Класс для работы с двухосевым джойстиком
- Войдите на сайт для отправки комментариев
Короче, есть у мну это китайское чудо. Лежало до поры, до времени, но всё было не до сук :) Расчехлил надысь поделку, посмотрел примеры работы с ним в этих ваших интернетах - и уху ел: ну ничего нормального нет, от слова "совсем". Ни фильтрации дребезга, ни калибровки хотя бы по центральным точкам, ни полярных координат - так, записки неандертальцев на стенах пещеры, не более того.
Оставить такое дело в таком положении я не мог, и чисто для сэбэ - написал классец, который управляется со всем вышеописанным: углы по осям, полярные координаты, гистерезис, калибровка по центральному положению. Юзается примерно так:
#include "CoreJoystick.h" Joystick joy; void setup() { uint8_t xPin = A9; // куда подключена ось X uint8_t yPin = A10; // куда подключена ось Y int16_t midPointX = 500; // центральное значение оси Х в покое int16_t midPointY = 490; // центральное значение оси Y в покое uint8_t zeroHisteresis = 20; // гистерезис для фильтрации шумов joy.begin(xPin, yPin, midPointX, midPointY, zeroHisteresis); } void loop() { joy.update(); // значения X и Y в диапазоне [-1.0,1.0] float x = joy.getX(); float y = joy.getY(); Serial.print(x); Serial.print(","); Serial.println(y); // сырые значения потенциометров int16_t rawX = joy.getXRaw(); int16_t rawY = joy.getYRaw(); Serial.print(rawX); Serial.print(","); Serial.println(rawY); // значения углов по осям (по умолчанию степень свободы - 180 градусов, центральное положение - 90 градусов) float xAngle = joy.getXAngle(); float yAngle = joy.getYAngle(); Serial.print("X angle = "); Serial.println(xAngle); Serial.print("Y angle = "); Serial.println(yAngle); // полярные координаты (0-360 градусов) float polarAngle = joy.getPolarAngle(); Serial.print("Polar angle = "); Serial.println(polarAngle); Serial.println(); }
Джойстик подключён, и находится в покое (код из примера):
Покрутил по осям:
Кнопку специально обрабатывать не стал, т.к. есть кучу классов для кнопок, тот же "титановый велосипед" Клапы, которые справятся с задачей обработки нажатия на кнопку на раз.
Единственное, чего пока нет - это границы крайних положений, т.к. очевидно, что дешёвенький потенциометр практически никогда не выдаст 0 и 1023, но это для меня - некритично пока. При помощи такого класса можно управлять как двумя сервами, т.к. есть отдельные данные по осям, так и одной полнооборотной сервой, т.к. есть данные в полярных координатах, так и делать, что хочешь, т.к. есть относительные положения осей в условных единицах диапазона [-1.0,1.0]. Короче - пляши как хочешь.
Исходники сего поделия - да вот они: https://drive.google.com/file/d/1Kix0Vj9tsZXE38SnjqNvggisQ_J29BwE/view?usp=sharing
Вдруг кому пригодится - мне не жалко, пользуйтесь.