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

26. März 2017
10497 Views
26 Comments

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

26 Kommentare

  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
    • Das Problem mit der Kompatibilität vieler Bibliotheken ist der Hauptgrund warum ich Python2 hauptsächlich verwende. Ich versuche mich aber daran zu halten und in Zukunft mehr Python3 zu nutzen.

      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
    • In den Anfängertutorials werden die wesentlichen Unterschiede zw. Python 2 und 3 nicht behandelt (bzw. ist nicht geplant). Der print Befehlt ist extra Python3 kompatibel geschrieben worden.
      Im nächsten Teil geht es dann um die Allgemeine Steuerung der GPIOs.
      PS: Goto würde ich (bis auf wenige Ausnahmen) generell nicht empfehlen zu verwenden. Return gibt es natürlich – dazu auch in späteren Teilen mehr.
      Bisher sind nur die ersten 3 Teile geplant, von daher versuche ich Wünsche möglichst einzubauen.

      Antworten
  6. Hallo,
    ich habe als Anfänger ein kleines Problem:
    Wenn ich auf einen meiner Pythonversuche klicke öffnet sich Python 2.7.9.
    Da ich den PI B+ zusammen mit einem PifaceDigital2 betreiben will, alle Beispiele und Informationen darüber alle in Python3 sind, wäre es schön, wenn beim Klicken auf ein Python-Programm (.py) nicht die Python2 Umgebung, sondern die Python3 Umgebung sich öffnen würde.
    Wo kann ich diese Voreinstellungen auf dem Raspi ändern? (bitte auch ein Anfänger-Tutorial)
    Danke schonmal im Voraus
    Martin

    Antworten
  7. Schönes Tutorial Schritt für Schritt. War mein erster Kontakt mit Python, der Anfang ist jetzt also gemacht :-). Freue mich schon auf die GPIO-Geschichten! Viele Grüße
    Kameh

    Antworten
  8. Hallo,

    In -Teil 3: GUI erstellen-, steht am Ende
    „“Übrigens: Da Python und Tkinter ebenso auf Windows und MacOS laufen, kann damit natürlich auch eine Programmoberfläche für PCs und Macs erstellt werden.““

    Die Datei gui.py habe ich auf meinem Macbook erstellt und bekomme folgenden Fehler, nur, ich sehe keinen, kann mir bitte jemand helfen, wo ich ansetzen soll?

    Danke

    Hanss-MacBook-Pro:~ hansmmb$ cd /Users/hansmmb/Desktop

    Hanss-MacBook-Pro:Desktop hansmmb$ wget http://placehold.it/200×200
    –2017-04-22 06:46:51– http://placehold.it/200×200
    Resolving placehold.it… 45.56.123.206, 2600:3c00::f03c:91ff:fe1f:70fc
    Connecting to placehold.it|45.56.123.206|:80… connected.
    HTTP request sent, awaiting response… 301 Moved Permanently
    Location: https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200 [following]
    https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200: HTTPS support not compiled in.

    Hanss-MacBook-Pro:Desktop hansmmb$ sudo python3 gui.py
    Traceback (most recent call last):
    File „gui.py“, line 17, in
    imageEx = PhotoImage(file = ‚200×200‘)
    File „/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py“, line 3539, in __init__
    Image.__init__(self, ‚photo‘, name, cnf, master, **kw)
    File „/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py“, line 3495, in __init__
    self.tk.call((‚image‘, ‚create‘, imgtype, name,) + options)
    _tkinter.TclError: couldn’t open „200×200“: no such file or directory
    Hanss-MacBook-Pro:Desktop hansmmb$

    Antworten
  9. Vielen Dank für diesen ersten Schritt hier…
    Ich habe mich gleich an meine Schulzeit erinnert, wo wir damals mit TurboPascal etwas programmierten…. ;-).

    Und ich habe eben auch bemerkt, dass dein „Geburtstagstutorial“ nicht mit Python 3 funktioniert bis ich auf Version 2 gewechselt habe – siehe da….

    Somit viele Grüße!

    Antworten
  10. Grüß dich Felix,

    Frage zu deinem „Geburtstags“-Code:
    So wie Du ihn dort geschrieben hast, erfolgt bei mir nur die Ausgabe ob älter oder jünger als 18. Dass es ein Sommerkind ja ist, da Monat=7, wird nicht mehr mit ausgegeben.
    Wäre es denn nicht so erfolgreicher?:
    >>

    # Variablen Definition
    geb_tag = 30
    geb_monat = 2
    geb_jahr = 1980
    ausgabe1 = "" # leerer String
    ausgabe2 = ""
    
    # Abfrage erfolgt
    if geb_jahr  18"
    
        if (geb_monat >= 6) and (geb_monat <= 9):
            ausgabe2 = "Kind hat im Sommer Geburtstag"
        else:
            # hier kann z.B. noch ein weiterer Befehl stehen
            ausgabe2 = "kein Sommerkind"
    # Ausgabe
    print(ausgabe1)
    print(ausgabe2)

    <<
    Oder wolltest Du die Info ob oder ob kein Sommerkind nicht ausgeben, wenn es älter als 18 ist? Denn drehe ich das Kleiner in ein Größer als, erfolgt zumindest die Ausgabe, dass die Person ein Sommerkind ist.

    Viele Grüße
    Sebastian.-

    Antworten
    • Hallo Sebastian,
      bei deinem ersten If stimmt etwas nicht. Das ganze sollte eher die Verschachtelung von Operationen zeigen. Bestimmt kann man das Beispiel um einiges erweitern und verbessern 🙂

      Antworten
      • In der Tat! Sorry, da hat wohl beim copy-paste etwas nicht ganz geklappt…. :
        # Variablen Definition

        geb_tag = 30
        geb_monat = 7
        geb_jahr = 1980
        ausgabe1 = "" # leerer String
        ausgabe2 = ""
        
        # Abfrage erfolgt
        if geb_jahr  18"
            
            if (geb_monat >= 6) and (geb_monat <= 9):
                    ausgabe2 = "Person hat im Sommer Geburtstag"
            else:
                    # hier kann z.B. noch ein weiterer Befehl stehen
                    ausgabe2 = "kein Sommerkind"
        
        # Ausgabe
        print(ausgabe1)
        print(ausgabe2)
  11. Hallo Felix,

    eine richtig tolle Seite. Ixh bin begeistert. Die Tutorials sind selbst für den absoluten Einsteiger gemacht und vor allem: Du denkst oft auch an die Schritte, die viele andere Tutorials (nicht nur im Rasperry Bereich) nicht zeigen, weil sie es einfach voraussetzen.

    Ich bin Fan und hab auch daher alle meine Sachen über deine Links bestellt 🙂
    Heut is der grösste Teil gekommen und ich werd mal ein bisschen testen. Ersma paar Dioden blinken lassen 🙂
    Aber mein Ziel ist ein Gerät mit Touchpad von dem meine Band auf Livekonzerten Synthesizer und Click Playback ans Mischpult schicken kann.
    Ich hab schon gesehen, dass da n Kickstarter-Projekt ist mit einer Mehrkanal-Soundkarte (mit XLR-Outs), die bald erscheint. Mal sehen ob ich bis dahin fit genug bin, das Ganze umzusetzen.

    Aber diese Seite hier wird mir sicherlich extrem helfen.

    Danke!!!

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!