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.