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 |
#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 }
Um 11h15 starten wir mit drei Challenges:
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 } }
Beim Fahren auf Distanz geht es darum, den US-Sensor auszulesen. Dieser kann (siehe ivobot) mit us.measure() ausgelesen werden. Folgende Bemerkungen:
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 }
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(); } }
Wertung