Die Dokumentation zu meinem jugend forscht Projekt
1.Einführung | 2.Ein intelligentes Fahrzeug | 3.- 3.4 Hauptteil | 3.5 Hauptteil | 3.6 - 3.8 Hauptteil | 4.Ergebnisse


Fahrerlos zum Ziel
Mikrocontrollergesteuertes Fahrzeug mit Ultraschall-Sensorik
1993 von Holger Buß
2.Platz Bundesausscheidung Technik


3.
Hauptteil

3.6
Der Antrieb

Der Antrieb des Fahrzeugs besteht aus zwei Schrittmotoren (4), an deren Achse jeweils ein 10er-Zahnrad befestigt
ist, und aus den Antriebsrädern mit 40er-Zahnrädern. Hinten, unter dem Fahrzeug, befindet sich ein einzelnes
Rad, welches sich mittels eines Gestänges und eines 4 cm entfernten Drehpunkts in verschiedene Richtungen
bewegen kann.
Das Fahrzeug ist so ausbalanciert, daß fast das gesamte Gewicht auf den Antriebsrädem liegt, und so das
einzelne Rad entlastet wird.
Die Schrittmotoren bewegen sich pro Vollschritt 1,8 Grad, woraus eine Anzahl von 200 Schritten pro
Umdrehung resultiert. Da die Räder mit einer Übersetzung von 4:1 an die Motoren gekoppelt sind, sind
4*200, also 800 Vollschritte pro Radumdrehung erforderlich.
Bei einem Umfang von 23 cm entspricht ein Schritt 0,23m/800=0,28mm. Man könnte das Fahrzeug im
Halbschrittbetrieb also praktisch mit einer Genauigkeit von 140 Mikrometern ansteuern. Die Motoren werden
vom Mikrocontroller unter der Adresse COO4h angesteuert. Da der Rechner genaue Kontrolle über den Antrieb
hat, kann er anhand des Radumfangs, des Radabstandes voneinander und der Umdrehungen die genaue Position
des Fahrzeugs errechnen. Voraussetzung ist natürlich, daß die Antriebsräder immer festen Kontakt mit dem
Boden halten.
Die Antriebsräder können das Fahrzeug auf der Stelle drehen, da sie den Boden nur mit einer kleinen Fläche
berühren und sich das kleine Rad selbst nachführt. Wenn sich die Räder entgegengesetzt bewegen, wird die
Himmelsrichtung trotz Beibehaltung der momentanen Koordinaten geändert.

3.6.1
Schrittmotorenansteuerung

Als Treiber für die Motorwicklungen verwende ich einfache negierende Treiberbausteine. Man könnte das
Drehmoment der Motoren erhöhen, wenn man Widerstände vor die Spulenanschlüsse schalten, und dann mit
einer größeren Spannung arbeiten würde.
Im Einschaltmoment der Spulen fließt aufgrund der Selbstinduktion praktisch kein Strom und die volle
Betriebsspannung läge an. Das würde einen schnelleren Aufbau des magnetischen Felds bewirken. Bei hoher
Umdrehungszahl ist dies unumgänglich.
Da das Drehmoment für meine Anwendung jedoch reicht und ich die große Verlustleistung an den
Widerständen vermeiden wollte, habe ich auf diese Schaltungsvariante verzichtet.

3.7
Infrarot-Sender und Empfänger

Mittels eines Senders kann man drahtlos mit dem Mikrocontroller des Fahrzeugs kommunizieren. So kann man
ihm Befehle und Koordinaten über 44 Tasten zusenden. Als Sender verwende ich eine handelsübliche
Infrarotfembedienung eines Receivers von Philips. Sie arbeitet mit dem international genormten RC5-Code und
14 Bit Wortlänge.
Das Datenwort ist in Befehlen und Sub-Systemadressen aufgeteilt. Mittels der Systemadresse wird zwischen
unterschiedlichen Geräten unterschieden, so hat z.B. ein CD-Player die Adresse 20 und ein Kassettenrecorder
die Adresse 18. Bei beiden Geräten sind jedoch die Befehlswörter gleich.
Als Infrarotempfänger setze ich den integrierten IR-Vorverstärker SFH505A der Firma Siemens ein. Er zeichnet
sich durch große Empfindlichkeit, hohe Störsicherheit, geringe Fremdlichtbeeinflussung, kompakte Bauform
und kleinen Preis aus. Der Chip benötigt lediglich eine Versorgungsspannung von 5V
Das vom Sender einfallende Infrarotlicht wird mit Hilfe des Empfängers aufbereitet und dem Single-Chip-
Mikrocontroller SAA3049 der Firma VALVO seriell zugeführt. Bei diesem Baustein handelt es sich um einen
CMOS-Controller, der speziell zur Demodulation dieser Fernbedienungssignale entwickelt wurde. Er verarbeitet
sowohl den RECS8O-Code (Pulsabstandmodulation) als auch den RC5-Code (Biphasenmodulation).
Dieser Controller muß nur mit einem 4 MHz-Quarz und einem Power-On-Reset beschaltet werden. Mittels des
Code-Eingangs wird die Modulationsart bestimmt. Sobald ein korrekter Code akzeptiert wurde, liegt die
Information an den Datenpins (Pin 1 bis 6) in invertierter Form an. Die übertragene Adresse ist ebenfalls direkt
abzugreifen. Diese Daten sind über den Adreßdecoder unter der Adresse C004 abzurufen.
Nach Empfang eines gültigen Codes wird an einem der Pins ein 10 Mikrosekunden langer Low-Impuls
ausgegeben. Dieser wird negiert und dem Mikrocomputer des Fahrzeugs an einem flankengesteuerten In-
terrupteingang zugeführt.
Nach dem Einschalten erwartet der Mikrocomputer einen Befehl, der mittels des Senders übertragen wird. Die
Tasten der Fernbedienung habe ich beliebig mit verschiedenen Funktionen belegt. Man könnte das Fahrzeug so
z. B. manuell fernlenken.
Nach Betätigen der ,,MEMO"-Taste fordert der Controller eine Zielkoordinate an, die mittels der Ziffern des
Senders gesendet wird. Das Fahrzeug versucht nun diese Koordinate selbständig zu erreichen und weicht dabei
im Weg liegenden Hindernissen aus.

3.8
Das Programm

Man braucht um das Board zu programmieren, selbstverständlich eine Tastatur und einen Monitor. Da der
Controller diese nicht beinhaltet, muß man sich diese praktisch von einem PC leihen. Ich verwende hier ein
vollduplexfahiges Terminalprogramm, bei dem jeder Tastendruck vom PC seriell umgewandelt wird und über
die V24 Schnittstelle zum Controller gelangt. Die Zeichen erscheinen nur dann auf dem Bildschirm, wenn sie
vom Controller

zurückgeschickt wurden. Wenn ein Programm fertig ist, kann man es direkt starten oder es in ein EPROM
brennen. Zum Brennen verwende ich ein anderes Compuboard, welches mit einem 8052-Chip und
entsprechender Hardware bestückt ist. Das Fahrzeug bewegt sich immer nur in Y oder X Richtung, nie diagonal.
Es bietet sich für diese Zwecke also an, mit den vier Himmelsrichtungen zu arbeiten. Diese Richtungen stimmen
jedoch nur dann mit den echten Himmelsrichtungen überein, wenn das Fahrzeug beim Einschalten nach Norden
gerichtet ist. Es bewegt sich auf einem Koordinatensystem, bei dem die YAchse Norden entspricht. Bewegt sich
das Fahrzeug also nach Norden, wird jeder gegangene Zentimeter der Y-Koordinate hinzugerechnet, und die X-
Koordinate bleibt unverändert. Bewegt es sich nach Westen, so muß der Weg von der X-Koordinate subtrahiert
werden, usw. Ich ordne jeder Richtung eine feste Zahl zu: S=1, W=2, N=3, 0=4. Sie sind also im Uhrzeigersinn
durchnummeriert. Dreht sich das Fahrzeug jetzt gegen den Uhrzeigersinn, so wird der Richtungszeiger
dekrementiert (-1) und umgekehrt. Anhand der Richtung weiß der Rechner, welcher Raumachse er den
gegangenen Weg zuordnen soll. Man kann dem Controller sehr einfach die gewünschte Richtung mitteilen,
indem man die Variable HRI auf den entsprechenden Wert setzt und dann in das Unterprogramm:
,,Richtungskorrigierung" springt. Diese Routinen erleichtern später wesentlich das Programmieren im unteren
Bereich (ab Zeile 1500). Wenn sich das Fahrzeug eine bestimmte Strecke vorwärtsbewegen soll, braucht man
sie nur in Zentimetern in die Variable MUSS schreiben und dann das entsprechende Unterprogramm aufrufen.
Jetzt bewegt sich das Fahrzeug vorwärts, bis es den gewünschten Weg zurückgelegt hat, oder vor ein Hindernis
geraten ist. Programmteile, die man immer wieder benötigt, habe ich einfach zu Unterprogramm-Routinen
gemacht, die man jederzeit aufrufen kann. Einige davon sind z.B. die Unterprogramme für die Rotorsteuerung
oder: ,,So weit, bis rechts frei". Sie läßt das Fahrzeug soweit fahren, bis es rechts mindestens 40cm Platz hat
oder vor ein Hindernis gelaufen ist.

3.8.1
Beispiel eines Programms

Anhand eines kleinen Beispiels kann man die Programmschritte im unteren Bereich des Programms
verdeutlichen.

1600 ****** ZIEL RECHTS ***
1601 PRINT "Ziel rechts"
1602 HM=N : GOSUB 700
1610 MUSS=YAB : GOSUB 300
1620 ROTOR=25 : GOSUB 10: GOSUB 400
1630 IF YAB<1.AND.PLATZ<30 THEN 2100
1640 IF PLATZ<30 THEN 1700
1650 HRI=O : GOSUB 700
1660 MUSS=XAB : GOSUB 300
1670 HRI=N : GOSUB 700
1680 GOTO 1550

Zuerst stellt der Rechner in der Grundroutine (Zeile 1570) fest, in welchem Teil des Koordinatensystems sich
das Ziel befindet. Dann verzweigt er in die dafür vorgesehenen Programmteile.
In dem Beispiel befindet sich das Ziel rechts vorne, also Nordost vom Fahrzeug (s. Abb. 11).
Zunächst wird in Zeile 1602 sichergestellt, daß die momentane Richtung Nord ist. Die Variable YAB entspricht
dem Y-Abstand zum Ziel. Jetzt muß das Fahrzeug eigentlich bis zur Y-Koordinate vorgehen, also:
MUSS=YAB (von y-Abstand). Wenn ihm ein Hindernis im Weg liegt, bleibt es davor stehen (ist in Unterprogramm von Zeile 700 vorgesehen).
Jetzt schaut es, ob ihm ein Hindernis im Weg lag oder nicht, nach rechts. Der ROTOR Wert 25 entspricht der
Rotorstellung rechts (0 ist links und 13 vorn). Über GOSUB 10 wird der Rotor in die entsprechende Stellung
gebracht, und über GOSUB 400 wird der Abstand gemessen, der in die Variable PLATZ geschrieben wird.
Sollte rechts der Platz kleiner sein als 30cm und die Y-Koordinate schon erreicht, so wird in den
Programmabschnitt: ,,Norden Ausweg suchen Ost" verzweigt.
Wenn der Platz zu klein ist und die Y-Koordinate noch nicht erreicht, so muß er vor und neben einem Hindernis
stehen. Er versucht jetzt das Hindernis links zu umgehen, indem er nach Zeile 1700 verzweigt.
Sollte er jedoch rechts doch Platz haben, so dreht er mittels des Befehls HRI=O nach Osten und bewegt sich
dann auf die X-Koordinate (Zeile 1660).
Danach schwenkt er wieder nach Norden, und das Programm beginnt wieder bei der Grundroutine.
In ähnlicher Weise ist auch der Rest des Programms aufgebaut.
Damit das Listing nicht zu lang wird, kommt es vor, daß in einer scheinbar ausweglosen Situation die Ziel- und
Ist-Koordinaten umgerechnet werden, damit Programmabschnitte, die eventuell das Problem lösen könnten,
zum Einsatz kommen. Dann werden die Hindernisse praktisch von einer anderen Seite betrachtet.