Как подключить джойстик к Arduino: распиновка, схема и скетч

Иван Корнев·13 августа 2026·3 мин

Подключение аналогового джойстика к Arduino требует соединения пяти контактов модуля с платой и загрузки простого скетча для считывания показаний. Чтобы разобраться, как подключить джойстик к Arduino, достаточно выполнить стандартную распиновку и использовать готовые библиотеки или базовый код.

Оглавление

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

Аналоговый джойстик обычно имеет 5 выводов: VCC, GND, VRx (ось X), VRy (ось Y) и SW (кнопка). Оси X и Y представляют собой переменные резисторы, поэтому их необходимо подключать строго к аналоговым пинам (A0–A5 на Arduino Uno/Nano), а не к цифровым. Кнопку SW рекомендуется подключать к цифровому пину с использованием внутренней подтяжки INPUT_PULLUP, поскольку на многих модулях отсутствует внешний подтягивающий резистор.

Вывод джойстикаПин ArduinoОписание
VCC5VПитание модуля. Допустимо использовать 3.3V, но в этом случае значения АЦП изменятся.
GNDGNDОбщий провод (земля).
VRxA0 (или A1–A5)Аналоговый выход оси X (потенциометр).
VRyA1 (или A1–A5)Аналоговый выход оси Y (потенциометр).
SWD2 (или любой цифровой)Цифровой выход кнопки. При нажатии замыкает контакт на GND.

Для стабильного считывания кнопки без внешних резисторов используйте режим INPUT_PULLUP в функции pinMode(). При нажатии кнопки на пине будет значение LOW, при отпускании — HIGH.

Пример программы (Скетч)

Следующий код считывает положение осей X и Y, а также состояние кнопки, выводя данные в монитор последовательного порта. Значения аналоговых осей находятся в диапазоне от 0 до 1023, где значение около 512 соответствует центральному положению джойстика.

// Пины подключения
const int pinX = A0; // Ось X -> A0
const int pinY = A1; // Ось Y -> A1
const int pinSW = 2; // Кнопка -> D2

void setup() {
  Serial.begin(9600);

  // Настройка пина кнопки с внутренней подтяжкой к питанию
  // При нажатии кнопка замыкает контакт на GND, давая LOW
  pinMode(pinSW, INPUT_PULLUP);
}

void loop() {
  // Считываем аналоговые значения (0-1023)
  int xValue = analogRead(pinX);
  int yValue = analogRead(pinY);

  // Считываем состояние кнопки (LOW - нажата, HIGH - отпущена)
  int swState = digitalRead(pinSW);

  // Вывод в монитор порта
  Serial.print("X: ");
  Serial.print(xValue);
  Serial.print(" | Y: ");
  Serial.print(yValue);
  Serial.print(" | Button: ");
  Serial.println(swState == LOW ? "PRESSED" : "RELEASED");

  delay(100); // Небольшая задержка для стабильности вывода
}

Этот базовый скетч легко расширяется для управления сервоприводами, моторами или навигацией по меню. Для более точного управления может потребоваться калибровка «нулевой» точки, поскольку реальные значения в состоянии покоя могут незначительно отличаться от идеального значения 512.

Частые ошибки

  • Подключение осей X и Y к цифровым пинам. Оси джойстика являются переменными резисторами и выдают аналоговый сигнал. При подключении к цифровым пинам плата не сможет корректно считывать промежуточные положения, получая только значения HIGH или LOW.
  • Использование INPUT вместо INPUT_PULLUP для кнопки. Без внешней или внутренней подтяжки пин кнопки остаётся «висящим в воздухе», что приводит к случайным срабатываниям и нестабильным показаниям.
  • Питание от 3.3V без учёта влияния на АЦП. При подаче 3.3V на VCC модуля опорное напряжение АЦП также должно быть соответствующим, иначе диапазон считываемых значений сократится, что потребует пересчёта в коде.
  • Ожидание ровно 512 в центре. Реальные значения джойстика в покое часто смещены относительно середины. Для точного позиционирования необходимо программно калибровать центральную точку при запуске устройства.

FAQ

Можно ли запитать джойстик от 3.3V вместо 5V? Да, модуль будет работать и от 3.3V. Однако при этом изменятся максимальные значения, возвращаемые функцией analogRead(), так как опорное напряжение АЦП останется 5V (если не изменить его отдельно). Это потребует корректировки логики в скетче.

Почему кнопка джойстика срабатывает сама по себе? Скорее всего, пин кнопки не подтянут к питанию. Если на самом модуле нет внешнего подтягивающего резистора, необходимо инициализировать пин с помощью pinMode(pin, INPUT_PULLUP) в функции setup().

Можно ли использовать аналоговые пины A0–A5 для подключения кнопки? Да, аналоговые пины Arduino могут работать и как цифровые. Если все цифровые пины заняты, кнопку SW можно подключить к A0–A5, используя их в режиме digitalRead().

Как использовать значения джойстика для управления сервоприводом? Значения оси (0–1023) необходимо масштабировать в диапазон углов сервопривода (обычно 0–180°) с помощью функции map(). Например: int angle = map(xValue, 0, 1023, 0, 180);. После этого полученный угол передаётся в библиотеку Servo.