Подключение джойстика к Arduino + управление двумя сервоприводами

Аналоговый джойстик → плавное управление двумя сервами по осям X и Y. Два режима: возврат в центр и с запоминанием позиции. Плюс кнопка для стрельбы/включения. Идеальная основа для поворотной платформы, лазерного прицела, камеры или робота.

Джойстик + сервоприводы Arduino

Схема подключения

  • 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;
}
Управляет двумя сервоприводами по осям X и Y с помощью аналогового джойстика.
Преобразует отклонение джойстика в плавное изменение углов сервоприводов с мёртвой зоной по центру.
Кнопка джойстика переключает состояние светодиода.
Используется программный антидребезг и ограничение углов сервоприводов.

Как откалибровать центр

Загрузи простой скетч:

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, а также полноценный двухосевой манипулятор. Это универсальная база для множества проектов робототехники.

📁 Скачать примеры