Проект 29: Модуль джойстика

Описание

Многим робототехническим проектам нужен джойстик. Этот модуль предоставляет доступное решение. Просто подключив его к двум аналоговым входам, вы получаете управление роботом по осям X и Y. Также у него есть кнопка, подключенная к цифровому пину.

Аппаратное обеспечение

1. Плата разработки UNO R3 (ch340) x1

2. Модуль джойстика x1

3. Провода DuPont

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

Поразительно, как джойстик может передавать каждое малейшее движение ваших пальцев. Это возможно благодаря конструкции джойстика, которая состоит из двух потенциометров и механизма подвеса (гимбала).

Механизм гимбала

Когда вы двигаете джойстик, тонкий стержень, расположенный между двумя вращающимися валами с прорезями (гимбал), перемещается. Один из валов позволяет движение вдоль оси X (влево и вправо), а другой — вдоль оси Y (вверх и вниз).

Когда вы двигаете джойстик вперед и назад, поворачивается вал оси Y. Когда двигаете его влево и вправо, поворачивается вал оси X. А при диагональном движении поворачиваются оба вала.

Каждый вал соединён с потенциометром так, что движение вала вращает движок соответствующего потенциометра. Иными словами, если толкнуть ручку джойстика вперёд, движок потенциометра сместится к одному концу резистивной дорожки, а если оттянуть назад — к противоположному.

Считывая значения этих потенциометров, можно определить положение ручки.

Считывание аналоговых значений с джойстика

Джойстик выдаёт аналоговый сигнал с напряжением от 0 до 5В. При движении джойстика по оси X от одного крайнего положения к другому выходное напряжение меняется от 0 до 5В, то же самое происходит при движении по оси Y. В центре (положение покоя) выходное напряжение примерно равно половине VCC, то есть 2.5В.

Это выходное напряжение можно подать на АЦП микроконтроллера, чтобы определить физическое положение джойстика.

Поскольку у Arduino разрешение АЦП 10 бит, значения на каждом аналоговом канале (оси) могут варьироваться от 0 до 1023. Следовательно, при движении джойстика от одного крайнего положения к другому, на соответствующем канале будет считываться значение от 0 до 1023. В центре джойстика оба канала (вертикальный и горизонтальный) будут показывать примерно 512.

На рисунке ниже показаны оси X и Y, а также как изменяются выходные значения при движении джойстика в разных направлениях.

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

Рабочее напряжение: 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, и один — для средней кнопки. Распиновка модуля следующая:

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

Пример кода

/*

Набор для обучения электронике на 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:

const int xPin = A0; // Пин для оси X

const int yPin = A1; // Пин для оси Y

const int buttonPin = 3; // Пин для оси Z (кнопка)

Здесь xPin и yPin определены как аналоговые входы A0 и A1, используемые для считывания аналоговых значений двух осей. buttonPin определён как цифровой пин 3, используемый для чтения состояния кнопки.

Функция setup

В функции setup() выполняется базовая настройка:

void setup() {

Serial.begin(9600); // Инициализация последовательного порта

pinMode(buttonPin, INPUT_PULLUP); // Установка пина кнопки как вход с внутренним подтягивающим резистором

}

Здесь Serial.begin(9600); инициализирует последовательную связь с скоростью 9600 бод, что позволяет Arduino обмениваться данными с компьютером или другими последовательными устройствами через USB. pinMode(buttonPin, INPUT_PULLUP); устанавливает пин кнопки как вход и включает внутренний подтягивающий резистор, что является распространённым способом обеспечить высокий уровень сигнала (HIGH), когда кнопка не нажата.

Основной цикл

Функция loop() содержит основную логику программы, которая выполняется непрерывно, считывая входы и отправляя данные в последовательный порт:

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 (отпущено).

P29