Mit Hilfe von Mikrokontrollern lassen sich viele Dinge bewegen; ob es der Druckkopf in einem Drucker, der Fensterheber in einem Auto oder die Armbewegung eines Roboters ist. Angetrieben werden die Teile von kleinen Schrittmotoren, die von einem Mikrokontroller ihre Anweisungen bekommen.
Ein-/Aus-Signale und Motorbewegungen
Wie wir bereits bei den LEDs gesehen haben, werden auch von Mikrokontrollern angesteuerte Motoren über HIGH und LOW Signale in eine kontrollierte Bewegung versetzt. Der Unterschied zur LED ist aber die viel schnellere Ablauffolge solcher HIGH-LOW-Signale. Würde man zur Kontrolle bei der Ansteuerung eines Motors eine LED zur Hilfe nehmen, dann würde das menschliche Auge die schnellen Änderungen der HIGH und LOW Signale an den Motor nicht auflösen können. Als Ergebnis sehen wir nur eine mehr oder weniger hell leuchtende LED.
Der einfachste Motor, mit dem man das Ansteuern durch einen Mikrokontroller näher untersuchen, lernen und verstehen kann ist der Servo. Er benötigt keine zusätzlichen elektronischen Hilfsschaltungen oder mechanische Zusatzbauteile und er ist sehr leicht über die BASIC Stamp ansprechbar.
Standardservos finden sich in allen ferngesteuerten, sogenannten RC-Modellbauten, wie Flugzeugen, Hubschraubern, Quadrocoptern, Booten und Fahrzeugen. In Autos sind sie unter anderem für die Lenkung und die Drosselklappe beim Motor verantwortlich, in einem Boot für die Ruderanlage und in einem Flugzeug für die Quer- und Seitenruder.
Ein RC Flugzeug wird per Funk-Fernsteuerung mittels zweier sogenannter Reflexstifte oder Steuerknüppel gesteuert, die wie Joysticks aussehen. Die Steuerungsdaten werden per Funk von der Steuerungseinheit an das Flugzeug übermittelt und dort von den jeweiligen Servos entsprechend umgesetzt.
Genauer gesagt wird jede Position der beiden Steuerknüppel von der Fernsteuerung möglichst schnell in Steuerimpulse bestimmter Länge umgesetzt. Die Länge eines Impulses ist ein Maß für die Position des Joysticks. Im RC-Modell werden die Steuerimpulse in digitale Impulse (HIGH/ LOW) umgesetzt und dann an die Servos übergeben. In jedem von ihnen existiert eine elektronische Schaltung, die diese digitalen Impulse wiederum in eine Drehbewegung umsetzen kann.
Die Länge eines Impulses ist dabei ein Maß für die Position, die das Steuerhorn eines Servos dann einnimmt oder den Winkel um den es sich dreht. Diese Impulse werden 40 bis 50 mal pro Sekunde wiederholt, haben eine Impulslänge von wenigen tausendstel Sekunden und halten den Servo in seiner Position.
Die Länge eines Impulses ist dabei ein Maß für die Position, die das Steuerhorn eines Servos dann einnimmt oder den Winkel um den es sich dreht. Diese Impulse werden 40 bis 50 mal pro Sekunde wiederholt, haben eine Impulslänge von wenigen tausendstel Sekunden und halten den Servo in seiner Position.
In dieser Lektion werden wir die BASIC Stamp so programmieren, dass sie Impulssignale an den Servo sendet und das Steuerhorn in bestimmte Positionen dreht oder den Servo in einer bestimmten Position hält. Die folgenden Programme fragen Druckschalter ab und benutzen die Information, ob ein Schalter gedrückt wurde oder nicht, das Steuerhorn eines Servos in eine bestimmte Position zu drehen und zu halten (Servo Positionskontrolle mit Drucktaster). Die BASIC Stamp werden wir auch dazu benutzen Eingabewerte über das Terminal abzufragen und damit die Position eines Servos zu verändern (Servo Positionskontrolle über Terminal).
In Lektion 4 lernst du
Material |
|
Aufgabe |
|
Der LED Schaltkreis dient in dieser Übung nur dazu, die Kontrollsignale, die von der BASIC Stamp an den Servo gesendet werden, "sichtbar" zu machen.
Hinweis: Am Board of Education lassen sich nicht alle am Markt erhältlichen Standardservos betreiben. Wer also eigene Servos zu Hause hat, sollte erst mit dem Parallax Standard Servo Erfahrungen gesammelt haben, bevor er sich an die Untersuchung eines fremden Produkts macht.
Anschluss eines Servos
Mit dem Kurzschlussbügel wird die Energiequelle für den Servo/die Servos eingestellt.
Schaltskizze und Schaltungsaufbau
Das Steuerhorn eines Parallax Standard Servos kann innerhalb eines Bereichs von 180° jede Winkelposition einnehmen. Wenn man einen kleinen Draht am Steuerhorn befestigt, ähnlich wie in Abbildung 4.7 gezeigt oder ein Stück Pappe in Form eines Zeigers auf das Horn klebt, dann lässt sich die Drehbewegung und der überstrichene Winkelbereich des Horns besser verfolgen.
Die Mittelstellung eines Servomotors findet man, indem man das Steuerhorn vorsichtig im und gegen den Uhrzeiger jeweils bis zum Anschlag dreht. Die Mittelstellung entspricht dann der 90° Position.
Sie liegt irgendwo in dem angezeigten Bereich und muss für jeden Servo neu ermittelt werden.
Aufgabe |
|
Drehbewegungen eines Servos programmieren
Abbildung 4.9 zeigt ein sogenanntes Zeitdiagramm eines Servomotors. Dargestellt wird eine Folge von HIGH-/ LOW-Signalen von einer BASIC Stamp, mit der ein Servo in der 90° Postion verweilt.
Die Signalfolge wiederholt sich alle 21,5ms. 1,5ms liegt ein HIGH-Signal an, gefolgt von einem ca. 20ms LOW-Signal. Mit diesem Pulsfolgeschema wird der Servo in seiner stabilen Position gehalten. Das Dauer des anliegenden LOW-Signal kann nach oben und unten um wenige Millisekunden abweichen, während die Dauer des HIGH-Signals für die genaue Positionierung exakt sein muss.
Mit dem speziellen PBASIC-Befehl pulsout lässt sich die Dauer für ein HIGH-Signal exakt vorgeben. Wir sprechen zukünftig auch kurz von der Pulsdauer eines HIGH-Signals.
legt die Pulsdauer für ein HIGH-Signal fest.
PIN ist eine natürliche Zahl; sie gibt den Ausgangsport an, über den der Impuls geschickt wird.
Dauer legt die Impulslänge in Vielfachen von 2µs fest.
Mit Hilfe des Befehls PULSOUT können wir jetzt mit Hilfe eines PBASIC Programms einen Servo in die 90° Position drehen lassen.
Der millionste Teil
Der tausendste Teil
Umrechnung: 1 ms entsprechen 1000 µs oder mit anderen Worten: erst wenn 1000 Mikrosekunden vergangen sind, ist 1 Millisekunde herum.
Aufgabe |
|
Das Programm 04_02.bs2
Meine Beobachtungen
a) Das Steuerhorn ...
_______________________________________________
_______________________________________________
_______________________________________________
b) Nach einem Reset habe ich beobachtet, dass das Steuerhorn ...
_______________________________________________
_______________________________________________
c) Ich erkläre mir das so, dass ...
_______________________________________________
_______________________________________________
_______________________________________________
Wie funktioniert das Programm 04_02.bs2?
Zeile 7
Der Befehl PULSOUT 14, 750 sendet einen Impuls von 750 x 2 µs Länge an den Servo; das entspricht einer Impulslänge von 1500 µs oder 1,5 ms.
Zeile 8
Anschließend wird für eine Dauer von 20 ms über Pin 14 ein LOW-Signal an den Servo gesendet.
Zeile 6 und Zeile 9
Die beiden Befehle in Zeile 7 und 8 sind in eine Endlosschleife eingebettet (DO ... LOOP). Damit werden die beiden Signale: HIGH für 1,5ms gefolgt von LOW für 20ms ständig wiederholt. Sie halten damit das Steuerhorn des Servo stabil in der Mittelstellung.
Die 90° Position des Steuerhorns wird auch als Mittelstellung eines Standardservos bezeichnet. Mit einem 1,5ms Impuls wird das Steuerhorn stabil in dieser Position gehalten, dies entspricht ungefähr der Position, die wir auf mechanische Weise in Aufgabe 2 schon selbst herausgefunden hatten.
Bezüglich dieser Mittelstellung entspricht ein Drehwinkel von 45° der Hälfte zwischen Ausgangsposition und Mittelstellung und ein Winkel von 135° der Hälfte zwischen Endposition und Mittelstellung (siehe Abb. 4.7).
In der folgenden Aufgabe wird die Mittelstellung eines Servos bestimmt.
Aufgabe |
|
Meine Beobachtungen
Nach dem Einschalten der Spannungsversorgung dreht das Steuerhorn ..
_______________________________________________
_______________________________________________
Wenn ich mit der Hand versuche das Steuerhorn zu drehen, spüre ich
_______________________________________________
Jetzt kommst du!
Programme, mit denen das Steuerhorn um verschiedene Winkel gedreht werden kann
In Abb. 4.10 sind einige Winkelpositionen des Steuerhorns mit den entsprechenden Befehlsaufrufen dargestellt. Es sind Näherungszahlen, die in dem einen oder anderen Fall abweichen können und ggf. individuell angepasst werden müssen.
Alle Zwischenwinkelmaße lassen sich aus den vorgegebenen Angaben leicht ableiten.
Beispiel
Der Servo soll in die 30° Position drehen. Um den Wert der Größe Dauer im PULSOUT-Befehl herauszufinden, wenden wir den klassischen Dreisatz an:
Wir wissen, dass zwischen 0° und 90° 500 Pulse liegen (siehe Abb. 4.10). Damit gilt:
90° entspricht einer Impulslänge von 250 + 500
1° entspricht einer Impulslänge
von 250 + 500/90
30° entspricht einer Impulslänge von
250 + (500/90)*30 = 250 + 166,66..
-> ca. 417
PULSOUT(14, 417) dreht das Steuerhorn des Servos über Pin 14 in die Position 30°.
Aufgabe |
Setze den Power Schalter in Position 0. Veränder das Programm 04_02.bs2 so, dass sich das Steuerhorn des Standardservos in folgende Winkelpositionen dreht: - 15° - 49° - 125° - 165° Notiere für jeden Winkel den berechneten Wert für die Variable Dauer. Setze den Power-Schalter in Position 2. Starte das jeweils modifizierte Programm 04_02.bs2. Überprüfe jeweils die Position des Zeigers. |
Meine Berechnungen
Winkelmaß | Dauer |
15° | |
49° | |
125° | |
165° |
Der in Abbildung 4.10 angegebene Bereich von 250 bis 1250 für die Größe Dauer ist ein theoretischer Wert und kann in Einzelfällen deutlich abweichen und dazu führen, dass ein Servo an die mechanisch vorgegebene Grenze stößt. Das kann seinen Lebensdauer deutlich verkürzen. Deshalb sollte man bei jedem Servo die maximalen Ausschläge nach rechts und links vorsichtig austesten und darauf achten, dass der Motor innerhalb der mechanisch eingebauten Grenzen arbeiten kann.
Abbildung 4.10 zeigt, dass jeder PULSOUT Befehl eng verknüpft ist mit der Impulsdauer eines HIGH-Signals. Der Befehl PULSOUT 14, 417 sendet zum Beispiel ein HIGH-Signal von 0,834ms Länge und der Impuls über den Befehl PULSOUT 14, 500 hat eine Impulslänge von 1,0ms.
Für die Umrechnung einer Zeitangabe in ms in einen Wert der Parametergröße Dauer im Befehl PULSOUT, benutzen wir die Umrechnungsformel:
Beispiel
Wie berechne ich den Wert für die Parametergröße Dauer, wenn ich vorgebe, dass die Impulslänge 1,5ms betragen soll?
Dauer = 1,5 x 500 = 750
Die Zeiteinheit bei einer BASIC Stamp 2 beträgt 2µs. In 1ms passen somit 500 Zeiteinheiten hinein.
Bei einem Befehl PULSOUT 14, 500 beträgt die Impulslänge
500 x 2µs = 1000µs = 1.0ms.
Löst man Gleichung (1) nach Zahl in ms auf, dann erhält man die Gleichung:
Beispiel
Im Befehl PULSOUT 14, 850 lässt sich die Impulslänge über Gleichung (2) sofort berechnen.
Zahl in ms = (850/500) ms = 1,7ms
Unter Vorlage eines Zeitdiagramms ein Programm schreiben
Wird ein 2.0ms HIGH-Signal wie in Abbildung 4.11 gezeigt von einer BASIC Stamp an einen Servo übertragen, dann wird das Steuerhorn in die stabile 135° Position drehen. Die Signale sollen sich ungefähr alle 22ms wiederholen, was mit einer Endlosschleife DO ... LOOP in einem PBASIC-Programm leicht umsetzbar ist. Es fehlt nur noch der Zahlenwert für die Parametergröße Dauer im PULSOUT Befehl. Nach Berechnungsformel (1) von Seite 11 ergibt sich:
Dauer = Zahl in ms x 500 = 2,0 x 500 = 1000
Damit könnte ein entsprechendes PBASIC Programm so aussehen:
Aufgabe |
|
In der Animatronik (animation - Bewegung, Elektronik) werden elektronische Komponenten eingesetzt um Spezialeffekte zu erzielen und elektronisch gesteuerte Figuren zu bewegen, die man zum Beispiel auf Jahrmärkten und in Vergnügungs- und Freizeitparks sehen kann.
Abbildung 4.13 zeigt ein Animatronikprojekt einer Roboterhand, deren Finger mit Hilfe von Servos bewegt werden. Das PBASIC Programm, mit dem die Handbewegungen gesteuert werden, muss die Servos für jede Bewegung für eine bestimmte Zeit in einer bestimmten Position halten können.
Bisher haben wir für die Ansteuerung der Servos Endlosschleifen benutzt; in dieser Übung geht es darum, wie man Programmcode schreibt, der einen Servo über eine bestimmte Zeitspanne hinweg in einer festen Position hält.
Mit einer FOR...NEXT Schleife die Haltezeit eines Servos bestimmen
Eine LED, die so programmiert ist, dass sie einmal pro Sekunde aufleuchtet, wird, wenn man die Programmzeilen im Befehlsblock einer FOR...NEXT Schleife unterbringt, die dreimal durchlaufen wird, genau drei Sekunden lang aufleuchten. Sie ist 500ms HIGH, 500ms LOW.
Blinkt eine LED fünfmal pro Sekunde, dann benötigt man eine FOR...NEXT Schleife, die 15-mal durchlaufen wird, um die LED genau 3 Sekunden aufleuchten zu lassen.
Die Befehle PULSOUT und PAUSE, mit denen ein Servo angesteuert wird, übertragen HIGH/LOW Signale, die auch eine LED zum Blinken bringen. Im vorherigen Kapitel leuchtete die LED nur schwach auf, da die Signalfolge sehr schnell und die HIGH-Signalanteile von relativ kurzer Dauer waren.
Wir werden jetzt die Geschwindigkeit der Signalfolge auf ein Zehntel reduzieren und damit die Blinkfolge bei einer LED deutlich sichtbar machen.
Beispielprogramm 04_03_1.bs2
Dolor |
|
Das Programm 04_03_1.bs2
Beispielprogramm 04_03_2.bs2
Wird der Befehl PULSOUT 14, 7500 abgewandelt zu PULSOUT 14, 750 und PAUSE 200 auf PAUSE 20, wird ein kurzes Signal die Positionierung des Steuerhorns in Mittelstellung veranlassen. Das Signaldauer ist um den Faktor 10 kürzer und die vollständige FOR...NEXT Schleife benötigt nur noch 1/10 der Zeit im Vergleich zum vorherigen Beispiel.
Wenn es das Ziel ist, eine bestimmte Position des Servos für drei Sekunden zu halten, dann sollten 10-mal so viele Impulse bereitgestellt werden; dies erreicht man, indem der Endwert in der FOR...NEXT Schleife von 15 auf 150 erhöht.
Programm 04_03_2.bs2
In dem folgenden Programm werden die drei Positionen des Steuerhorns für jeweils 3 Sekunden gehalten.
Beispielprogramm 04_03_3.bs2
Aufgabe |
|
In der 135°-Position verharrt der Servo für 3 Sekunden bevor das Programm stoppt. Das Steuerhorn bleibt in der angenommenen Position stehen, obwohl die BASIC Stamp keine Steuerimpulse mehr sendet. Der Unterschied besteht darin, dass solange Steuerimpulse gesendet werden, der Servo gegen äußere Kräfte anarbeitet, die versuchen die Position des Horns zu verändern. Sobald keine Steuerimpulse mehr gesendet werden, lässt sich das Steuerhorn mit der Hand leicht drehen.
Über das Kontrolllicht der LED an P14 lässt sich jederzeit feststellen, ob an den Servo Steuerimpulse gesendet werden. Solange die LED leuchtet, empfängt er Steuersignale und fixiert seine Posi-tion.
Das Programm 04_03_3.bs2
Aufgabe |
|
Der Widerstand, mit dem ein Servo versucht, auf Krafteinwirkungen von außen zu reagieren, kann man deutlich spüren. Er ist nicht mehr vorhanden, wenn keine Steuerimpulse mehr übertragen werden.
Aufgabe |
|
Jetzt kommst du!
In Programm 04_03_3 haben wir gesehen, dass die Ausführung von ungefähr 50 Servoimpulsen in einer FOR ... NEXT Schleife eine Sekunde dauert. Diese Kenntnis kann man auch zur Bestimmung der Haltezeit nutzen, indem man den Endwert entsprechend anpasst.
Beispiel
Soll ein Servo eine bestimmte Position für 2 Sekunden halten, dann muss der Endwert der Schleife nur von 150 auf 100 abgeändert werden; andererseits, wenn die Haltezeit von 3 auf 5 Sekunden erhöht werden soll, muss entsprechend der Endwert von 150 auf 250 erhöht werden.
Die Ausführungszeit einer FOR...NEXT Wiederholschleife
Eine grobe Näherung ist die Aussage, dass ein Schleifendurchlauf 0,02s benötigt oder 20ms. Es sind eigentlich 22,72ms. Jedes Element in einer FOR...NEXT Schleife kostet Zeit, sobald die Ausführung beginnt. Der Befehl PULSOUT 14, 750, der einen Servo in die Mittelstellung dreht, soll als Benchmark für die mittlere Pulsdauer angesehen werden. Die dafür notwendige Pulslänge beträgt 1,5 ms. Der Befehl PAUSE 20 hält die Programmausführung für 20ms an.
Eine FOR...NEXT Schleife mit einem PULSOUT und PAUSE Befehl benötigt ca. 1,3ms für die Ausführung aller Befehle, so dass die Zeit zwischen zwei LOW-Signalen bei 21,3ms und nicht bei 20ms liegt. Einfluss auf den Servo hat diese Erkenntnis nicht.
Die Genauigkeit eines LOW-Signals kann durchaus um ein paar ms abweichen, nur die Länge eines HIGH-Signals muss sehr präzise sein und dafür sorgt der Befehl PULSOUT.
Alles in allem benötigt eine FOR...NEXT Schleife für einen Durchlauf also:
1,5ms für das HIGH-Signal, 20ms für das LOW-Signal und 1,3ms für die Ausführung der Befehle. In der Summe macht das 22,8ms für eine Durchlauf. In einer Sekunde finden damit 1/0,0228 = 43,8.. Durchläufe statt, oder gerundet 44 Wiederholungen.
Die Anzahl Wiederholungen pro Sekunde wird auch Hertz genannt. 44 Wiederholungen pro Sekunde drücken wir damit kürzer durch 44 Hertz aus oder kürzer: 44 Hz. Eine andere Sprechweise ist: Die Steuersignale haben eine Frequenz von 44 Hz.
Periode und Hertz (Hz)
Wiederholt sich ein Signal in einer Zeiteinheit n-mal, dann wird jeder Wiederholungsabschnitt Periode genannt. Die Anzahl der Wiederholungen pro Sekunde wird in Hertz angegeben und mit Hz abgekürzt.
Je nachdem, ob der Wert der Parametervariablen DAUER im PULSOUT Befehl größer oder kleiner ist, beeinflusst er die Ausführungszeit einer FOR...NEXT Schleife. Ein Wert des PULSOUT Parame-ters Dauer von 750 bringt einen Servo in die Mittelstellung und entspricht ungefähr 44 Signalsimpulsen pro Sekunde oder 44 Hz.
Wenn präzisere Einstellungen notwendig sind, muss noch einmal die Mathematik von Seite 11/12 bemüht werden.
Beispiel
Wenn in der Schleife der Parameterwert Dauer des Befehls PULSOUT einen Wert von 1000 statt von 750 hat, erhöht sich die Impulslänge von 1,5ms auf 2ms. Der Wert von PAUSE bleibt bei 20ms und für die Ausführungszeit der Befehle stehen noch einmal 1,3ms an. Insgesamt kommen wir damit auf eine Periodenzeit von 23,3ms oder 43 Perioden pro Sekunde. Das entspricht 43 Hz.
Zusammenfassung
In Abbildung 4.15 wird noch einmal dargestellt, welcher Teil in einer FOR...NEXT Schleife welche Aufgabe bei einer Servoansteuerung übernimmt. Der Endwert in der Schleife ergibt, wenn man ihn durch 44 teilt, die Anzahl an Sekunden, die ein Servo in einer bestimmten Position gehalten wird. Der Parameter Dauer im PULSOUT Befehl beschreibt die Position des Steuerhorns. Ein Wert von 750 erzeugt einen 1,5ms Impuls, der den Servo in die Mittelstellung auf die 90° Position dreht.
Der Parameter PIN im PULSOUT Befehl beschreibt den I/O Portpin, über den die Signale an den Servo übertragen werden. Ein Wert von 14 besagt also, dass das HIGH-Signal an den Servo über den I/O Pin P14 gesendet wird. Im Anschluss daran wird über den I/O Pin ein LOW-Signal übertragen. Der PAUSE 20 Befehl stellt sicher, dass dieses Signal 20ms anliegt, bevor das nächste HIGH-Signal folgt.
Im Mittel wird eine FOR ... NEXT Schleife, die einen einzigen PULSOUT Befehl an einen Servo sendet, gefolgt von einer PAUSE von 20ms ungefähr 44 mal pro Sekunde ausgeführt. Wenn eine solche Schleife 132 durchlaufen wird, hält sie einen Servo für ca. 3 Sekunden in der 135° Position. Das ergibt sich durch eine kleine Rechnung:
132 geteilt durch 44 = 3
Soll eine Anwendung oder in einem Projekt eine BASIC Stamp einen Servo für eine bestimmte Anzahl an Sekunden in einer Position fixieren, dann muss die Zahl der Sekunden nur mit 44 multipliziert werden, um den Endwert der FOR...NEXT Schleife zu bestimmen.
Bei 5 Sekunden Haltezeit muss die FOR...NEXT Schleife 5x44 = 220 mal durchlaufen werden.
Industrielle Automation erfordert häufig den Dialog der eingesetzten Mikrokontroller mit größeren Datenrechnern. Die Mikrokontroller lesen die Sensoren aus und übertragen die Daten an den Hauptrechner. Dieser wertet die Daten aus und schickt entsprechende Informationen zurück an die Mikrokontroller, die dann wiederum Förderbänder beeinflussen können oder auf Sortiermaschinen Einfluss nehmen.
Mit Hilfe des Terminals lassen sich Informationen über den Computer an die BASIC Stamp übertragen (Abb. 4.16). Sie muss dazu so programmiert werden, dass die Werte über das Terminal eingegeben und anschließend in einer oder mehreren Variablen ablegt werden.
In der folgenden Übung wird die BASIC Stamp so programmiert, dass sie zwei Werte über das Terminal einliest und mit diesen den Servo eine kontrollierte Bewegung ausführen lässt. Die beiden Werte sind:
Material |
|
Aufgabe |
|
Die BASIC Stamp empfängt Steuerinformationen über den Befehl DEBUG
Mit Hilfe des DEBUG Befehls sendet die BASIC Stamp Daten/Mitteilungen an das Debug Terminal. Möchte man umgekehrt Daten vom Debug Terminal empfangen, steht dafür der Befehl
zur Verfügung. Vorher müssen eine oder mehrere Variable deklariert werden, in die die erhaltenen Werte/Informationen abgelegt werden können. Das folgende Beispiel zeigt die Deklaration einer Variablen pulsfolgen vom Typ Word:
pulsfolgen VAR Word
Später kann dieser Variablen über das Programm ein Wert zugewiesen werden, der über den Befehl DEBUGIN eingelesen wird:
DEBUGIN DEC pulsfolgen
Empfängt die BASIC Stamp einen nummerischen Wert vom Debug Terminal, wird er in der Variablen pulsfolgen abgelegt. Die Formatierungsanweisung DEC teilt dem Befehl DEBUGIN mit, daß die zu sendenden Zeichen ganze Zahlen sind. Sobald die Eingabetaste gedrückt wird, legt die BASIC Stamp die bis dahin empfangenen Zahlen in der Variablen pulsfolgen als Dezimalzahl ab und geht im Programm weiter.
Die folgende Zeile ist nicht im Programmbeispiel enthalten, kann aber eingefügt werden, um anzuzeigen, dass die BASIC Stamp den Befehl ausgeführt hat.
DEBUG CR, "Dein eingegebener Wert: ", DEC pulsfolgen
Abbildung 4.17 zeigt eine Ausschnittsvergrößerung des Debug Terminals mit den beiden Fenstern Senden und Empfangen. Mit dem Fenster Empfangen haben wir bisher gearbeitet. In ihm werden alle Mitteilungen ausgegeben, die das Debug Terminal von der BASIC Stamp erhält.
Über das Fenster Senden lassen sich Zeichen und Zahlen eingeben und an die BASIC Stamp übertragen.
In Abbildung 4.17 wurde die Zahl 264 in das Debug Terminal Fenster Senden eingegeben. Darunter, im Fenster Empfangen ist eine Kopie der eingegebenen Zahl zu sehen, direkt hinter dem Text: Gib die Anzahl der Pulsfolgen an:. Diese Form der Kopie wird auch als Echo bezeichnet und erscheint nur, wenn die Checkbox Echo Off rechts unten im Debug Terminal nicht markiert ist.
Aufgabe |
|
Das Programm 04_04_1.bs
Wie arbeitet das Programm 04_04_1.bs2?
Im Programmkopf werden drei Variablen vom Typ Word deklariert:
Die Zählervariable i wird in der FOR...NEXT Schleife aufgerufen. In den Variablen Pulsfolgen und Dauer werden die über das Debug Terminal eingegeben Daten abgespeichert, ebenso wird die Variable Pulsfolgen in der FOR...NEXT Schleife für die Anzahl der Pulsfolgen, die an den Servo gesendet werden, eingesetzt. Und mit der Variablen Dauer wird die Länge jedes Impulses im Befehl PULSOUT festgelegt.
Über den DEBUG Befehl wird der Anwender noch einmal darüber informiert, dass ca. 44 Pulsfolgen pro Sekunde in der FOR ... NEXT Schleife benötigt werden und das das Argument Dauer im Befehl PULSOUT, mit dem die Drehposition eines Servos festgelegt wird, Werte zwischen 350 und 1150 annehmen kann.
Der Rest des Programm ist in eine Endlosschleife eingebettet. Es wird zunächst ein Text ausgegeben und die Anzahl der Pulsfolgen als Vielfache von 44 abgefragt; der DEBUGIN Befehl wartet auf die Eingabe einer ganzen Zahl, die mit der Eingabetaste bestätigt wird.
Der Prozess wiederholt sich mit dem zweiten DEBUG und DEBUGIN Befehl, bei dem der Variablen Dauer ein Wert zugewiesen wird.
Neu ist in diesem Programm, dass der Endwert in der FOR...NEXT Schleife durch eine Variable Pulsfolgen bestimmt und deren Wert durch Eingabe über das Debug Terminal festgelegt wird.
Genau so wie der Wert für die Zeitspanne, die das Steuerhorn des Servos in einer bestimmten Position fixiert ist. Im Befehl PULSOUT wird der Parameter Dauer ebenfalls erst über die Eingabe im Terminal bestimmt; er legt fest, um welches Winkelmaß sich der Servo dreht.
Nehmen wir mal an, dass ein Computer Servo Kontrollsystem für eine Fernwartung entwickelt wurde. Vielleicht benutzt es ein Wachmann, um eine Schiffsluke zu öffnen, die er über eine Kamera fest im Blick hat. Ebenso wäre es möglich, dass ein Student damit die Kontrolltüren in einem Labyrinth für Mäuse überwacht, die nach Futter suchen. In jedem Fall aber sollte die Software so sicher sein, dass Falscheingaben ausgeschlossen werden, um Schäden zu vermeiden.
Unser letztes Programm 04_04_1.bs2 ist gegen Fehleingaben nicht geschützt. Es wäre zum Beispiel möglich, dass man bei der Abfrage nach der Steuerhornposition statt 1000 nur 100 eingegeben hat. Der Wert 100 würde den Servo in eine Position drehen, die außerhalb der mechanischen Grenzen liegt. Obwohl es nicht gleich den Servo zerstört, kann es die Lebensdauer des Bauteils deutlich verkürzen. Aus diesem Grund ist in das Programm eine Zeile eingefügt worden, die solche Fehleingaben vermeiden hilft:
Eine Fehleingabe von 100 würde durch das Programm so behoben, dass es statt dessen den Wert 350 setzt. Bei einem Eingabewert von 10000 würde der Wert 1150 eingesetzt. Die Reaktion des Programms lässt sich mit einem Entscheidungsbefehl erklären:
Eine automatische Fehlerkorrektur bei der Eingabe, wie wir sie eben aufgezeigt haben, muss nicht immer zum besten Ergebnis führen. Eine weitere Möglichkeit wäre, bei einer Falscheingabe eine Rückmeldung zu bekommen, die darauf hinweist, dass man die Eingabe noch einmal wiederholt und dem Anwender gleichzeitig aufzeigt, was falsch gemacht wurde.
Aufgabe |
|
Das modifizierte Programm (Ausschnitt) 04_04_2.bs2
In dieser Übung werden wir erfahren, wie man mit einem Servo verschiedene Positionen mit unterschiedlicher Geschwindigkeit anfährt. Das Steuerhorn wird sich dabei je nach Einstellung unter-schiedlich schnell drehen. Mit dieser Technik kontrollieren wir beim Servo die Bewegung statt der Position.
Mit dem folgenden Programm durchfährt ein Servo nahezu seinen kompletten Stellbereich.
i VAR Word
FOR i = 500 to 1000
PULSOUT 14, i
PAUSE 20
NEXT
Das Steuerhorn startet bei ungefähr 45° und rotiert langsam gegen den Uhrzeigersinn in die Position 135°. Der Laufindex in der FOR...NEXT Schleife ist die Variable i. Sie wird bei jedem Schleifendurchlauf um 1 erhöht und diese Größe steht auch im Befehl PULSOUT als Argument für die Dauer des HIGH-Impulses. Das heißt, mit jedem Schleifendurchlauf wird die Impulslänge größer und damit verändert sich auch die Position des Steuerhorns.
Eine FOR...NEXT Schleife lässt sich mit einem STEP <n> Befehl erweitern. Die Schrittweite der Schleife wird damit vergrößert, mit dem Effekt, dass ein Servo schneller rotiert. Das Argument <n> ist eine natürliche Zahl.
FOR i = 500 to 1000 STEP 8
Für das Abwärtszählen müssen nur Anfangs- und Endwert umgestellt werden:
FOR i =1000 to 500 STEP 8
Der Trick, mit dem ein Servo dazu gebracht wird, sich unterschiedlich schnell zu drehen, besteht darin eine FOR...NEXT Schleife mit entsprechender Anpassung der Schrittweite aufzurufen. Je nachdem, ob aufwärts oder abwärts gezählt wird, dreht sich der Servo entgegen oder im Uhrzeigersinn.
Drehgeschwindigkeit und Drehrichtung beim Servo verändern
Drehgeschwindigkeit: einstellen über die Schrittweite in einer FOR...NEXT...STEP <n> Schleife. Je größer die Schrittweite, desto höher die Drehgeschwindigkeit.
Drehrichtung im Uhrzeigersinn: in einer FOR...NEXT Schleife abwärts zählen
Drehrichtung entgegen dem Uhrzeigersinn: in einer FOR...NEXT Schleife aufwärts zählen.
Beispielprogramm
Aufgabe |
|
Das Programm 04_05_1.bs2
Wie arbeitet das Programm 04_05_1.bs2?
Die erste FOR...NEXT Schleife zählt aufwärts von 500 bis 1000, das führt zu einer Drehung des Steuerhorns in entgegengesetztem Uhrzeigersinn. Da die Zählvariable i auch im Befehl PULSOUT als Argument der Variablen Dauer benutzt wird, dreht sich das Steuerhorn mit erhöhter Geschwindigkeit.
Warum wurde der Befehl PAUSE auf den Wert 7 gesetzt?
Der Befehl DEBUG DEC5 i, cr, crsrup benötigt zur Ausführung ca. 8ms. Ein PAUSE 12 Befehl würde die Pause zwischen zwei HIGH-Signalen wieder auf 20ms bringen. Über eine Reihe von Experimenten wurde herausgefunden, dass mit einer Pause von 7ms der Servo die glatteste Bewegung ausführte. Da die 20ms für das LOW-Signal zwischen zwei HIGH-Signalen einer gewissen Toleranz unterliegen, ist es durchaus vertretbar durch Probieren selbst einen vertretbaren Wert zu ermitteln.
Als neue Formatierungszeichen, tauchen im DEBUG Befehl CRSRUP (cursor up) und DEC5 auf. DEC5 weist DEBUG an, jede Zahl auf dem Terminal fünfstellig auszugeben, CRSRUP wiederum setzt den Cursor eine Zeile im Terminal zurück. Die Wirkung ist klar; nachdem eine Zahl fünfstellig ausgegeben wurde und ein Zeilenvorschub (CR) erfolgte, wird der Cursor eine Zeile zurück nach oben bewegt. Beim nächsten Schleifendurchlauf wird die alte Zahl durch die neue überschrieben und so weiter und so fort.
In der zweiten FOR...NEXT Schleife wird von 1000 bis 500 in Schritten von jeweils 20 abwärts gezählt; damit dreht sich der Servo im Uhrzeigersinn. Da die Zählvariable i auch hier im Befehl PULSOUT als Argument der Variablen DAUER benutzt wird, dreht sich das Steuerhorn sehr schnell.
Jetzt kommst du!
Aufgabe |
|
Bisher haben wir Programme kennengelernt, mit denen ein Servo vorbestimmte Bewegungen ausführen musste und wir haben einen Servo über Eingaben des Debug Terminals gesteuert. Jetzt werden wir daran gehen zu zeigen, wie sich mit Hilfe einer BASIC Stamp ein Servo auch über Drucktaster ansprechen lässt. Wir werden in dieser Übung
Wenn wir damit fertig sind, können wir über die BASIC Stamp einen Servo mit Hilfe des einen Drucktasters in eine Richtung und mit dem anderen Taster in die entgegengesetzte Richtung bewegen. Wird kein Taster gedrückt, dann verharrt der Servo in der aktuellen Position.
Material |
|
Aufgabe |
|
Schaltskizze und Schaltungsaufbau
Aufgabe |
|
Vorüberlegungen zur Abfrage der Zustände von zwei Tastern
Mit einem IF...THEN Block lassen sich die Zustände der beiden Drucktaster abfragen. Wird einer der beiden Taster gedrückt, erhöht sich der Wert der Variablen DAUER, wird der andere Taster gedrückt, erniedrigt er sich entsprechend. Eine eingebettete IF...THEN Abfrage überprüft, ob die Variable DAUER den Wert von 1000 überschritten oder den Wert von 500 unterschritten hat. Im nachfolgenden Pseudocode kann der Programmaufbau noch etwas deutlicher vermittelt werden.
Pseudocode für die Abfrage von zwei Tastern
Starte in einer Endlosschleife
Wenn Taster T1an P3 gedrückt wurde, dann ...
Wenn Dauer > 500 dann ...
erniedrige den Wert der Variablen DAUER
Wenn Taster T2 an P4 gedrückt wurde, dann ...
Wenn Dauer < 1000, dann ...
erhöhe den Wert der Variablen DAUER
Ende der Endlosschleife
Beispielprogramm 04.06.1
In diesem Beispielprogramm wird das Steuerhorn des Servos entgegen dem Uhrzeigersinn gedreht, wenn der Taster T2 an P4 gedrückt wird. Das Horn wird solange gedreht wie der Taster gedrückt und der Wert der Variablen DAUER kleiner als 1000 ist. Wird hingegen der Taster T1 an P3 gedrückt, rotiert das Steuerhorn im Uhrzeigersinn, solange der Wert der Variablen DAUER 500 nicht unterschreitet. Im Debug Terminal wird der Wert der Variablen DAUER während des Programmlaufs angezeigt.
Das Programm 04_06_1.bs2
Jetzt kommst du! – Mechanische Grenzen oder Begrenzung durch Software
Standardservos verfügen über eingebaute mechanische Stopper, die sie daran hindern zu überdrehen. Wird an einen Servo beispielsweise der Befehl PULSOUT 14, 2000 geschickt, dreht er nicht in die im Argument DAUER angegebene Position. Ein eingebauter mechanischer Stopper begrenzt vielmehr die Drehbewegung und schützt so den Servo.
Dreht man vorsichtig das Steuerhorn eines Servos, fühlt man, wann die mechanische Begrenzung einsetzt. Ändere das Beispielprogramm in dieser Übung so ab, dass die BASIC Stamp die Drehbewegung des Servos auf einen engeren Bereich begrenzt, als von den mechanischen Stoppern vorgegeben.
Aufgabe |
|
Diese Unterrichtsvorlagen sind entstanden in Anlehnung an die deutsche Übersetzung des Buches "What´s a Microcontroller?" Vers. 3.0 by Andy Lindsay, Parallax Inc., übersetzt und nachbearbeitet von Reinhard Rahner.
BASIC Stamp, Board of Education, Homework Board sind eingetragene und geschützte Warenzeichen der Firma Parallax Inc.