3D-джойстик (Trema-модуль v2.0)

Общие сведения:

Trema-модуль 3D-джойстик - является модулем ввода данных. С его помощью можно управлять роботами, манипуляторами, станками, различными моделями (машинки, танки, самолёты, вертолёты, квадрокоптеры, лодки и т.д.), а также использовать для создания игровых приставок, выбора пунктов меню на дисплеях и индикаторах, ввода значений, и т.д. Джойстик можно не только перемещать по осям X и Y, но и нажимать на него.

Видео:

Спецификация:

  • Напряжение питания: 5 В / 3,3 В (оба напряжения входят в диапазон допустимых значений).
  • Потребляемый ток: < 10 мА
  • Габариты: 30x30 мм

Все модули линейки "Trema" выполнены в одном формате

Подключение:

  • Выводы «X» и «Y» модуля подключается к любым аналоговым входам Arduino. Значения, считываемые с этих выводов, растут при перемещении джойстика слева на право и снизу вверх.
  • Вывод «K» является цифровым и подключается к любому выводу Arduino. В обычном состоянии на нём уровень логического «0», а при нажатии на джойстик, он меняется на логическую «1».
  • Выводы «V» и «G» являются выводами питания.

Схема установки модуля при его подключении через Trema Set Shield.

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1 :  Используя проводной шлейф и Piranha UNO

Используя провода «Папа — Мама», подключаем  напрямую к контроллеру Piranha UNO

Способ - 2 :  Используя Trema Set Shield

Модуль можно подключить к любому из аналоговых входов Trema Set Shield.

Способ - 3 :  Используя проводной шлейф и Shield

Используя 5-и проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.

Питание:

Входное напряжение 5 В или 3,3 В постоянного тока, подаётся на выводы Vcc (V) и GND (G).

Работа с модулем:

Данные модуля считываются с двух потенциометров и тактовой кнопки, механически связанных с рычагом джойстика. Кнопка подключена в разрыв питания Vcc и выхода «K», который прижат к GND через резистор. Следовательно, на выходе «K» может устанавливаться только два состояния: логический «0» (кнопка отпущена) или «1» (кнопка нажата). Выводы координат «X» и «Y» являются аналоговыми выходами модуля, они подключены к потенциометрам так, что напряжение снимаемое между этими выводами и GND растет при перемещении джойстика слева на право и снизу вверх.

Примеры:

Определение положения джойстика и включение светодиода по нажатию кнопки

const int8_t Xaxis  = A0;                 // Определяем номер вывода, к которому подключен контакт оси Х джойстика
const int8_t Yaxis  = A1;                 // Определяем номер вывода, к которому подключен контакт оси У джойстика
const int8_t Button = 2;                  // Определяем номер вывода, к которому подключен контакт кнопки джойстика
const int8_t LED    = 7;                  // Определяем номер вывода, к которому подключен светодиод
uint16_t     XborderMIN = 505;            // Задаём границу значений, НИЖЕ которой будет считаться, что джойстик отклонён по оси Х влево
uint16_t     XborderMAX = 515;            // Задаём границу значений, ВЫШЕ которой будет считаться, что джойстик отклонён по оси Х вправо
uint16_t     YborderMIN = 505;            // Задаём границу значений, НИЖЕ которой будет считаться, что джойстик отклонён по оси У вниз
uint16_t     YborderMAX = 515;            // Задаём границу значений, ВЫШЕ которой будет считаться, что джойстик отклонён по оси У вверх
uint16_t     Xvol = 0, Yvol = 0;          // Задаём переменные, которые будут принимать значения, считанные с осей джойстика

void setup() {
  Serial.begin(9600);                     // Инициируем передачу данных в монитор последовательного порта
  pinMode(LED,  OUTPUT);                  // Настраиваем вывод LED на работу в режиме выхода
  pinMode(Button, INPUT);                 // Настраиваем вывод Button на работу в режиме входа
}
void loop() {
  Xvol = analogRead(Xaxis);               // Считываем значения оси Х
  Yvol = analogRead(Yaxis);               // Считываем значения оси У
  if (Xvol < XborderMIN) {                // Проверяем, полученное значение Х меньше нижней границы центрального положения или нет. Если да, то
    if (Yvol < YborderMIN) {              // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то
      Serial.println("Left-Down");        // значит джойстик находится в положении ВЛЕВО-ВНИЗ
    }
    else if (Yvol > YborderMAX) {         // Если же полученное значение У больше верхней границы центрального положения, то
      Serial.println("Left-Up");          // значит джойстик находится в положении ВЛЕВО-ВВЕРХ
    }
    else {
      Serial.println("Left");             // Если же полученное значение У входит в границы центрального положения по оси У, значит джойстик отклонён ВЛЕВО
    }
  }
  else if (Xvol > XborderMAX) {           // Проверяем, полученное значение Х больше верхней границы центрального положения или нет. Если да, то
    if (Yvol < YborderMIN) {              // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то
      Serial.println("Right-Down");       // значит джойстик находится в положении ВПРАВО-ВНИЗ
    }
    else if (Yvol > YborderMAX) {         // Если же полученное значение У больше верхней границы центрального положения, то
      Serial.println("Right-Up");         // значит джойстик находится в положении ВПРАВО-ВВЕРХ
    }
    else {
      Serial.println("Right");            // Если же полученное значение У входит в границы центрального положения по оси У, значит джойстик отклонён ВПРАВО
    }
  }
  else {                                  // Если полученное значение Х входит в границы центрального положения по оси Х, значит
    if (Yvol < YborderMIN) {              // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то
      Serial.println("Down");             // значит джойстик находится в положении ВНИЗ
    }
    else if (Yvol > YborderMAX) {         // Если же полученное значение У больше верхней границы центрального положения, то
      Serial.println("Up");               // значит джойстик находится в положении ВВЕРХ
    }
    else {
      Serial.println("Center");           // Если же полученное значение У входит в границы центрального положения по оси У, значит джойстик находится в центре.
    }
  }
  if (digitalRead(Button)) {              // Проверяем, нажата ли кнопка
    delay(1);                             // Если кнопка была нажата, то подавляем дребезг
    digitalWrite(LED, !digitalRead(LED)); // и меняем состояние на выходе светодиода
    Serial.println("Button click!");      // Выводим текст о том, что кнопка была нажата
    while (digitalRead(Button)) {}        // Если кнопка удерживается, то ничего не делаем
    delay(10);                            // Если кнопка отпускается, то подавляем дребезг
  }
}

В мониторе последовательного порта вы увидите:

Ссылки:

Обсуждение