# Проект 29: Модуль джойстика ![](../media/a741387e08ee7fcfacd4c5f65aaac243.png) #### Описание Многим робототехническим проектам нужен джойстик. Этот модуль предоставляет доступное решение. Просто подключив его к двум аналоговым входам, вы получаете управление роботом по осям X и Y. Также у него есть кнопка, подключенная к цифровому пину. #### Аппаратное обеспечение 1\. Плата разработки UNO R3 (ch340) x1 2\. Модуль джойстика x1 3\. Провода DuPont #### Принцип работы Поразительно, как джойстик может передавать каждое малейшее движение ваших пальцев. Это возможно благодаря конструкции джойстика, которая состоит из двух потенциометров и механизма подвеса (гимбала). Механизм гимбала Когда вы двигаете джойстик, тонкий стержень, расположенный между двумя вращающимися валами с прорезями (гимбал), перемещается. Один из валов позволяет движение вдоль оси X (влево и вправо), а другой — вдоль оси Y (вверх и вниз). ![](../media/100caa2bccf8ccb3f76d7e4fe4440009.png) Когда вы двигаете джойстик вперед и назад, поворачивается вал оси Y. Когда двигаете его влево и вправо, поворачивается вал оси X. А при диагональном движении поворачиваются оба вала. ![](../media/97fbb85bc4a5a8b96ccc5beee33e2518.GIF) Каждый вал соединён с потенциометром так, что движение вала вращает движок соответствующего потенциометра. Иными словами, если толкнуть ручку джойстика вперёд, движок потенциометра сместится к одному концу резистивной дорожки, а если оттянуть назад — к противоположному. ![](../media/f5e709fe04ac4d1bf0b654cc41c78896.png) Считывая значения этих потенциометров, можно определить положение ручки. Считывание аналоговых значений с джойстика Джойстик выдаёт аналоговый сигнал с напряжением от 0 до 5В. При движении джойстика по оси X от одного крайнего положения к другому выходное напряжение меняется от 0 до 5В, то же самое происходит при движении по оси Y. В центре (положение покоя) выходное напряжение примерно равно половине VCC, то есть 2.5В. Это выходное напряжение можно подать на АЦП микроконтроллера, чтобы определить физическое положение джойстика. Поскольку у Arduino разрешение АЦП 10 бит, значения на каждом аналоговом канале (оси) могут варьироваться от 0 до 1023. Следовательно, при движении джойстика от одного крайнего положения к другому, на соответствующем канале будет считываться значение от 0 до 1023. В центре джойстика оба канала (вертикальный и горизонтальный) будут показывать примерно 512. На рисунке ниже показаны оси X и Y, а также как изменяются выходные значения при движении джойстика в разных направлениях. ![](../media/joystick.png) #### Технические характеристики Рабочее напряжение: 5В Внутреннее сопротивление потенциометра: 10 кОм Разъёмы с шагом 2.54 мм Размеры: 4.0 см x 2.6 см x 3.2 см (1.57 дюйма x 1.02 дюйма x 1.26 дюйма) Рабочая температура: от 0 до 70 °C #### Распиновка Модуль джойстика имеет всего 5 пинов. Два из них — питание, два — выходы потенциометров по осям X и Y, и один — для средней кнопки. Распиновка модуля следующая: ![](../media/559e207693bc45f95142574d382bd13c.png) GND — земля. VCC — питание модуля. Подключите к положительному источнику питания (обычно 5В или 3.3В, в зависимости от логических уровней). VRx — выходное напряжение по горизонтали. При движении джойстика слева направо выходное напряжение меняется от 0 до VCC. В центре (положение покоя) выходное напряжение примерно половина VCC. VRy — выходное напряжение по вертикали. При движении джойстика вверх и вниз выходное напряжение меняется от 0 до VCC. В центре выходное напряжение примерно половина VCC. SW — выход с кнопки. По умолчанию выход плавающий. Для чтения кнопки требуется подтягивающий резистор, чтобы при нажатии на ручку джойстика выход становился LOW, а в остальных случаях — HIGH. Учтите, что пин, к которому подключена кнопка, должен иметь включённый внутренний подтягивающий резистор или быть подключён внешний. #### Схема подключения 1\. Подключите пин VCC модуля джойстика к 5V на плате 2\. Подключите пин GND модуля джойстика к GND на плате 3\. Подключите выход по оси X модуля джойстика к аналоговому входу A0 на плате 4\. Подключите выход по оси Y модуля джойстика к аналоговому входу A1 на плате 5\. Подключите выход кнопки модуля джойстика к цифровому входу D3 на плате ![Img](../media/img-20260403151553.png) #### Пример кода ```cpp /* Набор для обучения электронике на Arduino Проект 29 Модуль джойстика Редактировал Keyes */ const int xPin = A0; // Пин оси X const int yPin = A1; // Пин оси Y const int buttonPin = 3; // Пин кнопки (ось Z) void setup() { Serial.begin(9600); // инициализация последовательного порта pinMode(buttonPin, INPUT_PULLUP); // Установка пина кнопки как вход с внутренним подтягивающим резистором } void loop() { int xValue = analogRead(xPin); // считывание значения потенциометра по оси X int yValue = analogRead(yPin); // считывание значения потенциометра по оси Y int buttonState = digitalRead(buttonPin); // считывание состояния кнопки Serial.print("X: "); Serial.print(xValue); Serial.print(" Y: "); Serial.print(yValue); Serial.print(" Button: "); Serial.println(buttonState); delay(100); // задержка 100 мс } ``` #### Объяснение кода Сначала код определяет три константы для указания пинов, подключённых к плате Arduino: ```cpp const int xPin = A0; // Пин для оси X const int yPin = A1; // Пин для оси Y const int buttonPin = 3; // Пин для оси Z (кнопка) ``` Здесь `xPin` и `yPin` определены как аналоговые входы A0 и A1, используемые для считывания аналоговых значений двух осей. `buttonPin` определён как цифровой пин 3, используемый для чтения состояния кнопки. Функция setup В функции `setup()` выполняется базовая настройка: ```cpp void setup() { Serial.begin(9600); // Инициализация последовательного порта pinMode(buttonPin, INPUT_PULLUP); // Установка пина кнопки как вход с внутренним подтягивающим резистором } ``` Здесь `Serial.begin(9600);` инициализирует последовательную связь с скоростью 9600 бод, что позволяет Arduino обмениваться данными с компьютером или другими последовательными устройствами через USB. `pinMode(buttonPin, INPUT_PULLUP);` устанавливает пин кнопки как вход и включает внутренний подтягивающий резистор, что является распространённым способом обеспечить высокий уровень сигнала (HIGH), когда кнопка не нажата. Основной цикл Функция `loop()` содержит основную логику программы, которая выполняется непрерывно, считывая входы и отправляя данные в последовательный порт: ```cpp void loop() { int xValue = analogRead(xPin); // Считывание значения потенциометра по оси X int yValue = analogRead(yPin); // Считывание значения потенциометра по оси Y int buttonState = digitalRead(buttonPin); // Считывание состояния кнопки Serial.print("X: "); Serial.print(xValue); Serial.print(" Y: "); Serial.print(yValue); Serial.print(" Button: "); Serial.println(buttonState); delay(100); // Задержка 100 миллисекунд } ``` Этот код сначала использует функцию `analogRead()` для чтения аналоговых значений по осям X и Y соответственно. Эти значения обычно варьируются от 0 до 1023 в зависимости от изменения входного напряжения. Затем используется функция `digitalRead()` для чтения состояния кнопки, которое может быть HIGH (не нажата) или LOW (нажата). После этого значения выводятся через последовательный порт в формате "X: [xValue] Y: [yValue] Button: [buttonState]". В конце вызов `delay(100);` заставляет цикл выполняться каждые 100 миллисекунд, чтобы избежать слишком частого считывания или отправки данных. #### Результат проекта После загрузки кода откройте последовательный монитор Arduino IDE и установите скорость передачи 9600 бод. При вращении джойстика в мониторе будут отображаться значения по осям X и Y. При нажатии на джойстик монитор покажет 0 (нажато) или 1 (отпущено). ![](../media/a7f9fdd1641db569a688ce533fdf4a43.png) ![P29](../media/P29.gif)