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/03 21:52]
Ivo Blöchliger [Dienstag 4. Juli]
lehrkraefte:blc:robotics:ablauf [2018/12/14 15:56] (current)
Ivo Blöchliger [Dienstag 4. Juli]
Line 37: Line 37:
   * Installation der Arduino-IDE   * Installation der Arduino-IDE
     * Benötigte Libraries in der Arduino-IDE installieren: LiquidCrystal_PCF8574. Sketch -> Include Libraries -> Manage Libraries -> Search     * 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   * Testen und Korrektur der Motoren-Verdrahtung
     * Erster Arduino-Sketch gemeinsam erstellen. Grundgerüst verstehen.     * Erster Arduino-Sketch gemeinsam erstellen. Grundgerüst verstehen.
   * Download der Ivobot-Library: {{ :lehrkraefte:blc:robotics:ivobot.zip |}}   * Download der Ivobot-Library: {{ :lehrkraefte:blc:robotics:ivobot.zip |}}
     * Beispiel-Code studieren und verstehen.     * Beispiel-Code studieren und verstehen.
-  * [[pid|Theorie Line-Following und PID-Regler]]+    * [[https://fginfo.ksbg.ch/~ivo/ivobot/|Dokumentation]]
   * Programmierung Display und Buttons, Bestimmung der PID-Parameter   * 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.1499111557.txt.gz
  • Last modified: 2017/07/03 21:52
  • by Ivo Blöchliger