Подключаем джойстик PS2 к компьютеру через Serial

В различных DIY проектах очень часто используется управление с помощью джойстика. Действительно, это удобно, можно использовать различные сочетания клавиш и джойстиков.

Самая популярная модель, которую легко найти на Aliexpress работает по радиоканалу с частотой 2.4 Гц и включает в себя джойстик, а так же приёмник.

Выглядит это примерно так: image

Приёмник подключается к Ардуино или к Raspberry — примеров в интернете — просто сотни.

Но дело в том, что иногда гораздо удобнее подключать джойстик через Serial — порт. Умные люди придумали очень классный переходник, который автоматически конвертирует данные в не очень удобный формат.

Для отладки был использован переходник на USB, а в дальнейшем может выполнено подключение напрямую, например к Raspberry Pi.

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

image

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

Я написал простейшую программу для управления черепашкой с помощью джойстика.

import serial import sys from time import sleep import turtle ser = serial.Serial ("/dev/cu.usbserial", 9600)    #Open port with baud rate  turtle.shape("turtle") turtle.left(90) while True:     flag = ser.read(1) # Считываем первый байт     if flag.decode('utf-8') in ['W']: # Если джойстик, то выполняется пересчёт координат             st = ser.readline().decode('utf-8')              data = flag.decode('utf-8') +st             data = data.strip()             X,Y = data.split('P')             X = int(X[1:])             Y = int(Y)             if X < 127 :                     turtle.forward(10)             elif X > 127:                     turtle.backward(10)             if Y < 128:                     turtle.left(2)             elif Y > 128:                     turtle.right(2)                  else:             data = flag.decode('utf-8')             print(data)             if data == 'I': # Если нажат треугольник                     turtle.reset()                      turtle.home()             elif data == 'J': # Если нажат крестик                     sys.exit(0) 

У данной программы есть недостаток. Если зажата какая-то клавиша, а в этот момент двигается джойстик — программа выполнит только действие «подвешенное» на кнопку и проигнорирует джойстик.

В дальнейшем можно использовать этот джойстик для различных проектов.

FavoriteLoadingДобавить в избранное
Posted in Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *