В различных 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)


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

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

Комментарии (5)


  1. nevzorofff
    11.06.2019 17:11

    Вспомнились начало 2000-х, когда сломанные джойстики клонов NES переделывались пол LPT:)


    1. VBKesha
      11.06.2019 20:00

      Я на таких до сих пор играю.


  1. staticmain
    11.06.2019 18:22

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

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


  1. pproger
    11.06.2019 18:36

    >джойстик
    контроллер

    >и положении джойстиков
    аналогов/стиков

    статья о первой покупке на али?


    1. HardWrMan
      11.06.2019 18:50
      +1

      Не все лишь различают палку радости от подушки радости. И то и другое вместе — управлятор. :)