Подключение джойстика к Arduino + управление двумя сервоприводами
Аналоговый джойстик → плавное управление двумя сервами по осям X и Y. Два режима: возврат в центр и с запоминанием позиции. Плюс кнопка для стрельбы/включения. Идеальная основа для поворотной платформы, лазерного прицела, камеры или робота.
Схема подключения
- VCC джойстика → 5 В Arduino
- GND → GND
- VRx (ось X) → A1
- VRy (ось Y) → A2
- SW (кнопка) → D4 (внутренняя подтяжка)
- Сервопривод 1 (горизонталь) → D2
- Сервопривод 2 (вертикаль) → D3
- Питание серв → отдельный блок 5–6 В (земли соединены!)
- Светодиод/реле → D13 (или любой другой пин)
Готовый скетч (с запоминанием позиции + кнопка)
#include <Servo.h>
Servo servoX; // горизонталь
Servo servoY; // вертикаль
int posX = 90; // начальное положение
int posY = 90;
const int joyX = A1;
const int joyY = A2;
const int buttonPin = 4;
const int ledPin = 13;
int buttonState = 0;
int lastButtonState = 0;
void setup() {
servoX.attach(2);
servoY.attach(3);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
servoX.write(90);
servoY.write(90);
}
void loop() {
// читаем джойстик
int x = analogRead(joyX);
int y = analogRead(joyY);
// преобразуем 0–1023 в 0–180 градусов
x = map(x, 0, 1023, 0, 180);
y = map(y, 0, 1023, 0, 180);
// ось X (с небольшой мёртвой зоной около центра)
if (x > 95) posX++;
if (x < 85) posX--;
posX = constrain(posX, 0, 180);
// ось Y
if (y > 95) posY++;
if (y < 85) posY--;
posY = constrain(posY, 0, 180);
servoX.write(posX);
servoY.write(posY);
delay(15); // плавность движения
// кнопка джойстика
buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState == LOW) { // нажата
digitalWrite(ledPin, !digitalRead(ledPin)); // переключить светодиод
}
delay(50); // антидребезг
}
lastButtonState = buttonState;
}
Преобразует отклонение джойстика в плавное изменение углов сервоприводов с мёртвой зоной по центру.
Кнопка джойстика переключает состояние светодиода.
Используется программный антидребезг и ограничение углов сервоприводов.
Как откалибровать центр
Загрузи простой скетч:
void setup() { Serial.begin(9600); }
void loop() {
Serial.print("X: "); Serial.print(analogRead(A1));
Serial.print(" Y: "); Serial.println(analogRead(A2));
delay(200);
}
Посмотри значения в центре — обычно 500–530. Подставь их вместо 90±5 в условии мёртвой зоны.
Что можно сделать дальше
- Добавить NRF24L01 → беспроводное управление
- Подключить лазер → лазерный прицел
- Установить камеру → поворотная Wi-Fi камера
- Сделать 3D-печатную платформу
Итог
За 10 минут вы получаете полноценный двухосевой манипулятор с точным позиционированием и кнопкой действия. Отличная база для сотен проектов!
FAQ — Подключение джойстика к Arduino и управление сервоприводами
Как работает аналоговый джойстик при подключении к Arduino?
Аналоговый джойстик содержит два переменных резистора, формирующих сигналы по осям X и Y. Arduino считывает напряжение с выходов VRx и VRy через аналоговые входы (обычно A1 и A2) и преобразует его в значения 0–1023. Эти данные используются для управления сервоприводами в реальном времени.
Почему сервоприводы нужно питать от отдельного источника?
Сервоприводы потребляют значительный ток, особенно при нагрузке. Питание их от 5 В Arduino может привести к перезагрузкам микроконтроллера или некорректной работе серв. Отдельный блок питания на 5–6 В обеспечивает стабильное питание, при этом земля блока и Arduino обязательно должны быть соединены.
Как реализовано плавное управление сервоприводами?
Значения осей джойстика преобразуются в диапазон 0–180 градусов. При отклонении ручки выше или ниже центра положение сервопривода инкрементируется или декрементируется на 1 градус за шаг. Ограничения constrain() и задержка 15 мс обеспечивают плавность и стабильность движения.
Зачем нужна мёртвая зона вокруг центра джойстика?
Даже в положении покоя значения аналогового джойстика немного колеблются. Мёртвая зона (например, 85–95 после преобразования) предотвращает дрожание серв и обеспечивает корректный нулевой центр. Ширина зоны подбирается после калибровки конкретного джойстика.
Как откалибровать джойстик для точного центра?
Калибровка выполняется через простой скетч, выводящий analogRead() для осей A1 и A2. В состоянии покоя значения обычно находятся в диапазоне 500–530. Эти величины используются для настройки границ мёртвой зоны, что повышает точность управления сервоприводами.
Для чего используется кнопка джойстика?
Кнопка SW подключается к цифровому пину с внутренней подтяжкой. Она может использоваться для управления светодиодом, реле, стрельбой, запуском режима или переключения логики работы серв. В примере реализовано переключение состояния светодиода с защитой от дребезга.
Какие проекты можно создать на основе джойстика и двух сервоприводов?
На основе такого управления можно сделать поворотную платформу, лазерный указатель, сервоприводную камеру, дистанционно управляемый модуль через NRF24L01 или Wi-Fi, а также полноценный двухосевой манипулятор. Это универсальная база для множества проектов робототехники.