Erster Schritt getan:
Nach meinen letzten Experimenten mit einem XBOX360-Controller und dem USB-Shield auf einem Arduino wollte ich mal sehen ob man den Controller nicht auch an einem Raspberry Pi mit NodeJS auslesen kann. Die überlegung ist mittlerweile die Basisstation für den Roboter komplett auf einem RasPi zu realisieren. Hier sind mehr „Schweinereien“ möglich als auf einem Arduino Board. Ich denke da an die Steuerung per Webinterface etc.pp.
Also „Tante Google“ angeworfen und ein wenig geschaut.
Mein erster Treffer war das NodeJS-Modul „node-hid„. Das Modul soll einfachen Zugriff auf USB-HID-Devices wie Tastatur, Maus und andere Controller geben – also eigentlich auch auf den XBOX-Controller. „To cut a long story short“: Hat nicht kompiliert. Stundenlang weitergesucht und gepatch – hat dann kompiliert aber nicht funktioniert – erstmal alles in die Ecke gefeuert und andere Dinge gemacht… KACKE
Heute wieder ein wenig rumgesucht, sowas lässt mir ja keine Ruhe. Gibt es eine Alternative zum „node-hid“ Modul?
In einem vorherigen Post habe ich bereits den Anschluss des USB-Host-Shields an einen Arduino Mega beschrieben. Ziel war es einen XBOX360-Controller zum Steuern des Roboters zu verwenden. Die Usb-Host-Library bringt einige Module für die Kommunikation mit verschiedenen USB-Geräten mit. Darunter auch eine Library für die XBOX-Controller. Die ausgelesenen Steuerdaten eines Steuerkreuzes werden dann mit einem APC220-Funkmodul an den Roboter geschickt und dort an den Motorcontroller weitergereicht.
Der Rollstuhl den ich als Basis für die ganze Geschichte nehme hat eine fast komplette „Lichtsignalanlage“ (schönes Wort). Blinker und Licht (Vorne und Hinten). Bremslichter gibt es leider nicht.
Es musste also eine Lösung her um das Licht (und evtl. noch andere „Großverbraucher“) schalten zu können. Das Licht läuft auf 24Volt, also wiedereinmal ein wenig viel um das direkt an den Arduino anzuklemmen. Lösungen sind da entweder Relais oder MosFETs. Ausserdem muss das ganze in ein ordentliches Gehäuse verpackt werden. Die Ansteuerung und die Versorgung soll über den I2C-Bus erfolgen. Das braucht nur 4 Kabel und spart einen UART-Port.
Grundüberlegung: Wie steuert man einen solchen Roboter?!
Aktuell nutze ich eine 8-Kanal Fernsteuerung auf 2.4GHz (Turnigy 9X). Standartsteuerung für (Flug-)Modelle, Steuerkreuz links, Steuerkreuz rechts, ein paar Schalter.
Bei meinen Streifzügen durch das Web habe ich gesehen das einige Bastler zur Steuerung ihrer Fahrzeuge/Roboter keine normalen Fernsteuerungen einsetzen, sondern XBOX360 oder Playstation-Controller.
So ein Controller hat für meinen Robot einige Vorteile:
Ersteinmal die Steuerung des kompletten Fahrzeugs: Derzeit steuer ich die Kiste im „Panzermodus“ mit einem Steuerkreuz der Fernsteuerung. Vorwärt/Rückwärts ist klar, bei Kurvenfahrt wird ein Rad beschleunigt und das andere gebremst. Diese Steuerung könnte ich bei einem XBOX-Controller schon einmal mit dem „Right Stick“ erschlagen. (ich benenne das jetzt so wie auf dem obigen Bild zu sehen ist).
Dann soll die Kiste noch eine Kamera bekommen die frei schwenk- und neigbar ist. Dazu brauche ich also ein zweites „Steuerkreuz“. Mit der aktuellen Steuerung auch kein Problem, ist ja noch eines frei. Am XBOX-Controller würde ich wohl den „Left Stick“ nehmen.
Sollten noch weitere schaltbare „Schweinereien“ wie Blinker, Notaus, Streuwagen, Fegebürste, Hund, Katze, Maus kommen wäre das auch noch mit der aktuellen Steuerung lösbar (sind ja nur Schaltvorgänge). Wenn ich aber noch ein Steuerkreuz brauche wird das ganze ohne Doppelbelegung eng. Bei der XBOX-Steuerung wäre noch das „Directional pad“ über.
Ein weiterer Vorteil des Controllers gegenüber der aktuellen Steuerung: Das Teil liegt verdammt besser in der Hand 😉
Allerdings bringt das alles auch Probleme:
Kaum ein Problem ohne Lösungen:
Der Robot sollte von Anfang an eine „Basis-Station“ bekommen. Darin der Videomonitor für die Kamera und ein LCD-Display für die Telemetriedaten. Für die Telemetriedaten ist eine 2,4GHz Funkstrecke über zwei XBEE-Module vorgesehen. Um diese Basis-Station zu realisieren wird dort auch ein Arduino-Kontroller benötigt. Die XBEE-Funkstrecke ist bidirektional, das bedeutet ich bekomme nicht nur die Daten vom Robot, sondern sie kann auch die Steuersignale zum Robot schicken.
Problem 1 – Controler an die Basisstation verbinden: Dazu gibt es „USB-Host-Adapter“ z.B. von Sparkfun. Mit der passenden Software können dort USB-Sticks, Kameras, Festplatten, und – Gamecontroller angeschlossen werden. Für den Adapter gibt es eine Arduino Softwarelibrary die so ziemliche alle erdenklichen Geräte ansteuern oder auslesen kann. Die Library unterstützt auch direkt den XBOX360-Controller. Perfekt! 😉
Problem 2 – Übertragung: Wie oben angerissen können die Steuersignale über die XBEE-Verbindung an den Robot übertragen werden. Allerdings muss ich da noch nach einer Failsafe Lösung suchen! Diese Rollstuhlantriebe haben massiv Kraft und die Kiste kann erheblichen Schaden anrichten. Die aktuelle Steuerung hat einen eingebauten Lösung. Dazu wird im Empfänger eine „Failsafe-Stellung“ programmiert, welche ausgelöst wird wenn der Kontakt zum Sender unterbrochen wird.
Update
Offenbar kommt bald der „Arduino Esplora“, eine Art programmierbarer Controller mit diversen kleinen Gizmos.
Hier gibt es weitere Details: http://arduino.cc/en/Main/ArduinoBoardEsplora
USB-Host-Shield kaufen: http://www.watterott.com/de/SparkFun-USB-Host-Shield
USB-Host-Library: http://www.circuitsathome.com/arduino_usb_host_shield_projects