~~NOTOC~~ ====== Variablen sinnvoll einsetzen und erste Schritte mit dem Roboter ====== ===== Lernziele heute ===== * Spirale mit Turtle zeichnen und * Spirale mit Roboter abfahren: [[https://fginfo.ksbg.ch/~olaf/roboter-spirale.mp4|Video "Quadratische Spirale"]] ===== Hausaufgaben besprechen ===== * Klasse 1c: Spalte Einmaleins oder $n$-Eck ===== Steuerung der Turtle durch Variablen ===== ==== Aufgabe 1 (Algorithmenentwurf) ==== **"Gemeinsam" an Tafel:** Finde einen Algorithmus zum Zeichnen der folgenden "Spirale" und gib diesen durch ein Flussdiagramm an. * Die Spirale soll von innen her gezeichnet werden. * Zuerst soll die Schildkröte 10 Pixel vorwärts gehen und dann nach jeder Abbiegung 10 Pixel weiter gehen als zuvor. * Zusätzlich soll am Ende die Gesamtlänge der Spirale ausgegeben werden. {{:lehrkraefte:snr:informatik:bruehl-2022:eck-spirale-vergroesserung-konstant.png?200|}} Bemerkung: Wir sind nicht an der naiven Lösung interessiert, bei der alle Linien einzeln gezeichnet werden, sondern wollen eine Wiederholung (''repeat''-Struktur) und mindestens eine Variable verwenden. ==== Aufgabe 2 (Algorithmus bzw. Flussdiagramm in Python-Programm übersetzen) ==== **Einzelarbeit, ca. 10 Minuten.** Verwandle unser Flussdiagramm in ein Python-Programm zum Zeichnen der obigen Spirale; dabei soll ''repeat 16:'' verwendet werden. Am Ende soll mit ''print(...)'' die Gesamtlänge der Spirale ausgegeben werden. Wie immer: Speichere dein Programm ab. Später werden wir es verwenden, um den Roboter eine Spirale abfahren zu lassen. * Definiere am Anfang drei Variablen ''anfangsLaenge = 40'', ''laengenVergroesserung = 10'', ''anzahlBewegungen = 16'' und passe dein Programm so an, dass diese Variablen angeben, wie weit die Schildkröte am Anfang läuft, um wie viel sie ihre Bewegungsstrecke nach jeder Abbiegung vergrössert und wie oft sie vorwärts läuft. * Definiere zusätzlich eine weitere Variable ''abbiegeWinkel = ...'', die angibt, um welchen Winkel die Schildkröte nach jeder Vorwärtsbewegung abbiegt. Welchen Wert muss diese haben, damit die Schildkröte eine Spirale "aus 13-Ecken" zeichnet? Wie kann man eine möglichst runde Spirale zeichnen? * Definiere eine zusätzliche Variable ''winkelVergrösserung = ...''. Der Abbiegewinkel soll sich nach jeder Vorwärtsbewegung um diesen Winkel verändern. Setze ''laengenVergroesserung = 0'' und spiele mit der neuen Variablen ''winkelVergroesserung'' (und den anderen Variablen). Für geeignete Werte kannst du (bis auf Drehung am Anfang) Bilder der folgenden Art erstellen ("Seepferdchen" oder "Violinschlüssel"): {{:lehrkraefte:snr:informatik:bruehl-2022:notenschluessel.png?200|}} * Statt all diese Variablen am Anfang des Programms zu definieren, kannst du auch einige davon vom Benutzer erfragen. Verwende etwa ''abbiegeWinkel = input("Abbiegewinkel am Anfang?")''. ==== Aufgabe 3 (Einübung des gerade Gelernten an einem neuem Problem) ==== **Einzelarbeit, ca. 15 Minuten.** Erweitere den Programmcode from gturtle import * makeTurtle() # hideTurtle() n = input("Wie viele Quadrate?") s = 70 d = 10 # Hier ist dein Code zu ergaenzen. so, dass ineinanderliegende Quadrate gezeichnet werden, wie in der Skizze unten angedeutet. Dabei soll gelten: * ''n'' ist die Anzahl der Quadrate. * Das kleinste Quadrat hat eine Seitenlänge von ''s = 70'' Pixeln. * Benachbarte Quadrate unterscheiden sich in der Seitenlänge um ''d = 10'' Pixel. * Wenn man die Startwerte von ''s'' und ''d'' im Programm ändert, ändert sich die Zeichnung entsprechend. Gerne darf zuvor ein Flussdiagramm erstellt werden, wenn das hilft. {{:lehrkraefte:snr:informatik:bruehl-2022:quadrate-mit-gemeinsamer-ecke.png?400|}} In beliebiger Reihenfolge zu bearbeiten: * Verändere die Dicke des Zeichenstifts von Quadrat zu Quadrat. * Zeichne ''e''-Ecke statt Quadrate, wobei ''e'' eine neue Variable ist, die du am Anfang auf einen beliebigen Wert setzt. * Zeichne nun die Quadrate (bzw. ''e''-Ecke) von aussen nach innen und so, dass die Seitenlänge des nächstkleineren Quadrats (bzw. ''e''-Ecks) jeweils um den Faktor ''faktor = 0.7'' kleiner ist. {{:lehrkraefte:snr:informatik:bruehl-2022:quadrate-mit-gemeinsamer-ecke-aber-faktor.png?200|}} * Falls du auch die Farbe variieren willst, geht das am einfachsten mit dem Befehl ''setPenColor(makeColor("rainbow", ...))'' wobei für die drei Punkte ein Wert zwischen 0 und 1 einzusetzen ist, z. B. wie folgt: Definiere am Anfang eine Variable ''farbe = 1''. Dann verwende in jeder Wiederholung die Anweisungen setPenColor(makeColor("rainbow", farbe)) farbe = farbe-1/n {{:lehrkraefte:snr:informatik:bruehl-2022:quadrate-mit-gemeinsamer-ecke-aber-faktor-und-farbig.png?200|}} * Wenn du [[https://de.wikipedia.org/wiki/Additive_Farbmischung|additive Farbmischung]] (vgl. auch [[https://de.wikipedia.org/wiki/RGB-Farbraum|RGB-Farbmodell]] kennst, kannst du Farben auch per ''setPenColor(makeColor(r, g, b))'' festlegen, wobei r, g, b (Nichtkomma-)Zahlen zwischen 0 und 255 sind und die Helligkeit der Farben **R**ot, **B**lau und **G**rün angeben. ==== Aufgabe 4, Hausaufgabe (kann eventuell während der Lektion begonnen werden) ==== Schreibe ein Programm, das vom Benutzer eine Zahl ''n'' erfragt und dann entsprechend viele konzentrisch ineinanderliegende Quadrate zeichnet, so dass das kleinste Quadrat Seitenlänge ''s = 10'' Pixel hat und sich die Seitenlängen benachbarter Quadrate jeweils um ''differenz = 20'' Pixel unterscheiden. Wenn man ''s'' und ''differenz'' verändert, muss die Zeichnung entsprechend anders aussehen. Die Seiten des Quadrats sollen horizontal bzw. vertikal liegen (und nicht irgendwie schräg auf dem Monitor). Du darfst kreativ sein und Farbe und Stiftdicke beliebig wählen und auch von Quadrat zu Quadrat variieren. Du darfst auch konzentrische ''e''-Ecke oder Sterne mit ''e'' Zacken oder ähnliches statt Quadraten zeichnen. Für ''n = 8'' soll die Ausgabe so aussehen: {{:lehrkraefte:snr:informatik:bruehl-2022:konzentrische-quadrate.png?300|}} Abgabe bis **spätestens Sonntagabend 23:59 Uhr** vor der nächsten Doppellektion über den folgenden Link: * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Em86eQPAvUVJh0G2W3jCSiEBtdMKtBToivTxBvvUkbxjSQ|Klasse 1AFGsK]] * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/EmvvJ0cdAwlFo-2LMiiM790BdaP3p9QN2Sjhs-5lVz1C1Q|Klasse 1CFP]] Verwende eine ''repeat''-Struktur: In jeder Wiederholung wird ein Quadrat gezeichnet (und am Ende die Seitenlänge erhöht für das nächste Quadrat). Nach dem Zeichnen jedes Quadrats: Bewege die Schildkröte (ohne dass sie zeichnet) ein wenig nach links und nach unten (und drehe sie danach wieder in die gewünschte Richtung). Was "ein wenig" bedeutet, musst du herausfinden. Damit die Quadrate alle ihren Mittelpunkt in der Mitte haben: Gehe jeweils mit ''home()'' auf die Ausgangsposition, dann um die halbe aktuelle Quadratseitenlänge ohne zu zeichnen nach oben (verwende ''penUp()'' und ''penDown()'') und zeichne dann das Quadrat von dort aus. ====== Erste Schritte mit dem Roboter ====== [[https://www.youtube.com/watch?v=o3DkVUCgBUQ| (etwas US-amerikanisches) Video zu Robotern]] [[https://www.youtube.com/watch?v=tF4DML7FIWk| Parkour Roboter]] ===== Spiral challenge: Wessen Roboter fährt am Ende der Lektion die "beste" Spirale? ==== ===== Programmierung des Roboters über Zustände (anders als bei der Turtle!) ===== Turtle- und Roboterprogrammierung unterscheiden sich! Finde die Unterschiede in den beiden folgenden Programmen und versuche sie zu erklären! from mbrobot import * forward() delay(2000) right() delay(500) stop() from gturtle import * makeTurtle() forward(200) right(130) * Die Befehle ''forward()'' und ''right()'' im Befehlssatz/der Bibliothek ''mbrobot'' nehmen **keine** Streckenangaben oder Winkelweiten entgegen - im Gegensatz zu den entsprechenden Befehlen der Bibliothek ''gturtle''. * Sie versetzen den Roboter in den entsprechenden Bewegungszustand (Vorwärtsbewegung bzw. Rechtsdrehung). Dieser Zustand bleibt so lange erhalten, bis der Roboter in einen anderen Zustand versetzt wird. * Der Befehl ''delay(2345)'' belässt den Roboter für 2345 **Millisekunden** (Tausendstelsekunden) im aktuellen Zustand. * Am Ende jedes Roboterprogramms sollte der Befehl ''stop()'' stehen, damit der Roboter sich nicht so lange weiterbewegt, bis die Batterie schlappmacht. * Am Anfang ist ein Befehl wie ''delay(2000)'' sinnvoll, damit der Roboter nicht sofort loslegt. Tafelanschrieb dazu: {{:lehrkraefte:snr:informatik:bruehl-2022:bewegungszustaende-roboter.jpg?1200|}} ===== Roboter in Betrieb nehmen ===== Wir arbeiten mit dem Maqueen-Roboter (DF Robot) - der Mechanik - und der micro:bit-Steckkarte - dem Gehirn. Der Roboter hat zwei Motoren, mehrer LEDs, Abstandssensor und Infrarotsensoren. Die micro:bit-Steckkarte kann man auch separat programmieren. Sie besitzt ein quadratisches Feld von 25 LEDs, zwei Druckknöpfe (und einen Start-Button), Kompass, Beschleunigungssensor (Accelerometer), diverse Pins (etwa zum Datenaustausch mit dem Roboter) und eine BLE-Antenne (Bluetooth). Je zwei Leute bekommen einen Roboter. Bitte sorgsam behandeln! * Die Batteriebox aus dem schwarzen Säckli NICHT verwenden. * Den Mikrocontroller/Mikroprozesser micro:bit in die Steckleiste des Roboters einsetzen. Schrift "micro:bit" nach hinten, Seite mit 25 LEDs und den beiden Druckknöpfen nach vorne (so wie Abstandssensor und rote LEDs). * Computer per USB-Kabel mit dem micro:bit verbinden. * In Tigerjython über das Menü "Tools" -> "Devices" wähle "micro:bit/Calliope". * {{:lehrkraefte:snr:informatik:bruehl-2022:devices.png?200|}} * In Tigerjython über das Menü "Tools" wähle "Flash Target". * {{:lehrkraefte:snr:informatik:bruehl-2022:flash-target.png?200|}} * Dies kann gut 1-2 Minuten dauern. Im Ausgabebereich von Tigerjython wird angezeigt, was gerade passiert. Am Ende erscheint "Successfully flashed in ... seconds.". * {{:lehrkraefte:snr:informatik:bruehl-2022:flash-tj-window.png?300|}} * Schalte den Roboter an (kleiner Schieberegler "hinten" auf ON). (Bitte vor der Rückgabe wieder auf OFF stellen.) Es gibt zwei Ausführungsarten: * Simulationsmodus mit dem üblichen Run-Button {{:lehrkraefte:snr:run-button.png?25|}}. * Realmodus/Robotermodus per Robotik-Button {{:lehrkraefte:snr:robotik-button.png?25|}}. Im Robotermodus wird das Programm auf den Mikropprozessor hochgeladen und sofort ausgeführt (falls der Mikroprozessor eingesteckt ist und der Roboter angeschaltet ist). Eventuell wird man noch aufgefordert, das Programm abzuspeichern bzw. den Roboter einzuschalten. Der Roboter kann dann auch ausgesteckt werden und das Programm kann mit dem Knopf neben der USB-Buchse am micro:bit gestartet werden. ==== Aufgabe 5 (Roboter kennenlernen) ==== **Partnerarbeit** Kopiere das folgende Python-Programm in Tigerjython und führe es zuerst im Simulationsmodus und dann im Realmodus aus. Lerne deinen Roboter durch Experimentieren kennen! Für welche Werte der beiden Variablen * fährt dein Roboter zuerst eine Strecke von ca. 10 cm ab und * dreht sich dann um ca. $90^\circ$ nach rechts? **Seid nicht zu idealistisch. Auf dem Fussboden können die Werte anders sein als auf dem Tisch ...** Schreibe das Programm mit Hilfe einer ''repeat 4:''-Schleife so um, dass der Roboter ein Quadrat der Seitenlänge 10 cm abfährt. from mbrobot import * zeitVorwaerts = 4000 zeitRechtsdrehung = 2000 delay(1000) # Damit der Roboter nach Kopfdruck nicht sofort losfährt. forward() delay(zeitVorwaerts) right() delay(zeitRechtsdrehung) stop() ==== Aufgabe 6, Hausaufgabe (quadratische Spirale mit Roboter abfahren - kann eventuell während der Lektion begonnen werden) ==== **Partnerarbeit** Programmiere den Roboter so, dass er eine "quadratische" Spirale abfährt (zuerst 10 cm vorwärts, dann nach jedem rechtwinkligen Abbiegen 10 cm weiter fahren als zuvor). Verwende dazu die Erkenntnisse aus der vorigen Aufgabe und dein Turtle-Programm für die quadratische Spirale (du musst dort nur ein paar Änderungen vornehmen). Wenn du es zu Hause in Einzelarbeit ohne Roboter machst: Verwende den Simulationsmodus. Mit den Befehlen ''setLED(1)'' und ''setLED(0)'' kannst du die LEDs ein- und ausschalten. Schreibe dein Programm so um, dass die LEDS bei jeder Abbiegung ihren Zustand wechseln. (Der "LED-Zustand" des Roboters ist unabhängig vom Bewegungszustand.) Mir fallen zwei Möglichkeiten ein: - "Verdopple" den Code in der ''repeat''-Schleife und ergänze in der ersten bzw. zweiten Kopie ''setLed(1)'' bzw. ''setLed(0)'' am Anfang. - Eleganter: Verwende eine neue Variable ''LEDzustand = 0'', die in jeder ''repeat''-Schleife durch ''LEDzustand = 1 - LEDzustand'' verändert wird. ---- Abgabe bis **spätestens Sonntagabend 23:59 Uhr** vor der nächsten Doppellektion über den folgenden Link: * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/Em86eQPAvUVJh0G2W3jCSiEBtdMKtBToivTxBvvUkbxjSQ|Klasse 1AFGsK]] * [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/EmvvJ0cdAwlFo-2LMiiM790BdaP3p9QN2Sjhs-5lVz1C1Q|Klasse 1CFP]] ==== Spiral challenge: Wessen Roboter fährt die "beste" Spirale? ==== ... falls am Ende genug Zeit ist ... ==== Zusammenfassung ==== * Vom Problem zum Programm (Algorithmen- und Programmentwurf) * Flussdiagramm als Zwischenschritt * Turtlesteuerung mit Hilfe von Variablen: Spirale zeichnen * Programmierung des Roboters: Quadrat und Spirale * Roboter machen im Gegensatz zur Turtle oft nicht ganz genau das, was man sich erhofft, denn es gibt viele Einflussfaktoren: Bodenbeschaffenheit (rauh, glatt, geneigt, uneben), Zustand der Motoren, Räder und Batterie, Umgebungstemperatur, ... ====== Für die Schnellen ====== ==== Aufgabe 7, Bonusaufgabe (Verwendung eines Sensors, Rasenmäh-Roboter) ==== (1) Halte deine Hand in unterschiedlichen Abständen vor den Roboter, während das folgende Programm läuft, um zu verstehen, wie du die Werte des Abstandssensors bekommst. Damit ''print(d)'' funktioniert, muss der Roboter per USB-Kabel mit dem Computer verbunden sein. from mbrobot import * # Die folgende Zeile ist dasselbe wie "repeat unendlich oft:" while True: d = getDistance() print(d) delay(100) (2) Verstehe das folgende Programm durch Ausprobieren: x = input("Gib eine Zahl ein!") if x < 0: print("Deine Zahl ist negativ.") (3) Programmiere den Roboter nun so, dass er sich wie ein Rasenmäh-Roboter verhält: Er läuft solange vorwärts, bis er sich nahe genug vor einer "Wand" befindet. Dann soll er ein Stück zurück fahren, sich um etwa $90^\circ$ nach links drehen und das Spiel von vorne beginnen. Mit den Befehlen ''setLED(1)'' und ''setLED(0)'' kannst du die LEDs ein- und ausschalten. Schreibe dein Programm so um, dass die LEDs beim Rückwärtsfahren aufleuchten und sonst nicht. ===== Fragebox - auch zum Besprechen von Programmen während der Lektion (NICHT für Hausaufgaben) ===== Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag ''#'' als Kommentareinleitungszeichen am Zeilenanfang). [[https://bldsg-my.sharepoint.com/:f:/g/personal/olaf_schnuerer_ksbg_ch/EmLIcTN64lJIlEKu0EyiDYoBg9smMusTs1nVj04-F1tEFQ|Link zur Fragebox]] ===== Lösungsvorschläge ===== Lösungen zu den Aufgaben 4 und 6 sind auf der Seite der nächsten Doppellektion unten. Tafelaufschrieb Klasse 1a: {{:lehrkraefte:snr:informatik:bruehl-2022:spirale-flussdiagramm-klasse-1a-ausschnitt-kleiner.jpg?1200|}} Tafelaufschrieb Klasse 1c: {{:lehrkraefte:snr:informatik:bruehl-2022:flussdiagramm-spirale.jpg?1200|}} from gturtle import * makeTurtle() n = 16 # Anzahl der Bewegungen, darf gerne verändert werden s = 10 g = 0 # speichert die bis zum aktuellen Zeitpunkt zurückgelegte Strecke repeat n: forward(s) right(90) g = g + s s = s + 10 print("Gesamtlänge: ") print(g) from gturtle import * makeTurtle() # hideTurtle() n = input("Wie viele Quadrate?") s = 70 d = 10 repeat n: repeat 4: forward(s) right(90) s = s + d from mbrobot import * zeitVorwaerts = 666 zeitRechtsdrehung = 450 # Diese Zeitangaben haben bei meinem Roboter (ungefähr) # funktioniert. Im Simulationsmodus sind das aber keine # rechten Winkel beim Abbiegen. repeat 4: forward() delay(zeitVorwaerts) right() delay(zeitRechtsdrehung) stop() ===== Link zur Kursseite ===== [[lehrkraefte:snr:informatik:bruehl-2022:|Zur Kursseite]]