使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」

使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」最近,在学习使用树莓派的gpio,想直接通过树莓派直接控制ps2游戏手柄,但是在网上资料较少。直到发现了这个参考资料,我修改了一小部分代码,实现直接使用树莓派自带的gpio库函数来调用。#TheseareourbuttonconstantsimporttimeimportRPi.GPIOasgpioPSB_SELECT=1PSB_L3=2PSB_R3=3PSB_START=4PSB_PAD_UP=5PSB_PAD_RIGHT=6PSB_PAD

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

       准毕业本科狗在指导老师的带领下,打算做一个使用履带机器人。以前也接触过一点树莓派,就打算用树莓派作为主控板(虽然有点傻),一方面也考虑了后续要使用opencv库作图像处理。做的时候,想一开始用ps2手柄控制机器人,奈何网上资料都是stm32和arduino的。

       经过几天的查资料,我找到了micropython的ps2库(参考资料),但是为了直接使用树莓派自带的gpio,我稍微对程序做了一点修改,希望能给需要的同学一点帮助。


import time
import RPi.GPIO as gpio

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

#右摇杆X轴数据
PSS_RX = 5
PSS_RY = 6
PSS_LX = 7
PSS_LY = 8
comd = [0x01, 0x42] #开始指令
data = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]#数据存储数组

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
] #按键值与按键说明

class PS2KEY:

    def __init__(self,DAT,CMD,CS,CLK):
        gpio.setmode(gpio.BCM)     #选择 gpio numbers 编号系统
        gpio.setwarnings(False)

        # 设置gpio口为输出
        gpio.setup(DAT, gpio.IN, pull_up_down=gpio.PUD_DOWN)
        gpio.setup(CMD, gpio.OUT)
        gpio.setup(CS, gpio.OUT)
        gpio.setup(CLK, gpio.OUT)

        self.DAT = DAT
        self.CMD = CMD
        self.CS = CS
        self.CLK = CLK

        self.ps2_init()
        #self.ps2_red()

    #手柄初始化
    def ps2_init(self):
        gpio.output(self.CS, True)
        gpio.output(self.CLK, True)
        gpio.output(self.CMD, True)
        time.sleep(0.01)

    #发送数据
    def ps2_cmd(self,cmd):
        global data            
        data[1]=0
        for ref in (1,2,4,8,16,32,64,128):
            if (ref & cmd):
                gpio.output(self.CMD, True)
            else:
                gpio.output(self.CMD, False)
            gpio.output(self.CLK, True)
            time.sleep(0.00005)
            gpio.output(self.CLK, False)
            time.sleep(0.00005)
            gpio.output(self.CLK, True)
            if(gpio.input(self.DAT)):
                data[1]=ref|data[1]
        time.sleep(0.000016)

    #判断是否为红灯模式 是--返回0 否--返回1
    def ps2_red(self):
        global data
        global comd
        gpio.output(CS, False)
        self.ps2_cmd(comd[0])
        self.ps2_cmd(comd[1])
        gpio.output(CS, True)
        if(data[1]==57):
            return 0#red light
        else:
            return 1#not red
    #读取手柄数据
    def ps2_read(self):
        global data
        global comd
        byte=0
        ref=0x01
        gpio.output(self.CS, False)
        self.ps2_cmd(comd[0])
        self.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):
               gpio.output(self.CLK, True)
               gpio.output(self.CLK, False)
               time.sleep(0.00005)
               gpio.output(self.CLK, True)
               if(gpio.input(self.DAT)):
                   data[byte]=ref|data[byte]
            time.sleep(0.00005)
        gpio.output(self.CS, True)

    #清空data
    def ps2_clear(self):#ok
        global data
        for i in range(9):
            data[i]=0
    
    #输出摇杆数据(0-255)
    def ps2_andata(self,button):
        global data
        return data[button]

   #输出按下的按键对应编号
    def ps2_key(self):
        global data
        global mask
        self.ps2_clear()
        self.ps2_read()
        handkey=(data[4]<<8)|data[3]
        for index in range(16):
          if ((handkey&(1<<(mask[index]-1)))==0):
              return index+1
        return 0

 

实物连接图使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」

    这里测试了手柄△、□、○、×这几个按键返回的值。使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」

PS:这是我第一次写博客,有错误请多多指教!!谢谢!

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

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

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


相关推荐

  • 最长上升子序列 LIS算法实现[通俗易懂]

    最长上升子序列 LIS算法实现[通俗易懂]最长上升子序列LIS算法实现LIS(LongestIncreasingSubsequence)最长上升(不下降)子序列有两种算法复杂度为O(n*logn)和O(n^2)。在上述算法中,若使用朴素的顺序查找在D1..Dlen查找,由于共有O(n)个元素需要计算,每次计算时的复杂度是O(n),则整个算法的时间复杂度为O(n^2),与原来算法相比没有任何进步。但是由于D的特点(2),在D中查…

    2022年6月5日
    25
  • centos dhcp服务器配置_dhcp server什么意思

    centos dhcp服务器配置_dhcp server什么意思如何让linuxdhcpserver同时支持option60和option82认证(2012-06-0703:26:06)标签:linux认证serveroption如何杂谈如何让linuxdhcpserver同时支持option60和option82认证ddns-update-styleinterim;ignoreclient-updates;#DVNDHCP#class…

    2022年10月9日
    4
  • 【菜鸟学Python】案例一:汇率换算「建议收藏」

    【菜鸟学Python】案例一:汇率换算「建议收藏」汇率换算V1.0案例描述:设计一个汇率换算器程序,其功能是将外币换算成人民币,或者相反案例分析:分析问题:分析问题的计算部分;确定问题:将问题划分为输入、处理及输出部分;设计算法:计算部分

    2022年7月5日
    25
  • maven安装步骤_eclipse使用maven教程

    maven安装步骤_eclipse使用maven教程前言本篇文章是基于win10系统下载安装Maven的教程。一、Maven介绍1.什么是Maven​ Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目,其主要服务于基于Java平台的项目创建,依赖管理和项目信息管理。maven是Apache的顶级项目,解释为“专家,内行”,它是一个项目管理的工具,maven自身是纯java开发的,可以使用maven对java项目进行构建、依赖管理。2.Maven的作用依赖管理依赖指的就是是我们项目中需要使用的第三方

    2025年10月3日
    3
  • pandas中的loc和iloc_pandas获取指定数据的行和列

    pandas中的loc和iloc_pandas获取指定数据的行和列实际操作中我们经常需要寻找数据的某行或者某列,这里介绍我在使用Pandas时用到的两种方法:iloc和loc。目录1.loc方法(1)读取第二行的值(2)读取第二列的值(3)同时读取某行某列(4)读取DataFrame的某个区域(5)根据条件读取(6)也可以进行切片操作2.iloc方法(1)读取第二行的值(2)读取第二行的值(3)同时读取某行某列(4)进行切片操作loc:通过行、列的名称或标签来索引iloc:通过行、列的索引位置来寻找数据..

    2022年8月30日
    7
  • 贪吃蛇电脑代码能直接玩_贪吃蛇为什么能安装不能玩

    贪吃蛇电脑代码能直接玩_贪吃蛇为什么能安装不能玩贪吃蛇无敌版,可穿墙,英文输入法小写字母wasd操作。

    2025年9月13日
    7

发表回复

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

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