В данной статье мы рассмотрим подключение модуля аналогового джойстика к плате Raspberry Pi Pico W. Статья послужит профессиональным руководством, предлагающим пошаговые инструкции о том, как установить соединение и эффективно вводить данные с джойстика с помощью мощной платы Raspberry Pi Pico W.
Также на нашем сайте мы рассматривали подключение джойстика к другим микроконтроллерам (платам):
Более наглядно посмотреть представленный в статье материал вы можете в следующем видео:
Необходимые компоненты:
- Плата Raspberry Pi Pico W (купить на AliExpress).
- Модуль джойстика (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
- OLED дисплей с интерфейсом I2C и диагональю экрана 1.3 дюйма (1.3 inch I2C OLED display) (купить на AliExpress - для данного проекта выбирайте вариант дисплея с 4 контактами) - не обязательно.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Распиновка модуля джойстика
Модуль джойстика обычно имеет пять контактов, их назначение следующее:
VCC - этот вывод подключается к источнику питания, обычно +5 В от микроконтроллера или платы разработки.
GND (Земля) - этот вывод подключен к земле (0 В) источника питания и служит опорным напряжением для модуля.
VRx - этот вывод представляет аналоговый выход для оси X джойстика. Он обеспечивает переменное напряжение, пропорциональное горизонтальному перемещению джойстика.
VRy - Этот вывод аналогичен VRx, но представляет собой аналоговый выход для оси Y джойстика, обеспечивая переменное напряжение, соответствующее вертикальному перемещению джойстика.
SW - это контакт переключателя модуля джойстика. При нажатии джойстика на этот контакт подается уровень LOW (заземляется). В противном случае оно остается на высоком уровне напряжения (обычно VCC).
Часто задаваемые вопросы о модуле джойстика
Могу ли я использовать несколько джойстиков одновременно?
Да, вы можете использовать несколько джойстиков одновременно, подключив их к разным аналоговым входам микроконтроллера. Считывая значения с каждого джойстика независимо, вы можете одновременно управлять несколькими осями или устройствами в своем проекте.
Какие существуют типы джойстиков?
Существуют различные типы джойстиков, предназначенные для разных приложений, таких как игры, робототехника, авиация и промышленное управление. Некоторые распространенные типы включают аналоговые джойстики (на основе потенциометра), цифровые джойстики (с использованием переключателей или энкодеров), джойстики полета и джойстики аркадного типа.
В этом уроке мы используем аналоговый джойстик.
Схема проекта
Схема подключения джойстика к плате Raspberry Pi Pico W приведена на следующем рисунке.
Выполните в схеме следующие соединения.
Подключите контакт VCC модуля джойстика к контакту Vbus на Raspberry Pi Pico W.
Подключите контакт GND модуля джойстика к контакту GND (земля) на Raspberry Pi Pico W.
Подключите контакт VRx модуля джойстика к одному из контактов аналогового входа на Raspberry Pi Pico W (например, ADC0).
Подключите контакт VRy модуля джойстика к другому аналоговому входу на Raspberry Pi Pico W (например, ADC1).
Программирование Raspberry Pi для джойстика с помощью Micropython
- Сначала открой thonny ide.
- Загрузите прошивку micropython для Raspberry Pi Pico W с официального сайта .
- Перейдите в tools> options>interpreter («Инструменты»> «Параметры»> «Интерпретатор») и выберите Raspberry Pi Pico в качестве интерпретатора.
- Скопируйте приведенный ниже код в thonny ide и сохраните его на своей плате.
Приведенный ниже код объясняет взаимодействие Raspberry Pi Pico W с аналоговым джойстиком и последующую печать его на экране.
Сначала в коде программы импортируем необходимые модули: Pin и ADC из модуля machine для работы с GPIO (контактами ввода/вывода) и ADC (АЦП), а также utime для работы с функциями времени.
1 2 |
from machine import Pin, ADC import utime |
Затем мы создаем три объекта: xAxis, yAxis и кнопку. Мы настроили объекты xAxis и yAxis для чтения аналоговых значений с выводов 27 и 26 соответственно, используя конструктор АЦП (аналого-цифрового преобразователя). Мы также настроили объект кнопки для чтения цифрового ввода с контакта 16. Аргумент Pin.IN устанавливает режим работы контакта для ввода данных, а Pin.PULL_UP позволяет внутреннему подтягивающему резистору поддерживать высокий уровень на контакте, когда кнопка не нажата.
1 2 3 |
xAxis = ADC(Pin(27)) yAxis = ADC(Pin(26)) button = Pin(16, Pin.IN, Pin.PULL_UP) |
Далее у нас будет цикл, который будет работать бесконечно. Код внутри цикла будет выполняться неоднократно, пока программа не будет остановлена.
1 |
while True: |
Затем у нас будет идти код, в котором мы будем считывать аналоговые значения из объектов xAxis и yAxis с помощью метода read_u16(). Метод возвращает необработанные 16-битные аналоговые значения с соответствующих контактов. Мы также считываем цифровой ввод из объекта кнопки с помощью метода value(), который возвращает 0, если кнопка нажата, и 1, если она не нажата.
1 2 3 |
xValue = xAxis.read_u16() yValue = yAxis.read_u16() buttonValue = button.value() |
В следующем фрагменте кода мы выводим на консоль необработанные аналоговые значения для xValue и yValue, а также цифровое значение для buttonValue. При этом значения будут отображаться непрерывно каждые 0,1 секунды.
1 |
print("X Value:", xValue, "Y Value:", yValue, "Button Value:", buttonValue) |
Функция utime.sleep(0.1) приостанавливает выполнение кода на 0,1 секунды перед началом следующей итерации цикла. Это создает небольшую задержку между каждым чтением и печатью значений, предотвращая чрезмерную загрузку ЦП (центрального процессора).
1 |
utime.sleep(0.1) |
На следующем видео вы можете посмотреть тестирование работы проекта.
Схема проекта с OLED дисплеем
Схема подключения джойстика и OLED дисплея к плате Raspberry Pi Pico W приведена на следующем рисунке.
В приведенном ниже коде объясняется, как принимать вводимые данные с аналогового джойстика и выводить их на экран OLED-дисплея.
Объяснение кода проекта с OLED дисплеем
Вначале импортируем необходимые модули: Pin, ADC и SoftI2C из machine модуля для работы с GPIO (контактами ввода/вывода), аналого-цифрового преобразователя и функций для работы с интерфейсом I2C. Также импортируем ssd1306 для управления OLED-дисплеем и utime для работы с функциями времени.
1 2 3 |
from machine import Pin, ADC, SoftI2C import ssd1306 import utime |
Затем мы создаем объект i2c с помощью SoftI2C, который устанавливает программный протокол связи I2C. Мы указываем вывод SCL (контакт синхронизации) как контакт 5, а контакт SDA (данные) как контакт 4. Эти контакты используются для связи между Raspberry Pi Pico и OLED-дисплеем SSD1306.
1 |
i2c = SoftI2C(scl=Pin(5), sda=Pin(4)) |
В следующем фрагменте кода настраивается джойстик путем создания трех объектов:
xAxis: считывает аналоговые значения с контакта 27 с помощью АЦП.
yAxis: считывает аналоговые значения с контакта 26 с помощью АЦП.
Кнопка: считывает цифровой входной сигнал с контакта 16. Режим контакта установлен на вход (Pin.IN), и включен внутренний подтягивающий резистор (Pin.PULL_UP), который удерживает контакт на высоком уровне когда кнопка не нажата.
1 2 3 |
xAxis = ADC(Pin(27)) yAxis = ADC(Pin(26)) button = Pin(16, Pin.IN, Pin.PULL_UP) |
В следующих строках кода мы задаем ширину и высоту OLED-дисплея (128x64 пикселей) и создаем oled-объект с помощью SSD1306_I2C. Это инициализирует OLED-дисплей с указанными размерами и связью по интерфейсу I2C.
1 2 3 |
oled_width = 128 oled_height = 64 oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c) |
Далее у нас цикл, который будет работать бесконечно. Код внутри цикла будет выполняться неоднократно, пока программа не будет остановлена.
1 |
while True: |
В следующем фрагменте кода мы считываем аналоговые значения из xAxis и yAxis с помощью метода read_u16(), который возвращает необработанные 16-битные аналоговые значения с соответствующих контактов. Мы также считываем цифровой ввод с кнопки с помощью метода value(), который возвращает 0, если кнопка нажата, и 1, если она не нажата.
1 2 3 |
xValue = xAxis.read_u16() yValue = yAxis.read_u16() buttonValue = button.value() |
Затем мы очищаем OLED-дисплей, заполняя его черными (0) пикселями.
1 |
oled.fill(0) |
Далее мы используем метод text() для отображения аналоговых значений xValue и yValue на OLED-дисплее. Текст будет отображаться в координатах (0, 0) по оси X и (0, 20) по оси Y.
1 2 |
oled.text("X: {}".format(xValue), 0, 0) oled.text("Y: {}".format(yValue), 0, 20) |
Следующий условный оператор проверяет значение buttonValue. Если оно равно 0 (кнопка нажата), на OLED-дисплее в координатах (0, 40) отображается надпись «Btn: Pressed». В противном случае в тех же координатах отображается надпись «Btn: Not Pressed».
1 2 3 4 |
if buttonValue == 0: oled.text("Btn: Pressed", 0, 40) else: oled.text("Btn: Not Pressed", 0, 40) |
После настройки дисплея с текстом и изображениями метод show() используется для обновления OLED-дисплея, делая изменения видимыми на экране.
1 |
oled.show() |
Функция utime.sleep(0.1) приостанавливает выполнение кода на 0,1 секунды перед началом следующей итерации цикла. Это создает небольшую задержку между каждым чтением и обновлением значений на OLED дисплее, предотвращая чрезмерную загрузку ЦП. Затем цикл повторяется, постоянно обновляя OLED-дисплей новыми значениями джойстика и состоянием кнопок.
Тестирование работы этого варианта проекта вы можете посмотреть в следующем видео.