Как использовать данные float с датчика с помощью библиотеки Arduino mouse library
Я использую гироскоп, который возвращает угловую скорость в float. Я пытаюсь использовать эти данные с помощью библиотеки мышей arduino. Для функции перемещения требуется знаковый символ. Я не уверен, что лучший способ-это преобразовать float
данные с датчика в подписанный символ
.
Каким образом я могу это сделать, потеряв меньше всего с точки зрения точности?
Я узнал, что вы можете использовать dtostrf
для передачи float в массив символов, но не уверен, что делать после этого и является ли это вообще лучшим способом.
Я был бы признателен за любое руководство.
2 ответа
Лучший ответ:
Библиотека мыши ожидает, что координаты движения будут предоставлены как
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
Вы неправильно понимаете тип 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
- Преобразование Float в int не работает прямо в методе с использованием varargs
- Преобразование из Float в Int дает странные результаты. Что я делаю не так?
- просчет с плавающей запятой, когда переменная int32_t делится на 10
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
- Как преобразовать строку в массив байтов
- Как перевести float в четыре байта?
- Проблемы с преобразованием byte[] в String
похоже, это общий вопрос программирования на C++, а не вопрос, связанный с Arduino ... пожалуйста, проведите свое исследование в области языка C++ , @jsotola
Помимо проблем с типом данных, существуют проблемы с масштабированием. Что именно означает символ со знаком для функции перемещения мыши? Какую библиотеку мыши вы используете? Какой диапазон значений с плавающей точкой вы могли бы получить от гироскопа? Если это, например, от -300,0 до +300,0, то вам, по крайней мере, нужно будет уменьшить это значение, прежде чем преобразовывать его в целое число размером с символ., @lurker
это должно помочь https://duckduckgo.com/?q=c%2B%2B+с плавающей точкой+до+подписано&ia=веб, @jsotola
Спасибо за ответы. Масштабирование будет необходимо, поскольку значения, как правило, находятся в максимальном диапазоне 300 на размер выборки. Подписанный символ стандартной библиотеки arduino представляет собой величину перемещения по экрану относительно предыдущего положения курсора. Я попытался исследовать это как в C++, так и в arduino, но не смог найти ответа, поэтому решил попробовать спросить., @Zhelyazko Grudov