咸鱼ZTMR实例—PS2手柄

咸鱼ZTMR实例—PS2手柄咸鱼ZTMR实例—PS2手柄主控板:ZTMR开发板PS2手柄PS2手柄是游戏机的遥控手柄。psx系列游戏主机在全球很是畅销。不知什么时候便有人打起PS2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的机器人。突出的特点是现在这款手柄性价比极高。按键丰富,方便扩展到其它应用中。PS2由手柄与接收器两部分组成,手柄主要负责发送按键信息。都接通电…

大家好,又见面了,我是你们的朋友全栈君。

咸鱼ZTMR实例—PS2手柄


主控板:ZTMR开发板

PS2手柄

PS2 手柄是游戏机的遥控手柄。psx 系列游戏主机在全球很是畅销。不知什么时候便有人打起 PS2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的机器人。突出的特点是现在这款手柄性价比极高。按键丰富,方便扩展到其它应用中。

在这里插入图片描述

PS2 由手柄与接收器两部分组成,手柄主要负责发送按键信息。都接通电源并打开手柄开关时,手柄与接收器自动配对连接,在未配对成功的状态下,接收器绿灯闪烁,手柄上的灯也会闪烁,配对成功后,接收器上绿灯常亮,手柄上灯也常亮,这时可以按“MODE”键,选择手柄发送模式,红灯模式:遥杆输出模拟值;绿灯模式:遥杆对应上面四个按键,只有四个极限方向对应。
接收器和主机(单片机)相连,实现主机与手柄之间的通讯。

接收器引脚输出:
在这里插入图片描述

1 2 3 4 5 6 7 8 9
DI/DAT DO/CMD NC GND VDD CS/SEL CLK NC ACK

例程:串口打印PS2按钮信息
main.py

# main.py -- put your code here!
import ps2


def main():
  while True:
    pyb.delay(100)
    print('xycs:',ps2.ps2_key())
if __name__ == '__main__':
    main()

网上已经有开源的PS2手柄定义了, 我们保存成ps2.py文件直接保存起来就好了

ps2.py

from machine import Pin
import time
def ps2_test():
  print('test ok')
di=Pin(Pin.cpu.C6,Pin.IN,Pin.PULL_DOWN)                     
do=Pin(Pin.cpu.C7,Pin.OUT, )                                             
cs=Pin(Pin.cpu.B0,Pin.OUT,)     #PULL_UP 
clk=Pin(Pin.cpu.B1,Pin.OUT,) 

#D0 16 dat=DI
#D2 04 cmd=DO
#D3 0 CS =CS
#D4 02 CLK=CLK 
def DO_H():
  do.value(1)
def DO_L():
  do.value(0)
def CS_H ():
  cs.value(1)
def CS_L():
  cs.value(0)
def CLK_H ():
  clk.value(1)
def CLK_L():
  clk.value(0)

#常量按钮
PSB_SELECT     = 1
PSB_L3         = 2
PSB_R3         = 3
PSB_START      = 4
PSB_PAD_UP     = 5
PSB_PAD_RIGHT  = 6
PSB_PAD_DOWN   = 7
PSB_PAD_LEFT   = 8
PSB_L2         = 9
PSB_R2         = 10
PSB_L1         = 11
PSB_R1         = 12
PSB_GREEN      = 13
PSB_RED        = 14
PSB_BLUE       = 15
PSB_PINK       = 16
PSB_TRIANGLE   = 13
PSB_CIRCLE     = 14
PSB_CROSS      = 15
PSB_SQUARE     = 26
# 左摇杆
PSS_RX = 5                
PSS_RY = 6
PSS_LX = 7
PSS_LY = 8
mask=[
PSB_SELECT,
    PSB_L3,
    PSB_R3 ,
    PSB_START,
    PSB_PAD_UP,
    PSB_PAD_RIGHT,
    PSB_PAD_DOWN,
    PSB_PAD_LEFT,
    PSB_L2,
    PSB_R2,
    PSB_L1,
    PSB_R1 ,
    PSB_GREEN,
    PSB_RED,
    PSB_BLUE,
    PSB_PINK]
comd=[0x01,0x42]
data=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
def ps2_init():
  CLK_H()
  DO_H()
  time.sleep_ms(10)
def ps2_cmd(cmd):
  global data
  data[1]=0
  for ref in (1,2,4,8,16,32,64,128):
    if ( ref & cmd):
     DO_H()
    else:
     DO_L()
    CLK_H ()
    time.sleep_us(50)
    CLK_L()
    time.sleep_us(50)
    CLK_H ()
    if(di.value()==1):
     data[1]=ref|data[1]
def ps2_red():
  global data
  global comd
  CS_L()
  ps2_cmd(comd[0])
  ps2_cmd(comd[1])
  CS_H()
  if(data[1]==57):
    return 0#red light
  else:
    return 1#not red
def ps2_read():
  global data
  global comd
  byte=0
  ref=0x01
  CS_L()
  ps2_cmd(comd[0])
  ps2_cmd(comd[1])
  for byte in (2,3,4,5,6,7,8):
    for ref in (1,2,4,8,16,32,64,128):
     CLK_H ()
     CLK_L()
     time.sleep_us(50)
     CLK_H ()
     if(di.value()==1):
      data[byte]= ref|data[byte]
    time.sleep_us(50)
  CS_H ()
def ps2_clear():#ok
  global data
  for i in range(0,9,1):
    data[i]=0

def ps2_andata(button):
  global data
  return data[button]
def ps2_key():
  global data
  global mask
  ps2_clear()
  ps2_read()
  handkey=(data[4]<<8)|data[3]
  for index in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15):
    if (( handkey&(1<<(mask[index]-1)))==0):
     return index+2
  return 0

串口效果
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133125.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hash值_hash转换链接

    hash值_hash转换链接任何类都继承publicinthashCode()方法,该方法返回的值是通过将该对象的内部地址转换为一个整数来实现的,hash表的主要作用就是在对对象进行散列的时候作为key输入。我们需要每个对象

    2022年8月4日
    7
  • 淘宝装修代码大全(完整版)

    淘宝装修代码大全(完整版)1.公告栏的装修图片代码,帖到公告栏就行了.不过还是有好多人来问我公告栏的位置—–点我的淘宝—–管理我的店铺——基本设置,下面写着公告的位置。<imgsrc=&quot

    2022年7月4日
    23
  • 怎么把sql删干净_sql的导入和导出的好处

    怎么把sql删干净_sql的导入和导出的好处程序数据库(PDB)文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。在使用/debug生成时,会创建一个PDB文件。可以使用/debug:full或/debug:pdbonly生成应用程序。使用/debug:full生成将产生可调试的代码。使用/debug:pdbonly生成将产生PDB,但是不会产生通知JIT编译器调试信息可用…

    2022年9月25日
    0
  • 大屏数据可视化案例「建议收藏」

    大屏数据可视化案例「建议收藏」数据可视化:把相对复杂的、抽象的数据通过可视的、交互的方式进行展示,从而形象直观地表达数据蕴含的信息和规律。数据可视化是数据空间到图形空间的映射,是抽象数据的具象表达。数据可视化交互的基本原则:总览为先,缩放过滤按需查看细节。大屏数据可视化是当前可视化领域的一项热门应用,通常可以分为信息展示类、数据分析类及监控预警类。大屏数据可视化应用的难点并不在于图表类型的多样化,而在于如何能在…

    2022年6月27日
    31
  • 26.学习Camera之——PDAF(相位对焦)的基本原理

    26.学习Camera之——PDAF(相位对焦)的基本原理在自动对焦的时候总是有一个困惑,知道图像是不清楚的,但是lens应该向前还是向后移动呢?总是要前后移动lens一下才知道,普通的反差法对焦就是这么做的,爬山嘛。PDAF的出现就是为了解决这个lens移动的问题,可以根据图像,预判lens运动的方向。PDAF最早运用在单反上,已经是非常成熟的技术了,原理如下图。左图为CCD在焦后的情况,右图为焦前。当CCD在焦后时,在线阵CCD1和CCD2上会发现聚焦点CCD1的在左,反之,则聚焦点CCD2的在左(图中红色标记的光线)。这种方法需要加.

    2022年9月6日
    3
  • redis 主从架构(sizeof函数怎么计算)

    一.绪论   Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生。   当Slave启动并连接到Master之后,它将主动发送一个SYNC命令(首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件]Master会…

    2022年4月12日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号