LeoBot, der alternative Weihnachts-Kalender 2013          

Teil 2 - von Heinz D.                
Elektronik-Labor  Literatur  Projekte  Lernpakete  Kalender      

8 Das Fahrwerk3



Achtung: 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-SR04




Durch 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)


Elektronik-Labor  Literatur  Projekte  Lernpakete  Kalender