Montag, 4. November 2013
Crawlee 1.0
Firmware V1.0 - b9

Nachdem eine geeignete Entwicklungsumgebung aufgesetzt wurde, kann nun die eigentliche Firmware (FW) erstellt werden. Die FW selbst ist eigentlich ein Terminal, auf den über die serielle Schnittstelle zugegriffen werden kann. Auch wenn ich dadurch etwas Overhead produzieren werde, und ich einen einfachen Parser auf dem Atmega laufen lassen muss, glaube ich, dass die dadurch sehr guten Debug-Möglichkeiten es mehr als Wert sind. Prinzipiell kann der RP6-Rumpf über jedes Standartterminal programmiert und ausgelesen werden.

Für die eigentliche Kontrolle der Hardware greife ich in großem Maße auf die mitgelieferte RP6RobotBaseLib.h Bibliothek zu. Die Art und Weise, wie ein Bewegungsbefehl ausgeführt wird, habe ich aus dem LightFollowing Beispiel Nummer 7 übernommen.

Main Loop

Die Hauptschleife meines Roboters sieht wie folgt aus:

while(true)
	{
		//Check commands
		checkCommands();

		//Update ACS
		updateACS();

		//Execute move command
		moveCommand(&mv_cmd);

		//Perform system tasks and update data-fields
		task_RP6System();
	}

Zunächst kontrolliert der Roboter über checkCommands, ob ein Befehl (vollständig) gesendet wurde. Anschließend werden die mitgelieferten Systemfunktionen der Reihe nach aufgerufen. Die Funktionen updateACS und task_RP6System sind notwendig um alle Änderungen in Variablen in Hardware (HW) umzusetzen und Zustandsänderungen der HW in Variablen zu kopieren. Der moveCommand wertet einen etwaigen Bewegungsbefehl aus, und schaltet die Motoren.

Der Parser

Der Parser ist ein zentraler Bestandteil der FW, da er die Terminalfunktionalität bereitstellt.

checkCommands
Die Funktion liest alle Bytes in ein Bytearray und kontrolliert, ob der Befehl durch einen Zeilenumbruch ('\n') abgeschlossen wurde. Sollte das der Fall sein, wird der eigentliche Parser gestartet.

parseCommands
Der zentrale Parser ermittelt an Hand des ersten Buchstabens in einem switch-Konstrukt, welcher Befehl eingelesen werden soll. Kürzere Befehle, wie z.B. Move-Befehle, werden direkt in dieser Funktion vollständig geparst. Komplexere Befehle werden an spezialisierte Funktionen übergeben.

parseSpeedCommand, parseOffsetCommand, parseACSCommand, parseMoveTimedCommand
Spezialisierte Kommandos.

reportACSState, reportBatteryState, reportEngineState, reportLightState, reportBumperState
Diese Befehle senden die jeweiligen Sensorwerte über die serielle Schnittstelle zurück.

Der Terminal

Die Firmware ist ein einfacher Terminal. Nach dem Starten aus dem Bootloader wird zunächst eine Begrüßung gesendet. Eine Eingabeaufforderung wird durch das Senden des
>
Zeichens signalisiert. Die eigentlichen Befehle bestehen immer aus einem einzelnen Buchstaben und typischerweise einem Parameter.

Befehlsliste
w<dist> - Bewege den RP6 <dist>mm nach vorne
a<ang> - Drehe den RP6 <ang>° nach links
s<dist> - Bewege den RP6 <dist>mm zurück
d<ang> - Drehe den RP6 <ang>° nach rechts
q<speed> - Stelle den Speed für den nächsten Bewegungsbefehl ein auf <speed> zwischen 0 und 255
o<offset> - Stelle einen Offset zwischen den Ketten ein, für den c-Befehl
c<time> - Aktiviere beide Ketten für <time> ms mit Geschwindigkeit <speed> und <offset> -> Ein erneuter c Befehl resettet den Timer

e - Gibt die Motorströme zurück als 16-bit Wert
v - Gibt die Batteriespannung zurück als 16-bit Wert
b - Gibt den Bumperstatus zurück
l - Gibt die Helligkeitswerte zurück als 16-bit Wert
i<cmd> - Wird <cmd> weggelassen wird der Obstacle Sensor ausgegeben. Ansonsten kann die Helligkeit der IR-LEDs mit + und - erhöht werden oder über die Stufe 0 bis 3 auf eine entsprechende Helligkeit gesetzt werden.

... comment