Добрый день, сегодня хотелось бы поговорить об игровом контроллере для Arduino или просто джойстике.
Данный контроллер может пригодиться для изготовления пульта управления какой-либо моделью.
Поговорим о том, что может данный модуль.
Он способен осуществлять управление по двум осям, а также имеет тактовую кнопку. Питаться данный модуль может как от 5В так и от 3,3В. Т.к. у нас он будет использоваться в связке с Arduino, то будем питать его 5В.
Для наглядности работы предлагаю попробовать управлять сервоприводами, а работу тактовой кнопки контролировать при помощи светодиода.
Выходы VRX и VRY игрового контроллера подключаем к аналоговым ногам А0 и А1 arduino. Выход SW – к цифровой ноге D2. Подключаем питание к модулю.
Сервоприводы подключаем к внешнему питанию (ардуино может не потянуть), а сигнальные провода подключаем к ногам D9 и D10.
Светодиод подключать не будем, т.к. он уже распаян на самой ардуино и подключен к 13 пину.
В коде мы будем использовать встроенный в ардуино подтягивающий резистор, если по каким-то причинам это сделать не получается, то на самом модуле есть контактные площадки для его установки (см. фото).
Перейдем к программной части.
Немного теории как все это работает: На игровом контроллере по стоит два переменных резистора, каждый из которых по является делителем напряжения, когда джойстик установлен в центральное положение на выходе имеем приблизительно 2,5 вольта (при питании 5 вольт). Если отклонять джостик в крайнее положение – напряжение будет меняться от 2,5В до 5В или от 2,5В до 0В (это зависит от того в какую сторону двигать джойстик).
Ардуина в цикле опрашивает аналоговый вход и получает значения в диапазоне от 0 до 1024 (0В-5В), затем при помощи функции «map» сопоставляет или другими словами преобразовывает эти значения в угол поворота с диапазоном 0-180 и отправляет значение угла в сервопривод.
Тоже самое для второй оси модуля.
Обработка нажатия кнопки: в цикле наблюдаем за состоянием пина, когда уровень станет LOW – зажиаем светодиод подав высокий уровень на 13 ногу, как только кнопку отпустят, уровень вернется в состояние HIGH и ардуина потушит светодиод командой «digitalWrite(ledPin, LOW);»
Для работы с сервоприводами будем использовать стандартную библиотеку Servo.h.
Код достаточно комментирован, я не думаю, что тут возникнут проблемы.
Посмотреть код
#include <Servo.h>
Servo myservo1; // создаем обект для управления сервоприводом №1
Servo myservo2; // создаем обект для управления сервоприводом №2
int pos1 = 0; // переменная для хранения положение сервопривода №1
int pos2 = 0; // переменная для хранения положение сервопривода №2
int sensorValue1 = 0; // переменная для хранения значения сенсора №1 (ось Х)
int sensorValue2 = 0; // переменная для хранения значения сенсора №2 (ось У)
const int buttonPin = 2; // Номер пина к которому подлючена тактовая кнопка игрового контроллера
const int ledPin = 13; // Номер пина к которому подключен светодиод
int buttonState = 0; // переменная для чтения статуса кнопки
void setup()
{
myservo1.attach(9); // Servo №1 крепится к пину D9
myservo2.attach(10); // Servo №2 крепится к пину D10
pinMode(ledPin, OUTPUT); // настраиваем пин на выход
pinMode(buttonPin, INPUT); // настраиваем пин на вход
digitalWrite(buttonPin, 1); // включаем подтягивающий резистор
}
void loop()
{
buttonState = digitalRead(buttonPin); // читаем состояние кнопки
if (buttonState == LOW) { // Если кнопка нажата
digitalWrite(ledPin, HIGH); // зажигаем светодиод
} else { // иначе
digitalWrite(ledPin, LOW);} // тушим
// читаем аналоговые значения пинов А0 и А1
sensorValue1 = analogRead(A0);
sensorValue2 = analogRead(A1);
// преобразуем значени аналогового входа в угол поворота:
pos1 = map(sensorValue1, 0, 1023, 0, 180);
pos2 = map(sensorValue2, 0, 1023, 0, 180);
myservo1.write(pos1); // Записываем значение угла поворота для Servo №1
myservo2.write(pos2); // Записываем значение угла поворота для Servo №2
delay(5); // немного подождем
}
Я за 2 гoдa pаботы в kрyпнoй koмпании cтoльko нe зaрабoтала скoльko здесb. Aвтop спaсибo тебе болbшое. Именно ceйчас я точно пеpecтaну маятbcя eрундой с этими тaблетками)))) A тo и нa дeтей врeмени не хвaтaлo c таkой пoдработkoй. Teпeрb пoдaркoв смoгу вcем kупить и покaзaтb чтo финaнсы в интeрнете можно полyчaть!
Иван
Здравствуйте. Для включения поттягивающего резистора можно использовать константу INPUT_PULLUP.
Я за 2 гoдa pаботы в kрyпнoй koмпании cтoльko нe зaрабoтала скoльko здесb. Aвтop спaсибo тебе болbшое. Именно ceйчас я точно пеpecтaну маятbcя eрундой с этими тaблетками)))) A тo и нa дeтей врeмени не хвaтaлo c таkой пoдработkoй. Teпeрb пoдaркoв смoгу вcем kупить и покaзaтb чтo финaнсы в интeрнете можно полyчaть!
Здравствуйте. Для включения поттягивающего резистора можно использовать константу INPUT_PULLUP.