xbox手柄usb连接linux python控制

手柄在linux中叫joystick 首先插上手柄,打开目录/dev/inputls看到里面以js0,js1等文件就是手柄的输入。
用这个代码。
这个代码的效果跟jstest效果一样。就是输出你按下的手柄信息。可以根据自己的需求修改。

import os, struct, array
from fcntl import ioctl# Iterate over the joystick devices.
print('Available devices:')for fn in os.listdir('/dev/input'):if fn.startswith('js'):print('  /dev/input/%s' % (fn))
# 这句显示手柄在硬件中的端口位置: /dev/input/js0
# We'll store the states here.
axis_states = {'LX': 0,'LY': 0,'RX': 0,'RY': 0,'LT': 0,'RT': 0,'XX': 0,'YY': 0,
}
button_states = {'A': 0,'B': 0,'X': 0,'Y': 0,'LB': 0,'RB': 0,'START': 0,'BACK': 0,'HOME': 0,'LO': 0,'RO': 0,
}# 先前校验时,方向盘是x,左侧踏板是z,右侧踏板是rz。XBOX_TYPE_BUTTON = 0x01
XBOX_TYPE_AXIS = 0x02XBOX_BUTTON_A = 0x00
XBOX_BUTTON_B = 0x01
XBOX_BUTTON_X = 0x02
XBOX_BUTTON_Y = 0x03
XBOX_BUTTON_LB = 0x04
XBOX_BUTTON_RB = 0x05
XBOX_BUTTON_START = 0x06
XBOX_BUTTON_BACK = 0x07
XBOX_BUTTON_HOME = 0x08
XBOX_BUTTON_LO = 0x09    # /* 左摇杆按键 */
XBOX_BUTTON_RO = 0x0a    # /* 右摇杆按键 */XBOX_BUTTON_ON = 0x01
XBOX_BUTTON_OFF = 0x00XBOX_AXIS_LX = 0x00   # /* 左摇杆X轴 */
XBOX_AXIS_LY = 0x01   # /* 左摇杆Y轴 */
XBOX_AXIS_RX = 0x03   # /* 右摇杆X轴 */
XBOX_AXIS_RY = 0x04   # /* 右摇杆Y轴 */
XBOX_AXIS_LT = 0x02
XBOX_AXIS_RT = 0x05
XBOX_AXIS_XX = 0x06    # /* 方向键X轴 */
XBOX_AXIS_YY = 0x07    # /* 方向键Y轴 */XBOX_AXIS_VAL_UP = -32767
XBOX_AXIS_VAL_DOWN = 32767
XBOX_AXIS_VAL_LEFT = -32767
XBOX_AXIS_VAL_RIGHT = 32767XBOX_AXIS_VAL_MIN = -32767
XBOX_AXIS_VAL_MAX = 32767
XBOX_AXIS_VAL_MID = 0x00fn = '/dev/input/js0'
def xbox_read():jsdev = open(fn, 'rb')evbuf = jsdev.read(8)time, value, type, number = struct.unpack('IhBB', evbuf)return [time,value,type,number]axis_map = []
axis_names = {0x00: 'x',0x02: 'z',0x05: 'rz',}
# Open the joystick device.jsdev = open(fn, 'rb')# # Get the device name.
buf = array.array('u', ['\0'] * 5)
ioctl(jsdev, 0x80006a13 + (0x10000 * len(buf)), buf)  # JSIOCGNAME(len)
js_name = buf.tostring()
print('Device name: %s' % js_name)# Get number of axes and buttons.
buf = array.array('B', [0])
ioctl(jsdev, 0x80016a11, buf)  # JSIOCGAXES
num_axes = buf[0]# Get the axis map.
buf = array.array('B', [0] * 0x40)
ioctl(jsdev, 0x80406a32, buf)  # JSIOCGAXMAP
## Main event loop
while True:evbuf = jsdev.read(8)if evbuf:time, value, type, number = struct.unpack('IhBB', evbuf)if type & 0x01:if number == XBOX_BUTTON_A:button_states["A"] = valueelif number == XBOX_BUTTON_B:button_states["B"] = valueelif number == XBOX_BUTTON_X:button_states["X"] = valueelif number == XBOX_BUTTON_Y:button_states["Y"] = valueelif number == XBOX_BUTTON_LB:button_states["LB"] = valueelif number == XBOX_BUTTON_RB:button_states["RB"] = valueelif number == XBOX_BUTTON_START:button_states["START"] = valueelif number == XBOX_BUTTON_BACK:button_states["BACK"] = valueelif number == XBOX_BUTTON_HOME:button_states["HOME"] = valueelif number == XBOX_BUTTON_LO:button_states["LO"] = valueelif number == XBOX_BUTTON_RO:button_states["RO"] = valueprint(button_states)elif type & 0x02:if number == XBOX_AXIS_LX:axis_states["LX"] = valueelif number == XBOX_AXIS_LY:axis_states["LY"] = valueelif number == XBOX_AXIS_RX:axis_states["RX"] = valueelif number == XBOX_AXIS_RY:axis_states["RY"] = valueelif number == XBOX_AXIS_LT:axis_states["LT"] = valueelif number == XBOX_AXIS_RT:axis_states["RT"] = valueelif number == XBOX_AXIS_XX:axis_states["XX"] = valueelif number == XBOX_AXIS_YY:axis_states["YY"] = valueprint(axis_states)

关于ioctl的参数问题

主要解释一下代码中ioctl的第二个参数是怎么来的。以ioctl(jsdev, 0x80016a11, buf) # JSIOCGAXES举个例子。
首先查看库文件linux/joystick.h部分代码如下


emmmm…懒得找了就这样吧

自己找就可以看到。解释一下数据结构

如果真的感兴趣先去看一下这个博客关于构造IOCTL命令的学习心得

那么我们就可以知道

这个实际上是在joystick.h中的# JSIOCGAXES
这个函数的调用代码

6a实际上就是在ASCII码中的字符j也就是joystick的幻数。

这两位代表方向。这个位置是表示读数据。另外一位,置1表示写。后面的14位表示读取多少字节的数据。

这么讲应该可以自己构造数值了。
不过似乎只用上面的代码就可以了。
joystick官方api

xbox手柄usb连接linux python控制相关推荐

  1. 苹果Usb连接linux,Mount iPhone in Linux using USB (ifuse, libiphone)

    Finally, it's working. Mounting the iPhone in Linux over USB. No stupid (ADHOC) wireless connection ...

  2. 苹果Usb连接linux,Mac使用数据线连接ios,安装deb

    mac连接ios mac连接ios需要用到usbmuxd,这个可自行下载 到python-client目录下,将tcprely.py和usbmux.py拷贝到一个目录下或者就在当前目录下. 修改tcp ...

  3. 使用 Python 控制 USB 继电器

    本文将介绍如何使用 Python 控制 USB 继电器,使用的硬件是一个 USB 继电器,一台 PC 和一根 USB 接口线. 准备工作 准备一台 PC 以及一条 USB 接口线,用于连接 USB 继 ...

  4. 利用usb远程控制linux,Linux编程控制硬件(5) ---- 操作USB手柄

    Andrew Haung 转载请注明作者及联络方式 学员项目需要用到JoyStick来远程控制云台.以前在用SDL在游戏中很简单的就可以控制.但是现在需要在Linux C下直接调用C来控制JoySti ...

  5. 配置微软Xbox One手柄到ROS实现通讯控制

    环境:Ubuntu16.04 + ROS kinetic 安装joy package joy package为通用的Linux操纵杆提供了ROS驱动,它包括了一个joy_node节点,可以让Linux ...

  6. WSL2下连接XBOX手柄详细教程

    WSL2下连接手柄操作 前言 连接USB设备 重新编译内核 参考 前言 最近由于项目需要,要求在linux下连接xbox手柄去控制水下机器人(所以没有办法直接连在机器人上面)所以有了需要在WSL2上连 ...

  7. 给PS4装上Linux,然后用Xbox手柄打任天堂游戏?网友:这场面我没见过

    丰色 发自 凹非寺 量子位 | 公众号 QbitAI 在PS4上用Xbox手柄打任天堂游戏,是一种怎样的体验? 最近,油管博主Linus Tech Tips的最新作品在PS玩家中可是掀起了一股热潮: ...

  8. bufferedreader接收不到数据_PS4、Xbox手柄和Switch跨次元组队?全靠八位堂USB无线接收器...

    起因 应该不止我一个人是这样吧,喜欢玩Switch,但是不喜欢用Joy-Con手柄!因为无论是和手掌的贴合度还是按键的操作感,相比于专业的游戏手柄. 即使有装Joy-Con的握把,依然无法弥补手感上的 ...

  9. xbox手柄接收器驱动_xbox手柄连接 win10电脑

    xbox手柄 连接win10笔记本 分为三种连接方式: 有线 蓝牙 无线适配器 首先说明一下连接方式的特点然后说明连接方式 第一种:有线连接 手柄直接通过micro USB数据线和win10电脑连接. ...

最新文章

  1. wget下载https时遇到not trusted下载不了的解决办法
  2. WebClient DownloadFile 用法
  3. CSS知识点整理(2):框模型,定位
  4. K8S+Harbor+gluster+haproxy 实践加坑
  5. ORACLE 表空间扩展方法
  6. “我辞退了一位学位学历造假的程序员“
  7. 小程序嵌套h5界面,在h5界面调用小程序的扫一扫功能
  8. 联合分布概率密度函数
  9. 智能聊天机器人平台的架构与应用
  10. Team Foundation Server 开发流程管理管理研讨会
  11. 配置postfix邮件监控
  12. php 2038,php实现兼容2038年后Unix时间戳转换函数
  13. 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
  14. 诗歌(1)—定风波(常羡)
  15. Service Mesh发展历程
  16. 上半年最中意的 GitHub 更新「GitHub 热点速览 v.22.21」
  17. 中国最懒城市,这里的人不想赚钱,只想躺平
  18. idea做一个日志自动生成的jar包,并用flume做生产者,采集日志数据,用kafka做消费者来消费日志数据
  19. 乱七八糟的概念[更新中...]
  20. 全志A63_SDK_User_Manual,全志A63_Android N快速移植手册

热门文章

  1. 微信发单机器人_微信多客服系统SDK通信接口
  2. java 接口重写_java如何实现接口中的重写
  3. AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制
  4. 设计模式(二)(C++)
  5. SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解
  6. STM32CubeMx-SPI读写W25QXXX
  7. zabbix lld使用trapper方式(zabbix_sender)
  8. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例
  9. 二进制,CPU,操作系统
  10. 一道分蛋糕的joj题