RP6 ROBOT BASE RP6-BASE RP6v2-BASE ©2007 - 2012 AREXX Engineering www.arexx.
RP6 Robot System Bedienungsanleitung - Deutsch (German) Version RP6-BASE-DE-20120215 für RP6 und RP6v2 WICHTIGE INFORMATION! Bitte unbedingt lesen! Bevor Sie den RP6, RP6v2 oder Zubehör in Betrieb nehmen, lesen Sie bitte diese Anleitung und ggf. die Anleitungen von Zubehörteilen vollständig durch! Sie erläutert Ihnen die korrekte Verwendung und weist auf mögliche Gefahren hin! Weiterhin enthält sie wichtige Informationen, die für viele Anwender keineswegs offensichtlich sein dürften.
Impressum ©2007 - 2012 AREXX Engineering Nervistraat 16 8013 RS Zwolle The Netherlands Tel.: +31 (0) 38 454 2028 Fax.: +31 (0) 38 452 4482 "RP6 Robot System" ist eingetragenes Warenzeichen von AREXX Engineering. Alle anderen Warenzeichen stehen im Besitz ihrer jeweiligen Eigentümer. Diese Bedienungsanleitung ist urheberrechtlich geschützt.
Inhaltsverzeichnis 1. Einleitung ..................................................................................... 6 1.1. Technischer Support ................................................................ 7 1.2. Lieferumfang RP6 .................................................................... 7 1.3. Lieferumfang RP6v2 ................................................................ 8 1.4. Der RP6v2 und Erweiterungsmöglichkeiten ................................. 8 1.5.
4.1.1. Menüeinträge erstellen......................................................53 4.1.2. Syntax Highlighting einstellen.............................................56 4.1.3. Beispielprojekt öffnen und kompilieren.................................58 4.2. Programme in den RP6 laden .................................................. 60 4.3. Warum ausgerechnet C? Und was bedeutet „GCC“? ................... 61 4.4. C - Crashkurs für Einsteiger .................................................... 62 4.4.1.
RP6 ROBOT SYSTEM - 1. Einleitung 1. Einleitung Der RP6 ist ein kostengünstiger autonomer mobiler Roboter, entwickelt um sowohl Anfängern, als auch fortgeschrittenen Elektronik und Software Entwicklern einen Einstieg in die faszinierende Welt der Robotik zu bieten. Der Roboter wird komplett aufgebaut geliefert und ist damit ideal für alle, die sonst eher wenig mit Löten und Basteln zu tun haben und sich hauptsächlich auf die Software konzentrieren möchten.
RP6 ROBOT SYSTEM - 1. Einleitung 1.1. Technischer Support Bei Fragen oder Problemen erreichen Sie unser Support Team wie folgt über das Internet (Bevor Sie uns kontaktieren lesen Sie aber bitte diese Bedienungsanleitung vollständig durch! Erfahrungsgemäß erledigen sich viele Fragen so bereits von selbst! Bitte beachten Sie auch insbesondere Anhang A - Fehlersuche): - über unser Forum: http://www.arexx.com/forum/ - per E-Mail: info@arexx.nl Unsere Postanschrift finden Sie im Impressum dieses Handbuchs.
RP6 ROBOT SYSTEM - 1. Einleitung 1.3. Lieferumfang RP6v2 Folgende Dinge sollten Sie in Ihrem RP6v2 Karton vorfinden: ● ● ● ● ● ● Fertig aufgebauter RP6 Roboter RP6 USB Interface USB A->B Kabel 10 poliges Flachbandkabel RP6 CD-ROM Kurzanleitung Experimentierplatine NICHT mehr im Lieferumfang! 1.4. Der RP6v2 und Erweiterungsmöglichkeiten Der RP6v2 ist eine leicht überarbeitete Version des RP6. Die wichtigsten Änderungen betreffen die Drehgeber und zusätzliche Steckverbinder.
RP6 ROBOT SYSTEM - 1. Einleitung Die Hauptsicherung wurde von 2.5A auf 3.15A erhöht, da zusätzliche Stromversorgungsanschlüsse hinzugekommen sind und die Stromversorgung etwas optimiert wurde. Dies erlaubt es, größere Verbraucher als bislang zu verwenden. Ebenfalls verbessert wurden die Motortreiber, dort werden nun etwas leistungsfähigere und robustere MOSFETs verwendet was die ohnehin schon geringen Verluste weiter reduziert.
RP6 ROBOT SYSTEM - 1. Einleitung Auch Kombinationen z.B. aus RP6v2-M256-WIFI, RP6-M32 und mehreren Experimentierplatinen sind möglich – hier hätte man also 3 AVR Prozessoren und insgesamt (inkl. Mainboard) etwa 80 I/O Ports zur Verfügung, die man über Flachbandkabel zu den Experimentierplatinen führen kann. Dort kann man dann beliebige Sensorschaltungen aufbauen bzw. fertige Sensoren montieren (z.B. Ultraschall oder Infrarot Distanzsensoren, Temperatur, Kompass etc.).
RP6 ROBOT SYSTEM - 1. Einleitung 1.5. Features und technische Daten Dieser Abschnitt gibt einen Überblick darüber, was der Roboter zu bieten hat und dient gleichzeitig der Einführung einiger Begriffe und Bezeichnungen von Komponenten des Roboters, die vielen Anwendern noch nicht bekannt sein dürften.
RP6 ROBOT SYSTEM - 1. Einleitung gängigen Betriebssystemen wie Windows XP / 7 und Linux, die mit fast allen Terminalprogrammen und eigener Software benutzbar ist. ◊ Für den komfortablen Programmupload wird die Software RobotLoader (früher war der Name der Software RP6Loader) mitgeliefert. Sie bietet auch direkt ein kleines Terminal um mit dem Roboter über Textnachrichten zu kommunizieren und läuft unter Windows und Linux.
RP6 ROBOT SYSTEM - 1. Einleitung ◊ Kann zur Kommunikation von mehreren Robotern verwendet werden (Reflektion an Zimmerdecke bzw. Sichtverbindung) oder um Telemetriedaten zu übertragen. ● Zwei Lichtsensoren - z.B.
RP6 ROBOT SYSTEM - 1. Einleitung Weiterhin werden einige C Beispielprogramme sowie eine sehr umfangreiche Funktionsbibliothek mitgeliefert, welche die Programmierung stark erleichtert. Auf der Website zum Roboter werden demnächst evtl. weitere Programme und Updates für den Roboter und seine Erweiterungsmodule zur Verfügung stehen.
RP6 ROBOT SYSTEM - 1. Einleitung 1.7. Anwendungsvorschläge und Ideen Der RP6 ist auf Erweiterung seiner Fähigkeiten ausgelegt - mit Erweiterungsmodulen und zusätzlichen Sensoren könnte man dem RP6 z.B.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail 2. Der RP6 im Detail Dieses Kapitel beschäftigt sich detaillierter mit den wichtigsten Hardware Komponenten des RP6. Hier gehen wir auf die Funktionsweise der Elektronik und das Zusammenspiel mit der Software auf dem Mikrocontroller ein. Wenn Sie bereits Erfahrung mit Mikrocontrollern und Elektronik haben, brauchen Sie viele der Abschnitte in diesem Kapitel vermutlich nur kurz zu überfliegen.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Man kann den RP6 grob in 5 Funktionsgruppen unterteilen: ● Steuerungssystem (Control System) ● Stromversorgung (Power Supply) ● Sensorik, IR Kommunikation und Anzeigen (Sensors) – alles was mit der Aussenwelt kommunizieren kann bzw. bestimmte Werte misst. ● Antriebssystem (Drive System) ● Erweiterungssystem (Expansion System) 2.1.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Der Controller kann den logischen Zustand der Ports einlesen und in der Software weiterverarbeiten. Genauso kann er auch logische Zustände über die Ports ausgeben und kleinere Lasten wie z.B. LEDs damit schalten (bis ca. 20mA). Zusätzlich verfügt der Controller über viele integrierte Hardware Module, die spezielle Funktionen übernehmen können.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail 2.1.1. Bootloader Im Mikrocontroller befindet sich in einem speziellen Speicherbereich der sog. Bootloader. Das ist ein kleines Programm, das über die serielle Schnittstelle des Mikrocontrollers neue Programme in den Programmspeicher laden kann. Der Bootloader kommuniziert mit einem Host PC über die mitgelieferte RobotLoader Software (ehemals RP6Loader). Durch den speziell für den RP6 entwickelten Bootloader entfällt ein normalerweise benötigtes Programmiergerät.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail 2.3. Sensorik Die meisten Sensoren über die der Roboter verfügt, haben wir ja schon in anderen Abschnitten kurz genannt, wollen diese nun aber etwas detaillierter betrachten. In dem Blockdiagramm sind einige der Sensoren nicht in dem blauen Bereich "Sensors" zu sehen, weil sie besser in andere Bereiche passen.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Mit einem entsprechenden Programm, kann man so z.B. eine starke Taschenlampe in einem abgedunkelten Zimmer verfolgen, oder den Roboter die hellste Stelle in einem Raum suchen lassen! Klappt z.B. sehr gut mit einem stärkeren Hand-Halogenscheinwerfer: Wenn man damit auf den Boden leuchtet, kann der Roboter dem Lichtfleck auf dem Boden folgen. Das geht natürlich auch umgekehrt: Der Roboter könnte z.B. auch versuchen sich vor hellem Licht zu verstecken...
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail 2.3.4. Stoßstangensensoren (Bumper) Vorn am Roboter sind zwei Mikroschalter mit langem Schalthebel auf einer separaten Platine untergebracht, die etwas vor der anderen Sensorplatine liegt. Dadurch werden die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen wenn der Roboter mal gegen ein Hindernis fährt.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail 2.3.6. Drehgeber (Encoder) Ganz anders als die letztgenannten Sensoren funktionieren die Drehgeber, die an den Getrieben der Motoren zur Drehzahlmessung angebracht sind. Es handelt sich dabei um Reflexlichtschranken, die auf Codierscheiben mit je 18 weissen und 18 schwarzen Segmenten ausgerichtet sind, also insgesamt 36 Segmente (s. Abb). Diese Codierscheiben sind wiederum an je eines der Zahnräder der beiden Getriebe geklebt worden.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Dabei sind die Encoder sehr nützlich, denn man kann die Geschwindigkeit gut einregeln, egal wie der Untergrund und die Motorbelastung gerade aussieht. Bei gemessenen 50 Segmenten pro Sekunde liegt die Geschwindigkeit bei 1.25 cm/s, sofern wir von 0.25mm pro Zählschritt ausgehen. Etwa 50 Segmente pro Sekunde ist auch die geringste gerade noch regelbare Geschwindigkeit (das variiert aber etwas von Roboter zu Roboter).
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail So kann man also schonmal die Drehrichtung einstellen. Und wie bekommt man den Motor nun schneller bzw. langsamer? Ein Elektromotor dreht umso schneller, je höher die angelegte Spannung ist. Die Drehzahl kann also über die Spannung eingestellt werden - und genau dazu können wir die H-Brücke auch verwenden! Die Abbildung verdeutlicht das Prinzip nach dem wir vorgehen können. Wir erzeugen ein Rechtecksignal fester Frequenz, bei dem wir das sog.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Neben Sensoren macht es auch sehr viel Sinn, zusätzliche Controller einzubauen um die anfallenden Aufgaben aufteilen zu können. Beispielsweise das RP6 CONTROL M32 mit einem weiteren MEGA32 Mikrocontroller. Das Erweiterungssystem muss natürlich in der Lage sein, viele Erweiterungsmodule miteinander zu verbinden (engl. Expansion Modules, s. Abb.), dabei mit wenigen Signalleitungen auskommen und eine ausreichend hohe Geschwindigkeit bieten. 2.5.1.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail Nach der Startbedingung folgt die 7Bit lange Adresse des Slaves, mit dem die Kommunikation stattfinden soll, gefolgt von einem Bit das festlegt ob Daten geschrieben oder gelesen werden. Der Slave bestätigt dies mit einem ACK ("Acknowledge" = Bestätigung). Danach folgen beliebig viele Datenbytes wobei der Empfang jedes einzelnen Bytes vom Slave mit einem ACK quittiert wird. Abgeschlossen wird die Übertragung mit der Stopbedingung.
RP6 ROBOT SYSTEM - 2. Der RP6 im Detail loader Software startet... (der Bootloader generiert zum Starten allerdings nicht nur einen low Puls, sondern einen kompletten I²C General Call mit 0 als Datenbyte.) Die Interruptleitungen werden von einigen Modulen dazu verwendet, dem Master Mikrocontroller per externem Interrupt Signal mitzuteilen, dass neue Daten vorhanden sind oder eine bestimmte Aufgabe ausgeführt worden ist und auf neue Befehle gewartet wird.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3. Inbetriebnahme Bevor Sie mit dem RP6 oder seinem Zubehör loslegen, folgen nun einige Sicherheitshinweise die Sie vor allem dann beachten sollten, wenn Kinder den RP6 betreiben werden! Lesen Sie den folgenden Abschnitt daher bitte besonders aufmerksam durch! 3.1. Sicherheitshinweise Bedingt durch die offene Bauform gibt es beim RP6 einige spitze Ecken und scharfe Kanten. Er darf daher nicht als Spielzeug für Kinder unter 8 Jahren eingesetzt werden.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Programmabstürzen oder unkontrollierter Funktion des Roboters führen. Alle elektrischen Verbindungen von und zum Gerät sind stets vor Anschluss der Versorgungsspannung herzustellen. Das Aufstecken oder Abziehen von Verbindungskabeln/Modulen oder das Herstellen oder Lösen von Verbindungen können sonst zur Zerstörung von Teilen des Roboters oder seinem Zubehör führen. 3.1.2.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.2. Software Installation Als nächstes kommen wir zur Software Installation. Die korrekt installierte Software wird für alle nachfolgenden Kapitel unbedingt benötigt. Es sind Administrator-Rechte erforderlich, also melden Sie sich ggf.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.2.2. WinAVR - für Windows Als erstes werden wir WinAVR installieren. WinAVR ist aber - wie der Name schon andeutet - nur für Windows verfügbar! Linux Anwender müssen beim nächsten Abschnitt weiterlesen. WinAVR (das wird wie das englische Wort "whenever" ausgesprochen) ist eine Sammlung von vielen nützlichen und notwendigen Programmen für die Software Entwicklung für AVR Mikrocontroller in der Sprache C.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Zunächst müssen Sie evtl. schon installierte Versionen des avr-gcc, der avr-binutils und der avr-libc deinstallieren – wie schon gesagt sind diese meist veraltet. Das können Sie mit dem jeweiligen Paketmanager ihrer Distribution tun indem Sie nach „avr“ suchen und die drei oben genannten Pakete deinstallieren – sofern diese überhaupt vorhanden sind. Ob der avr-gcc schon installiert ist oder nicht und wenn ja wo, können Sie über eine Konsole z.B.
RP6 ROBOT SYSTEM - 3.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.2.3.2. Manuelle Installation Wenn Sie den Compiler lieber von Hand einrichten wollen oder die Installation mit dem Skript nicht klappt, können Sie nach den Anweisungen im folgenden Abschnitt vorgehen. Die Beschreibung hier orientiert sich an diesem Artikel: http://www.nongnu.org/avr-libc/user-manual/install_tools.html der auch in der AVR Libc Dokumentation im PDF Format auf der CD zu finden ist: :\Software\Documentation\avr-libc-user-manual-1.6.7.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme GCC für den AVR Der GCC wird ähnlich wie die Binutils gepatcht, übersetzt und installiert: > > > > > > > > > > > > > cd ~/RP6 bunzip2 -c gcc-4.1.1.tar.bz2 | tar xf cd gcc-4.1.1 patch -p0 < ../gcc-patch-0b-constants.diff patch -p0 < ../gcc-patch-attribute_alias.diff patch -p0 < ../gcc-patch-bug25672.diff patch -p0 < ../gcc-patch-dwarf.diff patch -p0 < ../gcc-patch-libiberty-Makefile.in.diff patch -p0 < ../gcc-patch-newdevices.diff patch -p0 < ../gcc-patch-zz-atmega256x.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.2.4. Java 6 Der RobotLoader (Infos dazu s.u.) wurde für die Java Plattform entwickelt und ist unter Windows und Linux verwendbar (theoretisch auch andere Betriebsysteme wie OS X, aber hier kann AREXX Engineering leider noch keinen offiziellen Support leisten). Damit das funktioniert, ist es notwendig, ein aktuelles Java Runtime Environment (JRE) zu installieren. Oft haben Sie dies bereits auf dem Rechner, allerdings muss es mindestens Version 1.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.2.5. RobotLoader Der RobotLoader wurde entwickelt, um komfortabel neue Programme in den RP6 und alle Erweiterungsmodule laden zu können (sofern diese über einen Mikrocontroller mit kompatiblem Bootloader verfügen). Weiterhin sind ein paar nützliche Zusatzfunktionen integriert, wie z.B. ein einfaches Terminalprogramm. Den RobotLoader selbst braucht man nicht zu installieren – das Programm kann einfach irgendwo in einen neuen Ordner auf die Festplatte kopiert werden.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.3. Anschluss des USB Interfaces – Windows Linux Anwender können beim nächsten Abschnitt weiterlesen! Zur Installation des USB Interfaces gibt es mehrere Möglichkeiten. Die einfachste Möglichkeit ist es, den Treiber VOR dem ersten Anschließen des Geräts zu installieren. Auf der CD befindet sich ein Installationsprogramm für den Treiber. Für 32 und 64 Bit Windows XP, Server 2003, Vista und Win7 Systeme: :\Software\USB_DRIVER\CDM20814_Setup.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.3.2. Treiber später wieder Deinstallieren Sollten Sie den Treiber jemals wieder deinstallieren wollen (Nein, das tun Sie jetzt bitte nicht - ist nur ein Hinweis falls Sie das jemals brauchen sollten): Wenn Sie das CDM Installationsprogramm verwendet haben, können Sie das direkt über Start-->Einstellungen-->Systemsteuerung-->Software tun.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme 3.6. Akkus einbauen Jetzt kommen wir endlich zum Roboter selbst. Dieser benötigt natürlich noch 6 Akkus! Wir empfehlen unbedingt qualitativ hochwertige NiMH Mignon Akkus (Hersteller z.B. Sanyo, Panasonic, o.ä. - am besten die Eneloop / Infinium Varianten!) mit einer realen Kapazität von mindestens 2000mAh (optimal sind 2500mAh) zu verwenden! Normale Batterien sollten Sie nicht verwenden.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Dann nehmen Sie den schwarzen in der Mitte liegenden Akkuhalter nach hinten heraus (s. Abb.). Stellen Sie nun bitte unbedingt sicher, dass der Schalter auf dem Mainboard des Roboters in der Position OFF steht, also in Richtung des Textes "OFF", bzw. in Richtung des großen zylinderförmigen Kondensators auf dem Mainboard zeigt (s. Abb)! Bevor Sie den Roboter wieder einschalten, müssen Sie kontrollieren ob die Akkus richtig herum eingelegt sind.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Das Mainboard wird nun wieder auf das Chassis gesetzt.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme LEDs ausgehen. Der Mikrocontroller auf dem Roboter schaltet sich nun - da er ohnehin noch kein Anwenderprogramm geladen hat das er ausführen könnte - automatisch in den Standby aus dem er über das USB Interface oder einen Druck auf den Start/Stop Taster bzw. einmal aus und wieder anschalten wieder aufgeweckt werden kann.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme gestartet werden damit die Verbindung wieder klappt). Die Virtual Comports heissen unter Linux „/dev/ttyUSBx“, wobei x eine Nummer ist, z.B. „/dev/ttyUSB0“ oder „/dev/ttyUSB1“. Die normalen Comports heissen unter Linux „/dev/ttyS0“, „/dev/ttyS1“ etc.. Diese tauchen ebenfalls in der Portliste auf sofern vorhanden.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme ter auch noch andere Hexdateien von Ihren eigenen Programmen und den Beispielprogrammen hinzufügen (s. Screenshot, hier wurden schon ein paar Hexdateien hinzugefügt). Der RobotLoader kann auch verschiedene Kategorien von Hexdateien verwalten. Damit lassen sich die Dateien übersichtlicher sortieren. Beispielsweise wenn man mehrere programmierbare Erweiterungsmodule auf dem RP6 hat, oder verschiedene Varianten von Programmen verwendet.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Die Warnmeldung erscheint auch direkt vor dem Test Nummer 8 nochmals und muss erst quittiert werden bevor es weitergeht. Genau wie jetzt, zu Beginn des Testprogramms. Geben Sie bitte ein kleines 'x' im Terminal ein und drücken Sie die Enter Taste (Das müssen Sie noch häufiger tun! Immer wenn so eine Meldung erscheint oder um einen Test abzubrechen...).
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Jetzt folgt der Akkusensortest. Der Sensor wurde eigentlich schon getestet, weil der RobotLoader die Akkuspannung ausliest und anzeigt, aber hier nochmal der Vollständigkeit halber.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Wenn man mit einer starken Taschenlampe ganz nah herangeht und direkt auf die Sensoren leuchtet oder den Roboter in die Sonne hält, können die Werte bis etwa 1000 ansteigen. Ist es im Raum sehr dunkel, sollten die Werte unter 100 liegen.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme Um den Test abzubrechen einfach x eingeben und Enter drücken. Weiter geht’s mit dem IRCOMM Test. Hier muss zunächst wieder mit x bestätigt werden. Dann werden IR Datenpakete gesendet und alle empfangenen Daten im Terminal ausgegeben und automatisch überprüft (das IRCOMM empfängt normalerweise auch die von ihm selbst gesendeten Signale, da die IR Dioden recht stark sind... wenn natürlich überhaupt keine reflektierenden Gegenstände bzw.
RP6 ROBOT SYSTEM - 3. Inbetriebnahme tes Getriebe – das sollte man aber eigentlich schon oben beim Test vor dem Akkueinbau bemerkt haben) wird der gemessene Strom sehr hoch sein und der Test sofort abbrechen.
RP6 ROBOT SYSTEM - 3.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4. Programmierung des RP6 Nun kommen wir endlich zur Programmierung des Roboters. 4.1. Einrichten des Quelltexteditors Erstmal müssen wir uns eine kleine Entwicklungsumgebung einrichten. Der sog. „Quelltext“ (auch Quellcode oder engl.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Es erscheint der Optionen Dialog. Hier können Sie diverse Einstellungen von PN2 verändern, wir wollen aber erstmal nur neue Menüeinträge zum Tools Menü hinzufügen. Wählen Sie dazu in der „Scheme:“ Dropdown Liste „C/C++“ aus! Klicken Sie dann auf den Button „Add“! Es erscheint der nebenstehende Dialog. Hier geben Sie bitte genau das ein, was Sie auf dem Screenshot sehen. „%d“ verweisst auf das Verzeichnis der aktuell gewählten Datei und „%d\make_all.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Alternativ zu „%d/make_all.bat“ kann man auch einfach nur „make“ ins Feld „Command“ schreiben und bei Parameters „all“. Die Batch Datei führt eigentlich auch nur diese Befehle aus (ist aber nützlich um das Programm einfach so aus dem Windows Explorer heraus zu kompilieren). Jetzt auf OK klicken – es erscheint ein neuer Eintrag in der Liste: ...und nochmal auf „Add“ klicken! Im selben Dialog wie oben nun die abgebildeten Eingaben vornehmen und auf OK klicken.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.1.2. Syntax Highlighting einstellen Eine weitere Einstellung die Sie verändern sollten betrifft das Syntax Highlighting. Es gibt einige „Keywords“ (=Schlüsselwörter) die dem normalen C/C++ Schema noch hinzugefügt werden sollten.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Fertig eingerichtet und nachdem man wie im nächsten Abschnitt beschrieben die Beispielprojekte geöffnet hat, sollte PN2 in etwa so aussehen: Links sind alle Beispielprojekte zu sehen, rechts der Quelltexteditor (mit dem angesprochenen Syntax Highlighting) und unten die Ausgabe der Tools (in diesem Fall die Ausgabe des Compilers). Sie können noch viele andere Sachen in PN2 umstellen und es gibt viele nützliche Funktionen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.1.3. Beispielprojekt öffnen und kompilieren Jetzt probieren wir gleich mal aus, ob auch alles richtig funktioniert und öffnen die Beispielprojekte: Im Menü „File“ den Menüpunkt „Open Project(s)“ wählen. Es erscheint ein normaler Dateiauswahl Dialog. Hier suchen Sie bitte den Ordner „RP6Base_Examples\“ im Ordner in dem Sie die Beispielprogramme gespeichert haben. Öffnen Sie nun bitte die Datei „RP6BaseExamples.ppg“.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Das Beispielprogramm wird nun übersetzt (das nennt man „kompilieren“ vom englischen „to complile“ bzw. „Compiler“=„Übersetzer“) und eine Hexdatei erzeugt. Diese enthält das Programm in der für den Mikrocontroller übersetzten Form und kann dann später in diesen geladen und ausgeführt werden! Es werden während der Kompilierung noch viele temporäre Dateien erzeugt (Endungen wie „.o, .lss, .map, .sym, .elf, .dep“).
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 der Compiler bemängelt. Wenn man auf diese farbig hervorgehobene Meldung klickt, springt PN2 im entsprechenden Editor direkt zu der jew. Zeile. Auch sehr hilfreich ist die Angabe zum Schluss „AVR Memory Usage“. Size after: AVR Memory Usage ---------------Device: atmega32 Program: 6858 bytes (20.9% Full) (.text + .data + .bootloader) Data: 148 bytes (7.2% Full) (.data + .bss + .
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.3. Warum ausgerechnet C? Und was bedeutet „GCC“? Die Programmiersprache C ist sehr weit verbreitet – es ist die standard Sprache die eigentlich jeder der sich für Softwareentwicklung interessiert mal verwendet haben sollte (oder zumindest von der Syntax her ähnliche Sprachen). Für so gut wie jeden derzeit verfügbaren Mikrocontroller existiert mindestens ein C Compiler.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4. C - Crashkurs für Einsteiger Dieses Kapitel gibt Ihnen nur eine ganz kurze Einführung in die C Programmierung. Wir besprechen hier nur die absolut notwendigen Dinge die man für den RP6 unbedingt braucht. Dieser Abschnitt und viele der Beispielprogramme verstehen sich eher als Kurzübersicht: „Was es so alles gibt und was man alles machen kann“.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Ein weiterer Artikel, der sich aber eher mit dem Compiler an sich und einigen speziellen Bereichen befasst ist hier zu finden: http://www.roboternetz.de/wissen/index.php/Avr-gcc Dann gibt es auch noch die WinAVR Homepage und Dokumentation: http://winavr.sourceforge.net/ http://winavr.sourceforge.net/install_config_WinAVR.pdf sowie die AVR-LibC Dokumentation: http://www.nongnu.org/avr-libc/user-manual/index.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Wir halten uns bei den größeren Beispielprogrammen auch konsequent daran und benennen alle Funktionen und Variablen in den Beispielprogrammen mit englischen Begriffen! Hier im Handbuch und diesem C Crashkurs wird jedoch ab und an auch mal eine Ausnahme gemacht. Bei den Programmen dieses Crashkurses sind die Kommentare auf Deutsch verfasst, aber bei den richtigen Beispielprogrammen und der RP6Library sind sie komplett auf Englisch.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Zeile 5: #include "RP6RobotBaseLib.h" Hier binden wir die RP6 Funktionsbibliothek ein. Diese stellt sehr viele nützliche Funktionen und vordefinierte Dinge bereit, die das Ansteuern der Hardware immens erleichtern. Das müssen wir über eine sog. Headerdatei (Endung „*.h“) einbinden, da der Compiler sonst nicht weiss, wo er die ganzen Funktionen finden kann. Header braucht man für alle Dinge, die in externen C-Dateien liegen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.3. C Grundlagen Wie schon zu Beginn gesagt, besteht ein C Programm aus reinem ASCII (American Standard Code for Information Interchage) Text. Es wird dabei strikt zwischen Großund Kleinschreibung unterschieden.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.4. Variablen Erstmal fangen wir aber damit an, wie wir denn überhaupt Daten im Arbeitsspeicher ablegen und auslesen können. Das geht mit Variablen. Es gibt in C verschiedene Arten von Variablen - sog. Datentypen. Grundsätzlich sind dies 8, 16 oder 32Bit große, ganzzahlige Datentypen, die entweder mit oder ohne Vorzeichen verwendet werden können.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Um eine Variable nutzen zu können, muss sie zunächst deklariert werden. Hierbei wird festgelegt welchen Datentyp, Namen und evtl. noch welchen Anfangswert die Variable erhalten soll. Der Name einer Variablen muss dabei mit einem Buchstaben beginnen (Der Unterstrich also “_” zählt ebenfalls als Buchstabe) und darf auch Zahlen, aber keine Sonderzeichen wie z.B. „äöüß#'[]²³|*+-.,<>%&/(){}$§=´°?!^“ o.ä. enthalten.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Es gibt dann noch ein paar nützliche Abkürzungen: z z z z += *= -= /= 10; 2; 6; 4; z++; z++; z++; z--; z--; z--; // // // // // // // // // // entspricht: z = z * 2 = z = z - 6 = z = z / 4 = z = z + 10; also ist z = 15 30 24 8 Abkürzung für z = z + 1; Also ist z hier 9 z = 10 // z++ nennt man auch „z inkrementieren“ z = 11 ... z = 10 // z-- nennt man auch „z dekrementieren“ z = 9 z = 8 ... Oben haben wir noch den Datentyp „char“ verwendet.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Ein weiteres Beispiel dazu: 1 2 3 4 5 6 7 8 9 10 uint16_t tolleVariable = 16447; if(tolleVariable < 16000) // Wenn tolleVariable < 16000 { // Dann: writeString("tolleVariable ist kleiner als 16000!\n"); } else // Sonst: { writeString("tolleVariable ist größer oder gleich 16000!\n"); } Hier wäre die Ausgabe „tolleVariable ist größer oder gleich 16000!“, denn tolleVariable ist hier 16447 und somit größer als 16000.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.6. Switch-Case Oft muss man eine Variable auf viele verschiedene Zahlenwerte überprüfen und abhängig davon Programmcode ausführen. Das kann man natürlich wie oben beschrieben mit vielen if-then-else Bedingungen machen, aber es geht auch eleganter mit einer switch-Verzweigung.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.7. Schleifen Schleifen werden immer dann gebraucht, wenn bestimmte Operationen mehrmals wiederholt werden müssen. Dazu direkt ein kleines Beispiel: 1 2 3 4 5 6 7 8 9 uint8_t i = 0; while(i < 10) { writeString("i="); writeInteger(i, DEC); writeChar('\n'); i++; // // // // // // // solange i kleiner als 10 ist... ... wiederhole folgenden Programmcode: "i=" ausgeben, den dezimalen (engl. "DECimal") Zahlenwert von i und ... ... einen Zeilenumbruch ausgeben.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Das kann man sowohl mit einer while als auch mit einer for Schleife ganz einfach realisieren: while(true) { } bzw. for(;;) { } Der Anweisungsblock wird dann „unendlich oft“ ausgeführt (bzw. bis der Mikrocontroller das Reset Signal erhält, oder man mit dem Befehl „break“ die Schleife beendet). Der Vollständigkeit halber kann man noch die do-while Schleife erwähnen, dabei handelt es sich um eine Variante der normalen while-Schleife.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.8. Funktionen Ein sehr wichtiges Sprachelement sind Funktionen. Wir haben ja weiter oben auch schon mehrere solcher Funktionen gesehen und verwendet. Beispielsweise die Funktionen „writeString“ und „writeInteger“ und natürlich die Main Funktion. Funktionen sind immer nützlich, wenn bestimmte Programmsequenzen in mehreren Teilen des Programms unverändert verwendet werden können – gute Beispiele sind z.B.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Die Main Funktion dient als Einsprungpunkt ins Programm. Sie wird in jedem C Programm zuerst aufgerufen und MUSS somit auch immer vorhanden sein. In unserer obigen Main Funktion wird zuerst die initRobotBase Funktion aus der RP6Library aufgerufen, die den Mikrocontroller initialisiert (muss man beim RP6 immer als erstes in der Main Funktion aufrufen, sonst funktionieren viele Sachen nicht richtig!).
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.9. Arrays, Zeichenketten, Zeiger ... Es gäbe noch viel mehr Sprachelemente und Details zu besprechen, aber hier müssen wir auf die angegebene Literatur verweisen. (Infos zu Zeigern finden Sie z.B. hier: http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_014_000.htm ) Das meiste davon braucht man auch gar nicht um die Beispielprogramme verstehen zu können. Hier geben wir nur ein paar Beispiele und Begriffe an, um einen Überblick darüber zu geben.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.10. Programmablauf und Interrupts Wir hatten weiter oben schon gesagt, das ein Programm generell Anweisung nach Anweisung von oben nach unten ausgeführt wird. Dann gibt es natürlich noch die normale Flusssteuerung mit Bedingungen und Schleifen, sowie Funktionen. Neben diesem normalen Programmablauf gibt es allerdings noch sog. „Interrupts“. Die verschiedenen Hardwaremodule (Timer, TWI, UART, Externe Interrupts etc.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.4.11. C-Präprozessor Den C Präprozessor wollen wir auch noch kurz ansprechen. Wir haben diesen bereits oben verwendet – nämlich bei #include "RP6RobotBaseLib.h"! Dieser Befehl wird noch vor dem eigentlichen Übersetzen durch den GCC vom Präprozessor ausgewertet. Mit #include "Datei" wird der Inhalt der angegebenen Datei an dieser Stelle eingefügt. Im Falle unseres Beispielprogramms ist das die Datei RP6BaseLibrary.h.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.5. Makefiles Das Tool „Make“ nimmt uns eine ganze Menge Arbeit ab, denn normalerweise müsste man so einiges in die Kommandozeile eintippen um ein C Programm zu kompilieren. Make verarbeitet ein sog. „Makefile“, das alle Befehlssequenzen und Informationen enthält, die zum Kompilieren des jeweiligen Projekts notwendig sind.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6. RP6 Funktionsbibliothek (RP6Library) Die RP6 Funktionsbibliothek, auch RP6Library oder kurz RP6Lib genannt, bietet viele nützliche Funktionen um die Hardware des RP6 anzusteuern. Über die meisten hardwarespezifischen Dinge muss man sich damit (eigentlich) keine Gedanken mehr machen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.2. UART Funktionen (serielle Schnittstelle) Wir haben im C-Crashkurs oben schon einige Funktionen aus der RP6Library verwendet, vor allem die UART Funktionen. Mit diesen Funktionen kann man Textnachrichten über die serielle Schnittstelle des Roboters an den PC (oder andere Mikrocontroller) schicken und auch von diesem emfangen. 4.6.2.1.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 void writeStringLength(char *data, uint8_t length, uint8_t offset); Wenn man Texte mit einstellbarer Länge (length) und Anfangsposition (offset) ausgeben möchte, kann man diese Funktion verwenden. Ein Beispiel: writeStringLength("ABCDEFG", 3, 1); Ausgabe: „BCD“ writeStringLength("ABCDEFG", 2, 4); Ausgabe: „EF“ Diese Funktion belegt allerdings auch RAM Speicher und ist eigentlich nur für dynamische Textausgabe gedacht (wird z.B.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 void writeIntegerLength(uint16_t number, uint8_t base, uint8_t length); Eine Variante von writeInteger. Hier kann zusätzlich die Anzahl der Stellen (length) die ausgegeben werden soll, angegeben werden. Ist eine Zahl kürzer als die angegebene Stellenzahl, werden führende Nullen angefügt. Ist Sie länger, werden nur die letzten Stellen dargestellt.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 anpassen. Standardmäßig hat der Ringpuffer eine Größe von 32 Zeichen. In der RP6uart.h Datei können Sie dies mit der UART_RECEIVE_BUFFER_SIZE Definition anpassen. Ein größeres Programm dazu finden Sie bei den Beispielprogrammen! Das Beispiel „Example_02_UART_02“ wurde an die neuen Funktionen angepasst. 4.6.3.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 mern universell verwendebare „Stopwatches“. Diese Bezeichnung ist nicht allgemein üblich, der Autor fand den Namen aber passend, weil das ganz ähnlich wie reale Stoppuhren funktioniert. Die Stopwatches machen viele Aufgaben einfacher.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Das Programm ist sehr einfach gehalten. Es wird jede Sekunde ein Zählerstand über die serielle Schnittstelle ausgegeben und inkrementiert (Zeile 29 bis 36) und nebenbei noch ein Lauflicht ausgeführt (Zeile 19 bis 26), das alle 100ms weitergeschaltet wird. Dazu werden Stopwatch1 und Stopwatch2 verwendet. In Zeile 9 und 10 werden die beiden Stopwatches gestartet und fangen danach an zu zählen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 setStopwatchX(uint16_t preset) Dieses Makro setzt Stopwatch X auf den übergebenen Wert. Beispiel: setStopwatch1(2324); setStopwatch2(0); setStopwatch3(2); setStopwatch4(43456); getStopwatchX() Dieses Makro gibt den Wert von Stopwatch X zurück. Beispiel: if(getStopwatch2() > 1000) { ... } if(getStopwatch6() > 12324) { ... } 4.6.4. Status LEDs und Bumper void setLEDs(uint8_t leds) Die 6 Status LEDs können Sie mit dieser Funktion steuern.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Da diese Funktionen sehr schnell ausgeführt werden, werden die LEDs nicht dunkel auch wenn die Funktion den Portpin auf Eingangsrichtung umschaltet. Man sollte aber zwischen den einzelnen Aufrufen ein paar Millisekunden Pause einfügen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 gleich noch kleinere Aufgaben - wie eben die Bumper auslesen - in einem Rutsch mit erledigen. Das geht sehr schnell und man müsste das sonst ohnehin fast immer noch im Hauptprogramm machen. Damit die Bumper automatisch überwacht werden, muss man diese Funktion: void task_Bumpers(void) ständig aus der Hauptschleife aufrufen (s.a.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 dann etwas abzufragen, wenn auch Bedarf dafür besteht. In C kann man auch Zeiger auf Funktionen definieren und diese dann darüber aufrufen ohne die Funktion in der Library selbst zu definieren. Normalerweise müsste eine Funktion schon zur Zeit der Übersetzung des Programms bekannt sein und in der RP6Library eingetragen werden, damit man diese Aufrufen kann. So kann man eigens definierte Funktionen als sog.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Drückt man z.B. den rechten Bumper wäre die Ausgabe: Bumper Status hat sich geaendert: - Linker Bumper nicht gedrueckt. - Rechter Bumper gedrueckt! Drückt man beide: Bumper Status hat sich geaendert: - Linker Bumper gedrueckt! - Rechter Bumper gedrueckt! Da man beide Bumper nicht wirklich gleichzeitig drücken kann, könnte evtl. noch eine zusätzliche Nachricht ausgegeben werden wo nur einer der beiden gedrückt gewesen ist.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.5. ADC auslesen (Batterie-, Motorstrom- und Lichtsensoren) Am ADC (Analog to Digital Convertor) sind - wie in Abschnitt 2 schon beschrieben wurde - viele Sensoren des RP6 angeschlossen. Natürlich bietet die RP6Library auch hier eine Funktion, um diese auszulesen: uint16_t readADC(uint8_t channel) Die Funktion gibt einen 10 Bit Wert (0...1023) zurück, also benötigt man 16 Bit Variablen für die Sensorwerte.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 void task_ADC(void) In diesem Fall verkürzt sie die Zeit die zum Auslesen aller Analog/Digital Wandler Kanäle im Programm benötigt wird. Ruft man diese Funktion ständig auf, werden automatisch alle ADC Kanäle der Reihe nach „im Hintergrund“ (also immer wenn gerade Zeit dazu ist) ausgelesen und die Messwerte in Variablen gespeichert.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.6. ACS – Anti Collision System Das Anti Collision System wird nicht mehr wie beim RP5, von einem kleineren Co-Prozessor gesteuert, sondern direkt vom MEGA32. Das erfordert nun zwar etwas mehr Programmieraufwand auf dem Hauptcontroller, hat aber auch den Vorteil, dass man es beliebig verändern und verbessern kann. Beim RP5 war das Programm im Co-Prozessor nicht veränderbar... Die Reichweite bzw.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include "RP6RobotBaseLib.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 schlossen lassen und sich die Ausgaben auf dem Bildschirm ansehen. Bewegen Sie einfach mal die Hand oder einen Gegenstand direkt vor dem Roboter hin und her! Das ACS kann durch Störquellen in seiner Funktion beeinträchtigt werden! Bestimmte Leuchtstoffröhren und ähnliches können den Roboter quasi „blind“ machen oder zumindest die Empfindlichkeit verringern. Wenn Sie also Probleme damit haben, schalten Sie erstmal alle evtl. störenden Lichtquellen aus.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Zimmerdecke und anderen Gegenständen oder bei direkter Sichtverbindung nach vorn, kann man so mit anderen Robotern oder z.B. einer Basisstation kommunizieren. Das geht zwar nur relativ langsam (ein Datenpaket braucht ca. 20ms und danach eine kleine Pause), aber einfache Kommandos und einzelne Messwerte lassen sich schon damit übertragen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Der Event Handler muss folgende Signatur haben: void receiveRC5Data(RC5data_t rc5data) Wie die Funktion heisst, ist natürlich auch hier fast egal! void IRCOMM_setRC5DataReadyHandler(void (*rc5Handler)(RC5data_t)) Mit dieser Funktion kann man den zuvor definierten Event Handler registrieren. z.B. so: IRCOMM_setRC5DataReadyHandler(receiveRC5Data); Danach wird immer diese Funktion aufgerufen sobald ein gültiger RC5 Code empfangen worden ist.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.9. Antriebs Funktionen Der Antrieb des Roboters kann mit Funktionen der RP6Library sehr komfortabel gesteuert werden. Es gibt dort bereits Funktionen, die mithilfe der Drehgeber automatisch die Geschwindigkeit der Motoren einregeln, den Motorstrom überwachen, automatisch bestimmte Distanzen abfahren und noch einiges mehr. Das ist sehr komfortabel, aber man muss – wie bei den anderen Systemen auch - ein paar Besonderheiten beachten wenn man das benutzen will.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 heißlaufen, was auf Dauer zu Beschädigungen führen würde. Nach drei Überstromereignissen innerhalb von 20 Sekunden wird der Roboter komplett gestoppt und die vier roten Status LEDs fangen an zu blinken. Ebenfalls wird überwacht ob einer der Encoder oder Motoren ausgefallen ist (kann schonmal passieren, wenn man zuviel dran rumbastelt...). Denn falls das der Fall ist, würde die motionControl Funktion den PWM Wert bis aufs Maximum erhöhen und so evtl.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Der Roboter erhöht oder verringert ggf. auch automatisch die Motorleistung – z.B. wenn er eine Rampe hochfährt.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include "RP6RobotBaseLib.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Der Roboter wird versuchen die gewünschte Strecke möglichst genau abzufahren. In der motionControl Funktion wird dazu zunächst ganz normal auf die gewünschte Geschwindigkeit beschleunigt, dann aber kurz vor dem Ziel abgebremst um nicht zu weit zu fahren. Das klappt aber nur auf ein paar Millimeter genau (etwa plusminus 5mm) – was in den meisten Fällen aber gut ausreichen sollte.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 An diesem Beispiel sieht man, wie die beiden Funktionen benutzt werden können: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include "RP6RobotBaseLib.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.10. task_RP6System() Wie wir in den vorangegangenen Abschnitten gesehen haben, muss man vier Funktionen ständig aus der Hauptschleife heraus aufrufen, damit ACS/IRCOMM, Motoren und Bumper korrekt funktionieren und die ADCs im Hintergrund ausgewertet werden. Um etwas Schreibarbeit zu sparen und es übersichtlicher zu machen, wurde die Funktion: void task_RP6System(void) implementiert.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.6.11. I²C Bus Funktionen Zum Schluss dieses Kapitels, kommen wir zu den I²C-Bus Funktionen. Diese sind zur Kommunikation mit anderen Mikrocontrollern und Erweiterungsmodulen notwendig. Es gibt zwei Versionen der I²C Funktionen – eine für den Slave und eine für den Master Modus.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Die beiden Arrays und die Variable für General Calls heissen I2CTWI_readRegisters, I2CTWI_writeRegisters und I2CTWI_genCallCMD I2CTWI_readRegisters sind die lesbaren Register und I2CTWI_writeRegisters sind die beschreibbaren Register. I2CTWI_genCallCMD speichert das zuletzt empfangene General Call Kommando. Der Datenaustausch über den I²C Bus läuft im Slave Modus komplett über diese Register.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Hier ein kleines Beispielprogramm dazu: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include "RP6RobotBaseLib.h" #include "RP6I2CslaveTWI.h" // I2C Library Datei einbinden (!!!) // ACHTUNG: Das muss auch im Makefile eingetragen werden (!!!) #define CMD_SET_LEDS 3 // LED Kommando, das über den I2C Bus // empfangen werden soll.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Sonst tut das Programm nichts – ein ausführlicheres Beispiel bei dem man so gut wie alles auf dem Roboter steuern kann gibt es wie schon gesagt auf der CD. Das hier demonstriert nur das Funktionsprinzip. Standardmäßig gibt es 16 beschreibbare und 48 lesbare Register. Wer mehr oder weniger benötigt, kann diese Werte in der Datei RP6I2CSlaveTWI.h der RP6Library anpassen. 4.6.11.2.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Diese Funktion braucht man häufig, denn viele I²C Geräte erwarten die Daten im Format: Slave Adresse – Registeradresse – Daten void I2CTWI_transmit3Bytes(uint8_t adr, uint8_t data1, uint8_t data2, uint8_t data3) Braucht man ebenfalls häufig. Vor allem im Zusammenhang mit dem oben beschriebenen Slave Programm – hier kann man die Daten im Format Slave Adresse – Kommandoregister – Kommando – Parameter1 übertragen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Empfangen von Daten Zum Empfangen von Daten bietet die RP6Library mehrere Möglichkeiten. Zum einen blockierende Funktionen, die ähnlich wie die Schreibfunktionen aufgebaut sind. Zum anderen aber auch Funktionen, die die Daten automatisch „im Hintergrund“ abholen. Zunächst zu der einfachen Variante, Daten blockierend lesen. uint8_t I2CTWI_readByte(uint8_t targetAdr); Diese Funktion liest ein einzelnes Byte von einem Slave.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 void I2CTWI_requestDataFromDevice(uint8_t requestAdr, uint8_t requestID, uint8_t numberOfBytes) Und mit dieser Funktion kann man Daten von einem Slave anfordern. Nachdem man diese Funktion aufgerufen hat, läuft der Abholvorgang wie oben beschrieben automatisch im Hintergrund. Anschließend kann man die Daten mit der Funktion: void I2CTWI_getReceivedData(uint8_t *msg, uint8_t msgSize) abrufen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 4.7. Beispielprogramme Auf der CD / Webseite finden Sie einige kleine Beispielprogramme. Diese Beispielprogramme demonstrieren die grundlegenden Funktionen des Roboters. Die meisten davon sind weder besonders komplex, noch stellen sie die optimale Lösung dar und verstehen sich nur als Ausgangspunkt für eigene Programme. Das ist absichtlich so, damit Ihnen auch noch etwas zu tun bleibt – wäre ja langweilig einfach nur vorgefertige Programme auszuprobieren...
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 1: „Hello World“-Programm mit LED Lauflicht Verzeichnis: \RP6BaseExamples\Example_01_LEDs\ Datei: RP6Base_LEDs.c Das Programm erzeugt Ausgaben auf der seriellen Schnittstelle, sie sollten den Roboter also an den PC anschließen und sich die Ausgaben im Terminal der RobotLoader Software ansehen! Der Roboter bewegt sich in diesem Beispielprogramm nicht! Sie können ihn also z.B. auf einen Tisch neben dem Computer stellen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 3: Frage-Antwort Programm Verzeichnis: \RP6BaseExamples\Example_02_UART_02\ Datei: RP6Base_SerialInterface_02.c Das Programm erzeugt Ausgaben auf der seriellen Schnittstelle Der Roboter bewegt sich in diesem Beispielprogramm nicht! Dieses etwas umfangreichere Beispiel ist ein kleines Frage-Antwort Programm. Der Roboter stellt vier einfache Fragen und man kann diese beliebig beantworten. Der Roboter reagiert z.B.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 6: Der Roboter fährt im Kreis Verzeichnis: \RP6BaseExamples\Example_05_Move_01\ Datei: RP6Base_Move_01.c ACHTUNG: Der Roboter bewegt sich in diesem Beispielprogramm! Sie müssen also die Verbindung zum PC nach dem Programmupload trennen und den Roboter auf eine ausreichend große Fläche Stellen! Es sollte schon mindestens eine Fläche von 1m x 1m oder eher 2m x 2m sein.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 9: Exkursion - Endliche Automaten Verzeichnis: \RP6BaseExamples\Example_05_Move_04_FSM\ Datei: RP6Base_Move_04_FSM.c Das Programm erzeugt Ausgaben auf der seriellen Schnittstelle Der Roboter bewegt sich in diesem Beispielprogramm nicht! Für komplexere Programme reichen die einfachen Methoden die wir in den bisherigen Beispielprogrammen verwendet haben nicht immer aus.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Das hier ist nur ein sehr sehr simples Beispiel um das Prinzip zu verdeutlichen. Ein Automat besteht aus Zuständen und Übergängen zwischen diesen Zuständen. Unsere Zustände sind hier STATE_START und STATE_1 bis 3. Den Automaten im obigen Listing könnte man auch folgendermaßen als Graphen darstellen: S ist dabei der Startzustand.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Text auf der seriellen Schnittstelle aus und setzt die Status LEDs, aber dafür ist kein Platz mehr in dem Graphen oben gewesen. Der obige Graph soll auch nur den grundlegenden Aufbau verdeutlichen. Beispiel 10: Endliche Automaten Teil 2 Verzeichnis: \RP6BaseExamples\Example_05_Move_04_FSM2\ Datei: RP6Base_Move_04_FSM2.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 werden je nach Akkuzustand etc. pp.. Wenn man das Programm allerdings modular implementieren will, sollte man sowas auch in zusätzliche Verhalten auslagern. Escape ist dagegen schon relativ komplex und wird bei Zusammenstößen mit Objekten die von den Bumpern gemeldet werden aktiv. Dann wird - je nachdem welche Bumper getroffen wurden – ein paar Zentimeter zurückgesetzt, etwas gedreht und anschließend die Kontrolle wieder an das andere Verhalten übergeben.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 12: Verhaltensbasierter Roboter 2 Verzeichnis: \RP6BaseExamples\Example_05_Move_05\ Datei: RP6Base_Move_05.c ACHTUNG: Der Roboter bewegt sich in diesem Beispielprogramm! In diesem Beispiel wurde unser verhaltensbasierter Roboter um ein Verhalten namens „Avoid“ erweitert. Mit diesem kann das ACS mit eingebunden werden und so nicht nur bei Kollisionen reagiert werden, sondern schon vorher versucht werden Hindernissen auszuweichen.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 14: Verhaltensbasierter Roboter 3 Verzeichnis: \RP6BaseExamples\Example_07_LightFollowing\ Datei: RP6Base_LightFollowing.c ACHTUNG: Der Roboter bewegt sich in diesem Beispielprogramm! Die Lichtsensoren können wir natürlich ebenfalls über ein kleines Verhalten namens „FollowLight“ mit einbeziehen: Die Priorität von FollowLight liegt unterhalb von Escape und Avoid, aber oberhalb von Cruise.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 bremst. Der Roboter beschleunigt und bremst also absichtlich so langsam. Man kann die Bewegung mit einer Taste auch abrupt stoppen – dann bremst der Roboter sofort ab und kommt (ohne besonders viel Last jedenfalls und abhängig von der Geschwindigkeit) innerhalb von etwa ein bis zwei Zentimetern zum Stehen. Der RC5 Empfang kann natürlich noch für viele andere Dinge verwendet werden – z.B.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 dann zwar etwas komplizierter zu handhaben, aber auch deutlich flexibler, da man den Mikrocontroller beliebig programmieren kann! Die Datenblätter vom PCF8574 und PCF8591 mit genauen Infos finden Sie auf der CD! Beispiel 18: I²C Bus Interface – Master Modus Verzeichnis: \RP6BaseExamples\Example_I2C_MASTER_03\ Datei: RP6Base_I2C_MASTER_03.c Dieses Programm demonstriert wie man den Master Modus des I²C Busses verwenden kann.
RP6 ROBOT SYSTEM - 4. Programmierung des RP6 Beispiel 20: I²C Bus Interface – Slave Modus Verzeichnis: \RP6BaseExamples\Example_I2C_SLAVE\ Datei: RP6Base_I2C_SLAVE.c Dieses Programm tut von sich aus erstmal nichts. Man muss den Roboter mit einem Erweiterungsmodul ausstatten, welches die Kontrolle übernimmt und als I²C Master agiert. Es ist sehr sinnvoll, den Roboter mit weiteren Controllern auszustatten.
RP6 ROBOT SYSTEM - 5. Experimentierplatine 5. Experimentierplatine Im Lieferumfang des RP6 Roboters (nicht beim RP6v2!) befindet sich eine Experimentierplatine. Darauf können Sie eigene Schaltungen mit bedrahteten Bauelementen aufbauen. Die Platine kommt als Bausatz – man muss noch die Stecker RICHTIG HERUM (s. Platinenaufdruck) anlöten bevor man etwas damit anfangen kann.
RP6 ROBOT SYSTEM - 6. Schlusswort 6. Schlusswort Hier endet dieser kleine Einstieg in die Welt der Robotik! Wir hoffen, dass Sie schon viel Spaß mit dem RP6 hatten und auch weiterhin haben werden! Aller Anfang kann schwer sein, gerade bei dieser komplexen Materie, aber wenn man die ersten Hürden genommen hat, macht die Robotik sehr viel Spaß und man lernt auch viel dabei. Wenn man sich später ein wenig besser in der C Programmierung auskennt, kann man richtig loslegen und größere Ideen realisieren.
RP6 ROBOT SYSTEM - ANHANG ANHANG A - Fehlersuche Hier eine kleine Liste mit Fehlern und möglichen Ursachen bzw. Lösungsvorschlägen. Die Liste wird in Zukunft noch erweitert und aktualisiert werden! 1.
RP6 ROBOT SYSTEM - ANHANG 2. Der Roboter startet die Programme nicht! ● Haben Sie nach dem Programmupload auch auf den Start/Stop Taster gedrückt? ● Haben Sie ein Programm korrekt in den RP6 geladen? Ist es das richtige Programm? Vor dem Übersetzen auch abgespeichert? 3. Der Roboter löst während der Fahrt ständig Resets aus und stoppt die Programmausführung! ● Die Akkus sind nicht ausreichend geladen.
RP6 ROBOT SYSTEM - ANHANG ein oder fügen Sie ihn durch Komma getrennt hinten an. Wenn keiner der Einträge vorhanden ist, fügen Sie einfach beide neu hinzu. Dann müssen Sie noch als root die schreib/lese Rechte für den Port setzen. Also „chmod 777 /dev/ttyUSB0“ ausführen sofern dem USB Interface der Port /dev/ttyUSB0 zugewiesen wurde. Danach einmal neu anmelden oder den Rechner neustarten. Nun sollte es funktionieren. 6.
RP6 ROBOT SYSTEM - ANHANG 7. Die Motoren beschleunigen bei jedem Programm immer nur ganz kurz auf eine sehr hohe Geschwindigkeit, stoppen dann sofort und die vier roten LEDs fangen an zu blinken! ● Die einfachste Möglichkeit: Sie haben ein eigenes Programm oder ein geändertes Beispielprogramm in den Roboter geladen und vergessen den Befehl „powerON();“ auszuführen bevor Sie die Motoren starten! ● Haben Sie die Software sonst irgendwie geändert? Funktionieren andere Beispielprogramme bzw.
RP6 ROBOT SYSTEM - ANHANG 8. Der Roboter bewegt sich nicht oder nur langsam und/oder nach kurzer Zeit bzw.
RP6 ROBOT SYSTEM - ANHANG 9. Mein Ladegerät lädt die Akkus im Roboter nicht! ● Haben Sie das Ladegerät Polungsrichtig angeschlossen? ● Sind die Akkus richtig eingebaut? Kein Wackelkontakt oder falschrum eingebaut? ● Ist der Stecker des Ladegeräts innen zu groß und hat deshalb keinen Kontakt zu dem inneren Stift der Ladebuchse? (Es gibt verschiedene Versionen dieser Stecker, die kann man normalerweise problemlos austauschen und es sollten verschiedene Varianten bei Ihrem Ladegerät mitgeliefert werden.
RP6 ROBOT SYSTEM - ANHANG 12. Der Roboter dreht sich nicht exakt um die vorgegebenen Winkel. ● Das ist erstmal normal und es wurde ja oben bereits erläutert warum! Bei Raupenantrieben entstehen immer Abweichungen durch Kettenschlupf. Außerdem müssen die Encoder kalibriert werden bevor das überhaupt richtig klappen kann. Lesen Sie dazu auch Anhang B. 13.
RP6 ROBOT SYSTEM ● ANHANG Häufige Anfängerfehler sind: ■ Ein Semikolon an die falsche Stelle gesetzt – z.B. hinter eine Schleife oder eine if Bedingung. Da kann man zwar oft einfach ein Semikolon hinmachen – aber das ist nicht immer das, was man eigentlich wollte! ■ Klammern bei if-else Konstrukten falsch gesetzt – da kann man sich schonmal vertun wenn man die Blöcke nicht richtig einrückt. ■ Falschen Datentyp für eine Variable verwendet – ein uint8_t kann z.B.
RP6 ROBOT SYSTEM - ANHANG B – Encoder Kalibrierung Die Auflösung der Encoder (Drehgeber) ist triebsräder und der Gummiketten abhängig. tergrund ein und werden auch selbst etwas Fertigungsschwankungen. Daher kann man und muss Messreihen durchführen um die nauer zu ermitteln. vom tatsächlichen Durchmesser der AnDie Gummiketten drücken sich in den Uneingedrückt.
RP6 ROBOT SYSTEM - ANHANG Bessere Methoden zur Wegmessung und Positionsbestimmung Das alles wird nur mit den Encodern nie 100%ig genau werden. Wenn man mit einem Raupenfahrzeug genauer navigieren will, muss man zusätzliche Sensoren verwenden. Die amerikanische Universität Michigan hat bei einem Ihrer großen Roboter mit Raupenantrieb z.B. einen kleinen Messanhänger gebaut, den der Roboter hinter sich herzieht (Roboter und Anhänger sind dabei über einen schwenkbaren Metallstab verbunden).
RP6 ROBOT SYSTEM - ANHANG C – Anschlussbelegungen In diesem Abschnitt finden Sie die Anschlussbelegungen der wichtigsten Stecker und Lötpads auf dem Mainboard, zusammen mit einigen wichtigen Hinweisen zur Verwendung. Zunächst der Vollständigkeit halber nochmal die Anschlussbelegung der Erweiterungsstecker mit passendem Textauszug aus Kapitel 2: Pin 1 liegt auf dem Mainboard immer auf der Seite auf der sich die weisse Beschriftung XBUS1 bzw. XBUS2 befindet bzw.
RP6 ROBOT SYSTEM - ANHANG damit die Treiberstufen des Controllers bei falschem Anschluss nicht überlasten! Eine normale RS232 Schnittstelle am PC verwendet 12V Pegel. Der RP6 hat keinen Pegelwandler auf dem Mainboard, da dies mit dem USB Interface nicht notwendig ist. Für eine normale 12V RS232 Schnittstelle muss allerdings unbedingt ein Pegelwandler wie der MAX232 zwischengeschaltet werden, da der RP6 mit 5V TTL Pegel arbeitet.
RP6 ROBOT SYSTEM - ANHANG Neue Anschlüsse des RP6v2 Der RP6v2 verfügt über einige zusätzliche Steckverbinder. In näherer Umgebung des Spannungsreglers IC1 befinden sich nun zwei zusätzliche 4 polige +5V Versorgungsanschlüsse, ideal um Verbraucher mit besonders hohem Energiebedarf zu versorgen (Servos, LED Scheinwerfer o.ä.). Ausserdem gibt es dort einen 3 poligen Anschluss für +UB (unregulierte Batteriespannung). Die Anschlussbelegung ist auf der Platine aufgedruckt.
RP6 ROBOT SYSTEM - ANHANG D – Entsorgungs- und Sicherheitshinweise Entsorgungshinweise Der RP6 darf nicht im normalen Hausmüll entsorgt werden! Er muss wie alle Elektrogeräte beim Wertstoffhof oder an einer anderen Elektro-Altgeräte Sammelstelle abgegeben werden! Falls Sie Fragen dazu haben, wenden Sie sich an Ihren Händler.