PS2无线手柄上有12个按键,两个摇杆,用来控制小车什么的足足有余。接掌控板需要占用 4 个数字口,一个输入,三个输出。折腾半天,可以判断哪个按键是否按下,还有在红模式下返回 2 个摇杆的模拟值。不过,使手柄震动测试没有成功。查资料也没找到原因,有可能是我的手柄有问题,因为是个三十几元的便宜货。有问题,找商家准备退货。
(程序在mpythonx 0.33下调试通过)
代码: 全选
from machine import Pin
import time
class PS2KEY:
def __init__(self,_di,_do,_cs,_clk):
self.di=Pin(_di,Pin.IN,Pin.PULL_DOWN)
self.do=Pin(_do,Pin.OUT)
self.cs=Pin(_cs,Pin.OUT)
self.clk=Pin(_clk,Pin.OUT)
self.ps2_init()
self.comd=[0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
self.data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
def ps2_init(self):
self.clk.value(1)
self.do.value(0)
time.sleep_ms(10)
# 红模式返回1,绿模式返回2, 错误返回0
def getMode(self):
if self.data[1] == 0x41:
return 2
elif self.data[1] == 0x73:
return 1
else:
return 0
def isPressed(self, keyIndex):
if keyIndex not in range(16):
raise IndexError
indexList = [1, 2, 4, 8, 16, 32, 64, 128]
if keyIndex < 8:
ref = indexList[keyIndex]
return not (self.data[3] & ref)
else:
ref = indexList[keyIndex-8]
return not (self.data[4] & ref)
def shake_left(self, speed):
self.comd[4] = speed
def shake_right(self, speed):
self.comd[3] = speed
# 返回左摇杆模拟值,红模式有效
def get_L_XY(self):
return self.data[5:7]
# 返回右摇杆模拟值,红模式有效
def get_R_XY(self):
return self.data[7:]
# 完成一次通信,请预先设置是否振动电机
# 获取任何结果前,请先完成一次通信
def cc(self):
self.data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
self.clk.value(1)
time.sleep_us(10)
self.cs.value(0)
time.sleep_us(10)
for i in range(9):
for ref in (1,2,4,8,16,32,64,128):
if self.comd[i]:
if ( ref & self.comd[i]):
self.do.value(1)
else:
self.do.value(0)
self.clk.value(1)
time.sleep_us(5)
self.clk.value(0)
time.sleep_us(10)
if(self.di.value()==1):
self.data[i]=ref|self.data[i]
self.clk.value(1)
time.sleep_us(5)
self.cs.value(1)
if __name__ == "__main__":
from mpython import *
ps2 = PS2KEY(Pin.P16, Pin.P15, Pin.P14, Pin.P13)
ps2.shake_right(200)
while True:
ps2.cc()
print(ps2.data)
oled.fill(0)
keyList = []
for i in range(16):
if ps2.isPressed(i):
keyList.append(i)
oled.DispChar(str(keyList), 0,0)
if ps2.getMode() == 1:
oled.DispChar(str(ps2.get_L_XY()), 0, 12)
oled.DispChar(str(ps2.get_R_XY()), 0, 24)
oled.show()