我正在尝试编写一些代码以在 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 中所做的。
谢谢