TA的每日心情 | 开心 2019-10-6 19:57 |
---|
签到天数: 62 天 [LV.6]常住居民II
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 chpczx 于 2019-8-8 13:44 编辑
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()
-
复制代码
PS2无线手柄遥控器资料.zip
(1.68 MB, 下载次数: 1)
|
|