掌控板PS2无线手柄驱动(micropython)

MicroPython相关代码、库、软件、工具
回复
头像
shaoziyang
帖子: 3917
注册时间: 2019年 10月 21日 13:48

掌控板PS2无线手柄驱动(micropython)

#1

帖子 shaoziyang »

原帖作者:chpczx 发表于 2019-8-5

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()
        
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章