Gerade haben wir in Martin's Bastelstube, Teil IV
einen LEGO-Motor selbst gebaut, jetzt kommt gleich die nächste Forderung:
Wir wollen einen Servomotor betreiben! Das heißt, dass wir den Motor in eine
bestimmte Position fahren wollen und gleich eine Rückmeldung darüber
haben wollen, in welcher Position der Motor steht.
Damit könnte man zum Beispiel den Sensor, der im RoboCup-Wettkampf den Ball sucht,
nach links und rechts schwenken, anstatt immer gleich den ganzen Roboter mit fest
angebautem Ballsensor zu drehen.
Zum Glück gibt's das Ganze schon als fertiges Modul, so dass wir
nicht Motor, Getriebe und Positionssensor aus LEGO-Technic-Teilen
"zu Fuß" aufbauen müssen. Sowas nennt man
Motor-Potentiometer. Es ist beispielsweise in Hifi-Geräten
der etwas teureren Kategorie eingebaut.
Bitte schraubt jetzt nicht Papis tolle Stereo-Anlage auseinander!
Ihr müsst schon warten, bis sie von selbst schrottreif wird.
Manchmal gibt es auch im Elektronik-Handel solche Motor-Potentiometer
neu oder als Restposten zu kaufen.
|
|
Ach so – hab' ich's noch nicht erklärt? Ein Potentiometer ist ein
veränderbarer elektrischer Widerstand. So etwas gibt's als linearen
Schieberegler oder mit Drehknopf.
Für den Motor gelten dieselben Auswahlkriterien wie in
Martin's Bastelstube, Teil IV beschrieben.
Die Potentiometer sind meistens logarithmisch gebaut – das heißt,
dass der Widerstandwert sich nicht gleichmäßig ändert,
wenn man das Potentiometer um einen bestimmten Winkel dreht. Ihr solltet also
ausprobieren, mit welchen Anschlüssen (Mitte-Links oder Mitte-Rechts)
euer RCX die besser unterscheidbaren Messwerte liefert.
Hardware:
Wir suchen einen großen LEGO-Stein, der Motor und
Potentiometer aufnimmt. Das Bohren und Feilen kann ich euch nicht
im Detail beschreiben – die Arbeitsschritte hängen davon
ab, wie euer LEGO-Stein und euer Motor-Potentiometer aussieht.
|
|
Wir nehmen eine LEGO-Kontaktplatte 4x2 und trennen die Blechstreifen
auf der Unterseite in zwei Hälften à 2 Noppen Breite (wie in
Martin's Bastelstube, Teil I
beschrieben).
An alle 4 entstandenen Blechstreifen löten wir je 1 Kabel.
Die 2 Kabel der einen Hälfte werden an den Motor angeschlossen,
die 2 anderen Kabel ans Potentiometer. Zur Sicherheit
(damit nichts kaputt geht, wenn ihr später mal aus
Versehen das Motor- und Sensorkabel vertauscht) bekommt der mittlere
Kontakt des Potentiometers noch einen Serienwiderstand von 470 Ohm.
|
|
Dann wird die Kontaktplatte fest und sicher am tragenden LEGO-Stein
befestigt. Vielleicht müsst ihr vorher 2 Löcher in den
tragenden LEGO-Stein bohren, wo ihr die Kabel durchfädelt
(idealerweise vor dem Löten der Anschlusskabel ;-) ).
Zum Kleben von LEGO-Steinen hat sich UHU allplast
bewährt. Der Kleber ist so gut, dass ihr nie wieder an die
Lötstellen herankommt! Kontrolliert also nochmal, ob die
Kontakte zuverlässig funktionieren.
|
|
Hier ist das Motor-Potentiometer schon fertig eingebaut und alle
Kabel sind angeschlossen.
|
|
Jetzt wird noch ein großer Drehknopf auf die Achse des
Potentiometers aufgesetzt. Das ist sozusagen unsere Plattform, auf
der wir alles befestigen können, was der Servomotor drehen soll.
Ich habe zusätzlich noch eine LEGO-Platte 4x4 aufgesetzt, damit
man Mindstorms-Sensoren ohne bauliche Veränderung aufstecken kann.
|
|
Software:
Ähnlich wie in in
Martin's Bastelstube, Teil II
nehmen wir jetzt die Messkurve des Potentiometers auf.
Zuerst müssen wir den Sensor-Eingang in den RAW-Modus schalten. Damit bekommen
wir die höchste Messgenauigkeit (Zahlenwerte zwischen 0 und 1023).
SetSensorType (SENSOR_1, SENSOR_TYPE_TOUCH);
SetSensorMode (SENSOR_1, SENSOR_MODE_RAW);
Wir lassen uns auf dem Display des RCX die Messwerte für den Sensor-Eingang
anzeigen und schreiben auf, welche Messwerte für alle Potentiometerstellungen
angezeigt werden.
SelectDisplay (DISPLAY_SENSOR_1);
Beispieltabelle:
Winkel |
Messwert Mitte-Links |
Messwert Mitte-Rechts |
0 ° |
|
|
15 ° |
|
|
30 ° |
|
|
45 ° |
|
|
60 ° |
|
|
. . . |
. . . |
. . . |
255 ° |
|
|
270 ° |
|
|
Wir drehen das Potentiometer in eine Endstellung (0°). Von dort ausgehend drehen
wir es in immer gleichbleibenden Winkeln (z.B. 15° für die obige Tabelle)
und schreiben den entsprechenden Messwert auf. Das Ganze je einmal für jede
Anschlusskombination der Sensorkabel am Potentiometer (Mitte-Links und Mitte-Rechts).
Aus der Tabelle müsste jetzt deutlich werden, bei welcher Anschlusskombination
wir die besser unterscheidbaren Messwerte bekommen.
In dieser Kombination schließen wir die Sensorkabel an.
Jetzt brauchen wir noch eine NQC-Funktion, die uns für einen beliebigen Messwert
den Winkel zurückgibt und umgekehrt eine weitere Funktion, die uns für einen
beliebigen Winkel den Sollwert des Sensors zurückgibt.
Dann kommt als drittes eine Funktion, die den Motor möglichst zügig, aber
ohne viel Ruckeln auf einen vorgegebenen Winkel fährt.
Ich habe da schon mal was vorbereitet:
Hier
ist der NQC-Code zum Betrieb und Test des Servomotors zu finden. Im Gegensatz zum Text oben
habe ich in diesem Code den Winkelbereich von -135° bis +135° benutzt.
Eine der Funktionen ist ein eigenständiger Task, der den Servomotor dauernd auf
Position hält – auch dann, wenn jemand die Achse absichtlich verstelt.
Andere Robotik-Plattformen:
Ich habe die ganze Beschreibung auf LEGO zugeschnitten, aber dieses Prinzip kann man
genauso gut auf anderen Robotik-Plattformen anwenden. Man braucht auf jeden Fall einen
Motor-Ausgang und einen Analog-Eingang für jeden Servomotor, den man kontrollieren
will.
Es gibt bei einigen Elektronik-Versandhäusern auch sehr günstige Servos als
Komplettmodul zu kaufen. Die sind eigentlich für Fernsteuerungen vorgesehen.
Man kann sie aber auch von einem Robotik-Controller aus ansteuern, wenn man ausreichend
schnell die Signale schalten kann. Das werde ich mal in einer späteren Folge von
Martin's Bastelstube behandeln.
Tschüß, euer Martin S.
|