KY-023 – модуль джойстика (Dual Axis Joystick). Подключение к Arduino.

В этом уроке мы познакомимся с одним из самых популярных модулей для создания интерактивных проектов — модулем джойстика KY-023. Этот модуль, основанный на джойстике от игрового контроллера PS2, позволяет легко считывать перемещения по двум осям (X и Y) и регистрировать нажатие на сам стик.

Модуль KY-023 представляет собой два перпендикулярно расположенных потенциометра и тактовую кнопку.

Модуль KY-023 представляет собой два перпендикулярно расположенных потенциометра и тактовую кнопку. При смещении стика меняется сопротивление потенциометров, что позволяет нам определять его положение. Нажатие на стик сверху вниз замыкает контакты кнопки. Это простое и универсальное устройство для ввода данных в ваши проекты.

Области применения:

  • Управление роботами и машинками: Создание пульта для управления движением RC-моделей.
  • Игровые контроллеры: Сборка собственного геймпада или джойстика.
  • Навигация по меню: Удобное перемещение по пунктам меню на LCD-дисплеях.
  • Управление светодиодами: Плавное изменение цвета RGB-светодиода или яркости.
  • Позиционирование: Управление сервоприводами или шаговыми двигателями для точного позиционирования объектов (например, камеры).

Модуль KY-023 полностью совместим с самыми популярными платформами, включая Arduino (UNO, Nano, Mega), ESP32, ESP8266 и Raspberry Pi

Совместимость:

Модуль KY-023 полностью совместим с самыми популярными платформами, включая Arduino (UNO, Nano, Mega), ESP32, ESP8266 и Raspberry Pi, так как для работы с ним достаточно стандартных аналоговых и цифровых портов.

1. Подробное описание модуля.

1.1. Структура и компоненты.

Модуль состоит из нескольких ключевых элементов:

  • Джойстик (стик): Пластиковая рукоятка для управления.
  • Два потенциометра по 10 кОм: Один для оси X, другой для оси Y. Они изменяют свое сопротивление в зависимости от положения стика.
  • Тактовая кнопка: Расположена под стиком и активируется при нажатии на него сверху (ось Z).
  • Плата с 5 выводами: Для удобного подключения к микроконтроллеру.

1.2. Распиновка.

Распиновка.

Модуль имеет 5 выводов со следующими обозначениями:

  • GND (или -): Земля. Подключается к пину GND микроконтроллера.
  • +5V (или средний пин): Питание. Подключается к пину 5V (или 3.3V) микроконтроллера.
  • VRx: Аналоговый выход для оси X. Значение меняется при движении стика влево-вправо.
  • VRy: Аналоговый выход для оси Y. Значение меняется при движении стика вверх-вниз.
  • SW: Цифровой выход кнопки. Активируется при нажатии на стик.

1.3. Технические характеристики.

  • Рабочее напряжение: 3.3V – 5V
  • Потребляемый ток: Несколько миллиампер (очень низкое)
  • Тип выходных данных:
    • VRx, VRy: Аналоговый сигнал (значения от 0 до 1023 на Arduino)
    • SW: Цифровой сигнал (HIGH/LOW)
  • Сопротивление потенциометров: 10 кОм
  • Размеры платы: 26 мм x 34 мм
  • Рабочая температура: от -25°C до +70°C

1.4. Принцип работы.

Принцип работы модуля очень прост. Когда вы двигаете стик, вы изменяете положение двух потенциометров. Это приводит к изменению напряжения на выводах VRx и VRy. Микроконтроллер считывает это аналоговое напряжение с помощью АЦП (Аналого-цифрового преобразователя) и преобразует его в числовое значение. На Arduino UNO это значение будет в диапазоне от 0 до 1023.

  • Центральное положение: Оси X и Y выдают значение примерно в середине диапазона (~512).
  • Движение по оси X: Значение меняется от 0 (крайнее левое) до 1023 (крайнее правое).
  • Движение по оси Y: Значение меняется от 0 (крайнее нижнее) до 1023 (крайнее верхнее).

Кнопка SW при нажатии замыкает контакт на землю. Чтобы получить стабильный сигнал, мы будем использовать внутренний подтягивающий резистор Arduino (INPUT_PULLUP), который будет удерживать пин в состоянии HIGH, пока кнопка не нажата. При нажатии пин будет считываться как LOW.

Модуль KY-023 является низковольтным и абсолютно безопасен в использовании.

1.5. Техника безопасности.

Модуль KY-023 является низковольтным и абсолютно безопасен в использовании. Единственное, на что стоит обратить внимание, — правильность подключения питания: не перепутайте пины GND и +5V, чтобы не повредить модуль или микроконтроллер.

2. Использование KY-023 с Arduino.

2.1. Схема подключения KY-023 к Arduino.

Подключить модуль к Arduino очень просто. Нам понадобится два аналоговых пина для осей и один цифровой для кнопки.

Подключение к Arduino UNO:

Пин модуля KY-023 Пин Arduino UNO
GND GND
+5V 5V
VRx A0
VRy A1
SW D7

Схема для Arduino UNO.

Схема для Arduino UNO.

Подключение к Arduino NANO.

Схема подключения к Arduino NANO аналогична, просто используйте соответствующие пины на плате Nano.

Схема подключения к Arduino NANO аналогична, просто используйте соответствующие пины на плате Nano.

Схема подключения к Arduino NANO аналогична, просто используйте соответствующие пины на плате Nano.

Пин модуля KY-023 Пин Arduino NANO
GND GND
+5V 5V
VRx A0
VRy A1
SW D7

2.2. Необходимые библиотеки.

Для базовой работы с модулем KY-023 не требуются никакие сторонние библиотеки. Все необходимые функции (analogRead, digitalRead, pinMode) уже встроены в стандартную среду Arduino IDE.

Для базовой работы с модулем KY-023 не требуются никакие сторонние библиотеки.

2.3. Код (скетч) для Arduino.

Базовый пример: Считывание данных с джойстика и вывод в Монитор порта.

Этот простой скетч позволяет проверить работоспособность модуля, непрерывно считывая значения с осей X, Y и кнопки, а затем выводя их в Монитор порта.

/* -------------------
Урок: Модуль джойстика KY-023 Dual Axis Joystick
https://arduino-tex.ru/news/229/modul-dzhoistika-ky-023-dual-axis-joystick-podklyuchenie-k-arduino.html
======================================
Автор: Константин Казанцев.
https://arduino-tex.ru/ 
--------------------*/
// Определяем пины, к которым подключен модуль
const int pin_VRx = A0; // Пин для оси X
const int pin_VRy = A1; // Пин для оси Y
const int pin_SW = 7;   // Пин для кнопки
void setup() {
  // Инициализируем Serial-порт для вывода данных
  Serial.begin(9600);
  // Настраиваем пин кнопки как вход с внутренним подтягивающим резистором
  // Это значит, что когда кнопка не нажата, на пине будет HIGH (1)
  // А когда нажата - LOW (0)
  pinMode(pin_SW, INPUT_PULLUP);
  // Примечание: для аналоговых пинов pinMode(pin, INPUT) необязателен,
  // так как analogRead() настраивает пин автоматически.
}
void loop() {
  // Считываем аналоговые значения с осей X и Y
  int xValue = analogRead(pin_VRx); // Значение от 0 до 1023
  int yValue = analogRead(pin_VRy); // Значение от 0 до 1023
  // Считываем цифровое состояние кнопки
  int btnState = digitalRead(pin_SW); // Значение 0 (нажата) или 1 (не нажата)
  // Выводим полученные значения в Монитор порта
  Serial.print("X: ");
  Serial.print(xValue);
  Serial.print(" | Y: ");
  Serial.print(yValue);
  Serial.print(" | Button: ");
  Serial.println(btnState);
  // Небольшая задержка, чтобы не засорять порт данными
  delay(200);
}

Пояснения к коду:

  • const int pin_VRx = A0; — создаем константу для пина оси X, чтобы код был более читаемым.
  • pinMode(pin_SW, INPUT_PULLUP); — ключевая строка для работы с кнопкой. INPUT_PULLUP активирует внутренний резистор Arduino, который "подтягивает" напряжение на пине к 5V. Благодаря этому нам не нужен внешний резистор для кнопки.
  • analogRead(pin_VRx); — считывает напряжение на аналоговом пине и преобразует его в число от 0 до 1023.
  • digitalRead(pin_SW); — считывает цифровое состояние пина кнопки (HIGH или LOW).
  • Serial.print(...); — выводит текст или значение переменной в Монитор порта.
  • delay(200); — приостанавливает выполнение программы на 200 миллисекунд.

Serial.print(...); — выводит текст или значение переменной в Монитор порта.

Пример можно скачать внизу страницы в разделе «Файлы для скачивания».


3. Совместное использование с другими модулями (практический проект).

Давайте создадим простой, но наглядный проект: "Палитра цветов: управление RGB-модулем с помощью джойстика". Движение джойстика по осям X и Y будет плавно изменять цвет, а нажатие на кнопку — включать и выключать свечение.

3.1. Идея проекта.

Используя два модуля, мы соберем интерактивное устройство для выбора цвета:

  • Движение джойстика KY-023 по оси X будет управлять красной (Red) составляющей цвета.
  • Движение по оси Y будет управлять синей (Blue) составляющей.
  • Нажатие на кнопку джойстика будет включать или выключать модуль KY-009.
  • Для "зеленого" цвета мы будем использовать инвертированное значение одной из осей, чтобы получить более широкую палитру.

3.2. Список компонентов.

  1. Arduino UNO (или Nano).
  2. Модуль джойстика KY-023.
  3. Модуль RGB-светодиода KY-009.
  4. Макетная плата (опционально, можно соединить напрямую).
  5. Соединительные провода "папа-мама" и "папа-папа".

Краткая справка по модулю KY-009: Это небольшой модуль, на котором уже распаян SMD RGB-светодиод. Он имеет 4 вывода: один общий (в данном случае, общий катод, обозначается как "GND" или "-") и по одному выводу на каждый цвет (R, G, B). В отличие от сборки с отдельным светодиодом. Подробнее о модуле можно прочитать в уроке по KY-009.

3.3. Схема подключения всех модулей к Arduino.

Подключение к Arduino UNO:

Компонент Вывод модуля Подключение к Arduino UNO
KY-023 Joystick GND GND

+5V 5V

VRx A0

VRy A1

SW D7
KY-009 RGB LED - (или GND) GND

R D9 (PWM)

G D10 (PWM)

B D11 (PWM)

Важно: Для плавного управления цветом модуля KY-009 необходимо подключать его выводы R, G, B к пинам Arduino с поддержкой ШИМ (PWM). На Arduino UNO они отмечены тильдой ~ (например, 3, 5, 6, 9, 10, 11).

Схема подключения KY-023, KY-009 к Arduino NANO.

Схема подключения KY-023, KY-009 к Arduino NANO.

3.4. Код для совместной работы.

Код для этого проекта будет практически идентичен предыдущему варианту, так как принцип управления ШИМ-сигналом не меняется. Это лишь подтверждает, насколько гибка платформа Arduino.

/* -------------------
Урок: Модуль джойстика KY-023 Dual Axis Joystick
https://arduino-tex.ru/news/229/modul-dzhoistika-ky-023-dual-axis-joystick-podklyuchenie-k-arduino.html
======================================
Автор: Константин Казанцев.
https://arduino-tex.ru/ 
--------------------*/
// --- Пины для джойстика ---
const int pin_VRx = A0; // Ось X
const int pin_VRy = A1; // Ось Y
const int pin_SW = 7;   // Кнопка
// --- Пины для модуля RGB KY-009 (обязательно PWM-пины) ---
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
// --- Переменные для хранения состояний ---
int xValue = 0;
int yValue = 0;
bool ledState = true; // Состояние светодиода (включен/выключен)
unsigned long lastButtonPress = 0; // Для защиты от дребезга контактов
void setup() {
  Serial.begin(9600);
  // Настройка пина кнопки джойстика
  pinMode(pin_SW, INPUT_PULLUP);
  // Настройка пинов модуля KY-009 как выходов
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}
void loop() {
  // --- Обработка нажатия кнопки джойстика ---
  // Проверяем, нажата ли кнопка и прошло ли достаточно времени с последнего нажатия
  if (digitalRead(pin_SW) == LOW && millis() - lastButtonPress > 250) {
    ledState = !ledState; // Инвертируем состояние (вкл -> выкл, выкл -> вкл)
    lastButtonPress = millis(); // Запоминаем время нажатия
    Serial.print("RGB Module state changed to: ");
    Serial.println(ledState ? "ON" : "OFF");
  }
  // --- Управление модулем KY-009 ---
  if (ledState) {
    // Если модуль включен...
    // Считываем аналоговые значения с джойстика
    xValue = analogRead(pin_VRx);
    yValue = analogRead(pin_VRy);
    // Преобразуем диапазон джойстика [0..1023] в диапазон для ШИМ [0..255]
    int redValue = map(xValue, 0, 1023, 0, 255);
    int blueValue = map(yValue, 0, 1023, 0, 255);
    // Зеленый будет меняться в противофазе красному для большего разнообразия цветов
    int greenValue = map(xValue, 0, 1023, 255, 0); 
    // Устанавливаем цвет на модуле KY-009
    setColor(redValue, greenValue, blueValue);
  } else {
    // Если модуль выключен, гасим его
    setColor(0, 0, 0);
  }
  delay(10); // Небольшая задержка для стабильности работы
}
// Вспомогательная функция для установки цвета на модуле KY-009
void setColor(int r, int g, int b) {
  analogWrite(redPin, r);
  analogWrite(greenPin, g);
  analogWrite(bluePin, b);
}

Пояснения к коду проекта

Пояснения к коду проекта:

  • Код практически не изменился, что демонстрирует модульность подхода. Мы просто заменили один компонент на другой, а логика управления осталась прежней.
  • Для удобства и улучшения читаемости кода мы вынесли установку цвета в отдельную функцию setColor(r, g, b). Это хорошая практика в программировании.
  • В выводе в Serial добавили тернарный оператор ledState ? "ON" : "OFF", который выводит "ON", если ledState истинно, и "OFF" в противном случае. Это делает лог более понятным.

Вывод

Модуль джойстика KY-023 — это фантастический инструмент для добавления интуитивно понятного управления в проекты на Arduino. Он прост в подключении, не требует библиотек и очень надежен.

Сильные стороны:

  • Универсальность: Подходит для управления движением, навигации, изменения параметров.
  • Простота: Легко подключается и программируется.
  • Три в одном: Дает сразу три канала управления (две аналоговые оси и одна цифровая кнопка).
  • Низкая стоимость: Один из самых доступных модулей ввода.

Слабые стороны:

  • Размер: Может быть громоздким для очень компактных устройств.
  • Отсутствие возврата в центр: На дешевых модулях со временем может появиться небольшой дрейф, и в центральном положении значения могут быть не ровно 512, а, например, 510-515. Это легко исправляется программной калибровкой.

Надеемся, этот урок был вам полезен! Совместное использование модулей, таких как KY-023 и KY-009, позволяет быстро и без лишних усилий создавать интересные интерактивные устройства.

А какие идеи по использованию этого модуля появились у вас? Поделитесь ими в комментариях!


Понравился Урок KY-023 – модуль джойстика (Dual Axis Joystick). Подключение к Arduino? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на VK Видео, вступить в группу Вконтакте.

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

KY-023_Arduino KY-023_Arduino.ino2 Kb 38 Скачать
KY-023_KY-009_Arduino KY-023_KY-009_Arduino.ino3 Kb 41 Скачать

Комментарии

Ваше Имя*


Разработка проектов
EasyHMI
Умный Дом