立即注册

micropython-microbit 中文社区

查看: 96|回复: 4

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

  [复制链接]
  • TA的每日心情
    开心
    2019-10-6 19:57
  • 签到天数: 62 天

    [LV.6]常住居民II

    发表于 2019-8-5 21:54:48 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 chpczx 于 2019-8-8 13:44 编辑

    PS2无线手柄上有12个按键,两个摇杆,用来控制小车什么的足足有余。
    接掌控板需要占用 4 个数字口,一个输入,三个输出。
    折腾半天,可以判断哪个按键是否按下,还有在红模式下返回 2 个摇杆
    的模拟值。不过,使手柄震动测试没有成功。查资料也没找到原因,有可能
    是我的手柄有问题,因为是个三十几元的便宜货。有问题,找商家准备退货。
    (程序在mpythonx 0.33下调试通过)

    1. from machine import Pin
    2. import time

    3. class PS2KEY:
    4.     def __init__(self,_di,_do,_cs,_clk):
    5.         self.di=Pin(_di,Pin.IN,Pin.PULL_DOWN)
    6.         self.do=Pin(_do,Pin.OUT)
    7.         self.cs=Pin(_cs,Pin.OUT)
    8.         self.clk=Pin(_clk,Pin.OUT)
    9.         
    10.         self.ps2_init()
    11.         
    12.         self.comd=[0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
    13.         self.data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
    14.         
    15.     def ps2_init(self):
    16.         self.clk.value(1)
    17.         self.do.value(0)
    18.         time.sleep_ms(10)
    19.    
    20.     # 红模式返回1,绿模式返回2, 错误返回0
    21.     def getMode(self):
    22.         if self.data[1] == 0x41:
    23.             return 2
    24.         elif self.data[1] == 0x73:
    25.             return 1
    26.         else:
    27.             return 0
    28.    
    29.     def isPressed(self, keyIndex):
    30.         if keyIndex  not in range(16):
    31.             raise IndexError
    32.         indexList = [1, 2, 4, 8, 16, 32, 64, 128]
    33.         if keyIndex < 8:
    34.             ref = indexList[keyIndex]
    35.             return not (self.data[3] & ref)
    36.         else:
    37.             ref = indexList[keyIndex-8]
    38.             return not (self.data[4] & ref)
    39.    
    40.     def shake_left(self, speed):
    41.         self.comd[4] = speed
    42.         
    43.     def shake_right(self, speed):
    44.         self.comd[3] = speed
    45.         
    46.     # 返回左摇杆模拟值,红模式有效
    47.     def get_L_XY(self):
    48.         return self.data[5:7]
    49.    
    50.     # 返回右摇杆模拟值,红模式有效
    51.     def get_R_XY(self):
    52.         return self.data[7:]
    53.         
    54.     # 完成一次通信,请预先设置是否振动电机
    55.     # 获取任何结果前,请先完成一次通信
    56.     def cc(self):
    57.         self.data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]

    58.         self.clk.value(1)
    59.         time.sleep_us(10)
    60.         self.cs.value(0)
    61.         time.sleep_us(10)
    62.         for i in range(9):
    63.             for ref in (1,2,4,8,16,32,64,128):
    64.                 if self.comd[i]:
    65.                     if ( ref & self.comd[i]):
    66.                         self.do.value(1)
    67.                     else:
    68.                         self.do.value(0)
    69.                 self.clk.value(1)
    70.                 time.sleep_us(5)
    71.                 self.clk.value(0)
    72.                 time.sleep_us(10)
    73.                 if(self.di.value()==1):
    74.                     self.data[i]=ref|self.data[i]
    75.                 self.clk.value(1)
    76.                 time.sleep_us(5)
    77.         self.cs.value(1)

    78.         
    79. if __name__ == "__main__":
    80.     from mpython import *
    81.     ps2 = PS2KEY(Pin.P16, Pin.P15, Pin.P14, Pin.P13)
    82.     ps2.shake_right(200)
    83.     while True:
    84.         ps2.cc()
    85.         print(ps2.data)
    86.         oled.fill(0)
    87.         keyList = []
    88.         for i in range(16):
    89.             if ps2.isPressed(i):
    90.                 keyList.append(i)
    91.         oled.DispChar(str(keyList), 0,0)
    92.         if ps2.getMode() == 1:
    93.             oled.DispChar(str(ps2.get_L_XY()), 0, 12)
    94.             oled.DispChar(str(ps2.get_R_XY()), 0, 24)
    95.         oled.show()
    96.         
    复制代码

    PS2无线手柄遥控器资料.zip (1.68 MB, 下载次数: 1)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-6 19:57
  • 签到天数: 62 天

    [LV.6]常住居民II

     楼主| 发表于 2019-8-6 11:13:25 | 显示全部楼层
    程序中有错误的地方,已经改正过来了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2019-8-8 08:51:01 | 显示全部楼层
    可以在详细一下吗?比如手柄的接线定义,链接方式等。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-6 19:57
  • 签到天数: 62 天

    [LV.6]常住居民II

     楼主| 发表于 2019-8-8 13:41:30 | 显示全部楼层


    IMG_0003.jpg IMG_0004.jpg

    PS2无线手柄遥控器资料.zip (1.68 MB, 下载次数: 1)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2019-8-9 08:32:41 | 显示全部楼层

    非常感谢提供的资料,有空研究看看。
    回复 支持 反对

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区

    GMT+8, 2019-12-5 23:53 , Processed in 0.103592 second(s), 23 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表