Как использовать данные float с датчика с помощью библиотеки Arduino mouse library

Я использую гироскоп, который возвращает угловую скорость в float. Я пытаюсь использовать эти данные с помощью библиотеки мышей arduino. Для функции перемещения требуется знаковый символ. Я не уверен, что лучший способ-это преобразовать float данные с датчика в подписанный символ.

Каким образом я могу это сделать, потеряв меньше всего с точки зрения точности?

Я узнал, что вы можете использовать dtostrf для передачи float в массив символов, но не уверен, что делать после этого и является ли это вообще лучшим способом.

Я был бы признателен за любое руководство.

, 👍0

Обсуждение

похоже, это общий вопрос программирования на C++, а не вопрос, связанный с Arduino ... пожалуйста, проведите свое исследование в области языка C++ , @jsotola

Помимо проблем с типом данных, существуют проблемы с масштабированием. Что именно означает символ со знаком для функции перемещения мыши? Какую библиотеку мыши вы используете? Какой диапазон значений с плавающей точкой вы могли бы получить от гироскопа? Если это, например, от -300,0 до +300,0, то вам, по крайней мере, нужно будет уменьшить это значение, прежде чем преобразовывать его в целое число размером с символ., @lurker

это должно помочь https://duckduckgo.com/?q=c%2B%2B+с плавающей точкой+до+подписано&ia=веб, @jsotola

Спасибо за ответы. Масштабирование будет необходимо, поскольку значения, как правило, находятся в максимальном диапазоне 300 на размер выборки. Подписанный символ стандартной библиотеки arduino представляет собой величину перемещения по экрану относительно предыдущего положения курсора. Я попытался исследовать это как в C++, так и в arduino, но не смог найти ответа, поэтому решил попробовать спросить., @Zhelyazko Grudov


2 ответа


Лучший ответ:

1

Библиотека мыши ожидает, что координаты движения будут предоставлены как 8-разрядные целые числа со знаком, что соответствует типу данных int8_t. Этот тип на самом деле является псевдонимом для signed char, но называть его таким образом запутанно, так как слово char каким-то образом подразумевает тип, предназначенный для хранения символов, что здесь определенно не так.

Преобразование float в любой целочисленный тип может быть выполнено простым назначением, с двумя оговорками:

  • Если float превышает диапазон целого числа, назначение будет заключаться вокруг модуля 2^(целочисленный размер в битах). Это нежелательно и может быть предотвращено первым ограничением()ing float до соответствующего диапазона.
  • Назначение округляется до нуля, в то время как округление до ближайшего целого числа лучше, если вы хотите минимизировать ошибки. Это может быть достигнуто с помощью макроса round ().

Вкратце:

// В глобальном контексте:
const float scale = 0.4;  // масштабный коэффициент для движений мыши

// Внутри цикла():
float rotation = get_data_from_gyroscope();
int8_t mouse_move = round(constrain(rotation * scale, -128, +127));

Обратите внимание, что оптимальную шкалу можно определить только экспериментально: вы должны настроить ее до тех пор, пока устройство ввода “не почувствует” правильность.

,

Еще раз большое тебе спасибо, Эдгар! Мне кажется, что это очень важная часть реализации, так как при преобразовании вы можете потерять точность датчика, поэтому я благодарен, что в дело вмешался эксперт., @Zhelyazko Grudov


1

Вы неправильно понимаете тип char. Он называется character, потому что в представлении ASCII вы можете использовать его для сохранения одного символа. Но внутренне это просто число. Arduino все равно, сохраняете ли вы в нем символы или числа, потому что символы для него тоже являются числами.

Знаковый символ, как и функция move() библиотеки uses`, имеет 1 байт и является знаковым, поэтому может содержать числа от -128 до 127.

Хотя в документации неясно, что на самом деле представляют собой параметры x и y, ответ на этот вопрос ясен. По сути, весь диапазон от -128 до +127 представляет собой целый дюйм (или то, что компьютер считает дюймом). Таким образом, это приводит к разрешению 1" / (127 - -128) = 1" / 255 = 0.0039" (или около 0,1 мм). Я не знаю, какие значения вы получаете от датчика, но вам придется масштабировать его где-то в диапазоне от -128 до 127 (зависит от того, насколько чувствительным вы хотите его видеть). И здесь вы не потеряете точность. Значения датчика, скорее всего, более точны, чем диапазон действия функции перемещения мыши ().

Расчет тогда будет таким же простым, как

signed char mouse_x = sensor_x * factor + offset;

Результат вычисления будет неявно преобразован в 1-байтовое целое число со знаком (именно так называется signed char). Если вы хотите пояснить, что здесь происходит, вы также можете написать:

signed char mouse_x = (signed char)(sensor_x * factor + offset);

Это не нужно, но вы можете сделать это для ясности.


Увиденный в Эдгаре Бонетсе ответ: Вы можете захотеть ограничить значение приведенного выше расчета диапазоном от -128 до 127. Если вы получите неожиданное высокое значение от вашего датчика, приведенный выше расчет переполнит переменную mouse_x (не подходит для правильных значений). Поэтому ограничение значений в этот диапазон с помощью функции constrain() определенно хорошо. Обратитесь к Edgars answer и документации для этого.

,

Привет, Крисл, большое тебе спасибо за подробный ответ. Я действительно ценю, что вы нашли время. Между вашими ответами и ответами Эдгара я чувствую, что гораздо лучше понимаю проблему. Вы оба должны знать, что новички действительно благодарны, когда вы помогаете. Или они должны быть такими!, @Zhelyazko Grudov