Scratch Kurs

Gerhard Hepp

2023-01-27

Versionsgeschichte

1. Scratch Kurs
1.1. Einleitung
1.2. Bühne, Skripte, Objekte, Palette
1.3. Skripte
1.3.1. Steuerungselemente
1.3.1.1. Start von Skripten
1.3.1.2. Entscheidungen 'falls'
1.3.1.3. Wiederholungen
1.4. Variablen, Operatoren
1.4.1. Variablen einen Wert zuweisen
1.4.2. Rechnen mit Variablen
1.4.3. Gültigkeitsbereich ('scope')
1.4.4. Variablennamen
1.4.5. Beispiele für die Verwendung von Variablen
1.4.5.1. Beispiel: Schrittzähler
1.4.5.2. Beispiel: Schleifenzähler
1.4.5.3. Beispiel: Ereigniszähler
1.4.5.4. Beispiel: Zustandsvariable
1.4.6. Anzeige von Variablen
1.4.7. Listen-Variablen
1.4.8. Operatoren
1.5. Signale Senden, Empfangen
1.5.1. Beschreibung von Abläufen, UML Sequenzdiagramme
1.5.2. Unterprogramme in scratch 1.4
1.6. Bewegung
1.6.1. Musterlösungen für Bewegungen
1.6.1.1. Steuerung von Figuren
1.6.1.2. Labyrinth
1.6.1.3. Jump and Run
1.6.1.4. Bewegungsmuster: Wurfbahn schiefer Wurf
1.7. Aussehen, Grafiken, Kostüme, Sprechen, Denken
1.7.1. Eigene Kostüme erstellen
1.7.1.1. Objekte neu malen
1.7.1.1.1. Kurzanleitung Grafik Editor
1.7.1.2. Objekt aus einem bestehenden Bild abwandeln
1.7.1.3. Objekt importieren
1.7.1.4. Grafiken in Ebenen anordnen
1.7.2. Hintergrund
1.8. Klang, Krach machen
1.8.1. Krach Bumm Schepper
1.8.2. Klänge
1.9. Persönlichkeitsrechte, Urheberrechte
1.10. Fühlen, Sensoren
1.11. Hilfe in Scratch
1.12. Kommentare, Anmerkungen
2. Fehlersuche, Debugging in Programmen
2.1. Methodische Fehlersuche
2.1.1. Schritt 1: Verstehe das System
2.1.2. Schritt 2: Wiederhole den Fehler
2.1.3. Schritt 3: Beobachten
2.1.4. Schritt 4: Teile und Herrsche
2.1.5. Schritt 5: Nur den Fehler beheben, keine anderen Änderungen
2.1.6. Schritt 6: Mitschreiben, was getan wurde
2.1.7. Schritt 7: Gibt es noch andere Möglichkeiten?
2.1.8. Schritt 8: Neue Eindrücke
2.1.9. Schritt 9: Wenn der Fehler nicht behoben ist, dann ist der Fehler nicht behoben.
2.2. Vorbeugende Massnahmen.
3. Wichtige Formeln
3.1. Skalierung von Messwerten
4. Anbindung Hardware mit scratchClient
4.1. Leuchtdioden, Taster auf der Adapterplatine
4.1.1. Start scratchClient Software
4.1.2. scratch3: Start der Extension 'ScratchClient'
4.1.3. Überprüfung der Funktion
4.1.4. Aufgaben
Glossar

Kapitel 1. Scratch Kurs

1.1. Einleitung

In scratch kann man Spiele (und auch andere Dinge) programmieren.

Die offensichtlichen Dinge in Scratch sind die Figuren (Objekte) wie die Katze.

Die Figuren befinden sich auf der Bühne. Die Figuren können sich bewegen, unterschiedliches Aussehen bekommen, Sprechblasen anzeigen oder Klänge ausgeben.

Wie die Figuren sich verhalten wird über Programme (Skripte) gesteuert. Diese verwenden auch Variablen, um sich etwas zu merken.

Um all diese Dinge zu einem sinnvollen Spiel zusammenzubauen können sich die Objekte Signale schicken.

Die folgenden Kapitel stellen diese Elemente vor und zeigen, wie man damit umgeht.

Es erfordert ein wenig Ausdauer, sich da durchzuarbeiten.

1.2. Bühne, Skripte, Objekte, Palette

Scratch1, Elemente der Oberfläche

Das Bild zeigt den Aufbau von Scratch 1. Das Programm wurde bisher im Kurs verwendet und viele Bilder in diesem Text stammen noch von diesem Programm.

Scratch3, Elemente der Oberfläche

Das Bild zeigt den Aufbau von Scratch 3. Obwohl die grafische Gestaltung etwas moderner ist sind die wesentlichen Elemente unverändert.

Die Bühne ist im Bild relativ klein. Oben rechts an der Bühne kann man die Grösse einstellen. Auch der Präsentationsmodus ist dort zu finden. Im Präsentationsmodus wird nur die Bühne angezeigt.

1.3. Skripte

Skripte steuern die Abläufe im Programm. Also das 'was passiert'.

Skripte gehören zu Objekten, ein Objekt kann mehrere Skripte enthalten. Skripte in Scratch bestehen aus Steuerungselementen und den 'Arbeitslementen'.

1.3.1. Steuerungselemente

Wann läuft ein Skript los, wie reagiert Scratch auf Mausklicks, Wiederholungen und Entscheidungen werden mit Steuerungselementen bewerkstelligt.

Die Farbe dieser Elemente ist orange in der Palette. Scratch3, Elemente der Oberfläche

1.3.1.1. Start von Skripten

Skripte müssen gestartet werden, die laufen nicht einfach los. Es gibt mehrere Methoden ein Skript zu starten:

  • wenn die Flagge gedrückt wird,

  • bei Tastendrücken

  • oder bei Signalen ('senden' und 'empfangen', „wenn ich 'hallo' empfange“)

Die Flagge wird üblicherweise verwendet um ein Spiel zu starten.

Gestartete Skripte bekommen einen hellen Rahmen.

Man kann auch einfach Befehle, eine Reihe von Befehlen oder ein ganzes Skript mit der Maus anklicken und es läuft los. Das funktioniert sogar für Elemente, die noch in der Palette liegen. Diese Möglichkeit ist als Hilfe bei der Programmentwicklung vorgesehen; im Präsentationsmodus kann das nicht mehr benutzt werden.

1.3.1.2. Entscheidungen 'falls'

Wenn ein Programmablauf mal so, mal anders laufen muss, dann sind Entscheidungen nötig.

Beispiel in Pseudocode:

Falls 'es regnet'
    spanne den Regenschirm auf
sonst
    klappe den Regenschirm zu.
						

Bedingungen haben die Werte 'wahr' oder 'falsch'.
Meist sind Bedingungen etwas komplizierter als wie im obigen Beispiel.

Dann können Bedingungen mit 'UND', 'ODER' oder auch 'NICHT' aus mehreren Teilen miteinander kombiniert werden. Diese 'logischen Operatoren' UND, ODER, NICHT findet man in 'Operatoren'

Diese logischen Operatoren sind mit spitzen Ecken ausgestattet.

Siehe auch Scratchreferenzhandbuch , Seite 14. Dort sind diese logischen Operatoren unter 'Zahlen' aufgeführt (was nicht ganz passt).

1.3.1.3. Wiederholungen

Manchmal muss man Dinge mehrmals tun. „Gehe 20 Schritte bis zum Schatz“ zum Beispiel. Dafür gibt es die Wiederholungselemente.

Aufgabe

Erstelle das Programm in Scratch und lasse es laufen. Was passiert, wenn man die Wartezeit auf 0 stellt. Oder auf 2sek ?

Bei den Wiederholungen gibt es die, welche etwas eine bestimmte Anzahl oft tun, die eine Bedingung haben und die einfach ohne Bedingung funktionieren.

Bei den Wiederholungen gibt es zwei 'Geschmacksrichtungen', solche die unten keine Andockmöglichkeit haben und andere, wo unten weitere Elemente angefügt werden können.

1.4. Variablen, Operatoren

Die Farbe der Variablen ist orange in der Palette. Scratch3, Elemente der Oberfläche

Die Farbe der Operatoren ist grün in der Palette. Scratch3, Elemente der Oberfläche

Zu was braucht man Variablen ?

Allgemein gesagt: wenn man sich was merken will. Und weil das so wichtig ist, ist dieses Kapitel relativ umfangreich.

Variablen sind 'Datenspeicher', die einen Namen haben und einen Wert.

Beispiel: meine Hausnummer ist 7 . Hier ist der Name der Variablen 'Hausnummer', der Wert ist '7'.

Beispiel: mein Lieblingsessen ist Pizza . Hier ist der Name der Variablen 'Lieblingsessen', der Wert ist 'Pizza'.

Variablen werden in scratch angelegt (erhalten einen Namen). Dann können Werte zugewiesen werden oder Werte verändert werden.

So etwas ähnliches wie 'Variablen' gibt es auch in der Mathematik. Dort werden sie auch als 'Platzhalter' bezeichnet. Die Verwendung dort ist jedoch unterschiedlich zu 'Variablen' in einer Programmiersprache.
In einer Programmiersprache bedeutet:

a = 2   die Variable 'a' erhält den Wert 2 
b = a   die Variable 'a' erhält den Wert, der in der Variable 'b' gespeichert ist.

In der Mathematik bedeutet:

a = 2   die Variable 'a' ist ein Platzhalter für den Wert 2
b = a   die Variable 'a' hat denselben Wert wie 'b'.

Zu was braucht man Operatoren ?

Operatoren können rechnen, Texte verarbeiten und es gibt Vergleiche. Operatoren verarbeiten z.B. Variablen.

1.4.1. Variablen einen Wert zuweisen

In Scratch können Variablen als Werte ganze Zahlen, Kommazahlen und Texte enthalten.

Scratch3, Variablenzuweisung


Sogar das Ergebnis von logischen Operatoren kann verwendet werden.

Scratch3, Variable mit logischem Wert


Variablen können den Wert einer anderen Variablen zugewiesen bekommen. Hierzu zieht man das Symbol der anderen Variable in das Zuweisungsfeld.

Scratch3, Variable mit logischem Wert

Beispiel für Wertezuweisungen in Pseudocode:

a = 2
a = 1.234
a = 'apfel'
my_variable = spielstand

Sprechweise ist kurz "a gleich 2" und ausführlich "die Variable mit dem Namen 'a' erhält den Wert 2".

Sprechweise ist kurz "Variable my_variable gleich Variable spielstand" und ausführlich "die Variable mit dem Namen 'my_variable' erhält den Wert von spielstand'".

1.4.2. Rechnen mit Variablen

In Scratch sind die Grundrechenarten und einige komplexere Funktionen verfügbar.

Grundrechenarten mit Variablen

Hier wird eine neue Variable 'c' mit einem Multiplikationsergebnis befüllt.

Es muss aber nicht immer eine neue Variable sein, wenn man 'a' verdoppeln möchte kann das auch so aussehen:

Grundrechenarten mit Variablen

Hier ist absichtlich der Befehl 'a=1' und die restlichen Anweisungen nicht verbunden, da sonst ja immer dasselbe Resultat herauskommen würde.

Aufgabe

Gib das vorherige Beispiel in Scratch ein und starte die einzelnen Blöcke durch Doppelklick mit der Maus.

1.4.3. Gültigkeitsbereich ('scope')

Variablen können nur für eine Figur angelegt werden (private Variablen).

Diese Variablen können von anderen Objekten nicht gelesen und nicht verändert werden.

Variablen können 'für alle Figuren' angelegt werden (globale Variablen).

Diese Variablen können von allen Skripten gelesen und verändert werden.

Die Regel ist: so wenig globale Variablen wie möglich.

1.4.4. Variablennamen

Variablen können (fast) beliebige Namen bekommen. Sobald man aber Skripte austauscht oder Fehler in Skripten von Mitschülern sucht, wird das deutlich einfacher wenn die Namensgebung einheitlich ist. Die 'Wartbarkeit' von Software ist dann wichtig, wenn es um Fehlerbehebung und Weiterentwicklung geht.

Die Namen der Variablen sollen lesbar und verständlich sein. Und darauf hindeuten, was sie bedeuten.

Schlechtes Beispiel:

  • OOO0OO0000 (eine Abfolge von 'Oh's und Nullen, schlecht unterscheidbar)

  • prqrwrlz (schöner Name, aber was bedeutet das ?)

Schreibweise:
Zusammengesetzte Namen sollten mit 'camelCase' geschrieben werden oder mit Unterstrichen getrennt werden, damit sie besser lesbar sind.

  • xPosition (camelCase, ein Kamelhöcker in der Mitte)

  • x_position (Unterstriche)

  • wert_0 (sieht schöner aus als wert0)

Einheitlichkeit:
Namen von Variablen sollten so benutzt werden, dass gleichartige Dinge auch gleich benannt werden. Gut:

xPosition
yPosition

Weniger gut, weil unsystematisch:

xPosition
obenuntenKoordinate

Verständlichkeit:
Umlaute und Sonderzeichen sollten vermieden werden. Die funktionieren zwar, aber wenn mal Skripte international ausgetauscht werden, dann können englische Schüler mit diesen Zeichen nichts anfangen.

Lesbarkeit:
Keine Leerzeichen in Namen verwenden!
Zur Verdeutlichung ein Skript. Warum funktioniert das nicht?

Warum funktioniert das Programm nicht?

Die Lösung ist sehr schwer zu finden: es gibt zwei unterschiedliche Variablen die sehr ähnlich aussehen:

Beispiel: Variablen mit Leerzeichen sind schwer zu unterscheiden.

Solche Variablennamen führen zu Fehlern in Programmen die nur sehr schwer zu finden sind.

1.4.5. Beispiele für die Verwendung von Variablen

1.4.5.1. Beispiel: Schrittzähler

Die Katze sucht einen Schatz, und fragt nach der Anzahl der Schritte die sie bis zum Schatz gehen soll.

Programmablauf in Pseudocode:

- Frage nach Anzahl der Schritte
- hole Antwort
- Wiederhole 'anzahl' mal
    gehe einen Schritt
    sage die Schrittnummer

Für das Beispiel braucht man zwei Variablen, 'anzahl' und 'schritt'. Die 'Antwort'-Variable wird automatisch durch das 'Antwort'-Element angelegt. Am Variablennamen auf der Bühne sieht man, dass die Variablen lokal sind, also nur für die Katze lesbar/schreibbar sind ("Katze anzahl").

Aufgabe

Gib' das vorherige Beispiel in Scratch ein und probiere es aus.
Schalte das 'Spiel' in den Präsentationsmodus.

Lösung (aber versuche es mal selber).

1.4.5.2. Beispiel: Schleifenzähler

Anderes Beispiel für die Verwendung von Variablen: Schleifenzähler, wenn man z.B. Werte von 10 bis 20 braucht.

Nicht abtippen, nur verstehen !

Wie das Schleifenzähler-Beispiel zeigt, können Variablen in scratch überall da eingesetzt werden wo es abgerundete oder rechteckige Andockstellen gibt.

1.4.5.3. Beispiel: Ereigniszähler

Ein weiteres Beispiel für Variablen ist das Zählen im Spiel, wie oft ein Ereignis aufgetreten ist. Im Beispiel werden Bananen gezählt.

Die Banane kann man mit der Maus bewegen und die Katze reagiert darauf.

Der Variablenname 'a' ist hier nicht sinnvoll gewählt. Was wäre besser ?

Aufgabe

Erweitere das Bananenzählen so, dass die Katze nach drei Bananen satt ist und 'ich bin satt' sagt. Und jetzt hat man fast schon ein Tamagotchi.

Lösung (aber versuche es mal selber).

1.4.5.4. Beispiel: Zustandsvariable

Beispiel: Tamagotschi kann 'hungrig' sein, oder 'muede', oder 'willSpielen'. Je nachdem kann sich die Figur verhalten, hier in Pseudocode formuliert:

falls zustand= 'hungrig'
    verhalte dich wie ein hungriger Tamagotchi...
    falls es Bananen gibt
        setze zustand auf 'muede'
falls zustand ='muede'
    verhalte dich wie ein müder Tamagotchi
						

Einfacher Tamagotschi .

1.4.6. Anzeige von Variablen

Durch Anclicken der Checkbox links von einer Variablen wird diese auf der Bühne angezeigt. Die Anzeige auf der Bühne kann zwischen drei Anzeigeformen umgeschaltet werden. Hierzu auf der Bühne mit Maus rechts clicken auf die Variable. Es kann ausgewählt werden:

Scratch3, Anzeigeoptionen für Variablen

Aufgaben

Lege drei Variablen an.
Zeige eine Variable als 'Normale Anzeige', die zweite Variable als 'Großanzeige' und die dritte Variable mit einem Schieberegler von -10 bis +100

Die zweite Variable soll zweimal auf der Bühne angezeigt werden, jedesmal in groß.
Überlege wie man das lösen kann und schreibe das Skript dazu.

1.4.7. Listen-Variablen

Dieses Kapitel kann man überspringen, da Listen-Variablen selten gebraucht werden.

Normale Variablen sind 'jeweils nur ein Wert'. Manchmal möchte man jedoch mehrere Werte zusammenfassen.

Beispiel: Namen der Schüler eine Klasse.

Beispiel: Temperaturen, die jede Minute gemessen werden.

Scratch hat für diesen Zweck Listen.

Listen werden verwendet, wenn man gleichartige Daten hat, aber noch nicht weiss wie viele es werden sollen.

Z.B. die Namen der Schüler in der Klasse: hier weiß der Programmierer noch nicht in welcher Klasse das verwendet wird und muss mit unterschiedlichen Schülerzahlen rechnen.

Listeninhalte kann man als Datei exportieren und importieren.

Index ab 1; 'index' ist der Name für die Position eines Elementes.

Längen-Operator

Anfügen an beliebiger Position; Entfernen an beliebiger Position; die anderen Elemente rücken auf.

Sortieren von Listen
Es gibt keine eingebauten Sortiermethoden. Im Internet findet man Skripte für 'Bubblesort', das ist ein einfacher Sortieralgorithmus.

1.4.8. Operatoren

Bei den Operatoren gibt es die runden Blöcke und die spitzen Blöcke.
Die runden Blöcke geben eine Zahl oder einen Text zurück.
Die spitzen Blöcke geben einen boolschen Wert zurück und können insbesondere dort verwedendet werden wo Blöcke spitze Löcher haben.

Einige Blöcke erklärt:

  • Zufallszahl: liefert eine zufällige Zahl im dem angegeben Bereich.

  • mod: der Rest der ganzzahligen Division. mod(7, 2) ergibt 1; mod(6, 3) ergibt 0

Aufgaben

Lege eine Variable 'spielstand' an.
Belege die Variable mit einem Zufallswert zwischen 1 und 100.
Schreibe ein Skript, das die Variable überprüft und mit dem 'sage'-Block das Ergebnis ausgibt.

wenn spielstand < 20:
    sage "noch zu wenig"
wenn spielstand zwischen 40 und 60:
    sage 'gutes Mittelfeld'
wenn spielstand grösser 80:
    sage 'prima, sehr gut'

1.5. Signale Senden, Empfangen

Die Farbe dieser Elemente ist gelb in der Palette. Scratch3, Elemente der Oberfläche

Objekte, bzw. die Skripte darin können sich über Signale unterhalten.
Diese Funktionalität ist sehr wichtig in scratch, um Programmabläufe zu koordinieren.

Sende- und Empfangs Blöcke in scratch.

Die Skripte können die Signale empfangen und reagieren also nur auf die Signale, die sie interessant finden (genau genommen der Programmierer als er/sie das Programm geschrieben hat). Was die Skripte dann tun hängt dann vom Zweck des Programmes ab.

Es gibt zwei Arten von Sendesignalen

  • asynchrones Senden
    „Sende XYZ an alle“ schickt ein Signal und macht dann einfach weiter. Die Empfänger müssen dann noch nicht fertig sein mit ihrer Arbeit.

  • synchrones Senden
    „Sende XYZ an alle und warte“ wartet, bis alle Empfänger ihre Arbeit fertig gemacht haben. Das ist dann nützlich, wenn man Dinge in einer exakten Reihenfolge tun will.

Besonderheiten sind,

  • dass man auch an eigene Skripte Signale senden kann,

  • dass es (fast) beliebig viele Empfänger für Signale geben kann,

  • dass es (manchmal) auch keinen Empfänger für Signale gibt,

  • dass man synchrone Signale benutzen kann, um Unterprogramme in scratch zu konstruieren. Mehr dazu bei Abschnitt 1.5.2, „Unterprogramme in scratch 1.4“

[Anmerkung]

Signale werden auch an den ScratchClient geschickt, und der ScratchClient kann auch Signale an Scratch und die Skripte schicken. Ein Beispiel ist im Abschnitt 1.10, „Fühlen, Sensoren“ enthalten.

1.5.1. Beschreibung von Abläufen, UML Sequenzdiagramme

Der Ablauf von Programmen kann schnell sehr unübersichtlich werden.
Da hilft es, wenn man die Abläufe in einer Grafik aufzeichnen kann.
Die Beschreibungsmethode Unified Modeling Language 'UML' wird üblicherweise zur Beschreibung von Software verwendet. Entwickelt wurde diese von Booch, Jacobsen, Rumbaugh etwa 1990.
Diese Beschreibungen sind standardisiert, was den Vorteil hat dass man nicht jedesmal erklären muss wie die Grafiken aufgebaut sind. UML benutzt grafische Darstellungen. Diese sind übersichtlich und schnell verständlich. Werden Signale verwendet so bieten sich 'Sequenzdiagramme' an um die Abläufe zu beschreiben.

Sequendiagramme bestehen aus vertikalen Linien (Lebenslinien) für die beteiligten Softwarekomponenten.

Signale werden als horizontale Pfeile gezeichnet. Synchrone Nachrichten haben gefüllte Pfeilspitzen, asynchrone Nachrichten haben offene Pfeilspitzen. Bei synchronenen Nachrichten zeichnet man üblicherweise noch einen Rückgabepfad ein.

Zu den Pfeilen werden die Namen der Signale geschrieben.

Kleine Rechtecke an den Lebenslinien sind die Programmteile, die nach dem Eintreffen der Signale ausgeführt werden.

Beispiel 'pingpong', asynchrone Signale

Das pingpong-Beispiel sind zwei Scripte, die sich gegenseitig Signale zuschicken: ping hin, pong zurück. Das Programm entstand bei einer Überprüfung der Rechengeschwindigkeit von scratch: wie schnell kann man Signale schicken.

Damit das Programm überhaupt losläuft. muss man einmal über die grüne Flagge ein 'ping' losschicken. Dann läuft das Programm endlos weiter.

Sequenzdiagramm pingpong.

Hier das scratch-Programm dazu. Es gibt noch eine Variable 'counter', ein Zähler für die Anzahl der Durchläufe.

scratch pingpong.

Aufgaben

Erweitere das Beispielprogramm so, dass die Anzahl der Signale je Sekunde gemessen werden kann.

Gibt es einen Unterschied, ob das Programm im Entwicklermodus oder Präsentationsmodus läuft ? Im Entwicklermodus werden die laufenden Skripte jeweils hell hinterlegt, was CPU-Zeit benötigt. Im Präsentationsmodus sollte diese Animation nicht mitlaufen und deswegen etwas schneller sein. Überprüfe das.

Beispiellösung: PingPong-Programm

1.5.2. Unterprogramme in scratch 1.4

Scratch 1.4 hat kein Konzept für Unterprogramme. Mit synchronen Signalen kann man das aber einfach selber aufbauen.

Gründe für den Einsatz von Unterprogrammen sind:

  • Übersichtlichkeit, Verständlichkeit
    Oft hat man das Problem, dass ein Ablauf an mehreren Stellen identisch oder fast identisch vorkommt. Man kann dann zwar einfach die benötigten Blöcke kopieren, aber das vergrössert den Code und macht ihn schlechter verständlich.

  • Wartbarkeit
    Wenn man später Änderungen an sich wiederholenden Abläufen durchführt vergisst man leicht, dass die anderen Stellen ebenfalls zu ändern sind.

DRY, Don't repeat yourself
Gleiche Abläufe sollen nur einmal programmiert werden.

Beispiel: Muster stempeln.
Erzeuge ein regelmässiges Raster auf dem Bildschirm aus Quadraten.
Das soll einen Punktestand anzeigen.

Beispiel, Bühne, so sieht die Ausgabe aus.

Das Beispiel zeigt einen Punktezähler 'spielstand', der am Anfang auf Null gesetzt wird. Dann soll sich der Spielstand ändern, und für jeden Punkt ein Quadrat angezeigt werden.
In Spielen gibt es meist mehrere Stellen, die den Spielstand verändern. Um zu zeigen, wie unübersichtlich das Skript ohne Unterprogramme wird, hier ein Beispiel wie man es nicht machen soll:

Beispiel, kein Unterprogramm, viele Wiederholungen.


Mit einem Unterprogramme wird es deutlich kürzer und einfacher:

Der Ablauf wurde jetzt mit Unterprogrammen aufgebaut. Hier ist der Vollständigkeit halber auch das Setzen des Spielstands '0' enthalten.

Und hier noch das Sequenzdiagramm der Unterprogrammaufrufe. Die Signale sind synchron (sende und warte), deshalb als geschlossene Pfeile gezeichnet und der gestrichelte Rück-Pfad deutet das 'warten' an.

Unterprogrammaufruf, synchrone Signale, Sequenzdiagramm.

1.6. Bewegung

Die Farbe dieser Elemente ist blau in der Palette. Scratch3, Elemente der Oberfläche

Die Objekte können sich um kleine Schritte bewegen, von dort wo sie sich gerade befinden (relative Bewegungen). Diese Bewegung geht in die Richtung in die die Figur gerade gedreht ist.

Die Bewegungsgeschwindigkeit kann über 'warte'-Anweisungen beeinflusst werden.

Oder die Figur kann in x oder y-Richtung (oder beidem) auf eine Position gesetzt werden (absolute Bewegung, absolute Positionierung).

Absolute Positionierung wird oft verwendet um am Beginn eines Spieles die Objekte auf ihre Startposition zu setzen.

Die Koordinaten sind -240 bis +240 in x-Richtung, und -180 bis +180 in y-Richtung. Wenn man die Maus über der Bühne bewegt, werden die Koordinaten angezeigt.

Koordinaten auf der Bühne.

Die Objekte kann man, obwohl ein Programm läuft, immer noch mit der Maus bewegen. Das kann bei den Objekten ausgeschaltet werden, dann sind die Objekte nur noch vom Programm aus veränderbar.

Sperre für das Bewegen der Figuren auf der Bühne.

Aufgaben zu relativen Bewegungen. Wenn Du das 'Katze mit dem Schatz'-Beispiel schon gemacht hast, dann überspringe das und gehe zu den absoluten Bewegungen.

Aufgaben

Schreibe ein Skript, das die Katze 20 mal um einen kleinen Schritt bewegt.
Schreibe ein Skript, das die Katze in einem Viereck bewegt. Dann schiebe die Katze mit der Maus in eine Ecke, und beobachte was bei der Bewegung passiert.

Aufgaben zu absoluten Bewegungen

Bewege die Katze von Position[0,0] zu [100,0] in 5-er Schritten. Benutze eine Variable xSoll und eine Schleife.
Eine komplizierte Aufgabe: schreibe ein Skript, das die Katze immer dem Mauszeiger folgen lässt. Die Mauszeigerkoordinaten sind bei 'Fühlen' verfügbar.

Zusatzaufgabe

Schräge Bewegungen eines Objektes. Erzeuge zwei Variablen xSoll und ySoll. Und dann folgendes Programm:
wiederhole fortlaufend:
    ändere xSoll um 2.3
    ändere ySoll um 2
    gehe zu xSoll, ySoll
    
					

[Anmerkung]

Es gibt einen 'SuperSonderAllesInEinem'-Befehl für absolute, zeitgesteuerte Bewegungen 'gleite'

Befehl: gleitezu.

Dieser Befehl ist deswegen so interessant, da damit z.B. lange Bewegungen mit gleichmässiger Geschwindigkeit zurückgelegt werden können.

Zusätzlich braucht der Befehl relativ wenig CPU-Zeit verglichen mit einer Bewegung, die aus einzel-'gehe'-Befehlen zusammengesetzt ist.

1.6.1. Musterlösungen für Bewegungen

Man muss nicht alles selber erfinden. Es gibt für fast alle Probleme bereits Lösungen. Diese werden oft auch als 'pattern' bezeichnet.

In diesem Kapitel sollen einige Beispiele vorgestellt werden für Bewegungen, die Bewegung in einem Labyrinth, in einem Jump and Run und für Wurfbahnen.

1.6.1.1. Steuerung von Figuren

Es gibt die Möglichkeit Figuren über Tasten zu steuern. Eine einfache Lösung ist (Vorsicht, nicht nachmachen):

Diese Lösung braucht relativ CPU-Zeit, belastet den Rechner also stark. Deshalb ist sie nicht empfehlenswert, wenn man die Figur über längere Strecken bewegen will.

Beispielprojekt

Eine bessere Lösung, dass über Variablen die Richtungen vorgegeben werden und diese über Tasten belegt werden. Das sieht so aus:

Was passiert hier: in einer Endlosschleife wird die Position um den Wert der Variablen 'dx' verändert. Die Tastendrücke setzen diesen Wert entsprechend (nach rechts: positiver Wert; nach links: negativer Wert). Es ist also nur bei Richtungswechseln ein Tastendruck nötig. Beispielprojekt

Aufgabe zur Bewegungssteuerung

Erweitere das Beispiel um eine Steuerung in der y-Richtung.
Erweitere das Beispiel so, dass die Figur mit der Leertaste gestoppt wird.

1.6.1.2. Labyrinth

Man kann eine Figur so weit bewegen, bis sie an einer bestimmten Farbe anstösst. Im Beispiel wurde die blaue Farbe als Begrenzung gewählt.

Die Bewegungsrichtung wird über zwei Variablen dx und dy definiert. Das 'd' ist eine Abkürzung für 'delta', also einen Wert der einen Unterschied angibt. Soll sich die Figur nach rechts bewegen ist dx=3 und dy=0. Soll sich die Figur nach unten bewegen, dann ist dx=0 und dy=-3. In einer Schleife wird die Figur jeweils um diese Werte 'versetzt'.

Die Bewegung wird gestoppt, sobald die Figur die Begrenzungsfarbe berührt. Da bei einer Berührung die Figur nicht mehr weiterläuft, muss dann die Figur wieder einen Schritt zurückbewegt werden.

Hier die Beispiellösung: Beispielprojekt

1.6.1.3. Jump and Run

Spielfiguren bei einem Jump and Run können eine rechts-links-Bewegung ausführen. Bei Bedarf können die Figuren auch über Hindernisse springen oder z.B. auf Hindernisse drauf springen. Ein Grundmuster für die X-Bewegung ist wie wie im Layrinth:

Eine Variable scrollX ist mit +5 (für Bewegung nach rechts) bzw. -5 (für Bewegung nach links) belegt. Die Pfeiltasten der Tastatur werden für das Belegen dieser Variablen verwendet. In einer Schleife wird dann das Objekt um diesen Betrag bewegt.

Die Bewegung in Y-Richtung muss mehrere Fälle abdecken:

  • Wenn das Objekt in der Luft ist, soll es nach unten fallen.

  • Das Objekt soll auf 'festen' Unterlagen stehen/gehen können.

  • Wenn das Objekt auf einer festen Unterlage steht/geht, dann soll es springen können. Nicht allerdings, wenn es in der Luft ist, denn da kann man sich ja nicht abstossen.

Diese Anforderungen können in Scratch mit Farbkodierungen erledigt werden. Die Spielfigur erhält an den Füssen eine spezielle Farbe, hier zum Beispiel sind es 'Raketenschuhe'.

Die 'festen Unterlagen' erhalten einen doppelten Farbüberzug. Der eine Überzug stoppt die Fallbewegung, der andere ist dafür zuständig die Sprungbewegung zu erlauben. Im Detail sieht das so aus:

Springen ist erlaubt, wenn die grüne Farbe berührt wird:

Nach oben bewegen, Stop der Fallbewegung und Fallen:

Hier Beispielprojekte:

1.6.1.4. Bewegungsmuster: Wurfbahn schiefer Wurf

Wurfbahnen sind idealisiert eine Parabel. Die Flugbahn kann - auch wenn das im Lehrplan noch nicht behandelt wurde - mit folgenden Kochrezept berechnet werden.

Beispielprojekt

Für eigene Projekte kann das Skript einfach mit einem 'Sprite' eingebunden werden. Hier die Schritt-für-Schritt-Anleitung

  • Das Wurfbahn-Sprite 'wurfbahn_sprite.sprite' speichern. (Link anklicken, speichern unter /home/pi).

  • Scratch öffnen, dann 'neues Objekt aus Datei laden' und den Sprite 'wurfbahn_sprite.sprite' laden.

  • Um die Funktion auszuprobieren fehlt noch das Belegen der Variablen 'wurfbahn_winkel'. So sollte das aussehen:

1.7. Aussehen, Grafiken, Kostüme, Sprechen, Denken

Die Farbe dieser Elemente ist violett in der Palette. Scratch3, Elemente der Oberfläche

Es gibt nicht nur Katzen in Scratch.

Klicke auf 'Neues Objekt aus Datei laden' und schaue Dir die Verzeichnisse an.

In „Media/Costumes“ findet man eine Sammlung verschiedener Grafiken.

Möchte man ein Objekt laden, dann auswählen und übernehmen durch 'ok' oder Doppelklick.

Objekte können mehrere 'Kostüme' haben. Beispiel ist die Katze. Wähle das Objekt aus (wenn mehrere Objekte auf der Bühne sind, Auswählen durch Anklicken in der Objektanzeige)und schaue in 'Kostüme' nach. Hier sind zwei verschiedene Bilder für die Katze vorhanden.

Zu was braucht man Kostüme ?

  • Eine Figur soll mit den Armen zappeln.

  • Ein Tamagotchi hat verschiedene Stimmungen und soll je nachdem andere Gesichtsausdrücke haben.

  • Eine Figur bekommt eine Beule (autsch), wenn sie mit einem Hindernis kollidiert.

  • Die Katze kann gehen

  • Und und und.

Kostüme kann man mit Skripten auswählen, diese Befehle findet man unter 'Aussehen'.

Aufgaben

Lass' die Katze gehen. Schreibe ein Skript, das die Katze in 10-er Schritten bewegt und schalte dabei die Kostüme um.
Experimentiere mit Schrittweiten. Wann sieht die Bewegung flüssig aus ?

Hinweis: Das Skript sieht ungefähr so aus:

1.7.1. Eigene Kostüme erstellen

Drei Möglichkeiten: ganz neu malen, oder aus einem bestehenden Bild abwandeln.

Die dritte Möglichkeit ist der Import aus Bildern, die mit dem Fotoapparat, Scanner oder einem anderen Computer erstellt wurden.

1.7.1.1. Objekte neu malen

Den „Neues Objekt Malen“- Button drücken, oberhalb der Objekt-Anzeige.

Man erhält einen Grafik-Editor.

1.7.1.1.1. Kurzanleitung Grafik Editor

Farbe auswählen: in der Farbpalette eine Farbe aussuchen

Mit einem Malwerkzeug Pinsel – Freihand malen

Mit dem Malwerkzeugen Linie, Rechteck oder Kreis können geometrische Formen gezeichnet werden.

Löschen mit dem Radiergummi.

Durchsichtige Stellen können mit der 'durchsichtig-Farbe' gezeichnet werden..

Wichtig: 'ok' auswählen, wenn man fertig ist.

1.7.1.2. Objekt aus einem bestehenden Bild abwandeln

In der Kostümansicht ein Kostüm 'kopieren' und dann 'bearbeiten' auswählen.

1.7.1.3. Objekt importieren

Bild im Format jpg, gif oder png abspeichern. Und in Scratch importieren.

1.7.1.4. Grafiken in Ebenen anordnen

Mit den Blöcken 'komme nach vorn' und 'gehe N Ebenen nach hinten' kann man Grafiken überlagern und andere Elemente dahinter verstecken. Beispiel Gläser füllen

Aufgaben

Male ein Strichmännchen.
Erzeuge zwei Abwandlungen des Strichmännchens, die mit den Armen winken. Animiere die Kostüme: Schreibe ein Skript, so dass das Strichmännchen zappelt.
[Anmerkung]

erst mal nicht zu viel Zeit mit der Grafik verbringen, sondern auch das Skript schreiben! Und dann erst die Bilder schöner machen, wenn nötig.

Das Skript speichern. 'hampelmann' wäre ein guter Name.
Erweitere das Skript, so dass das Strichmännchen nach 30 Sekunden 'ich bin müde' sagt. Und eine Weile stehenbleibt.

1.7.2. Hintergrund

Der Hintergrund der Bühne ist ein Grafikobjekt wie andere Objekte auch. Allerdings kann man dieses Objekt nicht bewegen.

Das Hintergrund-Objekt kann wie alle anderen Objekte Skripte enthalten.

Man wird typischerweise solche Skripte an dieses Objekt anhängen, die das ganze Projekt/Spiel betreffen.

Ein Beispiel dafür ist eine komplizierte Startprozedur, wo andere Objekte in einer genau definierten Reihenfolge positioniert, angezeigt und gestartet werden müssen.

1.8. Klang, Krach machen

Die Farbe dieser Elemente ist magenta in der Palette. Scratch3, Elemente der Oberfläche

Spiele ohne Töne und Musik sind langweilig. Kurze Töne oder Klänge unterstützen Aktionen; eine Hintergrundmusik vermittelt eine Grundstimmung zu einem Spiel.

[Anmerkung]

Wenn Klänge nicht funktionieren, dann die Lautstärke am Monitor kontrollieren.

Dann gibt es noch eine Lautstärkeeinstellung in scratch.

Damit es nicht zu einfach ist, gibt es noch eine Lautstärkeeinstellung in linux. Termin 'lxterminal' öffnen, sudo alsamixer aufrufen und Lautstärke mit den Pfeiltasten erhöhen/erniedrigen.

1.8.1. Krach Bumm Schepper

In der 'Schepper Klang'-Abteilung kann man Schlagzeuge und Töne spielen. Diese Töne können zeitgenau in eine Bewegung eingebaut werden.

1.8.2. Klänge

Zu den Objekten kann man Klänge importieren. Das sind teils teils synthetische, teils natürliche Klänge (mit dem Mikrofon aufgenommen).

Unter 'Music Loops' sind Klänge abgelegt, die sich als Hintergrundmusik eignen.

'Spiele Klang ganz': spielt den Klang bis zum Ende.

'Spiele Klang' bricht ab, wenn das Skript verlassen wird.

Aufgaben

Das Strichmännchen so erweitern, dass es bei jeder Bewegung einmal einen Trommelklang macht.
Und wenn das Strichmännchen müde ist, dann soll es erst mal einen Schrei von sich geben.

1.9. Persönlichkeitsrechte, Urheberrechte

Man kann Fotos oder mit einem Mikro aufgenommene Klänge in Scratch importieren. Bildern, Zeichnungen, Fotografien, Tonaufnahmen können aber urheberrechtlich geschützt sein. Sind Personen zu sehen, zu hören, so kann das Persönlichkeitsrecht betroffen sein.

Deshalb ist zu beachten:

  • Fotos und Tonaufnahmen von Personen ohne deren Einwilligung zu verwenden ist nicht erlaubt. Das verletzt die 'Persönlichkeitsrechte' der Person.

  • Auch wenn Ihr Aufnahmen von Personen mit deren Einwilligung verwendet, sollten diese die Personen nicht schlecht dargestellt werden.

  • Bilder, also Zeichnungen, Fotografien aus Zeitungen, Comics oder dem Internet sind in der Regel urheberrechtlich geschützt. Das bedeutet, dass der Erfinder, Zeichner oder Fotograf gefragt werden muss, ob diese verwendet werden dürfen.

  • Es gibt freie Sammlungen von Bildern oder Klängen, aber das muss dann jedesmal dabei stehen. Hier ist jedesmal die Lizenz nachzusehen und genau zu lesen.

  • Bei selbstgemalten Bildern oder eigenen Fotografien gibt es normalerweise keine Probleme. Und eigene Bilder zu gestalten macht mehr Spass als wie Lizenztexte zu lesen!

Persönlichkeitsrecht Deutschland

Urheberrecht

Aufgabe

Kurz überlegen: würdest Du es erlauben, wenn jemand Zeichnungen, die Du angefertigt hast, in einem Spiel verwendet ?
Kurz überlegen: würdest Du es erlauben, wenn jemand Fotografien von Dir ungefragt in einem Spiel verwendet ?

1.10. Fühlen, Sensoren

Die Kategorie 'Fühlen' der Palette ist etwas unglücklich aus dem englischen 'Sensing' übersetzt. 'Messen' wäre besser geeignet.

Diese Kategorie enthält Frage/Antwort, Mauskoordinaten, Abstände, Zeitmessungen.

Die Lautstärke-Funktionen können auf dem RaspberryPi nicht benutzt werden, da keine Soundkarte mit Mikrofon vorhanden ist.

Ganz unten sind die Sensorwerte zu finden. Das sind Variablen von Messaufnehmern, die über die Adapterplatine angeschlossen werden können.

Adapterplatine, Taster

Als ein Beispiel für die Benutzung der externen Sensoren soll die Katze in Scratch hüpfen, wenn eine Taste auf der Adapterplatine gedrückt wird.

Zusatzaufgabe

Die folgenden Schritte durchführen.

Schritt1:

Rechte Maustaste

über 'Fühlen', Wert von Sensor, im Popup dann 'Unterstützung von Netzwerksensoren einschalten'.

Schritt 2:

LXTerminal öffnen, folgenden

Text eingeben

cd ~/scratchClient
python3 src/scratchClient.py -config config/config_ikg_button_intern.xml
						

Das Terminal offen lassen, also nicht beenden oder schliessen.

Diese Befehle starten den ScratchClient, ein Programm das zwischen Scratch und der Adapterplatine Signale austauscht.

Wenn jetzt auf der Platine die Taster gedrückt werden (stumpfes Ende eines Stiftes durch die Löcher in der Abdeckung), dann werden Signale 's0_pressed', 's1_pressed', 's8_pressed' bzw 's0_released', 's1_released', 's8_released' nach scratch geschickt.

Schritt 3:

Ein Scratch-Programm schreiben

Das Programm empfängt ein Signal und lässt das Objekt hüpfen.

Statt zu hüpfen könnte man auch Schritte ausführen, einen Zähler hochzählen oder anderes.

1.11. Hilfe in Scratch

Die einzelnen Sprachelemente sind in der Scratch-Referenz beschrieben. In Scratch gibt es Hilfe zu jedem Befehl (rechte Maustaste, Hilfe), und allgemeine Hilfeseiten 'Hilfe'.

1.12. Kommentare, Anmerkungen

Kommentare sind Anmerkungen, Bemerkungen oder Notizen, die an Abläufe angehängt werden können. Sie sollen helfen, das Programm für andere besser verständlich zu machen oder dienen auch als Notizen für das eigene Verständnis. Rechte Maustaste, im Skript-Bereich 'Anmerkung hinzufügen'.

Kapitel 2. Fehlersuche, Debugging in Programmen

Wenn man Computerprogramme schreibt, dann funktionieren die selten beim ersten Mal.

Meistens enthalten Programme Fehler. Es kann sein, dass

  • etwas nicht funktioniert, wie es soll

  • oder Funktionen fehlen noch.

Fehler in Programmen nennt man auch englisch 'bug'. 'Debuggen' bedeutet: Fehler entfernen.

Fehlerbehebung kann kompliziert sein und viel Zeit benötigen. Aber das 'debugging' gehört zum Programmieren dazu.

Durch übersichtliches, strukturiertes Programmieren kann man Fehler vermeiden. Dazu gibt es einige Tips am Ende des Kapitels.

Definition Ein Fehler ist die Abweichung des erwarteten Verhaltens eines Programmes vom aktuellen Verhalten.

Das erwartete Verhalten ist das ‚so soll es sein‘-Verhalten.

Das aktuelle Verhalten ist das Verhalten, welches das Programm gerade hat 'so ist es gerade'.

Beispiel:

Das folgende Skript soll die Figur langsam rechts herum drehen.

Das erwartete Verhalten ist also ‚drehe Figur rechts herum‘.

Tatsächlich dreht sich die Figur jedoch links herum

Das beobachtete Verhalten ist also ‚Figur dreht sich links herum‘.

Da erwartetes Verhalten und beobachtetes Verhalten nicht übereinstimmen hat das Programm einen Fehler.

Methodisches Vorgehen erleichtert die Fehlersuche.

2.1. Methodische Fehlersuche

2.1.1. Schritt 1: Verstehe das System

In scratch gibt es Möglichkeiten die für die Fehlersuche genutzt werden können.

Starte nicht alles auf einmal (grüner Punkt), sondern nur einzelne Skripte durch Doppelclick mit der Maus. So können einzelne Teile gezielt überpüft werden, ohne dass andere Skripte dazwischenfunken.

Die Werte von Variablen können auf der Bühne sichtbar gemacht werden. Später kann man diese wieder ausblenden.

Die Werte von Variablen kann man mit dem Regler verändern. Der Bereich kann über die Reglerbereiche angepasst werden.

Oder man setzt die Werte von Variablen mit einzelnen 'setze'-Befehlen in der Palette. Blöcke in der Pelette können über Doppelclick ausgeführt werden.

Die Position von Figuren auf der Bühne können mit der Maus verändert werden. Das ist ganz praktisch, wenn man überprüfen will ob Farb-Berührungen, Positionen, Pbjekt-Berührungen richtig ermittelt werden.

2.1.2. Schritt 2: Wiederhole den Fehler

Es ist wichtig, dass der Fehler wiederholt werden kann. So kann man genauer untersuchen wie der Fehler zustande kommt. Und dann auch nach den Korrekturen überprüfen ob der Fehler wirklich behoben ist.

Fehler können immer auftreten oder nur manchmal.

Manchmal treten Fehler nur auf, wenn man ein Spiel das zweite Mal durchläuft. Oder nur wenn eine bestimmte Taste gedrückt wird.

Wenn klar ist wann der Fehler auftritt, dann ist das oft schon ein wichtiger Schritt um die Ursache zu erkennen.

2.1.3. Schritt 3: Beobachten

Beobachte den Fehler. Welche Skripte sind aktiv dabei? Welche Werte haben die Variablen?

Beobachte die Details. Wenn genügend Informationen bekannt sind, wann wird es einfacher den Fehler zu beheben.

2.1.4. Schritt 4: Teile und Herrsche

Manche Programme sind sehr groß und oft ist unklar, wo der Fehler steckt.

Aktiviere nur die Teile, die auch notwendig sind. Taucht der Fehler noch auf, dann steckt er in den aktiven Teilen, die inaktiven Teile sind wahrscheinlich in Ordnung. Verkleinere die Anzahl der Skripte so oft, bis nur wenige Skriopte übrig sind.

Man kann auch Teile des Programmes in einem neuen Projekt ausprobieren. Manchmal ist so ein kleiner Versuch schneller durchzuführen als die Untersuchung eines großen Programmes.

Diese Methode heisst auch 'wolf fencing': Wie fängt man einen Wolf in Kanada? Man baut einen Zaun durch die Mitte, und hört auf welcher Seite der Wolf ist. Dann teilt man diese Seite nochmals mit einem Zaun und hört wieder. Das macht man ein paar Mal, und dann hat man den Wolf gefangen.

2.1.5. Schritt 5: Nur den Fehler beheben, keine anderen Änderungen

Bei der Behebung von Fehlern sollte man nicht nebenher noch Ergänzungen oder Erweiterungen durchführen.

Werden viele Änderungen durchgeführt, dann können dadurch neue Fehler entstehen.

2.1.6. Schritt 6: Mitschreiben, was getan wurde

Es hilft, wenn die verschiedenen Massnahmen (stichwortartig) mitgeschrieben werden. Man vermeidet, dass man sich wiederholt. Und es hilft wenn man jemanden um Hilfe bittet: man kann besser berichten was schon getan wurde.

2.1.7. Schritt 7: Gibt es noch andere Möglichkeiten?

Meist denkt man an die naheliegenden Ursachen zuerst. Die unwahrscheinlichen Dinge vergisst man oft:

  • Es sind noch andere Skripte aktiv, die den Ablauf beeinflussen.

  • Falsch angeschlossene Elektronikbauteile. Verpolte LED leuchten nicht. Oder an einem Potentiometer die die Kabel vertauscht. Stecker werden manchmal verdreht.

  • Jumper auf der Adapterplatine vergessen oder falsch gesteckt.

  • Ein Fehler in den Programmen scratch oder scratchClient. Ein Neustart hilft manchmal.

2.1.8. Schritt 8: Neue Eindrücke

Manchmal hilft eine Pause um dann wieder neu nachforschen zu können.

Erkläre das Problem einem Mitschüler oder einem Experten. Manchmal fällt einem schon eine Lösung ein wenn man das Problem jemandem erklärt.

Wenn man gerade niemanden findet, der einem zuhört, dann kann man eine Gummiente auf den Monitor stellen und dieser Ente das Programm laut erklären. Deswegen heisst diese Methode auch ‚Rubber Duck-Methode‘.

Der Fehler ist dann hoffentlich wiederholbar, so dass man den auch zeigen kann.

Wichtig dabei ist: versuche den Fehler neutral zu beschreiben. Berichte die beobachteten Fakten, nicht Hypothesen. Vermeide es Mutmassungen über mögliche Ursachen zu berichten: das könnte den Helfer auf die falsche Fährte locken. Die Liste der bereits durchgeführten Massnahmen ist hilfreich.

2.1.9. Schritt 9: Wenn der Fehler nicht behoben ist, dann ist der Fehler nicht behoben.

Überprüfe, ob der Fehler behoben ist. Deshalb ist Schritt 1 so wichtig.

Wenn der Fehler nicht behoben ist, dann weiter bei Schritt 1.

Gibt es noch ähnliche Stellen wie die gerade gefundene Ursache ? Dann sollten auch diese untersucht werden.

2.2. Vorbeugende Massnahmen.

Kommentare

Kommentare in den Skripten erleichtern das Verständnis und die Fehlersuche.

Programmstruktur einfach halten: 'keep it simple'

Je übersichtlicher ein Programm aufgebaut ist, desto weniger Fehler wird es haben.

Beispiel: Ein Spiel mit verschiendenen Leveln funktionierte beim zweiten Durchlauf nicht richtig, da die Spielfiguren nicht wieder auftauchten wenn sie sollten.

Es wurden Skripte für 'level_1_start', 'level_1_stop', 'level_2_start', 'level_2_stop' eingebaut, in denen die Figuren sichtbar/ unsichtbar gemacht wurden. Dadurch wurde das Programm einfacher zu verstehen und funktionierte dann richtig.

Start-Stop-Skripte: die Bühne

Start-Stop-Skripte: Katze

Programmstruktur 'Spaghetti'

Wenn man alle möglichen Sachen in einem Skript erledigt, dann entsteht eine ziemlich verknotete Struktur, die schwierig zu verstehen ist. Man sagt auch 'Spaghetti'-Programm dazu.

Besser ist es, wenn zusammengehörende Teile in separate Skripte geschrieben werden. Das Programm wird übersichtlicher und einfacher zu vestehen und zu testen.

Meldungen einbauen

Wenn man das Verhalten von Skripten überprüfen möchte, dann kann man Meldungen einbauen. Diese Meldungen helfen für das Untersuchen des Verhaltens, müssen aber für das fertige Programm wieder ausgebaut werden.

Meldungen einbauen.

Ein Nachteil dieser ‚sage‘-Blöcke ist, dass schnell veränderliche Werte schwer zu sehen sind.

Benutzen von Listen für Meldungen

Mit einer Liste kann der Verlauf von Werten besser verfolgt werden.

Man legt unter ‚variablen‘ eine Liste an (hier ‚printout‘) und fügt die Meldungen in die Liste hinzu.

Meldungen in eine Liste schreiben.

Auf der Bühne kann man die Liste anzeigen und sieht die einzelnen Meldungen.

Meldungen auf der Bühne anzeigen.

Vorsicht: die Liste kann schnell sehr lang werden, was viel Speicherplatz benötigt. Deshalb öfter speichern und diese Methode nur sparsam einsetzen.

Beispielprogramm schreiben

Bevor man in einem komplizierten Programm neue Funktionen einbaut, sollte man diese erst mal in einem separaten scratch-Projekt ausprobieren.

Kapitel 3. Wichtige Formeln

3.1. Skalierung von Messwerten

Bei der Skalierung werden verschiedene Wertebereiche ineinander umgerechnet.

Beispiel:
Ein an den Raspberry Pi angeschlossenes Potentiometer liefert Messwerte von 0 bis 1023.
Mit diesem Wert soll eine Figur auf der Bühne in der y-Achse bewegt werden.
Die Y-Achse ist -180 bis +180.

Man braucht also eine Formel, mit der man einen beliebigen Potentiometerwert in einen Wert auf der y-Achse umwandeln kann.

Gegeben:

Gegeben sind die Start- und Endewerte des Eingangs und des Ausgangs, wie z.B. der Potentiometerwert und die Werte auf der Y-Achse.

Gesucht:

Gesucht wird eine Formel, die einen beliebigen Eingangswert in einen Ausgangswert umrechnet.

Schritt 1: Wertetabelle aufschreiben

Die Eingangsgröße 'input' ist der Wert des Potentiometers

Die Ausgangsgröße 'output' ist der Wert auf der Bühne.

Es ist sinnvoll, dass die Werte zuerst in einer Tabelle aufgeschrieben werden.

Eingangswert input von input 1 = 0 bis input 2 = 1023
Ausgangswert output von output 1 = -180 bis output 2 = 180

Zusammengehörende Werte stehen untereinander.

Schritt 2: Umrechnungsfaktor ermitteln

Mit den Werten aus der Tabelle kann ein Umrechnungsfaktor 'm' berechnet werden:

Hier kann man bereits die Zahlen aus der Tabelle einsetzen und den Wert ausrechnen.

Schritt 3: Berechnung der Werte

Der Ausgangswert 'output' wird aus einem Eingangswert 'input' wie folgt berechnet

Mit Zahlen aus dem Beispiel ergibt sich der Umrechnungsfaktor m zu

Ergebnis:

Mit der Formel aus Schritt 3 erhält man dann

In scratch kann die Lösung so aussehen. Den Wert m kann man aber auch einfach mit dem Taschenrechner ausrechnen.

Schritt 4: Überprüfung

Die beiden input-Werte aus der Wertetabelle in die Formel einsetzen. Es müssen die zugehörigen output-Werte herauskommen.

Schritt 5: Zusammenfassung

Die Skalierungsformel wird angewendet, wenn man eine lineare oder 'gleichmässigen' Umrechnung von Sensorwerten benötigt.

Aufgabe

Ein Abstandsensor liefert Werte von 80 bis 610. Damit soll auf der Bühne ein Element vertikal von y = 20 bis y= 240 verschoben werden. Berechne den Umrechnungsfaktor m und stelle die Formel für den Ausgangswert auf.
Ein Abstandsensor liefert Werte von 80 bis 610. Damit soll auf der Bühne ein Element horizontal von 240 bis -60 verschoben werden. Berechne den Umrechnungsfaktor m und stelle die Formel für den Ausgangswert auf.
In einem Spiel sollen die Credits des Spielers mit einem Objekt angezeigt werden, das sich horizontal von -60 bis 100 bewegt. Der Credit-Zähler soll Werte von 5 bis 100 haben. Wie muß die Position des Objektes berechnet werden ?

Kapitel 4. Anbindung Hardware mit scratchClient

4.1. Leuchtdioden, Taster auf der Adapterplatine

Der RaspberryPi Computer hat die Möglichkeit, direkt auf Ein- und Ausgabeleitungen zuzugreifen. Ausführlich erklärt wird das in dem Handbuch der Adapterplatine.

Mit dem bisher erworbenen Wissen kann man schon eigene Experimente mit den Schaltern und Leuchtdioden der Adapterplatine ausführen.

Hier die Schritt- für Schrittanweisung für den Start der scratchClient-Software.

4.1.1. Start scratchClient Software

Da Scratch selber nicht auf Hardware zugreifen kann, braucht man dazu eine spezielle Software, welche die Hardware bedient.

Es gibt viele verschiedene Ausführungen solcher Software, hier im Kurs wird der 'scratchClient' benutzt. Speziell entwickelt für das IKG.

Die scratchclient-Software muss manuell gestartet werden. Die Befehle hierzu sind in den Experimenten jeweils angegeben. Hier ein Beispiel und Erklärungen dazu was die einzelnen Schritte bedeuten.

Die Befehle werden in ein Terminal 'lxterminal' eingegeben. Die Befehle müssen nicht abgetippt werden, sondern können mit copy/paste übernommen werden.

cd ~/scratchClient
python3 src/scratchClient.py -c ikg_led

In der ersten Zeile wird das Verzeichnis im Dateisystem der SD-Karte gewechselt zu dem Verzeichnis, in dem die scratchClient Software gespeichert ist.

cd bedeutet 'change directory' und ist der Befehl, der zu einem Verzeichnis im Dateisystem wechselt.

Der nachfolgende Text '~/scratchClient' gibt das Verzeichnis an. Die Tilde '~' bedeutet das Heimatverzeichnis des Anwenders. Da im Kurs der Benutzer immer 'pi' ist, und die Heimatverzeichnisse im Verzeichnis /home/ liegen, ist die Tilde '~' also eine Abkürzung für /home/pi.

[Anmerkung]

Das Tilde-Zeichen erhält man, wenn man die 'alt gr' Taste drückt und hält, und dann die 'tilde' Taste.

Der Befehl cd ~/scratchClient wechselt also in das Verzeichnis /home/pi/scratchClient.

Die zweite Zeile ist der eigentliche Aufruf oder die Aktivierung des Programmes.

Der scratchClient ist in der Sprache 'python' geschrieben, und der Quellcode ist im Verzeichnis 'src' zu finden. Das Programm heisst 'scratchClient.py'. Pythonprogramme werden mit dem Programm 'python3' gestartet, dahinter folgt die Angabe des Programmnamens.

python3 src/scratchClient.py startet also ein Pythonprogramm.

Der scratchClient braucht eine Angabe, welche Ein- und Ausgänge zu verwenden sind und wie diese funktionieren sollen. Das wird mit einer Konfigurationsdatei eingestellt, die im Beispiel 'ikg_led' heisst.

Der Genauigkeit halber: Die Konfigurationen liegen im Verzeichnis './config'; der genaue Dateiname ist 'config_ikg_led.xml'; die scratchClient-Software ergänzt das automatisch aus der Abkürzung.

An dem Ausdruck -c erkennt der scratchClient, dass danach der Name der Konfigurationsdatei folgt.

Zuletzt das sudo . Der Zugriff auf Hardware ist nur für einen Superuser erlaubt, der normale Benutzer 'pi' darf das nicht. Mit dem vorangestellten sudo 'superuser do' wird scratchClient dann so ausführt, als ob ein Superuser ihn gestartet hätte.

Jetzt: Terminal öffnen, Befehl eingeben oder kopieren.

Die Ausgabe sieht dann so aus:

 

Einige Dinge sind zu beachten:

  • Fenster des Terminals nicht schliessen (mit dem 'X' oben rechts in der Titel-Zeile). Man darf das Fenster aber minimieren(mit dem '_' oben rechts in der Titel-Zeile).

  • Programm nur einmal starten.

  • Beenden des Programmes über strg-c (steuerung-Taste und c zusammen).
    Strg-c wird oft auch englisch als ctrl-c (control, englisch für Steuerung) oder  abgekürzt ^C geschrieben.

  • Möchte man den Rechner ausschalten, dann muss das Programm nicht gesondert gestoppt werden.

4.1.2. scratch3: Start der Extension 'ScratchClient'

In der linken unteren Ecke ist der Button für das Hinzufügen von Extension.

Anschliessend die ScratchClient Extension anwählen.

4.1.3. Überprüfung der Funktion

Die scratchClient-Software kann über den Web-Browser überprüft werden.

Adresse localhost:8080 aufrufen.

Es wird die gerade aktuelle Konfiguration angezeigt; ein Bild der Schnittstellen zeigt auch die Daten an, die von scratch geschickt werden. Es ist empfehlenswert, das mal anzusehen.

In der Darstellung der Schnittstellen können auch Eingaben simuliert werden.

4.1.4. Aufgaben

Die Aufgaben für dieses Kapitel sind im Handbuch der Adapterplatine zu finden.

Glossar

Algorithmus

Eine Rechenvorschrift oder Rechenrezept.

Arithmetische Operatoren

PLUS, MINUS, MULTIPLIKATION, DIVISION und z.B. auch die Funktionen SIN, COS etc. Diese Operatoren können auf Zahlenwerte angewendet werden.

Lizenz

Eine Lizenz ist ein 'Überlassungsvertrag' zwischen einem Programmierer, Hersteller, Künstler, Photographen und einem Verwender, der das Werk benutzen möchte. Es gibt sehr restriktive Lizenzen (der Verwender darf nicht weitergeben, nicht verändern o.ä.) und sehr offene Lizenzen (der Anwender darf auch beruflich verwenden, verändern, beliebig weitergeben). Auch wenn es unbequem ist: man muss das sehr ernst nehmen.

Logische Operatoren

UND, ODER, NICHT, arbeiten mit den logischen Werten 'wahr' bzw. 'falsch'.

Präsentationsmodus

Präsentation= Vorführung; Modus = Betriebsart. In diesem Modus werden die Palette, Skripte verdeckt und das Programm benutzt den kompletten Bildschirm.

Pseudocode

Manchmal möchte man den prinzipiellen Ablauf eines Programmes in gut lesbaren Sätzen darstellen. Dann verwendet man etwas formalere Ausdrücke als in der Umgangssprache, aber eben noch nicht die exakten Formulierungen einer Programmiersprache.

Wenn man wie in Scratch grafisch arbeitet, dann spart das auch Arbeit bei der Dokumentation, da das Kopieren von Grafiken in die Dokumentation viel Arbeit bedeutet.

ScratchClient

Programm, das die Ansteuerung von Hardware durch Scratch ermöglich.

Sequenzdiagramm

Ein Diagramm, das den Ablauf in einem Programm zeigt. Es zeigt die Objekte und die Signale, die hin- und hergeschickt werden.

Skript

Eine Abfolge von Programmbefehlen für einen Computer.

Sprite

Ein Objekt, das komplett mit Grafik, Skripten und Variablen geladen werden kann.

String Operatoren

Texte 'Strings' können verkettet werden. Hier bietet Scratch einen 'Verbinde'-Operator an und die 'Zeichen an Stelle N'. Diese liefern wieder Texte (Strings). Der Längenoperator 'Länge von ' liefert einen Zahlenwert.