lehrkraefte:snr:informatik:bruehl-2022:variablen-2

Variablen sinnvoll einsetzen und erste Schritte mit dem Roboter

  • Klasse 1c: Spalte Einmaleins oder $n$-Eck

“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.

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.

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.

Bonusaufgaben: (bitte ausklappen)

Bonusaufgaben: (bitte ausklappen)

  • 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”):

  • 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?”).

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.

Bonusaufgaben: (bitte ausklappen)

Bonusaufgaben: (bitte ausklappen)

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.

  • 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

  • Wenn du additive Farbmischung (vgl. auch 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 Rot, Blau und Grün angeben.

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:

Abgabe bis spätestens Sonntagabend 23:59 Uhr vor der nächsten Doppellektion über den folgenden Link:

Hinweis:

Hinweis:

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.

Alternative:

Alternative:

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

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)

Bitte ausklappen

Bitte ausklappen

  • 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:

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”.
  • In Tigerjython über das Menü “Tools” wähle “Flash Target”.
  • Dies kann gut 1-2 Minuten dauern. Im Ausgabebereich von Tigerjython wird angezeigt, was gerade passiert. Am Ende erscheint “Successfully flashed in … seconds.”.
  • 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 .
  • Realmodus/Robotermodus per Robotik-Button .

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.

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

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.

Bonusaufgabe (bitte ausklappen)

Bonusaufgabe (bitte ausklappen)

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.)

Hinweis zur LED-Steuerung (bitte ausklappen)

Hinweis zur LED-Steuerung (bitte ausklappen)

Mir fallen zwei Möglichkeiten ein:

  1. “Verdopple” den Code in der repeat-Schleife und ergänze in der ersten bzw. zweiten Kopie setLed(1) bzw. setLed(0) am Anfang.
  2. 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:

… falls am Ende genug Zeit ist …

Was habt ihr heute gelernt? Zuerst selbst überlegen!

Was habt ihr heute gelernt? Zuerst selbst überlegen!

  • 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

(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.

Bonusaufgabe (bitte ausklappen)

Bonusaufgabe (bitte ausklappen)

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.

Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag # als Kommentareinleitungszeichen am Zeilenanfang).

Link zur Fragebox

Lösungen zu den Aufgaben 4 und 6 sind auf der Seite der nächsten Doppellektion unten.

Aufgabe 1: Flussdiagramm zur Spirale

Aufgabe 1: Flussdiagramm zur Spirale

Tafelaufschrieb Klasse 1a:

Tafelaufschrieb Klasse 1c:

Aufgabe 2: Turtle-Spirale

Aufgabe 2: Turtle-Spirale

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)

Aufgabe 3: Quadrate mit demselben linken unteren Eckpunkt

Aufgabe 3: Quadrate mit demselben linken unteren Eckpunkt

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

Aufgabe 5: Quadrat mit Roboter

Aufgabe 5: Quadrat mit Roboter

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()  
  • lehrkraefte/snr/informatik/bruehl-2022/variablen-2.txt
  • Last modified: 2022/03/28 12:53
  • by Olaf Schnürer