xbox手柄usb连接linux python控制
xbox手柄usb连接linux python控制
手柄在linux中叫joystick 首先插上手柄,打开目录/dev/input
,ls
看到里面以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控制相关推荐
- 苹果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 ...
- 苹果Usb连接linux,Mac使用数据线连接ios,安装deb
mac连接ios mac连接ios需要用到usbmuxd,这个可自行下载 到python-client目录下,将tcprely.py和usbmux.py拷贝到一个目录下或者就在当前目录下. 修改tcp ...
- 使用 Python 控制 USB 继电器
本文将介绍如何使用 Python 控制 USB 继电器,使用的硬件是一个 USB 继电器,一台 PC 和一根 USB 接口线. 准备工作 准备一台 PC 以及一条 USB 接口线,用于连接 USB 继 ...
- 利用usb远程控制linux,Linux编程控制硬件(5) ---- 操作USB手柄
Andrew Haung 转载请注明作者及联络方式 学员项目需要用到JoyStick来远程控制云台.以前在用SDL在游戏中很简单的就可以控制.但是现在需要在Linux C下直接调用C来控制JoySti ...
- 配置微软Xbox One手柄到ROS实现通讯控制
环境:Ubuntu16.04 + ROS kinetic 安装joy package joy package为通用的Linux操纵杆提供了ROS驱动,它包括了一个joy_node节点,可以让Linux ...
- WSL2下连接XBOX手柄详细教程
WSL2下连接手柄操作 前言 连接USB设备 重新编译内核 参考 前言 最近由于项目需要,要求在linux下连接xbox手柄去控制水下机器人(所以没有办法直接连在机器人上面)所以有了需要在WSL2上连 ...
- 给PS4装上Linux,然后用Xbox手柄打任天堂游戏?网友:这场面我没见过
丰色 发自 凹非寺 量子位 | 公众号 QbitAI 在PS4上用Xbox手柄打任天堂游戏,是一种怎样的体验? 最近,油管博主Linus Tech Tips的最新作品在PS玩家中可是掀起了一股热潮: ...
- bufferedreader接收不到数据_PS4、Xbox手柄和Switch跨次元组队?全靠八位堂USB无线接收器...
起因 应该不止我一个人是这样吧,喜欢玩Switch,但是不喜欢用Joy-Con手柄!因为无论是和手掌的贴合度还是按键的操作感,相比于专业的游戏手柄. 即使有装Joy-Con的握把,依然无法弥补手感上的 ...
- xbox手柄接收器驱动_xbox手柄连接 win10电脑
xbox手柄 连接win10笔记本 分为三种连接方式: 有线 蓝牙 无线适配器 首先说明一下连接方式的特点然后说明连接方式 第一种:有线连接 手柄直接通过micro USB数据线和win10电脑连接. ...
最新文章
- wget下载https时遇到not trusted下载不了的解决办法
- WebClient DownloadFile 用法
- CSS知识点整理(2):框模型,定位
- K8S+Harbor+gluster+haproxy 实践加坑
- ORACLE 表空间扩展方法
- “我辞退了一位学位学历造假的程序员“
- 小程序嵌套h5界面,在h5界面调用小程序的扫一扫功能
- 联合分布概率密度函数
- 智能聊天机器人平台的架构与应用
- Team Foundation Server 开发流程管理管理研讨会
- 配置postfix邮件监控
- php 2038,php实现兼容2038年后Unix时间戳转换函数
- 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)
- 诗歌(1)—定风波(常羡)
- Service Mesh发展历程
- 上半年最中意的 GitHub 更新「GitHub 热点速览 v.22.21」
- 中国最懒城市,这里的人不想赚钱,只想躺平
- idea做一个日志自动生成的jar包,并用flume做生产者,采集日志数据,用kafka做消费者来消费日志数据
- 乱七八糟的概念[更新中...]
- 全志A63_SDK_User_Manual,全志A63_Android N快速移植手册
热门文章
- 微信发单机器人_微信多客服系统SDK通信接口
- java 接口重写_java如何实现接口中的重写
- AbstractQueuedSynchronizer同步队列与Condition等待队列协同机制
- 设计模式(二)(C++)
- SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解
- STM32CubeMx-SPI读写W25QXXX
- zabbix lld使用trapper方式(zabbix_sender)
- 在html5页面中添加canvas,HTML页面中添加Canvas标签示例
- 二进制,CPU,操作系统
- 一道分蛋糕的joj题