Table of Contents

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

Dienstag 4. Juli

#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
}

Mittwoch 5. Juli

Um 11h15 starten wir mit drei Challenges:

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:

Donnerstag 6. Juli

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();
  }
}

Freitag

Wettbewerb

Wertung