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
Last revision Both sides next revision
lehrkraefte:blc:robotics:ablauf [2017/06/30 16:31]
Ivo Blöchliger [Montag 3. Juli]
lehrkraefte:blc:robotics:ablauf [2017/07/07 07:55]
Ivo Blöchliger [Freitag]
Line 25: Line 25:
  
   * Bau der Roboter   * Bau der Roboter
-  * Installation der Arduino-IDE, Benötigte Libraries 
-  * Testen und Korrektur der Motoren-Verdrahtung 
-  * 1. Challenge: 1m Vorwärts fahren, wenden, und zum Ausgangspunkt zurückfahren und wenden. Das Score entspricht der Distanz zwischen den Hinterradspositionen in cm plus die Abweichung der Orientierung in Grad. 
  
 ==== Dienstag 4. Juli ==== ==== Dienstag 4. Juli ====
-  * Löten der IR-Distanz-Sensoren +  * Roboter Bau vollenden: 
-  Fabrikation der Ultraschallsensor Halterungen+    * **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. 
-  Auswerten der LochräderWiederholung der 1. Challenge +    Kabel wieder **richtig** einstecken
-  Einbau IR-Distanz-Sensoren+    Einschalten:  
-  * Theorie Line-Following und PID-Regler +      * Arduino und LCD müssen leuchten 
-  Programmierung Display und Buttons, Bestimmung der PID-Parameter+      * Radsensoren müssen blinkenwenn 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/bot/|Dokumentation]]
 +  * Programmierung Display und Buttons, Bestimmung der PID-Parameter
 ==== Mittwoch 5. Juli ==== ==== Mittwoch 5. Juli ====
-  * Fahren auf Distanz, einer Wand folgen, Hindernissen ausweichen+  * 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 ==== ==== Donnerstag 6. Juli ====
-  * Festlegen des Wettbewerbsparcours+  * [[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.   * 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 ==== ==== Freitag ====
-  Roboterwettbewerb+=== 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.
  
  • lehrkraefte/blc/robotics/ablauf.txt
  • Last modified: 2018/12/14 15:56
  • by Ivo Blöchliger