6. August 2011 Roboter fonera, tcp
In diesem Artikel möchte ich zeigen, wie eine drahtlose Kommunikation mit dem Roboter realisiert wird.
Dazu habe ich mir einen La Fonera 2100 Router bei Ebay bestellt. Aufgrund seiner geringen Größe, der Spannungsversorgung mit 5 Volt und seinem bereits rausgeführten seriellen Anschluss eignet er sich hervorragend zum Einbau auf einen Roboter.
Es gibt im Netz bereits etliche Artikel wie man einen SSH Zugang zu dem Router einrichtet oder per serieller Verbindung eine neue Firmware aufspielt. Ich habe mich als Firmware nicht für OpenWrt entschieden, sondern für eine veränderte Fon-Firmware (die ja auch auf OpenWrt basiert). Dies hatte den Vorteil, dass ich OpenWrt nicht selbst mit den benötigten Paketen (stty, setserial) kompilieren brauchte. Die Firmware habe ich hier runtergeladen. http://www.circuitdb.com/articles/11/5
Geflasht habe ich die Firmware komplett über den seriellen Port, so wie hier beschrieben.
Dazu habe ich mir eine Schaltung mit dem Max3232 auf dem Breadboard aufgebaut.
Das schöne an dieser Firmware ist, dass SSH bereits aktiviert und die Konsolenausgabe über den seriellen Port deaktiviert ist und der Port so anders genutzt werden kann. Außerdem ist das Kommando stty schon integriert, um die serielle Schnittstelle konfigurieren zu können.
So, jetzt nur noch 3 Shellkommandos über SSH und wir können einen Roboter, der an den seriellen Anschluss des Fonera angeschlossen ist, steuern!!
Zuerst die Berechtigung auf den seriellen Port ändern:
chmod a+rw /dev/tts/0
Dann das lokale Echo ausschalten und Raw-Modus einschalten.
stty 9600 -echo raw < /dev/tts/0
Standardmäßig ist das lokale Echo eingeschaltet. Damit werden alle eingehenden Bytes auf dem seriellen Port automatisch auf den Ausgang geroutet, was wir natürlich nicht wollen. Durch den Raw-Modus können alle Bytes direkt gelesen werden und es muss nicht extra auf einen Linebreak oder Carriage-Return gewartet werden.
Als nächstes brauchen wir einen Socket-Server, der alle einkommenden Bytes an den seriellen Port weiterleitet und alle Bytes vom seriellen Port über das Socket verschickt. Man könnte sich diesen Socket-Server selber in C programmieren, was ich auch bei anderen Projekten gesehen habe, aber glücklicherweise ist mir vorher der Befehl netcat über den Weg gelaufen. Er wird auch als „TCP/IP swiss army knife“ bezeichnet und ist für meinen Anwendungsfall ideal. Hier der 1-Zeiler, der mir viel Arbeit gespart hat:
nc -l -p 3333 < /dev/tts/0 > /dev/tts/0
Damit wird Netcat im Listening-Mode gestartet (-l) auf dem Port 3333. Als Standardein-/ausgabe wird der serielle Port angegeben. Und das wars auch schon. Dadurch haben wir unseren Socket-Server, auf den man sich von außen verbinden und Befehle in beide Richtungen austauschen kann. Wir haben natürlich unsere NetBot Software direkt um eine TCP-Client – Connection erweitert, die sich mit dem Router verbinden kann.
Um einen persistenten Socket-Server zu haben, der sich neu verbinden kann, muss dieser Aufruf noch in eine Schleife gepackt werden.
while [ true ]; do nc -l -p 3333 < /dev/tts/0 > /dev/tts/0; done
Wir haben die 3 Kommandos in ein Shell-Script geschrieben, das bei jedem Systemstart automatisch gestartet wird. Damit ist der Fonera-Router bereit für seinen Einsatz auf dem Roboter. Jetzt brauch ich „nurnoch“ die Elektronik und mein Roboter ist fertig.
Zum den Boards: https://www.bitworking.de/roboterbau-03/
Schreibe einen Kommentar