===== 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
#include
#include
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: {{ :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 **<>**: 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 **<>**: 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 **<>**: 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...
==== 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 ===
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();
}
}
==== 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.