Класс для работы с двухосевым джойстиком

Нет ответов
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче, есть у мну это китайское чудо. Лежало до поры, до времени, но всё было не до сук :) Расчехлил надысь поделку, посмотрел примеры работы с ним в этих ваших интернетах - и уху ел: ну ничего нормального нет, от слова "совсем". Ни фильтрации дребезга, ни калибровки хотя бы по центральным точкам, ни полярных координат - так, записки неандертальцев на стенах пещеры, не более того.

Оставить такое дело в таком положении я не мог, и чисто для сэбэ - написал классец, который управляется со всем вышеописанным: углы по осям, полярные координаты, гистерезис, калибровка по центральному положению. Юзается примерно так:

#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.00,0.00
513,495
X angle = 90.00
Y angle = 90.00
Polar angle = 0.00

Покрутил по осям:

Цитата:

-0.94,0.37
31,672
X angle = 5.58
Y angle = 123.43
Polar angle = 201.60

Кнопку специально обрабатывать не стал, т.к. есть кучу классов для кнопок, тот же "титановый велосипед" Клапы, которые справятся с задачей обработки нажатия на кнопку на раз.

Единственное, чего пока нет - это границы крайних положений, т.к. очевидно, что дешёвенький потенциометр практически никогда не выдаст 0 и 1023, но это для меня - некритично пока. При помощи такого класса можно управлять как двумя сервами, т.к. есть отдельные данные по осям, так и одной полнооборотной сервой, т.к. есть данные в полярных координатах, так и делать, что хочешь, т.к. есть относительные положения осей в условных единицах диапазона [-1.0,1.0]. Короче - пляши как хочешь.

Исходники сего поделия - да вот они: https://drive.google.com/file/d/1Kix0Vj9tsZXE38SnjqNvggisQ_J29BwE/view?usp=sharing

Вдруг кому пригодится - мне не жалко, пользуйтесь.