Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:robotics:ablauf [2017/07/05 07:44] – Simon Knaus | lehrkraefte:blc:robotics:ablauf [2018/12/14 14:56] (current) – [Dienstag 4. Juli] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Wochenprogramm im H46/H47 ===== | ||
| + | |||
| + | ^ Tag ^ Vormittag 8:00 bis 12:00 ^ Nachmittag 13:30 bis 16:30 ^ | ||
| + | | Montag 3. Juli | Einführung, | ||
| + | | 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, | ||
| + | |||
| + | ==== Montag 3. Juli ==== | ||
| + | * Begrüssung. Einzug CHF 40.- | ||
| + | * Einführung: | ||
| + | * 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/ | ||
| + | * 2 x 16 Kabel f-f, ein Stecker sec abschneiden, | ||
| + | * Batteriefach, | ||
| + | * 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 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, | ||
| + | * Installation der Arduino-IDE | ||
| + | * Benötigte Libraries in der Arduino-IDE installieren: | ||
| + | |||
| + | <code c++> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | LiquidCrystal_PCF8574 lcd(0x27); | ||
| + | |||
| + | #define LINKSV 5 | ||
| + | #define LINKSR 6 | ||
| + | #define RECHTSV 7 | ||
| + | #define RECHTSR 8 | ||
| + | |||
| + | void setup() { | ||
| + | Wire.begin(); | ||
| + | pinMode(LINKSV, | ||
| + | pinMode(RECHTSV, | ||
| + | lcd.begin(16, | ||
| + | lcd.setBacklight(1); | ||
| + | lcd.print(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | if (digitalRead(22)==HIGH) { // | ||
| + | digitalWrite(LINKSV, | ||
| + | digitalWrite(RECHTSV, | ||
| + | delay(1000); | ||
| + | | ||
| + | digitalWrite(LINKSV, | ||
| + | digitalWrite(RECHTSV, | ||
| + | delay(1000); | ||
| + | } // if wieder fertig | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * Testen und Korrektur der Motoren-Verdrahtung | ||
| + | * Erster Arduino-Sketch gemeinsam erstellen. Grundgerüst verstehen. | ||
| + | * Download der Ivobot-Library: | ||
| + | * Beispiel-Code studieren und verstehen. | ||
| + | * [[https:// | ||
| + | * 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 **<< | ||
| + | * Challenge 2 **<< | ||
| + | * Challenge 3 **<< | ||
| + | |||
| + | === Geradeausfahren === | ||
| + | Fürs Geradeausfahren gibt es eine wichtige Frage: Welches Rad dreht schneller. | ||
| + | |||
| + | <code c++> | ||
| + | int tickDiff = robot.motors.getTicks(1) - robot.motors.getTicks(0); | ||
| + | // Idee mit tickDiff Motoren Geschindigkeit steuern, z.B. multiplizieren, | ||
| + | </ | ||
| + | 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: | ||
| + | <code c++> | ||
| + | void loop() { | ||
| + | int tickDiff = robot.motors.getTicks(0) - robot.motors.getTicks(1); | ||
| + | if (robot.buttons.get() == 1) { | ||
| + | robot.motors.setPowers(799, | ||
| + | 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); | ||
| + | robot.lcd.clear(); | ||
| + | robot.lcd.print(" | ||
| + | robot.lcd.print(tickDiff); | ||
| + | delay(50); //LCD ohne Flackern | ||
| + | } | ||
| + | robot.lcd.setCursor(0, | ||
| + | robot.lcd.println(" | ||
| + | robot.motors.setPowers(0, | ||
| + | robot.motors.resetCounters(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | === Distanzmessung === | ||
| + | Beim Fahren auf Distanz geht es darum, den US-Sensor auszulesen. Dieser kann (siehe ivobot) mit // | ||
| + | Folgende Bemerkungen: | ||
| + | * // | ||
| + | * Distanz Überprüfungen können im Code z.B. wie folgt überprüft werden: <code ++> float distance = us.measure(); | ||
| + | | ||
| + | |||
| + | } </ | ||
| + | * 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 === | ||
| + | <code txt untermenu.txt> | ||
| + | |||
| + | void meinTollesUntermenu() { | ||
| + | // Menu anzeigen, Resultat ist Ganzzahl (int), gespeichert in der Variablen ' | ||
| + | int choice = robot.menu.choice(" | ||
| + | if (choice==1) { // Wenn gleich 1 | ||
| + | | ||
| + | } 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 ' | ||
| + | int choice = robot.menu.choice(" | ||
| + | if (choice==1) { // Wenn gleich 1 | ||
| + | | ||
| + | } 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, | ||
| + | * 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. | ||