lehrkraefte:blc:robotics:ablauf

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
  • 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
  • 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 <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
}
  • Testen und Korrektur der Motoren-Verdrahtung
    • Erster Arduino-Sketch gemeinsam erstellen. Grundgerüst verstehen.
  • Download der Ivobot-Library: ivobot.zip
  • Programmierung Display und Buttons, Bestimmung der PID-Parameter
  • 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.

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…
  • Festlegen der Wettbewerbsparcours (Folge von Challenges, die auch einzeln bestritten werden können).
  • Aufräumen
  • Mittag
  • Programmieren / Testen etc.
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();
  }
}

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