RC Car Ps4 controller

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
RamboRC
User
Beiträge: 4
Registriert: Sonntag 27. August 2017, 14:05

Hallo,

ich habe vor die Steuerung eines RC Autos über einen RaspberryPi und einen PS4 Controller zu bauen.
Ich hatte die Steuerung bereits mit einem Xbox360 Controller mit dem xboxdrv erstellt, allerdings war die Reichweite zu gering das ich jetzt auf den
PS4 Controller umgestiegen bin. Das eigentliche Problem daran ist das ich mit der Tasten und Achs Abfrage nicht weiterkomme.
Wenn ich js_linux.py ausführe bekomme ich in der Konsole alle Tasten und Achsen die
ich betätige dargestellt, aber wie kann ich es Programmieren das z.B. beim Drücken der Taste "A" ein Befehl ausgeführt wird?
Bei dem xboxdrv war das alles irgendwie viel einfacher :D
Hier mal der js_linux.py code. Und schon mal vielen Dank für eure Mithilfe

Code: Alles auswählen

# Released by rdb under the Unlicense (unlicense.org)
# Based on information from:
# https://www.kernel.org/doc/Documentatio ... ck-api.txt

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))

# We'll store the states here.
axis_states = {}
button_states = {}

# These constants were borrowed from linux/input.h
axis_names = {
    0x00 : 'x',
    0x01 : 'y',
    0x02 : 'z',
    0x03 : 'rx',
    0x04 : 'ry',
    0x05 : 'rz',
    0x06 : 'trottle',
    0x07 : 'rudder',
    0x08 : 'wheel',
    0x09 : 'gas',
    0x0a : 'brake',
    0x10 : 'hat0x',
    0x11 : 'hat0y',
    0x12 : 'hat1x',
    0x13 : 'hat1y',
    0x14 : 'hat2x',
    0x15 : 'hat2y',
    0x16 : 'hat3x',
    0x17 : 'hat3y',
    0x18 : 'pressure',
    0x19 : 'distance',
    0x1a : 'tilt_x',
    0x1b : 'tilt_y',
    0x1c : 'tool_width',
    0x20 : 'volume',
    0x28 : 'misc',
}

button_names = {
    0x120 : 'trigger',
    0x121 : 'thumb',
    0x122 : 'thumb2',
    0x123 : 'top',
    0x124 : 'top2',
    0x125 : 'pinkie',
    0x126 : 'base',
    0x127 : 'base2',
    0x128 : 'base3',
    0x129 : 'base4',
    0x12a : 'base5',
    0x12b : 'base6',
    0x12f : 'dead',
    0x130 : 'a',
    0x131 : 'b',
    0x132 : 'c',
    0x133 : 'x',
    0x134 : 'y',
    0x135 : 'z',
    0x136 : 'tl',
    0x137 : 'tr',
    0x138 : 'tl2',
    0x139 : 'tr2',
    0x13a : 'select',
    0x13b : 'start',
    0x13c : 'mode',
    0x13d : 'thumbl',
    0x13e : 'thumbr',

    0x220 : 'dpad_up',
    0x221 : 'dpad_down',
    0x222 : 'dpad_left',
    0x223 : 'dpad_right',

    # XBox 360 controller uses these codes.
    0x2c0 : 'dpad_left',
    0x2c1 : 'dpad_right',
    0x2c2 : 'dpad_up',
    0x2c3 : 'dpad_down',
}

axis_map = []
button_map = []

# Open the joystick device.
fn = '/dev/input/js0'
print('Opening %s...' % fn)
jsdev = open(fn, 'rb')

# Get the device name.
#buf = bytearray(63)
buf = array.array('c', ['\0'] * 64)
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]

buf = array.array('B', [0])
ioctl(jsdev, 0x80016a12, buf) # JSIOCGBUTTONS
num_buttons = buf[0]

# Get the axis map.
buf = array.array('B', [0] * 0x40)
ioctl(jsdev, 0x80406a32, buf) # JSIOCGAXMAP

for axis in buf[:num_axes]:
    axis_name = axis_names.get(axis, 'unknown(0x%02x)' % axis)
    axis_map.append(axis_name)
    axis_states[axis_name] = 0.0

# Get the button map.
buf = array.array('H', [0] * 200)
ioctl(jsdev, 0x80406a34, buf) # JSIOCGBTNMAP

for btn in buf[:num_buttons]:
    btn_name = button_names.get(btn, 'unknown(0x%03x)' % btn)
    button_map.append(btn_name)
    button_states[btn_name] = 0

print '%d axes found: %s' % (num_axes, ', '.join(axis_map))
print '%d buttons found: %s' % (num_buttons, ', '.join(button_map))

# Main event loop
while True:
    evbuf = jsdev.read(8)
    if evbuf:
        time, value, type, number = struct.unpack('IhBB', evbuf)

        if type & 0x80:
             print "(initial)",

        if type & 0x01:
            button = button_map[number]
            if button:
                button_states[button] = value
                if value:
                    print "%s pressed" % (button)
                else:
                    print "%s released" % (button)

        if type & 0x02:
            axis = axis_map[number]
            if axis:
                fvalue = value / 32767.0
                axis_states[axis] = fvalue
                print "%s: %.3f" % (axis, fvalue)
Zuletzt geändert von Anonymous am Sonntag 27. August 2017, 17:44, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@RamboRC: Mir ist die Frage nicht so wirklich klar‽ Wo genau liegt denn das Problem?
RamboRC
User
Beiträge: 4
Registriert: Sonntag 27. August 2017, 14:05

Wie gehe ich vor wenn ich das ein Befehl ausgeführt wird?
Also wenn ich Button 'a' drücke soll was geschehen.
Ich hoffe das ist verständlicher ;-)

gruß
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was soll denn geschehen? Und warum baust du das nicht einfach ein? Da steht doch schon die Ausgabe, was dazu muss ist eine Abfrage, ob

- es button a ist
- er gedrückt oder losgelassen wurde (ich nehme mal an dann soll auch was passieren)

Aber ich vermute mal du kannst kein Python?
RamboRC
User
Beiträge: 4
Registriert: Sonntag 27. August 2017, 14:05

Hallo,

also mit du verstehst kein Python liegst du nicht ganz falsch :roll: , aber ich bin dabei und es wird besser ;-)
Bei dem xboxdrv, mit dem ich das das erste mal gemacht habe, war es einfacher da eine Beschreibung dabei war.

Wie würde denn hier der Befehl aussehen, wenn Button a gedruckt wurde soll ein Befehl ausgeführt werden, welcher spielt hier ja erst mal keine Rolle,
als Beispiel kann man ja mal eine Textausgabe in der Konsole nehmen.
Nur zur Info, die Servos und LEDs werden über einen PCA9685 angesteuert und das habe ich schon mal hinbekommen. :mrgreen:

vielen Dank und Gruß
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na, ein einfaches

Code: Alles auswählen

if button == 'a':
    if value:
         mach_an()
    else:
         mach_aus()
ist alles was du brauchst. Natuerlich an der richtigen Stelle (Zeile 149), und entsprechend eingerueckt, denn Einrueckungen sind wichtig in Python.
RamboRC
User
Beiträge: 4
Registriert: Sonntag 27. August 2017, 14:05

:D Sau Gut! Wenn man weiß wie es geht ist es ja voll einfach :D

Danke!
Antworten