Programmieren lernen am Raspberry Pi – Teil 1: Einführung

Viele Einsteiger bekommen einen Raspberry Pi geschenkt und haben oft kaum bis gar keine Programmierkenntnisse. Daher möchte ich in dieser Reihe an Tutorials die Hürde verkleinern und zum Programmieren Lernen mit dem Raspberry Pi anregen. Der große Vorteil ist, dass wir auch hardwarenahen Code schreiben können, womit wir die GPIO Pins des Raspberry Pi’s nutzen können.

Als Programmiersprache nehmen wir Python, da diese eine der am einfachst zu lernenden Sprachen für Anfänger ist und es nebenbei auch mitunter die meisten Referenzen dafür gibt.

Zubehör

Ein Hinweis vorweg: Die Tutorialreihe soll den Einstieg in die Programmierung am Raspberry Pi möglichst erleichtern, ist jedoch nicht als eigenständiger Kurs zu verstehen. Ein Buch ist zur Vertiefung und zum Nachschlagen sehr von Vorteil. Im Speziellen kann ich eines dieser beiden Bücher bzw. Online Kurs zum Lernen empfehlen:

Als Nachschlagewerk für Leute mit erster Erfahrung eignet sich auch dieses Buch von Johannes Ernesti.

Hardware

Für den Anfang benötigen wir folgendes Zubehör:

Eine genaue Auflistung allen Einstiegszubehör findest du im übrigen in diesem Artikel: Raspberry Pi Einstieg – Was brauche und wie starte ich?

 

Vorbereitung

Bevor wir mit dem Programmieren loslegen, müssen wir einige Schritte vollziehen, um eine Umgebung einzurichten. Zunächst ist es nötig, dass der Raspberry Pi ein Betriebssystem bekommt. Dafür stellt die Raspberry Pi Foundation das sog. Raspbian OS zur Verfügung, welches wir herunterladen. Anschließend übertragen wir die enthaltene Datei auf die micro SD Karte. Eine genaue Anleitung dazu findest du hier:

Raspberry Pi Raspbian OS auf eine SD-Karte übertragen (Windows)

Nachdem das Abbild auf der SD Karte ist, stecken wir diese in den Raspberry Pi. Sobald Tastatur, Maus und ein Display per HDMI Kabel angeschlossen sind, können wir ihn starten. Dies geschieht einfach, indem wir das micro USB Kabel anschließen und mit Strom verbinden. Das Display sollte nun aufleuchten und ein paar Zeilen Code auf schwarzem Hintergrund erscheinen.

Kurz darauf ist der Startvorgang abgeschlossen und wir sehen den Desktop:

Wir öffnen nun die Python Konsole, in der wir gleich Programm-Code eingeben können. Diesen öffnen indem wir erst das Raspberry Pi Symbol oben links klicken und dann unter Programming auf Python 2 (IDLE):

Es öffnet sich nun die Python Konsole, die folgendermaßen aussieht. In dieser werden wir gleich unseren Code schreiben:

Falls du dich fragst, warum wir Python 2 genommen haben und ob du auch Python 3 nehmen kannst: Die Antwort ist, dass beides möglich ist. Zwar sind zwischen den Versionen ein paar Unterschiede, allerdings sind diese für den Einstieg egal. Den Code, den wir schreiben ist auf beiden Versionen lauffähig.
Falls dich die Unterschiede im Detail interessieren, kannst du diesen Artikel (Englisch) durchlesen.

 

Hello World Plus

Genug der Worte, wir starten! In der Konsole möchten wir mit einer typischen „Hello World“ Anwendung starten. Dabei ist nichts weiter nötig als folgende Zeile einzutippen und mit Enter abzusenden:

print("Hello World")

Damit bekommen wir unsere erste Ausgabe angezeigt:

Dabei ist print die Funktion, welche wir aufrufen. Innerhalb der Klammern geben wir Parameter an, welche die Funktion braucht. Da es sich um eine Zeichenkette handelt, müssen wir die Anführungszeichen am Anfang und Ende angeben, da sonstige Wörter als Variablen aufgefasst werden, wozu wir gleich kommen.

Nun ist es recht langweilig einfach nur einen Satz auszugeben. Daher erstellen wir nun eine sog. Variable. Dies ist quasi ein Platzhalter, der verschiedene Werte annehmen kann und über ihren Namen angesprochen werden kann. Beispiel gefällig? Hier:

zahl = 7
print(zahl)

Der Vorteil von Variablen ist, dass wir deren Wert auch einfach überschreiben können. Im nächsten Beispiel erstellen wir zwei Variablen und addieren die erste zur zweiten (und speichern das Ergebnis in der zweiten Variable – wir überschreiben diese also):

zahl_1 = 7
zahl_2 = 3.5
zahl_2 = zahl_1 + zahl_2
print(zahl_2)

Aber Achtung: Neben (Ganz-)Zahlen können Variablen ja auch z.B. Zeichenketten („Strings“) enthalten. Hier ist eine Addition nicht möglich und würde zu einem Fehler führen.

Übrigens: Die Variable kann nach Belieben benannt werden, darf aber nicht mit einer Zahl beginnen. Auch dürfen keine Sonderzeichen (abgesehen vom Unterstrich) verwendet werden. Es gibt auch keine zwei Variablen die gleich heißen.

 

Kommentare

Eine weitere nützliche Funktion sind Kommentare, die den Code erklären, falls jemand anderes oder man selbst sich den Code später noch einmal ansieht. Solche Kommentare sind in jeder Programmiersprache verfügbar und können auch dazu genutzt werden, wenn man Teile des Codes „stumm schalten“ möchte, sodass diese nicht ausgeführt werden. Den Vorgang nennt man auskommentieren.

In Python beginnen Kommentare mit einer Raute / Hashtag (#). Der Rest der Zeile wird daraufhin nicht mehr ausgeführt. Hier ein Beispiel:

# Dies ist ein Kommentar
print("Zeile1") # noch ein Kommentar
#print("Zeile2")
print("Zeile 3")

Wie du siehst, wird nur Zeile 1 und Zeile 3 ausgegeben, da wir den mittleren Befehl auskommentiert haben.

 

Erste Abfragen

Wie bereits gesagt können Variablen ja unterschiedliche Werte annehmen. Damit wir diese auch wiederum abfragen können gibt es auch hierfür eine Möglichkeit. Mit if .. else können wir dies realisieren. Hier ein Beispiel:

zahl = 7
# angenommen hier wird eine unbekannte Zahl addiert
if zahl == 10:
    print("Zahl = 10")
elif zahl < 10:
    print("Kleiner als 10")
else:
    print("Größer als 10")

Hier gibt es nun einiges zu beachten:

  1. Am Ende der if, elif bzw. else Zeile muss ein Doppelpunkt stehen, da wir somit sagen, dass die Bedingung zu Ende ist. Wir können nämlich ebenso mehrere Bedingungen verknüpfen.
  2. Bei Abfragen sind u.a. folgende Möglichkeiten gegeben == (Gleichheit), < (Kleiner), > (Größer), <= (Kleiner/gleich), >= (Größer/gleich). Beim Prüfen auf Gleichheit darf nicht das einfache Gleichheitszeichen verwendet werden, da damit nur Variablen zugewiesen werden.
  3. Die Befehle, die ausgeführt werden, falls die Bedingung wahr ist, muss mit Leerzeichen eingerückt werden. Dabei muss alles auf der gleichen Ebene sein, bzw. gleich weit eingerückt sein. Als Standard werden 4 Leerzeichen zum Einrücken genommen.

Ich zeige nun noch ein erweitertes Beispiel, damit die Syntax etwas besser verständlich ist (fiktive Person mit Geburtsdatum am 30.07.1980):

geb_tag = 30
geb_monat = 7
geb_jahr = 1980
ausgabe = "" # leerer String

if geb_jahr < (2017 - 18):
    # Nutzer ist alt genug
    ausgabe = "Alter > 18"
else:
    if (geb_monat >= 6) and (geb_monat <= 9):
        ausgabe = "Kind hat im Sommer Geburtstag"
    else:
        # hier kann z.B. noch ein weiterer Befehl stehen
        ausgabe = "kein Sommerkind"
print(ausgabe)

Wie du siehst, ist es sehr einfach möglich auch Abfragen zu verschachteln. Wichtig ist nur, dass man immer die Einrückungen im Auge behält, da man sonst einen Fehler bekommt (oder das Programm falsch ausgeführt wird).

 

Schleifen

Nun gehen wir einen Schritt weiter und schauen uns sog. Schleifen an. Diese repräsentieren im Grund einfache Wiederholungen, wobei nach jeder Wiederholung (auch Iteration genannt) geprüft wird, ob die angegebene Bedingung (noch) wahr ist.

Die beiden Schleifen Arten nennen sich ForLoop und WhileLoop. Die While-Schleife prüft anfangs ob die Abfrage wahr ist. Hier ein Beispiel:

x = 0
while x < 5:
    print(x)
    x += 1

In jeder Wiederholung wird anfangs geprüft, ob x kleiner als 5 ist und wenn ja der eingerückte Teil ausgeführt. Wir geben darin einmal die Zahl aus und addieren danach 1 zu x. Somit werden die Zahlen 0 bis 4 ausgegeben.

 

Im Gegensatz dazu ist der Aufbau der For-Schleife ein wenig anders. In Python ist dessen Definition for .. in .. : wobei man als ersten Parameter eine Variable setzt (die innerhalb der Schleife verfügbar ist) und als zweiten Parameter z.B. eine Liste. Um die Zahlen von 0 bis 4 auszugeben, haben wir folgende Möglichkeiten:

# Erste Alternative
for zahl in range(5): # range(x) gibt die Zahlen von 0 bis x-1 aus
     print(zahl)


# Zweite Alternative
for zahl in [0,1,2,3,4]:
    print(zahl)

Wie du siehst eignet sich eine For-Schleife zum einfachen Zählen besser.

 

Auslagerung des Codes in Dateien

Als letzten Schritt dieses Tutorials will ich noch zeigen, wie man den Code in eine Datei schreibt und diese ausführt. Da man meistens ganze Code-Blöcke schreibt, möchte man diese auch sequentiell ausführen lassen. Der sogenannte Compiler, welcher den lesbaren (für Menschen verständlichen) Code in Maschinencode übersetzt, kann einzelne Befehle oder ganze Dateien ausführen.

Klicke auf das Ordnersymbol in der Navigationsleiste und mache einen Rechtsklick auf die freie Fläche. Unter „Create New“ > „Empty File“ kannst du eine neue Datei anlegen:

Benenne sie z.B. „programm1.py“ (ohne Anführungszeichen). Vergiss nicht die „.py“ Endung, damit klar ist, dass es ein Python Skript ist.

Die erstellte Datei kannst du mit Doppelklick öffnen. Hier kannst du deinen Code schreiben und über das Menü abspeichern. Ich habe den Code von oben eingefügt:

 

Nachdem gespeichert wurde, können wir die Datei auch bereits starten. Dies passiert über das Terminal / Konsole. Klicke dazu in der Taskleiste auf das Symbol rechts vom Ordner. Es öffnet sich ein schwarzes Fenster, in dem du etwas eingeben kannst.

Hier schreibst du folgendes hinein (mit Enter absenden):

python2 programm1.py

Das Programm wird nun von Anfang bis Ende durchlaufen. Dabei werden eben alle Abfragen ausgeführt, bis das Programm am Ende angelangt ist, wo es keine weiteren Befehle gibt. Danach terminiert es.

 

Dies war es mit dem ersten Teil meiner kleinen Übersicht zum Einstieg in die Programmierung mit dem Raspberry Pi. Im nächsten Teil widmen wir uns dem Lesen und Beschreiben der GPIO Pins, womit wir elektronische Bauteile wie LEDs steuern und Taster auslesen können.

 

PS: Im Beitragsbild ist kein Pythoncode zu sehen, da es nur ein Symbolbild sein soll 🙂

PPS: Kommentare / Anregungen (speziell von Beginnern) sind erwünscht, sodass ich die weiteren Teile ggf. darauf anpasse.

75 Kommentare

    • NameError: name ‚hello‘ is not defined
      >>> print („hello“)
      hello
      >>> print(„Zeile1“)
      Zeile1
      >>> geb_tag = 30
      geb_monat = 7
      geb_jahr = 1980
      ausgabe = „“ # leerer String

      if geb_jahr 18″
      else:
      if (geb_monat >= 6) and (geb_monat >> x = 0
      while x >> for zahl in range(5): # range(x) gibt die Zahlen von 0 bis x-1 aus
      print(zahl)

      # Zweite Alternative
      for zahl in [0,1,2,3,4]:
      print(zahl)

      SyntaxError: invalid syntax
      >>>

      NameError: name ‚hello‘ is not defined
      >>> print („hello“)
      hello
      >>> print(„Zeile1“)
      Zeile1
      >>> geb_tag = 30
      geb_monat = 7
      geb_jahr = 1980
      ausgabe = „“ # leerer String

      if geb_jahr 18″
      else:
      if (geb_monat >= 6) and (geb_monat >> x = 0
      while x >> for zahl in range(5): # range(x) gibt die Zahlen von 0 bis x-1 aus
      print(zahl)

      # Zweite Alternative
      for zahl in [0,1,2,3,4]:
      print(zahl)

      SyntaxError: invalid syntax
      >>>
      Kein einziges Listing funktioniert

      Antworten
      • Tatsächlich ich habe noch einmal in die Tutorials geschaut. Es funktioniert ein einziges Script ohne Fehler. Weder in Wolfram noch in Scretch

      • Was mir auffällt ist das ich die GPIO nicht einmal öffnen kann ich habe somit nichts…bei beiden Systemen funktioniert überhaupt nichts.
        Ein Systemfehler oder liegt es an mir vor dem Bildschirm?

      • Es reicht schon…..
        int ledPin = 17;

        Nichts kommt heraus Syntax Error

        Woran kann das liegen?

      • Die Hochkommata müssen beide HOCH sein. Also nicht
        >> „Hallo“
        sondern

        >> "Hallo"
      • Ups. Das liegt am KommentarScript….. Hochkommata werden am Anfang RUNTER gesetzt. Na super. Mein Kommentar also sinnfrei.

      • Wenn ich das richtig sehe hast du denn ganzen Code einfach kopiert und eingefügt das geht leider nicht du musst jede Zeile einzeln eingeben dann sollte es funktionieren

    • Keine Funktion?
      Hmmm
      Es fängt schon mit
      int ledPin = 17;an
      Das kennt er nicht….selbst / akzeptiert er nicht Bolean
      import processing.io.*;

      int ledPin = 17;
      boolean ledState = false;
      void setup() {
      size(100, 100);
      GPIO.pinMode(ledPin, GPIO.OUTPUT);
      background(102);
      }

      void draw() {
      if (ledState) {
      GPIO.digitalWrite(ledPin, GPIO.HIGH);
      background(255,0,0);
      } else {
      GPIO.digitalWrite(ledPin, GPIO.LOW);
      background(102);
      }
      }

      void mouseClicked() { //if the mouse Clicked
      ledState = !ledState; //Change the led State
      }
      gibt sofort Fehler aus…. In C++ geht das ganz anders.

      Leute irgendwas mache ich grundsätzlich falsch

      Antworten
      • Hallo Peter, es geht hier um Python, nicht um C/C++. Schreibst du deinen Code in der Python-Shell? Funktionen und Variablendeklaration wie in C/C++ sind anders in Python.
        Grüße,
        Thorsten

      • ich denke auch, du hast den gleichen Fehler wie ich gemacht und direkt in der Shell geschrieben. Hatte die gleichen Probleme. Du musst erst einen File öffnen oder einen neuen File anlegen. Es öffnet sich ein neues Fenster und dort wird der Code eingegeben. Dann sind auch die „>>>“ nicht mehr zu sehen und der Code sieht aus wie in den Beispielen. Mit RUN wird er dann in der Shell ausgeführt. Hat mich auch erst verzweifeln lassen.

  1. hey deine Tutorials sind richtig toll!
    mein ws2812b „funzt“

    meine Bitte:
    Gehe auf Python3.
    Python2 ist Vergangenheit und Gegenwart und python3 ist Gegenwart und Zukunft.
    Der Stil ist auch sauberer.
    Gegen Python 3 spricht, dass noch viele Module der Community nicht auf Python3 laufen…. ein Problem, das seit einiger Zeit täglich kleiner wird und inzwischen nicht mehr gravierend ist.

    Antworten
  2. Hallo, Felix.
    Danke für das Beispiel. Ich glaube, es ist ein Fehler in Deine zweitn Code-Beispiel:
    zahl_1 = 7
    zahl_2 = 3.5
    zahl_2 = zahl_1 + zahl_2
    Muss es nicht heißen:
    zahl_3 =zahl_1+zahl_2 ?

    Antworten
  3. diese reihe finde ich super
    kannst du ruhig fortf ahren denn hat man als anfänger aber auch echt alles beisammen
    schön wäre es denn wenn deine pythoreihe auch später richtung deine projekte geht
    und eventuell so python hausaufgaben was mit deinen projkten in verbinudung stehn

    Antworten
    • Super Idee 🙂 Ich denke ich werde wirklich kleinere Aufgaben mit einbauen.
      Anregungen zu weiteren Teilen könnt ihr gerne äußern, ich versuche dann darauf einzugehen.

      Antworten
  4. Als Raspi Anfänger finde ich dies echt toll.
    Mein erster aufgebauter Server mit fertigen Tools funktioniert super und jetzt freue ich mich, dass mich jemand einfach und verständlich in die Welt des vorerst einfachen Programmierens einführt.
    Danke für die Mühe. Freue mich auf die nächsten Schritte

    Antworten
  5. Schön, dass ich hier mal ein Tutorial finde, wie ich als Anfänger in Python hineinkomme. Besonders gut finde ich, dass Du auch mal zeigst, wie Du an ein neues Programm herangehst – erst das Programm benennen und den Speicherort festlegen – bevor auch nur eine Programmzeile erstellt wird – , finde ich gut. Bisher habe ich meine „Versuche“ umgekehrt zuerst editiert und dann unter einem neuen Namen abgespeichert. Dabei ist mir manches verloren gegangen.
    Allerdings denke ich auch, dass Python2 – nach allem, was ich bisher gelesen habe, – auch aus den Anwendungen und Beispielen, die ich gefunden habe, überholt ist.
    Gibt es eigentlich eine Python-Entsprechung für das mir aus uraltem Basic bekannten „goto/gosub……..return“? Wenn ja, dann bitte in das Tutorial aufnehmen.
    Falls Du es nicht sowieso in der Hardware-Programmierung mit aufzunehmen planst, wäre es schön, wenn Du auch mal auf deutsch eine verständliche Anleitung zu Grundlagen von Hardware-Interrupts mit aufnehmen würdest.
    Gruß
    Martin

    Antworten