Darth – Jetson Nano Projekt

Heute am 18.10.2021 habe ich die erste Phase des Jetson Nano Projekts erfolgreich abgeschlossen. Basierend auf der Einplatinen Hardware von Nvidia habe ich ein von einem X-Box Controller steuerbares Fahrzeug fertiggestellt.

Die Umsetzung war etwas schwieriger als bei seinem Bruder “Yoda”, welcher auf dem Raspberry 4 basiert. Das hatte mehrere Gründe:

  1. Den Aufbau der Lenkstange musste ich mehrfach korrigieren.
  2. Die GPIO Pins zur Ansteuerung des Servomotors für die Lenkung mussten vor der Inbetriebnahme zuerst durch einen Neustart des Boards aktiviert werden.
  3. Da ich sowohl eine Servomotorsteuerung, als auch eine Gleichstrommotorsteuerung verwende muss die Ansteuerung der GPIO Pins mit GPIO.setmode(GPIO.TEGRA_SOC) erfolgen. Entsprechend müssen die Namen aus dem Pin Out des Boards verwendet werden.
  4. Die Bluetooth Aktivierung funktionierte nicht auf Anhieb über Remote Desktop.
YouTube player

Den Quelltext für die Ansteuerung des X-Box Controllers konnte ich dafür wieder verwenden. Dieser funktioniert auf dem Raspberry Pi 4 genauso, wie auf dem Jetson Nano:

class XBOXControllerEvents:
    def __init__(self):
        self._events = {}
        self.init_events()

    def add_event(self, name, typeofevent, code, type_id, value, action):
        eventkey = f"KEY_{code}_{value}"
        self._events[eventkey] = {}
        self._events[eventkey]["name"] = name
        self._events[eventkey]["typeofevent"] = typeofevent
        self._events[eventkey]["code"] = code
        self._events[eventkey]["type_id"] = type_id
        self._events[eventkey]["value"] = value
        self._events[eventkey]["action"] = action
        eventkeyalt = f"KEY_{code}_{type_id}_{value}"
        self._events[eventkeyalt] = {}
        self._events[eventkeyalt]["name"] = name
        self._events[eventkeyalt]["typeofevent"] = typeofevent
        self._events[eventkeyalt]["code"] = code
        self._events[eventkeyalt]["type_id"] = type_id
        self._events[eventkeyalt]["value"] = value
        self._events[eventkeyalt]["action"] = action


    def init_events(self):
        self.add_event("BTN_A", "BTN", 304, 1, 1, "")
        self.add_event("BTN_A", "BTN", 304, 1, 0, "")
        self.add_event("BTN_B", "BTN", 305, 1, 1, "")
        self.add_event("BTN_B", "BTN", 305, 1, 0, "")
        self.add_event("BTN_X", "BTN", 307, 1, 1, "")
        self.add_event("BTN_X", "BTN", 307, 1, 0, "")
        self.add_event("BTN_Y", "BTN", 308, 1, 1, "")
        self.add_event("BTN_Y", "BTN", 308, 1, 0, "")
        self.add_event("BTN_RT", "BTN", 311, 1, 1, "")
        self.add_event("BTN_RT", "BTN", 311, 1, 0, "")
        self.add_event("BTN_LT", "BTN", 310, 1, 1, "")
        self.add_event("BTN_LT", "BTN", 310, 1, 0, "")
        self.add_event("BTN_RB", "BTN", 9, 1, 1023, "")
        self.add_event("BTN_RB", "BTN", 9, 1, 0, "stop")
        self.add_event("BTN_LB", "BTN", 10, 1, 1023, "")
        self.add_event("BTN_LB", "BTN", 10, 1, 0, "stop")
        self.add_event("JOY_LEFT", "JOY_Y", 0, 1, 3, "")
        self.add_event("JOY_LEFT", "JOY_X", 1, 1, 3, "")
        self.add_event("JOY_RIGHT", "JOY_Y", 2, 1, 3, "")
        self.add_event("JOY_RIGHT", "JOY_X", 5, 1, 3, "")
        self.add_event("DPADUP", "BTN", 17, 3, -1, "forward")
        self.add_event("DPADUP", "BTN", 17, 3, 0, "stop")
        self.add_event("DPADLEFT", "BTN", 16, 3, -1, "leftsteering")
        self.add_event("DPADLEFT", "BTN", 16, 3, 0, "straightsteering")
        self.add_event("DPADRIGHT", "BTN", 16, 3, 1, "rightsteering")
        self.add_event("DPADRIGHT", "BTN", 16, 3, 0, "straightsteering")
        self.add_event("DPADDOWN", "BTN", 17, 3, 1, "backwards")
        self.add_event("DPADDOWN", "BTN", 17, 3, 0, "stop")
        self.add_event("START", "BTN", 315, 1, 1, "startmotor")
        self.add_event("START", "BTN", 315, 1, 0, "")
        self.add_event("STOP", "BTN", 158, 1, 1, "stopmotor")
        self.add_event("STOP", "BTN", 158, 1, 0, "")

    def get_events(self):
        return self._events

    def find_event(self, event):
        all_events = self.get_events()
        eventkey = f"KEY_{event.code}_{event.type}_{event.value}"
        if eventkey in all_events:
            return all_events[eventkey]
        eventkey = f"KEY_{event.code}_{event.value}"
        if eventkey in all_events:
            return all_events[eventkey]
        eventkey = f"KEY_{event.code}_{event.type}"
        if eventkey in all_events:
            return all_events[eventkey]
        return None
import evdev

from XBoxController.events import XBOXControllerEvents

class XBoxController:
    def __init__(self):
        self._xbox_device = self.init_device()
        self._eventController = XBOXControllerEvents()

    def init_device(self):
        devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
        for device in devices:
            if (device.name.__contains__('box') is True) and (device.name.__contains__('Cons') is False):
                return device
        return None

    def get_event_controller(self):
        return self._eventController

    def get_device(self):
        if self._xbox_device is None:
            self._xbox_device = self.init_device()
            if self._xbox_device is None:
                raise RuntimeError("Error: No X-Box device found ...")
        return self._xbox_device

    def get_action(self):
        event = self.get_device().read_one()
        return self.translate_event(event)

    def translate_event(self, event):
        result = None
        eventController = self.get_event_controller()
        if event is not None:
            result = eventController.find_event(event)
        return result

Die Lenkung ist momentan nur mit dem Steuerkreuz realisiert.

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmen Sie dem zu.

Datenschutzerklärung