2012-11-12

Industrieroboter, Arduino und ein Gamecontroller

Wie in einem früheren Post beschrieben, möchte ich Fischertechnik Modelle mit Arduino steuern. Der Hardware-Testaufbau besteht zunächst aus dem bereits beschriebenen, unmodifizierten Arduino UNO mit Motor-Shield und dem Dreiachs-Roboter aus dem Fischertechnik "Industry Robots II"-Kasten.

Als erstes Etappenziel wollte ich den Roboter nicht autonom programmieren (im Gegensatz zu einem "Teach-In" Roboter, bei dem man einen Ablauf aus X-Y-Z Koordinaten speichert, die dann später vom Dreiachs-Roboter beliebig oft abgespult werden), sondern den Roboter mit einem Gamepad ansteuern [Eigentlich ein XBox Gamecontroller (DirectInput), aber Controller ist in diesem Zusammenhang mehrdeutig.].





Die Lösung entspricht einer Client-Server Lösung:

  1. Das Gamepad wird an den PC angeschlossen. Das GUI läuft auf dem PC.
  2. Der PC kommuniziert über ein serielles Protokoll (USB, RS232, Bluetooth) mit der Mikrocontroller-Hardware.
  3. Die Mikrocontroller-Hardware (Arduino) steuert entsprechend die Motorentreiber-Bausteine und Ausgänge an.
Software-Bausteine (Arduino-Seitig):
  • Motor Shield Library
  • Protokoll (Idee), um dem Arduino via serielle Schnittstelle Steuerbefehle für die Motoren und zum Auslesen der Eingänge zu senden.
  • Interrupt-Library  (pinchangeint) für beliebige Pins, um später die Counter zu realisieren.































Das Protokoll:
Das Protokoll selbst ist extrem einfach gehalten.
Ein Befehl besteht aus einem Zeichen Befehlswort, plus einer Nutzlast und ggf. noch einem "/" als Ende der Nutzlast.
Jeder Befehl erwartet eine Antwort. Dies erleichtert das Synchronisieren. Der Arduino hat nur einen
sehr kleinen Send/Receive-Buffer für die serielle Kommunikation. Aus diesem Grunde ist das Protokoll auch minimalistisch (wenig geschwätzig) gehalten. Aber gerade so, dass man zum Debuggen die Befehle auch von Hand in ein Terminal eingeben kann, um den Client zu simulieren.

Beispiele:
 311180/     -> Motor Kommando (3), Motor 1, Forward, Speed <180>, sprich: Den Motor 1 in Forwärtsrichtung bewegen (Tempo 180).

2117/   -> Aktiviert einen Zähler auf Pin 17.
2217/   -> Auslesen des Zählers auf Pin 17.
usw.

Spezifikation (kann ändern!):

//  1 = Read:
//      1 = digital: + "pin number"
//      2 = analog: + "pin number"
//
//  2 = Counter Operations:
//     1 = Enable Counter: + "pin number" + "/"
//     2 = Read Counter: + "pin number" + "/"
//     3 = Reset Counter: + "pin number" + "/"
//     4 = Disable Counter: + "pin number" + "/"
//
//   3 = DC Motor (Motor Shield):
//       "motor number"
//       1 = Forward <speed>    [example: 3m1xxx]
//       2 = Backward <speed>   [example: 3m2xxx]
//       3 = Release / Stop
//       4 = SetSpeed
//           "speed"

PC-Seitige Bausteine:
  • Visual Studio Express 2012: Als Entwicklungsumgebung für den C# code.
  • SlimDX Framework : Eine schlanke Lösung, einen Controller (DirectInput / XInput) abzufragen, inklusive Beispielcode, den ich für meine Zwecke angepasst habe. [Sonst muss man zunächst riesige SDKs installieren]
  • Selbstgeschriebener Code für das Arduino-Protokoll
  • Fischertechnik-Bibliothek für .NET (Ich wollte Interface-agnostisch vorgehen: Wie man im Screenshot sehen kann, lässt sich der Wrapper für die Bibliothek auswählen, je nachdem, ob man einen TX Controller oder das Arduino Interface ansteuern möchte.
Hier ein Screenshot des aktuellen GUIs.













Die Counter:
Die Idee ist, hier Impulse, also Zustandsänderungen am Eingang zählen zu können, wie sie ein Encoder oder die Taster an den Achsen des Roboters liefern (Die Achsen haben kleine Impulsräder).
Das Problem dabei ist, dass Signale, die von einem Taster kommen, meist nicht entprellt sind. Hier muss man noch etwas tricksen (de-bouncing!). Sonst zählen wir viele kleine Spitzen, während der Schalter schliesst.

Das Ganze ist noch unvollendet. - Nur eines von vielen Hobby-Projekten.
Was noch zu tun wäre:  Ein echtes Teach-In Programm: Über die Counter sollte die Position des Roboters ermittelt werden. Die Strecke lässt sich dann später speichern und abfahren. Dies ist dann auch ohne Gamepad möglich.

Den Code werde ich dann nach Fertigstellung komplett posten. Ansonsten gibt es aber auch Code bei anderen ähnlichen Projekten. Vielleicht ohne DirectInput/XInput oder nicht .NET, aber viel Spass beim Basteln :-)

Ähnliche Bastelarbeiten im Netz (nur eine Auswahl):
Fischertechnik per Gamepad/Joystick steuern (hier, hier und hier)

Update: Hier ist noch eines, das vielversprechend aussieht: http://www.mathias-wilhelm.de/arduino/projects/arduino-control/

Ausblick

Wie oben angedeutet, hat die Sache noch mehr Potential: Ein fahrendes Robotermodell könnte via Bluetooth gesteuert werden. Da müsste ich dann die Ansteuerung der Fischertechnik-Encodermotoren genauer ansehen. Weiterhin habe ich ein paar Ultraschall-Distanzsensoren (HC-SR04), der ggf. auch mit dem TX Controller zusammen funktioniert (für den Arduino gibt es Beispielcode im Netz).
Und noch ein paar andere Ideen. Mehr dazu später.

2 Kommentare:

  1. Cool: kann man damit auch die Encoder Motoren von Fischertechnik auslesen und steuern?

    AntwortenLöschen
  2. I have similiar idea and I have done it in 2012.
    But it is based on old controler,and the protocol is : http://www.somatec.net/fischerInterface.htm

    http://forum.ftcommunity.de/viewtopic.php?f=17&t=1547&p=14785#p14785

    AntwortenLöschen