Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lehrkraefte:blc:robotics:ablauf [2017/07/03 21:21] 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: | * Benötigte Libraries in der Arduino-IDE installieren: | ||
+ | |||
+ | <code c++> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | LiquidCrystal_PCF8574 lcd(0x27); | ||
+ | |||
+ | #define LINKSV 5 | ||
+ | #define LINKSR 6 | ||
+ | #define RECHTSV 7 | ||
+ | #define RECHTSR 8 | ||
+ | |||
+ | void setup() { | ||
+ | Wire.begin(); | ||
+ | pinMode(LINKSV, | ||
+ | pinMode(RECHTSV, | ||
+ | lcd.begin(16, | ||
+ | lcd.setBacklight(1); | ||
+ | lcd.print(" | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | if (digitalRead(22)==HIGH) { // | ||
+ | digitalWrite(LINKSV, | ||
+ | digitalWrite(RECHTSV, | ||
+ | delay(1000); | ||
+ | | ||
+ | digitalWrite(LINKSV, | ||
+ | digitalWrite(RECHTSV, | ||
+ | delay(1000); | ||
+ | } // if wieder fertig | ||
+ | } | ||
+ | </ | ||
+ | |||
* 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: | * Download der Ivobot-Library: | ||
* Beispiel-Code studieren und verstehen. | * Beispiel-Code studieren und verstehen. | ||
- | | + | |
* 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 | + | |
+ | | ||
+ | * Wenden (mit und ohne Wendehindernis) und zurückfahren. | ||
+ | Um 11h15 starten wir mit drei Challenges: | ||
+ | * Challenge 1 **<< | ||
+ | * Challenge 2 **<< | ||
+ | * Challenge 3 **<< | ||
+ | |||
+ | === 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); | ||
+ | // Idee mit tickDiff Motoren Geschindigkeit steuern, z.B. multiplizieren, | ||
+ | </ | ||
+ | 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: | ||
+ | <code c++> | ||
+ | void loop() { | ||
+ | int tickDiff = robot.motors.getTicks(0) - robot.motors.getTicks(1); | ||
+ | if (robot.buttons.get() == 1) { | ||
+ | robot.motors.setPowers(799, | ||
+ | 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); | ||
+ | robot.lcd.clear(); | ||
+ | robot.lcd.print(" | ||
+ | robot.lcd.print(tickDiff); | ||
+ | delay(50); //LCD ohne Flackern | ||
+ | } | ||
+ | robot.lcd.setCursor(0, | ||
+ | robot.lcd.println(" | ||
+ | robot.motors.setPowers(0, | ||
+ | robot.motors.resetCounters(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | === Distanzmessung === | ||
+ | Beim Fahren auf Distanz geht es darum, den US-Sensor auszulesen. Dieser kann (siehe ivobot) mit // | ||
+ | Folgende Bemerkungen: | ||
+ | * // | ||
+ | * Distanz Überprüfungen können im Code z.B. wie folgt überprüft werden: <code ++> float distance = us.measure(); | ||
+ | | ||
+ | |||
+ | } </ | ||
+ | * Allenfalls könnte man sanftes Abbremsen andenken... | ||
==== Donnerstag 6. Juli ==== | ==== Donnerstag 6. Juli ==== | ||
- | * Festlegen | + | |
+ | | ||
+ | * 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 ' | ||
+ | int choice = robot.menu.choice(" | ||
+ | if (choice==1) { // Wenn gleich 1 | ||
+ | | ||
+ | } 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 ' | ||
+ | int choice = robot.menu.choice(" | ||
+ | if (choice==1) { // Wenn gleich 1 | ||
+ | | ||
+ | } else if (choice==2) { // Sonst wenn gleich 2 | ||
+ | meinCoolesProgramm(); | ||
+ | } else if (choice==3) | ||
+ | sontEinTestOderSo(); | ||
+ | } else if (choice==4) | ||
+ | undNochWas(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
==== Freitag ==== | ==== Freitag ==== | ||
- | | + | === Wettbewerb === |
+ | | ||
+ | * Wird eine Markierung mit allen Rädern überfahren, | ||
+ | * 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. | ||