Как изменить значок на светодиодной матрице micro:bit с вводом через последовательный порт

Во-первых, я вообще не разработчик, просто пытаюсь заставить все работать так, как я хочу. Не могу понять это:

С одной стороны, это мой скрипт Python на ПК с Ubuntu, который отправляет ввод кнопок с джойстика Playstation 4 на последовательный порт micro:bit (джойстик подключен к Ubuntu через Bluetooth):

import serial
import pygame

pygame.init()
pygame.joystick.init()

joystick = pygame.joystick.Joystick(0)
joystick.init()

screen = pygame.display.set_mode((100,100))

device = serial.Serial('/dev/ttyACM0', 115200)

try:
    while True:
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.JOYBUTTONDOWN:
                if event.button == 7:
                    device.write(b"1\r\n")
                elif event.button == 6:
                    device.write(b"2\r\n")
            elif event.type == pygame.JOYBUTTONUP:
                if joystick.get_button(7) == 1:
                    device.write(b"1\r\n")
                elif joystick.get_button(6) == 1:
                    device.write(b"2\r\n")
                elif joystick.get_axis(0) < 0:
                    device.write(b"3\r\n")
                elif joystick.get_axis(0) > 0:
                    device.write(b"4\r\n")
                else:
                    device.write(b"5\r\n")
            if event.type == pygame.JOYAXISMOTION:
                if event.axis == 0:
                    if event.value < 0:
                        device.write(b"3\r\n")
                    elif event.value > 0:
                        device.write(b"4\r\n")
                    elif event.value == 0:
                        if joystick.get_button(7) == 1:
                            device.write(b"1\r\n")
                        elif joystick.get_button(6) == 1:
                            device.write(b"2\r\n")
                        else:
                            device.write(b"5\r\n")
except KeyboardInterrupt:
    print("EXITING NOW")
    joystick.quit()
device.close()

С другой стороны, это простой код микропитона, который я прошил в micro:bit из редактора Mu и ожидал, что он будет работать, но это не так :lol:

from microbit import *

uart.init(baudrate=115200)

while True:
    joyinput = uart.read()
    if joyinput == "1":
        display.show(Image.ARROW_N)
    elif joyinput == "2":
        display.show(Image.ARROW_S)
    elif joyinput == "3":
        display.show(Image.ARROW_W)
    elif joyinput == "4":
        display.show(Image.ARROW_E)
    elif joyinput == "5":
        display.show(Image.HAPPY)

В консоли REPL редактора Mu я вижу, что связь идет нормально, т.е. пока я держу нажатой какую-то кнопку или перемещаю ось джойстика, я получаю REPL с соответствующим номером:

  • 1 для кнопки джойстика 7 (R2)
  • 2 для кнопки джойстика 6 (L2)
  • 3 для оси джойстика 0 левое положение (левый аналог на джойстике)
  • 3 для оси джойстика 0 правое положение (левый аналог на джойстике)
  • 5 если ничего не нажимается/не перемещается

Но значки на светодиодной матрице никогда не появляются.

До сих пор я мог отобразить какой-либо значок, только если я добавлю еще один оператор «else» в конце скрипта, но это нормально, потому что это «else». Например, последние две строки ниже:

from microbit import *

uart.init(baudrate=115200)

while True:
    joyinput = uart.read()
    if joyinput == "1":
        display.show(Image.ARROW_N)
    elif joyinput == "2":
        display.show(Image.ARROW_S)
    elif joyinput == "3":
        display.show(Image.ARROW_W)
    elif joyinput == "4":
        display.show(Image.ARROW_E)
    elif joyinput == "5":
        display.show(Image.HAPPY)
    else:
        display.show(Image.HAPPY)

введите здесь описание изображения

Заранее большое спасибо, буду рад предоставить любую дополнительную информацию.


person stiw47    schedule 11.04.2020    source источник


Ответы (1)


Я получил ответ на другом сайте: https://forum.micropython.org/viewtopic.php?f=2&t=8153 , поэтому я хотел бы опубликовать его здесь, возможно, это будет полезно для других людей с такими же сомнениями. Все кредиты принадлежат @jimmo на форуме micropyhton, также спасибо @Iyassou, который пытался помочь.

Ниже приведен код mycropython для micro:bit, который изменит значки на светодиодной матрице (стрелки в моем случае) в соответствии с вводом с последовательного порта. Конечно, вам нужно как-то отправить эти входы, я отправляю их с помощью скрипта Python в посте выше и джойстика PS4.

from microbit import *

uart.init(baudrate=115200)

while True:
    joyinput = uart.readline()
    if not joyinput:
        continue
    joyinput = str(joyinput.strip(), 'utf-8')
    if joyinput == "1":
        display.show(Image.ARROW_N)
    elif joyinput == "2":
        display.show(Image.ARROW_S)
    elif joyinput == "3":
        display.show(Image.ARROW_W)
    elif joyinput == "4":
        display.show(Image.ARROW_E)
    elif joyinput == "5":
        display.show(Image.HAPPY)
person stiw47    schedule 14.04.2020