Python XBox One使用带EVDEV的模拟棒无线控制伺服
我正在使用Evdev读取XBOX ONE的A、B、X、Y输入,取得了巨大的成功。然而,我正在努力获取模拟棒输入。有人能帮我编写Python代码吗 我正试图控制一个伺服系统 这是我迄今为止的代码,它工作“完美”。我需要知道如何读取(xbox)操纵杆的输出,这样我就可以为伺服设置“GPIO.PWM”Python XBox One使用带EVDEV的模拟棒无线控制伺服,python,xbox,servo,evdev,Python,Xbox,Servo,Evdev,我正在使用Evdev读取XBOX ONE的A、B、X、Y输入,取得了巨大的成功。然而,我正在努力获取模拟棒输入。有人能帮我编写Python代码吗 我正试图控制一个伺服系统 这是我迄今为止的代码,它工作“完美”。我需要知道如何读取(xbox)操纵杆的输出,这样我就可以为伺服设置“GPIO.PWM” from evdev import InputDevice, categorize, ecodes, KeyEvent import RPi.GPIO as GPIO from
from evdev import InputDevice, categorize, ecodes, KeyEvent
import RPi.GPIO as GPIO
from time import sleep
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(7, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(11, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)
gamepad = InputDevice('/dev/input/event2')
#evdev takes care of polling the controller in a loop
for event in gamepad.read_loop():
if event.type == ecodes.EV_KEY:
keyevent = categorize(event)
if keyevent.keystate == KeyEvent.key_down:
if keyevent.keycode[0] == "BTN_A":
print "Button A Pressed"
GPIO.output (8, GPIO.HIGH)
elif keyevent.keycode[0] == "BTN_B":
print "Button B Pressed"
GPIO.output (7, GPIO.HIGH)
elif keyevent.keycode[0] == "BTN_WEST":
print "Button Y Pressed"
GPIO.output (11, GPIO.HIGH)
elif keyevent.keycode[0] == "BTN_NORTH":
print "Button X Pressed"
GPIO.output (12, GPIO.HIGH)
if keyevent.keystate == KeyEvent.key_up:
if keyevent.keycode[0] == "BTN_A":
print "Button A Released"
GPIO.output (8, GPIO.LOW)
elif keyevent.keycode[0] == "BTN_B":
print "Button B Released"
GPIO.output (7, GPIO.LOW)
elif keyevent.keycode[0] == "BTN_WEST":
print "Button Y Released"
GPIO.output (11, GPIO.LOW)
elif keyevent.keycode[0] == "BTN_NORTH":
print "Button X Released"
GPIO.output (12, GPIO.LOW)
我正在做一个类似的项目,用XBox One无线控制器控制一个坦克式机器人,我已经画出了绝对轴,以左杆向前/向后移动和右杆转动为例 Python不是我最喜欢的语言,可能还有更好的校准方法,但我把它拼凑了起来。希望能有帮助
from evdev import list_devices, InputDevice, categorize, ecodes
CENTER_TOLERANCE = 350
STICK_MAX = 65536
dev = InputDevice( list_devices()[0] )
axis = {
ecodes.ABS_X: 'ls_x', # 0 - 65,536 the middle is 32768
ecodes.ABS_Y: 'ls_y',
ecodes.ABS_Z: 'rs_x',
ecodes.ABS_RZ: 'rs_y',
ecodes.ABS_BRAKE: 'lt', # 0 - 1023
ecodes.ABS_GAS: 'rt',
ecodes.ABS_HAT0X: 'dpad_x', # -1 - 1
ecodes.ABS_HAT0Y: 'dpad_y'
}
center = {
'ls_x': STICK_MAX/2,
'ls_y': STICK_MAX/2,
'rs_x': STICK_MAX/2,
'rs_y': STICK_MAX/2
}
last = {
'ls_x': STICK_MAX/2,
'ls_y': STICK_MAX/2,
'rs_x': STICK_MAX/2,
'rs_y': STICK_MAX/2
}
for event in dev.read_loop():
# calibrate zero on Y button
if event.type == ecodes.EV_KEY:
if categorize(event).keycode[0] == "BTN_WEST":
center['ls_x'] = last['ls_x']
center['ls_y'] = last['ls_y']
center['rs_x'] = last['rs_x']
center['rs_y'] = last['rs_y']
print( 'calibrated' )
#read stick axis movement
elif event.type == ecodes.EV_ABS:
if axis[ event.code ] in [ 'ls_x', 'ls_y', 'rs_x', 'rs_y' ]:
last[ axis[ event.code ] ] = event.value
value = event.value - center[ axis[ event.code ] ]
if abs( value ) <= CENTER_TOLERANCE:
value = 0
if axis[ event.code ] == 'rs_x':
if value < 0:
print('left')
else:
print('right')
print( value )
elif axis[ event.code ] == 'ls_y':
if value < 0:
print('foreward')
else:
print('backward')
print( value )
来自evdev导入列表\u设备、输入设备、分类、ecodes
中心公差=350
斗杆最大值=65536
dev=InputDevice(列出设备()[0])
轴={
ecodes.ABS_X:'ls_X',#0-65536中间是32768
ecodes.ABS_Y:“ls_Y”,
ecodes.ABS_Z:'rs_x',
ecodes.ABS_RZ:'rs_y',
ecodes.ABS_刹车:“lt”#0-1023
ecodes.ABS_气体:“rt”,
ecodes.ABS_HAT0X:'dpad_x',#1-1
ecodes.ABS_HAT0Y:“dpad_y”
}
中心={
'ls_x':杆最大/2,
'ls_y':杆最大/2,
“rs_x”:杆最大/2,
'rs_y':最大杆数/2
}
最后={
'ls_x':杆最大/2,
'ls_y':杆最大/2,
“rs_x”:杆最大/2,
'rs_y':最大杆数/2
}
对于dev.read_loop()中的事件:
#校准Y按钮上的零点
如果event.type==ecodes.EV_键:
如果分类(事件).keycode[0]=“BTN_WEST”:
中心['ls_x']=最后一个['ls_x']
中心['ls_y']=最后一个['ls_y']
中心['rs_x']=最后一个['rs_x']
中心['rs_y']=最后一个['rs_y']
打印(‘校准’)
#读取斗杆轴移动
elif event.type==ecodes.EV_ABS:
如果轴[event.code]位于['ls_x','ls_y','rs_x','rs_y']:
最后一个[axis[event.code]]=event.value
值=event.value-中心[axis[event.code]]
如果abs(值)请提供您当前的代码。@pydude-谢谢,刚刚添加了它,我将非常感谢您的指导。操纵手柄通常是EV\u abs
轴,因此除了KeyEvent
之外,您还必须管理AbsEvent
事件。谢谢!我现在就开始研究!谢谢你给我指点方向:)嗨,我这样做了,并设法得到了一些不错的读数,但它们似乎没有任何模式,将继续在gamepad中查找事件。read_loop():if event.type==ecodes.EV_ABS:adam=categorize(event)print adam.event