===== 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 #include 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: {{ :lehrkraefte:blc:robotics:ivobot.zip |}} * Beispiel-Code studieren und verstehen. * [[https://fginfo.ksbg.ch/~ivo/ivobot/|Dokumentation]] * 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 **<>**: 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 **<>**: 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 **<>**: 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 ==== * [[pid|Theorie Line-Following und PID-Regler]] * Festlegen der Wettbewerbsparcours (Folge von Challenges, die auch einzeln bestritten werden können). * Aufräumen * Mittag * Programmieren / Testen etc. === Menu Struktur === 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.