FAQ für c't-Bot und c't-SIM

Seite 4: Programmierung c't-Bot

Inhaltsverzeichnis

Mein c't-Bot fährt immer. Nur wenn ich die Abgrundsensoren abdecke hält er an. Was ist falsch?

Es passt dann lediglich die Konstante BORDER_DANGEROUS in der Datei bot-local.h nicht zu dem Untergrund, den die Abgrundsensoren sehen. Der Bot glaubt, immer einen Abgrund zu sehen und versucht zu fliehen.

Ich habe ct-Bot-Projekt aus dem CVS ausgelesen und möchte es in Eclipse unter Windows kompilieren. Der Vorgang endet aber mit der Meldung, das die Datei ct-Bot.exe nicht erstellen kann ("make: Target 'all' not remade because of errors.") Woran liegt das?

Wenn das Kompilieren des C-Codes fehlschlägt, kann das eine Reihe von Ursachen haben. Prüfen Sie, ob in Eclipse unter "Project/Properties" bei "C/C++ build" die richtigen Pfade zu MinGW und Pthreads eingetragen sind, wie in der Installationsanleitung beschrieben. Fehlen die entsprechenden Karteireiter ganz, so ist CDT (C Development Toolkit) nicht oder nicht richtig installiert. Eventuell hilft es, Eclipse nach der Installation von neuen Plugins einmal neu zu starten.

Weiterhin ist darauf zu achten, dass die vollständige Version von MinGW installiert wird, bei der Standardversion fehlen entscheidende Teile wie ein benötigtes Makefile. Im Zweifellsfall prüfen Sie bitte, ob Sie unsere Installationsanleitung wirklich Schritt für Schritt durchgeführt haben.

Wie erfasse ich neue RC5-Fernbedienungen?

Zuerst sollte man in der Datei rc5-codes.h dafür sorgen, dass die RC5-MASK so aussieht:

#define RC5_MASK (RC5_COMMAND|RC5_ADDRESS)

Und dann die Firmware nochmal neu in den Bot spielen. Im Normalbetrieb ignoriert der Bot den gesamten Adressbereich der RC5-Kommandos (#define RC5_MASK (RC5_COMMAND)), so erkennt er möglichst viele Fernbedienungen. Erfassen sollte man neue Codes jedoch vollständig. Hat man eine Liste mit den Codes der eigenen Fernbedienung fertig, indem man zum Beispiel die Werte aus dem Display des Bots abgeschrieben hat, so erstellt man in rc5-codes.h eine neue Sektion. Dabei lohnt es, eine vorhandenen als Vorlage zu verwenden.

Warum enthält das CVS keine perfekt funktionierende Steuerung für den Bot?

Unsere Entwicklungsarbeit bei c't konzentriert sich darauf, einen geeigneten Rahmen für die Roboterprogrammierung zur Verfügung zu stellen – eine möglichst sichere und pfiffige Steuerung für den Bot zu entwickeln, ist nicht unser Ziel. Denn damit würden wir ja Ihnen, unseren Lesern, den größten Teil des Spaßes nehmen, der gerade darin besteht, eigene Routinen zu ersinnen, sie in Code umzusetzen und anschließend – im Simulator oder in der Realität – auszuprobieren.

Die von uns bisher in die Code-Basis eingepflegten Robotersteuerungen sind daher mit Absicht(!) alles andere als perfekt – sie sollen Anregungen und Ausgangspunkte für Verbesserungen von Ihrer Seite liefern, nicht fertige Lösungen bieten.

Gelungenen Steuercode von Leserseite, der uns als Patch per E-Mail erreicht (unter den Adressen ct-bot@heise.de bzw. ct-sim@heise.de) nehmen wir jedoch gerne in die Code-Basis auf, oder stellen sie zum Download bereit.

Die Tasten meiner Fernbedienung sind anders beschriftet als die Vorlagen im Source-Code. Wie bezeichne ich die Tasten, um trotzdem die üblichen Funktionen nutzen zu können?

Um den Code verständlich zu halten, haben wir uns entschieden, dass jede Taste genau den Namen erhält, der aufgedruckt ist. Ein zweites #define-Statement kann dann diesen Code einer anderen Bedeutung zuordnen.

Angenommen auf der Fernbedienung gibt es keine Taste "DOWN" aber eine Taste "CH-", die man dafür umwidmen möchte. Dann sieht die Definition so aus:

#define RC5_CODE_CH_MINUS (0x1021 & RC5_MASK) /*!< Taste CH - */ #define RC5_CODE_DOWN RC5_CODE_CH_MINUS /*!< Taste CH - umgewidmet als DOWN-Taste*/

Das ganze Framework ist so kompliziert, wie finde ich einen Einstieg?

Wir haben zwei ganz einfache Routinen vorbereitet, die als guter Einstiegspunkt für eigene Experimente dienen können. Wie alle Verhalten existiert für sie eine eigene Datei im Unterverzeichnis bot-logic. In diesem Falle heißt die Datei behaviour_simple.c und die beiden Funktionen bot_simple_behaviour() sowie bot_simple2_behaviour()

Damit sich die alten Hasen nicht daran stören, sind beide Routinen per default inaktiv. Möchte man sie aktivieren, so entfernt man die Kommentarzeichen von folgenden Zeilen in bot_behave_init():

// activateBehaviour(bot_simple_behaviour); // activateBehaviour(bot_simple2_behaviour); 

bot_simple_behaviour() ist ein Beispiel für ein ganz schlichtes Verhalten, dass den Bot mit Hilfe von Hilfsverhalten im Quadrat fahren lässt.

bot_simple2_behaviour() nutzt keine Hilfsverhalten, sondern ist selbst eines und besitzt daher auch eine Botenfunktion bot_simple2(). Man kann es z.B. aus bot_simple_behaviour() heraus nutzen. Es fährt den Bot so lange geradeaus, bis es dunkler als ein bestimmter (übergebener) Wert wird. Es fragt also Sensoren ab und steuert relativ unmittelbar die Motoren an.

Viele weitere Details beschreibt das in c't 10/06 erschienene Tutorial.

Der Vorteil, wenn man mit diesen beiden Beispielen anfängt liegt darin, dass man sich um nichts anderes kümmern muss. Das Framework ermittelt für einen die Sensorwerte, stellt die Motoren nach und macht noch diverses andere im Hintergrund. Man kann sich ganz darauf konzentrieren z.B. den Bot ein kleines Herz oder andere geometrische Figuren fahren zu lassen. Das Suchen von Licht wäre ebenfalls ein geeignetes Übungsthema.

Beim Übersetzen bekomme ich seit dem Erscheinen von c't 10/06 immer die Fehlermeldung: undefined reference to `cos'. Was läuft schief?

Seit der Release 0.7 verwendet der Code Routinen aus der mathematischen Bibliothek. Diese Fehlermeldung deutet darauf hin, dass diese Library fehlt. Dazu öffnet man in Eclipse Project->Properties->C/C++-Build/GCC-C-Linker/Libraries. Im Feld Libraries drückt man auf das kleine grüne "Plus" und trägt in den sich öffnenenden Dialog ein kleines "m" ein. OK-Klicken. Fertig.

Mein Bot stürzt immer wieder ab. Was läuft schief?

Unter Umständen ist der Code zu groß für den Flash-Speicher des Bots geworden. Er besitzt nur 32 KByte davon. Ohne aktivierte Optimierung kommt der offizielle Code seit der Release 0.7 (c't 10/06) gefährlich nahe an diese Grenze. Aktiviert man die Optimierung (-Os), so ist wieder reichlich Platz: Einfach im Feld "Other Optimization Flags" des Menüs Project->Properties->C/C++-Build/GCC-C-Compiler/Optimization den Wert "-Os" eintragen.

Haben Sie sehr viel eigenen Code hinzugefügt, reicht vielleicht sogar die Optimierung nicht mehr aus. Dann können sie in ct-Bot.h unbenutzte Module deaktivieren um wieder Platz zu schaffen. Insbesondere Log- und Display-Routinen sind Speicherfresse, da sie mit Strings hantieren.

Der Befehl:

avr-size ct-Bot.elf

liefert Aufschluss über die jeweils belegten Speichersektionen. Die Bedeutung der einzelnen Sektionen ist hier genau erklärt.

Der Compiler meldet den Fehler: "section .bootloader [00007680 -> 00007a07] overlaps section .data" oder so ähnlich. Was läuft falsch?

Sie haben vergessen dem Linker mitzuteilen, wohin er den Bootloader packen soll. Wenn Sie den Bootloader benutzen wollen, finden Sie im Verzeichnis Documentation eine HTML-Datei mit einer bebilderten Anleitung, wie sie das dem Linker mitteilen können. Wenn Sie den Bootloader nicht verwenden wollen, deaktivieren sie den BOOTLOADER_AVAILABLE-Schalter in ct-Bot.h.

Ich will Code für den ATmega644 compilieren und das klappt nicht. Was mache ich falsch?

Zuerst müssen Sie in der Build-Umgebung von Eclipse dem C-Compiler und dem Linker mit auf den Weg geben, dass Code für den ATmega644 übersetzt werden soll. Ersetzen sie Wenn Sie unter Project->Properties->C/C++ Build/Tool Settings/GCC C Compiler/Miscellaneous die Option -mmcu=atmega32 durch -mmcu=atmega644. Das gleiche wiederholen Sie unter Project->Properties->C/C++ Build/Tool Settings/GCC C Linker/Miscellaneous.. Außerdem sollten sie darauf achten, dass Sie bei der Installation der Tools auf die in der Installationsanleitung erwähnten Hinweise für den ATmega644 geachtet haben.