Wochenprogramm im H46/H47
Tag | Vormittag 8:00 bis 12:00 | Nachmittag 13:30 bis 16:30 |
---|---|---|
Montag 3. Juli | Einführung, Gruppenbildung, Roboterbau | Roboterbau, erste Programmcodes |
Diestag 4. Juli | Roboterbau, Motorensteuerung 1 | PID-Regler für Line-Follower |
Mittwoch 5. Juli | Programmieren | FREI |
Donnerstag 6. Juli | Festlegen Aufgaben Roboterwettbewerb | Programmieren für Wettbewerb |
Freitag 7. Juli | Letzte Test, Roboterwettbewerb, Siegerehrung, Schluss | FREI |
Montag 3. Juli
- Begrüssung. Einzug CHF 40.-
- Einführung: Grundkomponenten des Roboters, $U=R\cdot I$, Stromversorgung, Arduino, Motordriver.
- Manufaktur:
- Platinen schneiden: 4er-Reihen plus 1x 3er-Reihe ohne Rand → Lieferung an Stromversorgung
- Header-Stifte mit Flachzange einzeln abtrennen → Lieferung an Stromversorgung
- Step-Up Converter auf 5.05 V einstellen → Lieferung an Stromversorgung
- 2 x 16 Kabel f-f aus den Farben rot/orange/dunkelrot und schwarz/grau/braun bei 7cm abschneiden, abisolieren, dünn verzinnen → Lieferung an Stromversorgung. 13cm Kabel abisolieren, dünn verzinnen, an Motoren anlöten.
- 2 x 16 Kabel f-f, ein Stecker sec abschneiden, abisolieren dünn verzinnen, an Motoren anlöten.
- Batteriefach, Kabel 5 cm abschneiden, abisolieren dünn verzinnen → Lieferung an Stromversorgung. Rest vom roten Kabel auf 5cm kürzen, unverzinntes Ende dünn verzinnen → Lieferung an Stromversorgung.
- Step-Up Converter tunen → Lieferung an Stromversorgung.
- Stromversorgung
- Driver Boards im H47
- Stromleisten im H47
- Ultraschallsensor Stützen biegen.
- Bau der Roboter
Dienstag 4. Juli
- Roboter Bau vollenden:
- Vor dem Einlegen der Batterien: Kabel vom Step-Up Konverter (Teil, das 5 V macht) ausstecken, und dort nach dem Einschalten mit Multimeter Spannung überprüfen (muss zwischen 5.00 V und 5.15 V liegen). Sonst ausschalten, Fehler suchen. Überprüfen, dass grüne LED auf Motordriver leuchtet.
- Kabel wieder richtig einstecken.
- Einschalten:
- Arduino und LCD müssen leuchten
- Radsensoren müssen blinken, wenn Rad gedreht wird
- LEDs auf Touch-Buttons müssen leuchten, wenn Buttons gedrückt.
- sonst ausschalten, Fehler suchen.
- Installation der Arduino-IDE
- Benötigte Libraries in der Arduino-IDE installieren: LiquidCrystal_PCF8574. Sketch → Include Libraries → Manage Libraries → Search
#include <Wire.h> #include <LiquidCrystal_PCF8574.h> LiquidCrystal_PCF8574 lcd(0x27); #define LINKSV 5 #define LINKSR 6 #define RECHTSV 7 #define RECHTSR 8 void setup() { Wire.begin(); pinMode(LINKSV, OUTPUT); pinMode(LINKSR, OUTPUT); // Ausgang 6 ist Ausgabe pinMode(RECHTSV, OUTPUT); pinMode(RECHTSR, OUTPUT); // Ausgang 8 ist Ausgabe lcd.begin(16, 2); lcd.setBacklight(1); lcd.print("Hello world!"); } void loop() { if (digitalRead(22)==HIGH) { //pgeagspoimjgfce Ist Button 1 gedrückt? digitalWrite(LINKSV, HIGH); // 5V am Ausgang 5 digitalWrite(RECHTSV, HIGH); // 5V am Ausgang 5 delay(1000); // 1000ms Warten digitalWrite(LINKSV, LOW); // 5V am Ausgang 5 digitalWrite(RECHTSV, LOW); // 5V am Ausgang 5 delay(1000); // 1000ms Warten } // if wieder fertig }
- Testen und Korrektur der Motoren-Verdrahtung
- Erster Arduino-Sketch gemeinsam erstellen. Grundgerüst verstehen.
- Download der Ivobot-Library: ivobot.zip
- Beispiel-Code studieren und verstehen.
- Programmierung Display und Buttons, Bestimmung der PID-Parameter
Mittwoch 5. Juli
- Geradeaus fahren
- Fahren auf Distanz und anhalten
- Wenden (mit und ohne Wendehindernis) und zurückfahren.
Um 11h15 starten wir mit drei Challenges:
- Challenge 1 «Querung des H-Stock Gangs»: Roboter startet an einer Kastenwand und fährt geradeaus möglichst nah an die gegenüberliegende Kastenwand. Bewertung: Abweichung von der Geraden (Klebstreifen am Boden) plus Distanz zur Kastenwand.
- Challenge 2 «Querung des H-Stock Gangs, U-Turn»: Roboter startet an Kastenwand, ein Teil des Roboters überquert die Linie parallel zur gegenüberliegenden Kastenwand, wendet und kehrt wiederum möglichst nah und auf der Geraden zur Ausgangswand zurück. Bewertung: Identisch zur Challenge 1 aber an der ursprünglichen Wand
- Challenge 3 «Pilonenrundtour»: Roboter startet im H47 mit Hinterrad in Klebesreifenbox, umrundet den Karton und kehrt zum Ursprung zurück. Bewertung: Distanz des Hinterrads vom Ursprung.
Geradeausfahren
Fürs Geradeausfahren gibt es eine wichtige Frage: Welches Rad dreht schneller.
int tickDiff = robot.motors.getTicks(1) - robot.motors.getTicks(0); // Anzahl Ticks rechter Motor minus Anzahl Ticks linker Motor. // Idee mit tickDiff Motoren Geschindigkeit steuern, z.B. multiplizieren, if(....)
Die Tickzähler können auch zurückgesetzt werden mit
robot.motors.resetCounters()
Ein Beispiel, welches bis zu einer TickDifferenz von 5 fährt, nachher die Motoren abstellt und den Counter zurücksetzt:
void loop() { int tickDiff = robot.motors.getTicks(0) - robot.motors.getTicks(1); //Variable für Tick Unterschied definieren if (robot.buttons.get() == 1) { robot.motors.setPowers(799, 799); // Motor maximale Leistung while (abs(tickDiff) < 5) { // so lange die Schlaufe ausführen, als dass die TickDifferenz < 5 ist. tickDiff = robot.motors.getTicks(0) - robot.motors.getTicks(1); //Differenz der beiden TickCounts berechnen. Linker minus rechter robot.lcd.clear(); //LCD Display 'löschen' robot.lcd.print("Tick Diff: "); //Text schreiben robot.lcd.print(tickDiff); //Tick Differenz ausgeben delay(50); //LCD ohne Flackern } robot.lcd.setCursor(0, 1); //Cursor auf zweite Zeile robot.lcd.println("5 ueberschritten"); robot.motors.setPowers(0, 0); //Motoren aus robot.motors.resetCounters(); //Counters zurücksetzen } }
Distanzmessung
Beim Fahren auf Distanz geht es darum, den US-Sensor auszulesen. Dieser kann (siehe ivobot) mit us.measure() ausgelesen werden. Folgende Bemerkungen:
- us.measure(); liefert eine Gleitkommazahl (Distanz in cm) zurück.
- Distanz Überprüfungen können im Code z.B. wie folgt überprüft werden:
float distance = us.measure(); if((distance <= 10) && (distance > 0)){ //der Sensor gibt bei einer zu grossen Distanz den Wert 0 zurück; & ist das logische und }
- Allenfalls könnte man sanftes Abbremsen andenken…
Donnerstag 6. Juli
- Festlegen der Wettbewerbsparcours (Folge von Challenges, die auch einzeln bestritten werden können).
- Aufräumen
- Mittag
- Programmieren / Testen etc.
Menu Struktur
- untermenu.txt
void meinTollesUntermenu() { // Menu anzeigen, Resultat ist Ganzzahl (int), gespeichert in der Variablen 'choice' int choice = robot.menu.choice("Cool1", "Toll2", "Super3", "Abort"); if (choice==1) { // Wenn gleich 1 coolesDing(); // Unterprogramm test_us aufrufen (siehe oben) } else if (choice==2) { // Sonst wenn gleich 2 meinCoolesProgrammKannsBesser(); } else if (choice==3) { sontEinTestOderSo(); } } // Wird immer wieder aufgerufen void loop() { // Menu anzeigen, Resultat ist Ganzzahl (int), gespeichert in der Variablen 'choice' int choice = robot.menu.choice("Prg1", "Prg2", "Prg3", "Prg4"); if (choice==1) { // Wenn gleich 1 meinTollesUntermenu(); // Unterprogramm test_us aufrufen (siehe oben) } else if (choice==2) { // Sonst wenn gleich 2 meinCoolesProgramm(); } else if (choice==3) { sontEinTestOderSo(); } else if (choice==4) { undNochWas(); } }
Freitag
Wettbewerb
- Start jeweils mit Hinterrad auf den Markierungen.
- Wird eine Markierung mit allen Rädern überfahren, gibt es die darauf markierten Punkte.
- Einer Berührung mit Mauern und Hindernissen gibt 1 Minuspunkt. Entlangschleifen gibt 2 Minuspunkte.
- Manuelles Eingreifen beendet die Challenge. Bisher gemachte Punkte zählen aber.
- In die richtige Richtung wenden nach einer Challenge gibt 1 Punkt.
- Eine Challenge autonom nach einer anderen zu fahren gibt 1 Punkte mehr für die zweite Challenge.
- Die vierte Challenge ohne den vorgegebenen Line-Following Code zu fahren, gibt 2 Plus-Punkte.
Wertung
- Drei Versuche pro Challenge und Team. Der beste Lauf zählt.