lehrkraefte:blc:robotics:ablauf

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:robotics:ablauf [2017/07/02 18:37] – [Dienstag 4. Juli] Ivo Blöchligerlehrkraefte: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, 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
 +
 +<code c++>
 +#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
 +}
 +</code>
 +
 +  * 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 **<<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.
 +
 +<code c++>
 +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(....)
 +</code>
 +Die Tickzähler können auch zurückgesetzt werden mit 
 +<code>
 +robot.motors.resetCounters()
 +</code>
 +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); //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
 +  }
 +}
 +</code>
 +=== 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: <code ++> 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
 +
 +} </code>
 +  * 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 '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();
 +  }
 +}
 +
 +</code>
 +==== 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.