0

Pi Pico で実行して SNES Mini コントローラーと接続し、通常のゲームパッド出力 (HID デバイス スタイル) を提供するコードを作成しようとしています。

そのため、MicroPython (Pico 上) が HID デバイスの操作を実行できないことに気付く前に、次の MicroPython コードを完成させました。

import machine
import time

GAMEPAD_ADDR = 0x52
FREQ_MOD = 3

i2c = machine.I2C(0, scl=machine.Pin(
    17), sda=machine.Pin(16), freq=int(100000 * FREQ_MOD))

i2c.writeto_mem(GAMEPAD_ADDR, 0x40, b'\x00')
time.sleep(0.05)


def reconnect():
    i2c.writeto_mem(GAMEPAD_ADDR, 0x40, b'\x00')
    time.sleep(0.05 / FREQ_MOD)


while True:
    i2c.writeto(GAMEPAD_ADDR, b'\x00')
    time.sleep(0.05 / FREQ_MOD)
    data = i2c.readfrom(GAMEPAD_ADDR, 6)

    if (data[1] == 255):
        reconnect()
    else:
        dataA = 0x17 + (0x17 ^ data[4])
        dataB = 0x17 + (0x17 ^ data[5])

        if not (dataB & ~0b11111110):
            print("UP")
        if not (dataB & ~0b11111101):
            print("LEFT")
        if not (dataA & ~0b10111111):
            print("DOWN")
        if not (dataA & ~0b01111111):
            print("RIGHT")
        if not (dataA & ~0b11011111):
            print("L")
        if not (dataA & ~0b11111101):
            print("R")
        if not (dataB & ~0b11101111):
            print("A")
        if not (dataB & ~0b10111111):
            print("B")
        if not (dataB & ~0b11011111):
            print("Y")
        if not (dataB & ~0b11110111):
            print("X")
        if not (dataA & ~0b11101111):
            print("SELECT")
        if not (dataA & ~0b11111011):
            print("START")

これはきれいではありませんが、機能します(reconnect切断されてセットアップバイトが再度必要になる理由がわからない少し奇妙です)、押されているキーがあれば出力されます。

これまでのところ、次の CircuitPython コードを取得しています。

import time
import board
import busio
from adafruit_bus_device.i2c_device import I2CDevice

FREQ_MOD = 3

i2c = busio.I2C(board.GP17, board.GP16, frequency=30000)

while not i2c.try_lock():
    pass

time.sleep(0.01)

print([hex(x) for x in i2c.scan()])

time.sleep(0.01)
data = bytearray(6)

i2c.writeto(0x52, bytes([0x40, 0x00]))
time.sleep(0.01)

while True:
    i2c.writeto_then_readfrom(0x52, bytes([0x00]), data, out_start=0)
    print(data)
    time.sleep(1)

i2c.deinit()

しかし、セットアップビットを正しく実行できないため、読み取りを続けますbytearray(b'\xff\xff\xff\xff\xff\xff')

MicroPythonに相当するCircuitPythonが必要なだけだと思う​​ので、i2c.writeto_mem(0x52, 0x40, b'\x00')そこからはうまくいくはずです。

writeto_then_readfromまた、MicroPython で行われていることと同等ではない可能性もあります。

ありがとう

4

1 に答える 1