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 で行われていることと同等ではない可能性もあります。
ありがとう