Зачастую возникает необходимость управлять различными устройствами аналоговым способом, например, для управления роботами и тому подобное.
Для этой цели идеально подходит джойстик, так как это очень простое устройство. Джойстик обычно состоит (независимо от размера) из 2-х потенциометров, механически связанных с ручкой.
Иногда джойстик дополнительно оснащается кнопкой (кнопками). Миниатюрные джойстики обычно имеют кнопку, которая активируется нажатием на саму ручку.
Принципиальная схема аналогового джойстика:
Джойстик – подключение к Ардуино
На самом деле подключить джойстик к Ардуино очень просто. Для этого соответствующим образом помеченные контакты (+, — или + 5V, GND) подключите к источнику питания, а остальные (оси X и Y джойстика) в соответствии с маркировкой к 2 аналоговым каналам Ардуино и сигнал от кнопки к любому контакту Ардуино.
В нашем случае мы подключим джойстик так:
- ось X — вывод A0
- ось Y — вывод A1
- кнопка — вывод 2
Первую программу для чтения данных, вероятно, может написать любой новичок:
void setup() { Serial.begin(9600);//устанавливаем последовательный порт для связи с компьютером pinMode(2, INPUT);//устанавливаем контакт 2 как вход для кнопки и включаем подтягивание digitalWrite(2, HIGH); /устанавливаем контакты A0 и A1 в качестве входов - подключаем оси X и Y джойстика соответственно pinMode(A0, INPUT);/ pinMode(A1, INPUT); } void loop() { int x=analogRead(A0);//считываем значения напряжения по осям X и Y int y=analogRead(A1); Serial.print(x);//выводим в монитор последовательного порта Serial.print(" "); Serial.print(y); Serial.print(" "); Serial.println(digitalRead(2));//кнопка }
Вторая программа немного сложнее и учитывает тот факт, что считывание джойстика в нейтральном положении может быть нестабильным, и что мы не обязательно хотим использовать около 500 состояний джойстика при отклонении в каждую сторону:
// мой АЦП возвращает 514 и 504 для центрального местоположения const int x_mid=514; const int y_mid=504; // устанавливаем гистерезис - только после превышения этого значения от центра будем что-то делать const int center_hist=5; void setup() { Serial.begin(9600);// устанавливаем последовательный порт для связи с компьютером pinMode(2, INPUT);// устанавливаем контакт 2 как вход кнопки и включаем подтягивание digitalWrite(2, HIGH); pinMode(A0, INPUT);// устанавливаем контакты A0 и A1 как входы - мы подключим к ним оси X и Y джойстика соответственно pinMode(A1, INPUT); } void loop() { int x=analogRead(A0);// считываем значения напряжения по осям X и Y int y=analogRead(A1); if(x>(x_mid+center_hist)||x<(x_mid-center_hist)){// если джойстик наклонен за пределы нейтрального положения x=(x-x_mid)/16;// вычисляем его позицию и уменьшаем количество возможных состояний (512/16 = 32) // обратите внимание - из-за деления в C мы получим асимметричный диапазон - если это нас беспокоит, мы можем использовать оператор if для обрезки асимметричного значения) }else x=0; if(y>(y_mid+center_hist)||y<(y_mid-center_hist)){// то же самое для оси Y y=(y-y_mid)/16; }else y=0; Serial.print(x);// отображаем их Serial.print(" "); Serial.print(y); Serial.print(" "); Serial.println(digitalRead(2)); }
Надеемся, что эти несколько строк вдохновят вас на создание множества интересных устройств (например, дистанционно управляемых). Конечно же, ничто не мешает использовать такой джойстик не только с Ардуино.