Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XBox One使用带EVDEV的模拟棒无线控制伺服_Python_Xbox_Servo_Evdev - Fatal编程技术网

Python XBox One使用带EVDEV的模拟棒无线控制伺服

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

我正在使用Evdev读取XBOX ONE的A、B、X、Y输入,取得了巨大的成功。然而,我正在努力获取模拟棒输入。有人能帮我编写Python代码吗

我正试图控制一个伺服系统

这是我迄今为止的代码,它工作“完美”。我需要知道如何读取(xbox)操纵杆的输出,这样我就可以为伺服设置“GPIO.PWM”

    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