Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung | |||
gf_informatik:microbit_programmieren_maqueen [2022-08-17 12:59] – sca | gf_informatik:microbit_programmieren_maqueen [2022-09-14 07:05] (aktuell) – gelöscht hof | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Microbit mit Maqueen programmieren ====== | ||
- | Auf dieser Seite lernst du die wichtigsten Funktionen kennen, um mit dem Microbit das Fahrwerk Maqueen zu steuern. Du kannst den Microbit einfach in den dafür vorgesehenen Steckplatz stecken. Sobald du den Schalter hinten am Fahrwerk auf On stellst, wird der Microbit mit Strom versorgt. | ||
- | {{: | ||
- | |||
- | ===== Motoren ansteuern ===== | ||
- | Die beiden Räder des Maqueen-Fahrwerks werden von je einem Motor angetrieben. Die beiden Motoren werden über einen //Motor Controller (MC)// gesteuert: | ||
- | |||
- | {{: | ||
- | |||
- | Über zwei Leitungen (Pins zwischen " | ||
- | |||
- | <code python> | ||
- | I2C_ADDR = 16 # Adresse des Motor-Controllers | ||
- | while I2C_ADDR not in i2c.scan(): | ||
- | display.show(Image.SAD) | ||
- | display.show(Image.HAPPY) | ||
- | </ | ||
- | |||
- | Obiger Code ruft die Funktion '' | ||
- | |||
- | Jetzt können über I2C einzelne Nachrichten an die Adresse des Motor-Controllers gesendet werden. In diesen Nachrichten können wir dem MC mitteilen: | ||
- | |||
- | * welcher Motor drehen soll, | ||
- | * in welche Richtung dieser drehen soll und | ||
- | * wie schnell er drehen soll. | ||
- | |||
- | Folgende Funktion sendet abgängig von den Parametern die richtigen Nachrichten: | ||
- | <code python> | ||
- | def motor_run(motors=0, | ||
- | # direction: 0 = forward, 1 = backward | ||
- | # speed range: 0...255 | ||
- | i2c_buf = bytearray([motors, | ||
- | if motors == 0: # left motor | ||
- | i2c_buf[0] = 0x00 | ||
- | i2c.write(I2C_ADDR, | ||
- | if motors == 1: # right motor | ||
- | i2c_buf[0] = 0x02 | ||
- | i2c.write(I2C_ADDR, | ||
- | if motors == 2: # both motors | ||
- | i2c_buf[0] = 0x00 | ||
- | i2c.write(I2C_ADDR, | ||
- | i2c_buf[0] = 0x02 | ||
- | i2c.write(I2C_ADDR, | ||
- | </ | ||
- | |||
- | Du musst nicht jede Zeile dieser Funktion verstehen. Wichtig ist, dass du sie richtig verwendest: Hier eine kurze Übersicht: | ||
- | |||
- | * Mit dem Parameter '' | ||
- | * 0 für den linken Motor | ||
- | * 1 für den rechten Motor | ||
- | * 2 für beide Motoren | ||
- | * Mit dem Parameter '' | ||
- | * 0 für vorwärts, | ||
- | * 1 für rückwärts. | ||
- | * Mit dem Parameter '' | ||
- | * von 0 (stillstehend) bis 255 (schnell). | ||
- | |||
- | Wenn du zum Beispiel willst, dass der linke Motor mit der Geschwindigkeit 200 rückwärts dreht, dann rufst du die Funktion wie folgt auf: | ||
- | <code python> | ||
- | motor_run(0, | ||
- | </ | ||
- | |||
- | **Probiere es aus:** | ||
- | |||
- | * Kopiere obige Code-Zeilen für die Suche nach dem Motor-Controller. | ||
- | * Kopiere dann die Zeilen für die Definition der Funktion '' | ||
- | * Ergänze den Code so, dass Maqueen vorwärts fahren und stoppen kann: | ||
- | * Wenn du Taste A drückst, soll Maqueen mit geringer Geschwindigkeit (50) vorwärts fahren. | ||
- | * Wenn du Taste B drückst, soll Maqueen stoppen. | ||
- | |||
- | ==== Aufgaben F ==== | ||
- | === Aufgaben F1 === | ||
- | Schreibe ein Programm, mit dem Maqueen möglichst schnell einen Halbkreis mit möglichst kleinem Radius fährt, sobald du die Taste A drückst. | ||
- | |||
- | === Aufgaben F2 === | ||
- | Speichere dein Programm aus Aufgabe **F1** unter neuem Namen und erweitere es: | ||
- | |||
- | * Schreibe eine Funktion – zum Beispiel namens '' | ||
- | * Mit dem Aufruf '' | ||
- | * Mit dem Aufruf '' | ||
- | * Mit dem Aufruf '' | ||
- | * etc. | ||
- | |||
- | |||
- | === Aufgaben F3 === | ||
- | Speichere dein Programm aus Aufgabe **F2** unter neuem Namen und erweitere es: | ||
- | |||
- | * Schreibe eine Funktion – zum Beispiel namens '' | ||
- | * Mit dem Aufruf '' | ||
- | * Mit dem Aufruf '' | ||
- | * Mit dem Aufruf '' | ||
- | * etc. | ||
- | |||
- | |||
- | === Aufgaben F4 === | ||
- | Baue mit ca. vier Gegenständen eine kleine Slalom-Strecke. Speichere dein Programm aus Aufgabe **F3** unter neuem Namen und erweitere es: | ||
- | |||
- | * Schreibe ein Programm, mit dem Maqueen die Slalom-Strecke (links vorbei, rechts vorbei etc.) fährt. | ||
- | * Dazu misst du erst deine Strecke aus und planst eine Route, die du mit den Funktionen '' | ||
- | * Sobald du Taste A drückst, soll Maqueen die Route abfahren. | ||
- | * Programmiere, | ||
- | |||
- | ===== Ultraschall-Sensor auslesen ===== | ||
- | Wenn du den Ultraschall-Sensor auf das Maqueen-Fahrwerk steckst, sieht es so aus, als hätte der kleine Roboter nun zwei Augen: | ||
- | |||
- | {{: | ||
- | |||
- | Technisch gesehen sind die beiden Zylinder aber keine Augen: Der linke Zylinder ist eher ein Mund und der rechte ein Ohr. Mit dem linken werden Schallwellen ausgesendet (engl.: // | ||
- | |||
- | Du kennst das vom Echo-Effekt: | ||
- | |||
- | Das heisst: Du könntest die Zeit zwischen Ruf und Echo stoppen und so auf die Distanz zwischen dir und der Felswand schliessen. Genau so funktioniert der Ultraschallsensor: | ||
- | |||
- | {{: | ||
- | |||
- | Auf der linken Seite des obigen Bildes siehst du, wie der Microbit mit dem Ultraschall-Sensor verbunden ist: Pin 1 ist mit dem Signal " | ||
- | |||
- | Auf der rechten Seite siehst du, wie es funktioniert: | ||
- | |||
- | Um nun eine Distanz zu messen, müssen wir nur ein kurzes Signal auf Pin 1 (Trigger) geben und dann an Pin 2 messen, wie lange das Echo-Signal dauert. Diese Zeit können wir in eine Distanz umrechnen: Der Schall legt ca. 340 Meter pro Sekunde zurück, das sind 0.034 cm pro Mikrosekunde. Angenommen, der Echo-Impuls ist 700 µs lang: Dann beträgt die Distanz 700 * 0.034 / 2 = 11.9 cm. Wir rechnen durch 2, weil der Schall die Distanz zweimal zurücklegt. Folgender Code misst die Distanz und zeigt sie auf dem Display an: | ||
- | |||
- | <code python> | ||
- | from microbit import * | ||
- | import utime | ||
- | import machine | ||
- | |||
- | while True: | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | Für die Funktion '' | ||
- | |||
- | ==== Aufgaben G ==== | ||
- | === Aufgaben G1 === | ||
- | Schreibe eine Funktion namens '' | ||
- | |||
- | * Baue in diese Funktion vor der return-Anweisung eine Verzögerung (sleep) von 10 ms ein. Damit wird verhindert, dass die Funktion innert weniger Millisekunden mehrmals aufgerufen wird, was die Ultraschall-Messung stören könnte. | ||
- | |||
- | === Aufgaben G2 === | ||
- | Speichere dein Programm aus Aufgabe **F3** unter neuem Namen und ändere es: | ||
- | |||
- | * Füge deine Funktion '' | ||
- | * In der Endlosschleife fragst du Tasten und Ultraschall-Sensor ab. | ||
- | * Wenn Taste A gedrückt wurde, soll Maqueen langsam (Geschwindigkeit 30) vorwärts fahren. | ||
- | * Wenn die Distanz zu einem Objekt kleiner als 10 cm ist, soll Maqueen erst stoppen und dann eine 90°-Drehung machen. | ||
- | |||
- | === Aufgaben G3 === | ||
- | Speichere dein Programm aus Aufgabe **G2** unter neuem Namen und ändere es: | ||
- | |||
- | * Ändere die Funktion zum Drehen ('' | ||
- | |||
- | === Aufgaben G4 === | ||
- | Speichere dein Programm aus Aufgabe **G3** unter neuem Namen und ändere es: | ||
- | |||
- | * Wenn Taste A gedrückt wurde, soll Maqueen langsam (Geschwindigkeit 30) vorwärts fahren. | ||
- | * Wenn die die Distanz zu einem Objekt kleiner als 6 cm ist, soll Maqueen erst stoppen; dann eine Drehung um einen zufälligen Winkel zwischen 30° und 170 ° machen und danach wieder langsam (Geschwindigkeit 30) vorwärts fahren. | ||
- | |||
- | Setze nun Maqueen in eine Feld, in dem er von vier Seiten begrenzt ist und beobachte das Verhalten. Angenommen, Maqueen könnte staubsaugen: | ||
- | |||
- | === Aufgaben G5 === | ||
- | Speichere dein Programm aus Aufgabe **G4** unter neuem Namen und ändere es: | ||
- | |||
- | * Vor jeder Drehung soll der Microbit drei Mal " | ||
- | |||
- | ==== Aufgaben H (Advanced) ==== | ||
- | === Aufgabe H1 === | ||
- | Du hast ja bereits den Code, um den Maqueen zu steuern (`drive()`, `turn()`, `stop()`, `getDistance()`). Lies nun das Kapitel [[https:// | ||
- | |||
- | Löse damit gerüstet die folgende Aufgabe: | ||
- | * der Roboter soll kollisionsfrei herumfahren (wie der Staubsaug-Roboter) | ||
- | * der Roboter soll mittels Radio andere Roboter finden und möglichst nahe zu ihnen fahren. Sind die zwei Roboter nah genug, sollen sie anhalten und einen Tanz vorführen (z.B. sich im Kreis drehen). |