ROBOprogy - der Komplettbaustein für programmierbare Steuerungen
Technische Merkmale des ROBOprogy:
Herzstück ist der leistungsstarke Controller Atmel MEGA32, der aber nicht in Assembler programmiert werden muss. Stattdessen wird eine Vielzahl an vor-programmierten Softwarebausteinen mitgeliefert, die mit der leicht erlernbaren Sprache Forth aneinander gefügt werden. Ist die Mechanik des Roboters aufgebaut, können unmittelbar nach dem Anschließen des ROBOprogy erste Fahrversuche absolviert werden. Dazu sind keinerlei Kenntnisse in Assemblersprache erforderlich.Mit der Sprache Forth ist das Programm auch bei komplexen Aufgaben nur wenige 100 Befehle (=Bytes) lang, etwa um den Faktor zehn kompakter als ein vergleichbares Assemblerprogramm. Forth wird wie ein Text auf dem PC entworfen, geändert und gespeichert. Auf Knopfdruck übersetzt das gratis mitgelieferte Programm den Text in Maschinensprache und überträgt das Ergebnis ohne "Programmierdongle" oder ähnliche Zusatzschaltungen an den ROBOprogy. Dort bleibt es im RAM-Speicher und kann - falls Fehler entdeckt werden - sekundenschnell durch eine verbesserte Variante ersetzt werden. Der Zyklus: Programm anpassen - übertragen - testen - verbessern benötigt meist weniger als eine Minute.
Der Roboter kann selbständig und ohne Verbindung mit dem PC das Spielfeld erkunden - wenn das Programm funktioniert. In der Anfangsphase ist es meist sinnvoll, ein ausreichend langes Verbindungskabel angesteckt zu lassen, damit man die Rückmeldungen vom ROBOprogy an den PC in Echtzeit mitlesen kann. Diese werden vorher an strategisch wichtigen Punkten in das Programm eingefügt, beispielsweise nach Fallunterscheidungen. Die Funktionsprüfung der Sensoren vor dem Start wird ebenfalls vereinfacht. Dieses interaktive Arbeiten führt recht schnell zu einem funktionsfähigen Programm.
Ausgänge des ROBOprogy:
Digitale Eingänge des ROBOprogy:
Analoge Eingänge des ROBOprogy:
Spezielle Softwarefunktionen des ROBOprogy:
Sonstiges:
...alle Wünsche erfüllt? ...
Wegen der Vielzahl der Ein- und Ausgänge kann man mit dem ROBOprogy sehr unterschiedliche Geräte steuern:
Rund um Roboter:
Sonstiges:
Man schließt den PC an, dann Motore und Servos und kann sofort loslegen, sobald der ROBOprogy Strom bekommt. Die sehr zahlreichen eingebauten Programmteile bieten Besonderheiten, die andere Steuerungen nicht bieten:
Die integrierte Regelung der Motore: Da wird nicht - wie bei anderen Steuerungen üblich - der mittlere Motorstrom vorgegeben, sondern die gewünschte Drehzahl. Um diese einzuhalten, wird 40 mal pro Sekunde der Strom kurz abgeschaltet und die Dynamospannung jedes Motors gemessen. Weicht ein Messwert vom Sollwert ab, wird der mittlere Strom sofort angepasst. Wenn Sie erst einmal selbst gefühlt haben, wie beim ROBOprogy die Antriebsmotore ihre vorgegebene Drehzahl trotz Belastungsänderung einhalten, werden Sie begeistert sein. Andere Robotersteuerungen können nur gegen Aufpreis nachgerüstet werden, diese Zusatzelektronik kostet genauso viel wie der ganze ROBOprogy. Noch ein Stromverbraucher, noch eine Platine mit etwa 60 Bauelementen für eine Aufgabe, die im ROBOprogy mit zwei 10k-Widerständen und durchdachter Software erledigt ist.
Die Linearisierungstabelle für den häufig verwendeten SHARP-Entfernungssensor GP2D120 (bis 30 cm) ist im ROBOprogy einprogrammiert. Der ROBOprogy kann diese Tabelle gleichzeitig auf zwei Sensoren an den Analog-Eingängen 1ADC und 2ADC anwenden. Sie programmieren unmittelbar mit Entfernungen und nicht mit Kennzahlen und Tabelle. Die Entfernungen werden in 2 mm-Stufen ausgegeben. Selbstverständlich können Sie auch die Spannung, die der GP2D120 liefert, direkt mit 1ADC abfragen.
Soll der Roboter Baken oder Fußbälle suchen, verwendet man zwei Phototransistoren, deren Helligkeit verglichen wird. Eine kleine Blende zwischen beiden Phototransistoren sorgt für unterschiedliche Helligkeit, wenn der Roboter nicht genau auf die Lichtquelle zufährt. Meist stört das Umgebungslicht und der Roboter sucht die hellste Stelle. Ändert sich die Helligkeit, muss die Empfindlichkeit der Photosensoren nachjustiert werden. Der ROBOprogy besitzt deshalb Programmteile, die mit dem Verfahren der Fourier-Analyse Wechselspannungssignale selektiv auf vier verschiedenen Frequenzen aus störendem Umgebungslicht herausfiltern kann. Diese Frequenzen sind so gewählt, dass andere Beleuchtungen wie Sonne oder 50 Hz-Wechsellicht nicht mehr stören. Der Roboter fährt nicht mehr zur hellsten Stelle der Umgebung, sondern er erkennt sein blinkendes Ziel. Dieses Verfahren funktioniert auch mit Schallquellen und zwei Mikrofonen.
Sind auf dem Spielfeld (Boden-)Marken auf Grund ihrer unterschiedliche Helligkeiten zu suchen, kennt wohl jeder das nervöse Herumschrauben an den Potis, um die Empfindlichkeit der Phototransistoren anzupassen. Der ROBOprogy kann den außerordentlich großen Dynamikbereich (65500 Stufen!) von Helligkeits-Frequenzwandlern (z.B. TSL245) nutzen, um selbstständig geringste Helligkeitsunterschiede festzustellen. Auch bei extrem großen Helligkeitsschwankungen geraten diese Sensoren nicht in den Stättigungsbereich, wo sie nicht mehr reagieren. Das lässt sich mit Phototransistoren und "normalen" 8-Bit-ADC-Wandlern nicht erreichen.
Was ist ein "transparentes" Echolot? Die üblichen Schaltungen messen die Zeitdifferenz vom Aussenden des Ultraschallimpulses bis zum zuerst eintreffenden Echo (das der nächstgelegene Gegenstand erzeugt) und beenden damit die Messung. Der ROBOprogy registriert auch später eintreffende Echos und gibt deren Entfernung an. Dadurch kann das Echolot auch "sehen", ob hinter dem Ball weitere Hindernisse folgen. Oder man kann das erste Echo, das am Roboter selbst entsteht, löschen und erst die folgenden auswerten.
Leider treten häufig Mehrfachreflexionen des Schalls auf, die eine falsche Entfernung vortäuschen. Bei glatten Wänden kann der Schall auch in die falsche Richtung reflektiert werden und beim Roboter kommt kein Echo an. Problematisch wird es, wenn mehrere Roboter Echolote der üblichen Frequenz 40 kHz verwenden und sich gegenseitig stören. In all diesen Fällen bieten sich - wie in der Luftfahrt - Transponder an, die auf einen Abfrageimpuls mit einer speziellen Signalfolge antworten. Wenn man die Richtung und Entfernung zu drei Transpondern kennt, lässt sich ähnlich wie bei GPS die Position im Spielfeld berechnen.
Der Roboter muss eine bestimmte Himmelsrichtung fahren? Dann schließen Sie einen elektronischen Kompass an den I2C-Port an und fragen immer wieder die Richtung ab, in die der Roboter fährt. Und falls Sie mehr Sensoren am Roboter anschließen wollen als dieser Eingänge besitzt? Dafür gibt es unterschiedliche I2C-Porterweiterungen (beispielsweise den PCF8574), die ebenfalls an den I2C-Port angeschlossen werden können.
Sie müssen genau wissen, wie weit der Roboter gefahren ist oder um welchen Winkel er sich gedreht hat? Dann bekommt jedes Antriebsrad eine Inkrementalscheibe (notfalls aus alten Kugel-Mäusen) mit den passenden Photosensoren – alles weitere erledigt der ROBOprogy. Weichen die beiden Zählerstände voneinander ab, verändert ein einfaches Programm die Motorgeschwindigkeiten so, dass der Roboter auch große Entfernungen exakt geradeaus fährt.
Bei humanoiden Robotern (Konstruktionen, die menschenähnliche Gestalt haben) werden die Gelenke mit Servos bewegt. Üblicherweise laufen diese in Mittelposition, wenn das Programm neu geladen und gestartet wird. Nicht so beim ROBOprogy. Die Positionen bleiben auch bei Programmänderungen gespeichert, bis der Strom ganz ausgeschaltet wird. Dieser Kundenwunsch erleichtert das Experimentieren und verhindert, dass es zu Schäden an der Mechanik kommt. Die Position eines Servos bewegt sich zwischen -150% und +150%; die Mittelstellung ist 0%. Hier die Messergebnisse:
| Servostellung | Pulsweite in ms |
|---|---|
| -150% | 0.9 |
| -100% | 1.1 |
| 0% Neutral | 1.5 |
| +100% | 1.9 |
| +150% | 2.1 |
Ein Prozent Servoweg entspricht somit 4 Mikrosekunden Pulsweite.
Die so genannte "Firmware" ist etwa 8400 Bytes groß und ständig im MEGA32 gespeichert. Dieses Programm meldet sich sofort nach jedem Einschalten mit einem BRUMM und ist betriebsbereit. Damit spart man die Zeit zum Hochladen nach jedem Batteriewechsel.
Das Anwenderprogramm - also das Programm, mit dem Sie den Roboter aktiv werden lassen – wird in Textform auf dem PC entworfen und gespeichert. Die Programmiersprache heisst Forth, arbeitet mit polnischer Notation und ist leicht erlernbar. Es stehen etwa 240 Befehle zur Verfügung, die nach gewissen Regeln kombiniert werden müssen. Diese Regeln sind in der Befehlsliste ausführlich beschrieben. Nicht dieses Programm kommt ins RAM des MEGA32, sondern eine sehr komprimierte Fassung in Form eines byte-codes, wie er auch in der Programmiersprache java verwendet wird. Die notwendige Übersetzung führt der PC während der Übertragung zum ROBOprogy durch. Wichtig ist, dass dieser komprimierte p-Code sekundenschnell ins RAM kommt und nicht mit einem speziellen und teuren "Programmiermodul" minutenlang ins EEPROM gebrannt wird.
Dieses Anwenderprogramm wird in wenigen Sekunden mit 38400 Baud vom PC zum MEGA32 übertragen. Nebenbei führt der PC noch einige Prüfungen durch. Dieses Verfahren verleitet zwar zum Programmieren nach "Versuch und Irrtum", hat aber den Vorteil, dass man Sekunden nach jeder Programmänderung die Reaktion des Roboter erleben kann. Das schont bei Wettbewerben die Nerven.
Falls der PC über ein ausreichend langes 3-adriges Kabel am Roboter angeschlossen bleibt, kann man in Echtzeit beliebige Daten der Sensoren und Zwischenergebnisse des Programms ( mit Kommentaren! ) am Bildschirm des PC mitlesen (Protokoll). Das ist unvergleichlich informativer als wenige Zeilen auf einem mitfahrenden LCD-Display und erleichtert die Fehlersuche. Man kann am PC-Monitor Schritt für Schritt nachvollziehen, was das Programm wann gemacht hat.
Jeder Programmierer macht Fehler. Das Protokoll erleichtert deren Suche und Beseitigung. Auch bei komplizierten und verschachtelten Fallunterscheidungen lässt sich durch angezeigte Texte auf dem ROBOprogy nachvollziehen, welche Einzelaufgaben das Programm nacheinander durchlaufen hat, welche Sensordaten eingetroffen sind und an welcher Stelle eine unerwartete Entscheidung getroffen wurde.
Eines ist klar: Jeder Prozessor - auch ein Pentium - kann nur ein Programm Schritt für Schritt abarbeiten. Um aber scheinbar mehrere (unabhängige) Aufgaben (=tasks) fast gleichzeitig zu erledigen, wurde bereits im letzten Jahrtausend das Zeitscheiben-Verfahren erfunden. Jede Aufgabe erhält eine kurze Rechenzeit von beispielweise 0,5 Millisekunden, dann kommt die nächste dran. Weil das etwa 1000-mal schneller ist als ein Mensch, verkaufen manche Leute das als "Multiprogramming". Wenn eine Zeitscheibe zehn Minten dauern würde, wäre klar erkennbar, dass immer nur ein Programm dran ist. Die einzelnen Programme können Daten über gemeinsam genutzte Variableninhalte austauschen.
Feste Zeitscheiben sind oft Zeitverschwendung: Manche Aufgaben warten nur auf einen Sensorberührung, um dann erst loszulegen. Diese Programmteile wären bereits mit 0,005 Millisekunden zufrieden und müssen nur selten drankommen. Andere Programmteile müssen so oft drankommen, wie möglich und dürfen nur kurzzeitig unterbrochen werden. Im ROBOprogy sind geeignete Befehle vorgesehen, ihre Anwendung wird in den Beispielen erklärt. Jede Aufgabe nimmt sich nur so viel Zeit, wie benötigt und endet dann. Falls Ihnen dieses Programmierverfahren noch nicht geläufig ist, finden Sie ein Beispiel in der Befehlsliste unter der Überschrift "Programmierte Sprünge (Sprungverteiler)".
Der größte Teil (etwa 500.000 Bytes) bleibt im PC: Eingeben des Programms, Editieren, Speichern, Übersetzen von Forth zu P-Code, Stackkontrolle, Syntaxprüfung und übertragen zum ROBOprogy. Diese Programme (Alle getestet auf Windows 98 / Win 2000 / Win-XP / Vista) können gratis hier herunter geladen werden: Q4e oder Q4d. Für die besonders Neugierigen sind auch die Quellcodes enthalten. Darin kann man sich ein Bild machen, wie die Sprache "Forth" funktioniert, wie das Programm für den Roboter analysiert und in Befehle für den ROBOprogy umgewandelt wird. Man kann auch detailliert nachlesen, welche Zeichen der PC mit dem ROBOprogy austauscht.
Ein erheblich kleinerer Teil (etwa 8400 Bytes) heißt Firmware (eine Sammlung immer wieder verwendeter Programmblöcke und die aufwendige Interruptsteuerung und die Drehzahlregelung für die Motore) und ist dauerhaft im MEGA32 "eingebrannt". Dieser Teil wird durch immer weitere Programmblöcke ergänzt und kann hier günstig gekauft werden. Für eigenen Experimente wird auch ein Teil des Assemblerprogramms veröffentlicht, damit man sich ein Bild machen kann, was im MEGA32 so vor sich geht. Allerdings wurden einige kompliziertere Passagen entfernt - ein kleines Geheimnis soll erhalten bleiben. Um am Assemblerprogramm eigene Versuche vornehmen zu können, benötigen Sie noch den Assembler "Studio4", den ATMEL gratis anbietet.
Der kleinste Teil (etwa 1000 Bytes), der Extrakt Ihres Roboterprogramms, kommt in den RAM-Speicher des MEGA32. Auf diese Weise sind Sie von umfangreichen Entwurf der notwendigen Hilfsprogramme befreit.
Weitere Software und Programmbeispiele entnehmen sie bitte der linken Spalte dieser Internetseite.
Weil dieser Prozessor ein außerordentlich umfangreiches Sortiment an Standard- und Spezialeingängen aufweist, die ganz vorzüglich für Robotersteuerungen geeignet sind. Bei anderen Fabrikaten muss man vieles extern dazukaufen. Das verteuert und vergrößert den Hardwareaufwand.
Der eingebaute RAM-Speicher von 2000 Byte reicht für die überwiegende Anzahl von Roboterprogrammen locker aus. Grund dafür ist der sehr kompakte Extrakt von Forth, der vom PC an den MEGA32 übermittelt wird. Grobe Faustregel: Ein Befehl = ein Programmbyte. Ein typisches Roboterprogramm besteht aus etwa 1000 Befehlen, eine Verwendung als automatisiertes Messgerät (PLEX) benötigt genau 91 Bytes. Den aktuellen Stand kann man mit dem Befehl RAM erfahren.
Für die vielen intern zu erledigenden Nebenaufgaben (Interruptsteuerung und Fourieranalyse) muss ein Prozessor verwendet werden, der möglichst wenig Zeit vergeudet mit dem Speichern der Registerinhalte auf dem Stack. Es wurden viele Prozessoren getestet - der MEGA32 ist mit seiner RISC-Architektur etwa um den Faktor 20 schneller als die Konkurrenz.
Als typisches Beispiel sei der 68HC11 von Motorola genannt, der auf dem "Handyboard“ des MIT eingesetzt wird: Sein RAM-Speicher wurde extern von 512 Byte auf 32768 Byte erweitert, wodurch genügend Platz vorhanden ist für ein austauschbares Betriebsprogramm, ähnlich wie beim LEGO-RCX. Das mitgelieferte Programm „Interactive C“ wurde durch eine an diesen Prozessor angepasste Version von Forth/P-Code ersetzt, um die gleichen Forth-Programme auf dem Handyboard und auf dem ROBOprogy laufen zu lassen und die Arbeitsgeschwindigkeit zu vergleichen. Der Unterschied ist frappierend, wie folgende Tabelle zeigt:
|
|
Mittlerer Zeitbedarf pro P-Code-Befehl |
Höchste programmierbare Frequenz in Forth |
Zeitbedarf des regelmäßigen Interrupt-Programms 1 kHz |
|
ROBOprogy MEGA32 |
1,8 µs |
180 kHz |
15 µs (985 µs für Forth) |
|
Handyboard 68HC11 |
41 µs |
12 kHz |
200 µs (800 µs für Forth) |
Ursache sind – bei gleicher Taktfrequenz – die zu speziellen Befehle des 68HC11, der Mangel an universell verwendbaren Registern im Prozessorkern und die eingebaute Automatik, dass alle diese Register vor jedem Interrupt auf dem Stack gespeichert und nachher wieder von dort geholt werden müssen. Bei den vielen Interrupts eines voll ausgebauten Programms kostet das Zeit! Der ATMEL MEGA32 besitzt erheblich mehr Register - 32 Stück! Davon muss aber nur ein einziges gespeichert werden. Die entsprechenden Details können den Datenblättern der Hersteller entnommen werden.
Vorzugsweise durch eigenes, interaktives Probieren mit dem ROBOprogy. Sie kaufen sich (mindestens) einen ROBOprogy und lernen Forth spielend. Man schließt einen Motor an und macht die ersten Laufversuche. Mit zwei Motoren - einer links, der andere rechts - und dem Befehl
15 MMGO
fährt das Ding, ohne im Handbuch blättern zu müssen. Die Logik dahinter heißt "polnische Notation": Zuerst wird die Zahl 15 auf dem Stack gespeichert, weil es kein Befehl ist. Die Folge MMGO wird beim Durchforsten der Befehlsliste gefunden und deshalb werden die dazugehörigen (etwa 30) Assemblerbefehl ausgeführt. Diese lauten: Hole den obersten Wert vom Stack und prüfe, ob positiv oder negativ. Versorge den L293D mit den erforderlichen Richtungsinformationen, bilde dann den Betrag der Zahl, multipliziere sie mit einem gewissen Faktor und sende sie zu den PWM-Registern. Schalte diese auf Dauerbetrieb. Schalte in regelmäßigen Abständen PWM kurz aus und messe die vom Motor erzeugte Generatorspannung. Weicht diese vom Sollwert ab, korrigiere den Inhalt der Register um 10%. Schalte dann PWM wieder ein. Bleibt die Abweichung, korrigiere beim nächsten Mal um 40%. Es gibt noch mehr Details zu beachten.
Falls sie an solchen Details nicht interessiert sind, sondern "nur" den Roboter zum Laufen bringen wollen, wird sie ein ROBOprogy schneller ans Ziel bringen als ein MEGA32 und eine Bedienungsanleitung für einen Assembler.
Als nächstes schließt man Servos an und lässt diese im Gleich- oder Gegentakt winken:
-50 1SERVO 30 2SERVO
Die weiteren Befehle probiert man schrittweise aus und fasst diese dann in einem ersten Programm zusammen.
Die gesamte Software des ROBOprogy (Editor, Compiler von Forth zu P-Code, Datenübertragung vom PC zum ROBOprogy) wurde mit WIN32FOR (Version 4.2) geschrieben. Dieses Programm ist Freeware und kann in der hier kostenlos geladen werden: Q4d (für COM1 und COM2) und Q4e (für USB mit Adapter). Beide Versionen funktionieren nur in Verbindung mit dem ROBOprogy, da dieser angeschlossen sein muss, um die Befehle in Echtzeit auszuführen und das Ergebnis an den PC zurück zu senden. Da wird nix im PC simuliert!
Die Sammlung von Programmbeispielen wird ständig ergänzt.
Wer lieber „trocken“ schwimmen lernen will, kann auch Forth ohne ROBOprogy lernen - das sind aber vorwiegend mathematische Aufgaben, bei denen sich kein Roboter bewegt. Die überwiegende Literatur ist in Englisch erschienen, im Internet findet jede Suchmaschine geeignetes Material. Sehr gute Programme von Tom Zimmer gibt es als Freeware in der Version W32for42. Mitgeliefert werden source-code, ausführliche Dokumentationen und Beispiele, da kann man richtig noch etwas lernen:-) Damit hat hier das gesamte Projekt ROBOprogy begonnen. Um eine Infizierung dieser EXE-Dateien durch Viren zu vermeiden, wurde jeweils von der Endung .exe der letzte Buchstabe geloescht. Damit diese Programme lauffähig werden, müssen Sie dieses "e" wieder ergänzen (rename).
Wenn Sie Fragen, Anregungen oder andere gute Ideen haben, bin ich für jede Rückmeldung dankbar. Haben sie Fehler entdeckt oder Verbesserungswünsche? email genügt...
10.09.2009 Herbert Weidner