Springe zum Inhalt oder Footer
SerloDie freie Lernplattform

Kurs

Grundlagen 1

1 Mu starten

Mu-Editor "Modus wählen"-Dialog

Wenn du Mu das erste Mal startest, wirst du aufgefordert, einen 'Modus' auszuwählen. Wähle jetzt in der Liste den Modus CircuitPython aus.

Mu versucht, automatisch zu erkennen, welches Board an deinen Computer angeschlossen ist. Der aktuelle Modus wird in der rechten unteren Ecke des Fensters links vom Zahnrad-Symbol angezeigt. Wenn das Symbol ein rotes x zeigt, ist es an der Zeit, dass du deinen Feather an den PC anschließt.

Verbinde dein Feather jetzt mit dem USB-Kabel mit dem Computer.

Wenn du dieses Fenster siehst, bist du bereit, um loszulegen.

Mu-Editor GUI

Den unteren Teil des Fensters nennt man Konsole. Du kannst die Konsole ein- und ausblenden, indem du oben in der Symbolleiste auf die Schaltfläche mit der Beschriftung Seriell klickst.

Neustarten

Hin und wieder ist es unumgänglich, das Board neu zu starten. Darum erfährst du bereits an dieser Stelle, wie das funktioniert.

Es gibt zwei Arten, das Board neu zu starten, also zu resetten. Man kann …

  1. einen Hard-Reset durchführen, indem man den Reset-Button auf dem Board drückt.

  2. einen Soft-Reset durchführen, indem man in der REPL die Strg-Taste gedrückt hält und gleichzeitig D drückt.

Was die REPL ist, und wie man damit umgeht, erfährst du später.

Normalerweise reicht ein Soft-Reset aus, aber manchmal verzettelt sich CircuitPython und du musst einen Hard-Reset durchführen. Das kommt aber selten vor.

2 Dein erstes Programm

Um ein Programm auf dein Board zu speichern, klickst du in der Symbolleiste auf Neu und anschließend auf Speichern. Speichere die Datei im Laufwerk CIRCUITPY unter dem Namen code.py ab.

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.BLUE_LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

Das ist der Programmcode deines ersten Circuitpython-Programms. Kopiere es in den Editor.

Speichere die Datei, indem du Strg + S drückst oder in der Symbolleiste wieder auf speichern klickst.

Hat sich etwas verändert? Blinkt da vielleicht etwas in rot?

Sieht es bei dir genau so aus wie hier? Beachte bitte, dass nach while True:, die nächsten vier Zeilen Leerzeichen enthalten, um sie einzurücken.

Jede Zeile ist genau gleich weit eingerückt. Alle anderen Zeilen enthalten keine Leerzeichen vor dem Text!

RED_LED blink

Glückwunsch! Du hast gerade dein erstes CircuitPython-Programm geschrieben!

Lass uns jetzt eine kleine Änderung am Code vornehmen. Ändere die erste 0.5 auf 1.0 und beobachte, was sich verändert.

Abspeichern nicht vergessen - sonst tut sich nichts!

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.BLUE_LED)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(1.0)
    led.value = False
    time.sleep(0.5)

Als Nächstes werden wir einen detaillierten Blick auf den Code werfen, um zu verstehen, wieso der Code eigentlich funktioniert.

Das Programm lässt sich in drei Teile gliedern. Wir beginnen mit den ersten drei Zeilen.

3 CircuitPython Module

Ein Programm wird in der Regel nie ausschließlich von nur einem einzigen Programmierer geschrieben. Stattdessen verwenden die allermeisten Programmierer, Programme, die von anderen Programmierern geschrieben wurden.

Jedes CircuitPython-Programm, das du schreibst und ausführen willst, benötigt also weitere Programme, um zu funktionieren.

Diese Programme sind teilweise in Dateien gespeichert, teilweise sind sie auch ein Teil von CircuitPython selbst.

Ein Programm, das geschrieben wurde, um von anderen Programmierern genutzt zu werden, nennt man Modul.

Einige Module sind, wie gesagt, bereits in CircuitPython integriert. Alle anderen Module findest du auf deinem CIRCUITPY-Laufwerk in dem Ordner lib. lib steht für library, das englische Wort für Bibliothek.

Eine Bibliothek ist eine Sammlung von einem oder mehreren Modulen. Ein Modul muss importiert werden, bevor es verwendet werden kann.

Importieren von Modulen

import board
import digitalio
import time

Mit der import-Anweisungen teilst du Python mit, dass du eine bestimmte Bibliothek (ein bestimmtes Modul) in deinem Code verwenden möchtest. In diesem Beispiel haben wir drei Module importiert: board, digitalio und time. Diese drei Module sind in CircuitPython integriert. Du findest sie also nicht im lib-Ordner.

Wofür stehen diese Module?

Die Module board und digitalio

Mit den Modulen board und digitalio kannst du auf die Hardware deiner Boards zugreifen. Das Modul board kennt alle Pins deines Boards und weiß, wozu du sie verwenden kannst. Dazu erfährst du später mehr.

Das Module time

Mit dem Modul time kannst du unter anderem die Ausführung deines Codes "pausieren" - also eine kurze Zeit anhalten.

Wir schauen uns das Modul zu einem späteren Zeitpunkt noch genauer an. Du hast aber hoffentlich schon erkannt, dass der folgende Befehl, den Code für eine halbe Sekunde pausieren kann:

time.sleep(0.5)

An dieser Stelle sei erwähnt, dass der Punkt für das, in Deutschland gebräuchliche, Komma steht.

0.5 heißt also "Null Komma Fünf"

4 Objekte und Klassen

Auf die Modulimporte folgen zwei Zeilen, die Arduino-Programmierer als setup-Funktion kennen.

Hier wird die LED eingerichtet. An dem Gleichheitszeichen = erkennt man eine Variablenzuweisung.

led = digitalio.DigitalInOut(board.RED_LED)
led.direction = digitalio.Direction.OUTPUT

Der Pin, an dem die kleine rote LED mit dem Prozessor verbunden ist, trägt den Namen: RED_LED - ein sehr guter Name für einen Pin, an dem eine rote LED angeschlossen ist.

Das board-Modul kennt die Namen aller Pins.

Falls du mit dem Konzept der objektorientierten Programmierung noch nicht vertraut bist, und noch nicht weißt, was Klassen und Objekte sind, solltest du dir den Bereich Klassen und Objekte am besten jetzt ansehen.

Ein DigitalInOut-Objekt erzeugen

In der ersten Zeile wird ein Objekt der Klasse DigitalInOut erzeugt. Die Klasse ist Teil des digitalio-Moduls. Den Konstruktor erkennt man an den beiden Klammern. Ihm wird die Konstante RED_LED übergeben.

Der Anschlusspin, an dem die rote LED angeschlossen ist, wird initialisiert und das Objekt der Objektvariablen led zugewiesen.

Zu diesem Zeitpunkt ist noch nicht entschieden, ob der Pin als Ausgabe- oder als Eingabe-Pin verwendet werden soll.

Mit der Objektvariable led können wir jetzt auf das DigitalInOut-Objekt zugreifen.

Die Richtung festlegen

Wie man einen Pin als Ausgabepin setzen kann, sieht man in der nächsten Zeile. Das Attribut direction (Richtung) des led-Objekts wird auf OUTPUT (Ausgabe) gesetzt. OUTPUT ist eine Konstante, der Klasse Direction, die zum Module digitalio gehört.

Auf die rote LED können wir jetzt "schreibend" durch das led-Objekt zugreifen.

Das ist für den Anfang alles sehr verwirrend, wenn man zum ersten Mal mit Objekten und Klassen zu tun hat, aber man gewöhnt sich schnell daran.

Groß- und Kleinschreibung

Groß- und Kleinschreibung haben in Programmiersprachen immer eine Bedeutung. Das meiste wird Kleingeschrieben.

  1. Variablen (led) und Attribute (value, direction) werden klein geschrieben.

  2. Methoden (sleep) werden klein geschrieben. Einzige Ausnahme sind Konstruktormethoden (DigitalInOut)

  3. Module (board, digitalio oder time) beginnen ebenfalls immer mit einem Kleinbuchstaben.

  4. Die meisten Schlüsselwörter (if, while, import) werden auch klein geschrieben.

Großgeschrieben werden Klassen (DigitalInOut, Direction) sowie die Schlüsselwörter True, False und None (kommt später noch). Bleiben noch Konstanten (RED_LED, OUTPUT oder INPUT). Sie werden komplett großgeschrieben.

5 Schleifen

Bei Schleifen spricht man von einer Kontrollstruktur. Mit ihnen lassen sich Programmteile wiederholt ausführen. In (fast) jeder Programmiersprache gibt es Schleifen, da das Programmieren mit Schleifen sehr übersichtlich und einfach ist. Es gibt aber auch alternativen, aber das zu thematisieren würde an dieser Stelle zu weit führen.

Normalerweise sollen Schleifen irgendwann abbrechen und das Programm darunter fortgesetzt werden. Darum muss zu Beginn eines Schleifendurchlaufs stets eine Bedingung überprüft werden sein. Solange diese Bedingung wahr ist, wird die Schleife ein weiteres Mal durchlaufen.

Die while-Schleife

Betrachte dieses einfache Beispiel einer while-Schleife:

1i = 10
2while i > 0:
3    print(i)
4    i = i - 1
5
6print(i)

Nachdem in Zeile 1 eine Variable i mit dem Wert 10 definiert wurde, folgt in Zeile 2 der Schleifenkopf. Die Bedingung lautet: Solange i größer als 0 ist.

Einrückung

Alles, was in der Schleife wiederholt werden soll, steht im Schleifenrumpf. Die vier Leerzeichen sind wichtig. Sie zeigen an, welche Zeilen im Schleifenrumpf stehen.

Die Zeile 6 gehört nicht mehr zur Schleife und wird ausgeführt, sobald die Schleife beendet ist. Zeile 5 dient nur zur Übersichtlichkeit und kann auch weggelassen werden.

Verändere den Code. Wo passt dieser Befehl am besten hin?

print(i*i)

6 Die Endlosschleife

Arduino-Programmierer kennen sie als loop-Funktion.

Mit while True: definiert man eine Endlosschleife. Der Code innerhalb einer Endlosschleife wird immer wieder ausgeführt, da die Bedingung dieser Schleife immer True (wahr) ist

while True: bedeutet im Grunde: "Tue für immer folgendes:".

Der gesamte Code, der unterhalb des Schleifenkopfes eingerückt ist, befindet sich innerhalb der Schleife. Innerhalb unserer Schleife stehen vier Befehle:

while True:
    led.value = True
    time.sleep(1.0)
    led.value = False
    time.sleep(0.5)

In der zweiten Zeile steht led.value = True. Hier wird die LED eingeschaltet.

In der nächsten Zeile (3) steht time.sleep(1.0).

Diese Zeile (3) weist CircuitPython an, den laufenden Code für eine Sekunde anzuhalten. Da dies zwischen dem Ein- und Ausschalten der LED liegt, ist die LED eine Sekunde eingeschaltet.

Der Punkt steht für das in Deutschland gebräuchliche Komma. 1.0 heißt also "Eins Komma Null"

Die nächsten beiden Zeilen (4 und 5) ähneln den ersten beiden.

led.value = False weist CircuitPython an, die LED auszuschalten, und time.sleep(0.5) weist CircuitPython an, weitere 0,5 Sekunden zu pausieren. Da das zwischen dem Aus- und Wiedereinschalten der LED geschieht, scheint es, als sei die LED für 0,5 Sekunden ausgeschaltet.

Die Schleife beginnt wieder von vorne und wird so lange fortgesetzt, solange die Stromversorgung gewährleistet ist und kein Reset durchgeführt wird!

Bild

7 Aufgaben

Gut gemacht! Du hast ein CircuitPython-Programm bearbeitet! Teste jetzt, ob du alles verstanden hast mit den Aufgaben.

Laden

Laden

Laden


Dieses Werk steht unter der freien Lizenz
CC BY-SA 4.0Was bedeutet das?