LeoBot, der alternative Weihnachts-Kalender 2013
Teil 2 - von Heinz D.
8 Das Fahrwerk3Achtung:
Wegen der höheren Batteriespannung ist äußerste Vorsicht geboten! Falls
Sie keine Erfahrung im RC-Modellbau haben, lassen Sie sich helfen!
Anfänger sollten die Finger davon lassen!
Falls Sie ein
Fahrwerk mit Bürsten-Motoren haben, können Sie das natürlich auch
benutzen. Sie benötigen zusätzlich zwei Adapter, um die Servosignale
für die Motoren aufzubereiten. Man kann sich ein ganzes Wochenende um
die Ohren schlagen, um zwei Motor-H-Brücken zu bauen und mit zwei
Tiny13 die Signale aufzubereiten.
Addiert
man die Preise der Einzelteile, wird man nicht unter 20€ kommen. Dafür
bekommt man im Modellbau für RC-Autos fertige Module, die nur noch
angeschlossen werden müssen. Unsere Module haben sogar noch einen Stabi
für +5V und wir können die Motoren mit +4,8V bis +8,4V speisen und den
Mega/Arduino mit +5V noch dazu.
Achten Sie darauf, dass Sie Module für Autos (vorwärts+rückwärts) und nicht für Flugzeuge (nur vorwärts!) kaufen.
Die
Module werden an MotorL und MotorR angeschlossen und die Beispiele
sollten funktionieren. Falls die Motoren rückwärts laufen, dann die
Motoren umlöten. Falls die Motoren nur einen Ton erzeugen, aber nicht
laufen, dann können Sie die Werte in den Programmen ändern:
Bascom-Zeile ~156:
Select Case Eebyte
Case &H01 : Servo(1) =
15
'Print #1 , "MotorLst"
Case &H02 : Servo(2) =
15
'Print #1 , "MotorRst"
Case &H03 : Servo(1) = 16 <-hier 17..18..19?
Case &H04 : Servo(2) = 14 <-hier 13..12..11?
Case &H05 : Servo(1) = 14 <-hier 13..12..11?
Case &H06 : Servo(2) = 16 <-hier 17..18..19?
in der .ino ab Zeile ~108:
void doMotor(byte Dat) {
switch (Dat) {
case 0: servo1.write(90); servo2.write(90); servo3.write(90); break;
// case 1: if (servo1.attached()) { tmpw = (180 * 5) / 255; servo1.write(tmpw); } break;
case 1: servo1.write(90); break;
case 2: servo2.write(90); break;
case 3: servo1.write(102); <-110..120..130 break;
case 4: servo2.write(78); <-70..60..50 break;
case 5: servo1.write(78); <-70..60..50 break;
case 6: servo2.write(102); <-110..120..130 break;
Das
Rp5-Chassis hat zwar größere Räder und kann ~20mm-Kanten (LeoBot-2
~18mm) erklimmen, beide haben ~10mm Bodenfreiheit. Der Rp5 ist etwas
länger, höher und nur wenig schmaler. Durch die 6-NC-Akkus ist der Rp5
etwas schwerer. Unsere Motoren waren so ungleich, dass eine
Geradeaus-Fahrt nicht möglich war. Die Steigfähigkeit war nicht besser
als bei den Servos. (Die Lego-Platte war gerade 16-Knöpfe breit.)
Fazit: es geht, aber umgebaute Servos sind besser, einfacher und
billiger.
9
IR-Kollision mit IS471F_SH mit je 2 IR-LED (berührungslos)
2 (1) IS471F_SH (185094)
4 (2) LD274
Der
4-pol-Chip enthält alles, außer den IR-Led. Es ist wegen der Modulation
unempfindlich gegen Fremdlicht (und gegen den 2. Sensor). Es kann
direkt anstatt der Taster angeschlossen werden. Bei Unterschreiten
einer Mindestentfernung wird 'Out' auf '0' gezogen. Es verhält sich
damit genau so, wie ein Taster. Schließen Sie die IS471 an die In2+In3
an, sonst könnten Sie nach Reset im Programmier-Mode landen und wissen
nicht wie Sie da heraus kommen. (Das Beispiel entsprechend ändern.)
Hindernisse
werden etwa bis zur Breite der IR-Led erkannt. Damit detektieren sie
breiter, als die US-Wandler. Von der Helligkeit der IR-Led ist der
(feste) Abstand von ~10cm abhängig. Die IR-Sendedioden müssen
entsprechend positioniert werden (ausprobieren). Schwarze
(ABS-Kunststoff) oder matte Hindernisse werden nicht erkannt. Falls die
IS471 nicht funktionieren, dann strahlen die IR-Led direkt ein! Sie
sollten dann etwas Alufolie seitlich an die Led kleben, kein schwarzes
Klebeband!
Die
Hysterese ist mit ~45% sehr groß. Damit kann das Rückwärtsfahren
gesteuert werden. Zum direkten Ausweichen ist die Hysterese so gross,
das ggf. Zick-Zack gefahren wird.
(Die Platine ist an einen 1x8-Stein geklebt)
Für Fortgeschrittene:
IR ausweichen:
27 Waitms 128 ;
03 MotorL vor ;
04 MotorR vor ;
68 A=In ;
AB d= -5 ;-> nochmal wenn 15
DF Jr d A=15 ;
A3 d=3 ;-> Hindernis links
DD Jr d A=13 ;
05 MotorL rück ;Hindernis rechts
FF Jp 0 ;
06 MotorR rück ;Hindernis links
FF Jp 0 ;
10 Ultraschall mit Sensor HC-SR04Durch
Messen der Laufzeit des Ultraschalls lässt sich die Entfernung zu einem
Gegenstand ermitteln. Nach einem Impuls (40kHz) wird die Zeit bis zum
Eintreffen des ersten Echos gemessen. Mit der Schallgeschwindigkeit
(340m/s) kann die Entfernung (hin und zurück) errechnet werden (17cm
=> 2*17cm / 340 m/s => 1ms) Der 'Fledermausdetektor' ist zwar
hilfreich, wenn nichts funktioniert will. Durch seine hohe
Empfindlichkeit können die Schallrichtungen jedoch nicht ermittelt
werden.
Durch
die schmale (Schall-) Richtung (max. +-30°) wird links und rechts vor
den Ketten sehr spät oder gar nicht gemeldet. Ein Kompromiss ist das
Zurücksetzen des US-Sensors um etwa 3cm bis 10cm (ausprobieren, ggf.
auch nach oben versetzen). Oder die Anwendung eines 2. US-Sensor. Je
nach Montage kann es mit US1 und US2 zu unterschiedlichen Entfernungen
kommen.
Auch
hier werden matte Hindernisse (Wolle, Polster usw.) nicht erkannt und
es können die Stosstangen-Taster herangezogen werden. Bei matten
Hindernissen kann sich die Ablaufsteuerung im HC-SR04 'aufhängen'.
Zwischen zwei Abfragen sollte ein 'Waitms >=64' liegen, um den
Wandler Zeit zum messen zu geben.
Trigger
wird an den Out-Port (D13=Led13), Echo an einen In-Port(D8 oder D12)
angeschlossen. Das TPR wandelt die Laufzeit in cm um (~3cm bis 14cm).
Wird der Abstand geringer als der Abstand der beiden Wandler, dann ist
das Ergebnis unsicher. Ist der Abstand größer als 14cm, dann wird 15
als Wert zurück gegeben.
US abfragen:
27 Waitms 128 ;
03 MotorL vor ;
04 MotorR vor ;
6B A=US1 ;links
7C B=US2 ;ohne Hindernis wird 15 erwartet
AA d= -6 ;-> nochmal wenn beide 15
F1 Jr d A=B ;
A3 d=3 ;-> Hindernis links
F3 Jr d A<B ;
05 MotorL rück ;Hindernis rechts
FF Jp 0 ;
06 MotorR rück ;Hindernis links
FF Jp 0 ;
(ein vierer-Steckverbinder ist an einen 2x4-Stein angeschraubt)
Nur für Fortgeschrittene:
Der US-Wandler kann auch wesentlich größere Entfernungen messen.
In der TPR-Routine für US kann der Faktor '59' vergrössert (verdoppelt) werden,
um größere (*2) Entfernungen zu messen.
(.bas-Zeile ~333; .ino-Zeile ~172+173+191+192 'delayMicroseconds(59)')
Servo 11 Servo [
]
Ein
Ausgang (D11=B.3) ist zum Anschluss eines serienmäßigen Servos
reserviert. Außer den fest eingestellen Winkeln (+-80°) können über die
Register 'A' oder 'B' 16 verschiedene Winkel (800us-2300us) eingestellt
werden. Sie können z.B. einen Port-Wert holen (A=..) und auf den Servo
(A=Servo) ausgeben. Oder einen Sensor montieren und gezielt schwenken.
Servo schwenken:
..
..
94 B=B+1
92 Servo=B
29 Wait
FF Jp 0
Ihrer Fantasie sind da kaum Grenzen gesetzt. (unten eine 2x4-Platte, oben eine 2x2-Platte angeklebt, 1-Höheneinheit)
12 Vier zusätzliche Tasten Theoretisch
lassen sich bist zu 10 Tasten über einen D/A-Wandler an einen
10-Bit-ADC-Port anschließen. Die Genauigkeit der beiden Wandler und die
Verdrahtung schränken die Wiederholgenauigkeit auf 4 (max.6) Tasten
ein. In der Tabelle sehen Sie die Berechnungen. Entscheidend sind nur
die gelben Felder. Nach der Berechnung im AVR wird ein binärer Wert
zurückgegeben, der den gedrückten Tasten entspricht. Im Gegensatz zu
anderen Programmen können Sie eine oder mehrere Tasten gleichzeitig
betätigen!
Die
Auswahl der Widerstände sollte sorgfältig erfolgen. In der
vorgeschlagenen Schaltung wird positive Logik verwendet. Das heisst:
keine Taste=0, Taste0=1, Taste1=2, Taste0+Taste1=3 und so weiter. (Ggf.
muss der Wert invertiert werden.)
Die Formel zur Berechnung ist: Taste = 8192 / Adc(3) - 8
(Im Programm wurde der Wert 8192 um 1% erhöht, weil die Widerstände nach unten abwichen.)
Im
Programmbeispiel werden T0 bis T3 auf 4 LED ausgegeben. Da es keine
'debounce' Funktion gibt, sollten Sie die Tasten zweimal abfragen und
vergleichen, ob das Ergebnis stabil ist.
4Tasten:
6E A=4Tasten ;holen
7E B=4Tasten ;
A2 d=2 ;
F1 Jr d A=B ;
3C Jr -4 ;-> 4Tasten
88 Out=A ;
FF Jr -6 ;-> 4Tasten (hier ginge auch Jr -2, verstanden?)
(eine Platte mit 1-Höheneinheit ist unter die Platine geklebt)
Abschlussbemerkung:
Anhand
der Beispiele haben Sie gesehen, dass viele Sensoren mit den
Grund-Befehlen gelöst werden können. Ein PIR-Sensor (oder andere
Sensoren) mit Schaltausgang können direkt angeschlossen werden. Lassen
Sie Ihrer Fantasie freien Lauf und bauen Sie mehrere LeoBot's, um sie
zusammen spielen zu lassen.
(Sorry, falls Sie noch Fehler entdecken)
Das Entwicklerteam Lukas(8) und Heinz D. wünscht Ihnen ein frohes Fest und viel Spaß.
13 RGB-Sensor, eine Experimental-Idee für sehr weit Fortgeschrittene
Ursprünglich
sollte der RGB-Farbsensor das Finden eines anderen LeoBot ermöglichen.
Wie Sie gleich lesen werden ist das mit diesem Sensor nur eingeschränkt
möglich. (180381-da-01-en-SMD_RGB_FARBSENSOR_KPS_5130PD7C.pdf)
Für den Farbsensor werden Ad0-Ad2 benötigt.
Mit
einem Dunkelstrom von 10nA sollten die Ad-Wandler den Wert '2' zeigen.
'Leider' ist der RGB-Wandler sehr schnell, sodass >=100nF-220nF
gegen 50Hz-Störungen verwendet werden.
Mit dem Befehl
'A=RGB/B=RGB' werden die drei Ad-Werte geholt und korrigiert. Dann wird
der Mittelwert errechnet, um nur die stärksten Farbe zurückzuliefern.
Jedes Bit entspricht einer Farbe. (1=rot; 2=grün; 3=gelb; 4=blau;
5=blau+rot; 6=blau+grün) Die '7' für schwarz/grau/weiss kann (per
Programm) nicht auftreten. Farbige Led werden bei einer Entfernung von
~5cm erkannt. Farbige Flächen werden nicht (sicher) erkannt.
Bei
normaler Zimmerbeleuchtung sollten alle Led aus sein. Bei Dunkelheit
werden zufällige Werte ausgegeben. Um die Logik dahinter zu verstehen
sollten Sie '25.10.13,
LED-Licht und physikalische Grössen' lesen.
Auch hier gibt es kein 'Debounce'. Um sicher zu gehen sollten Sie zweimal abfragen und vergleichen.
RGB-Test:
6D A=RGB ;
7D B=RGB ;
AD d= -3 ;-> RGB-Test
F2 Jr d A<>B ;
88 Out=A ;Ausgabe nur wenn A=B
3B Jr -5 ;-> RGB-Test
Nur
mit superhellen Led ist das Auffinden eines anderen LeoBot oder der
Garage/Ladestation möglich. (die Platine ist an einen 1x2-Stein
geklebt)