Logo

Raspberry Pi 3

Der Raspberry Pi bietet vielfältige Einsatzmöglichkeiten und eignet sich hervorragend zum Experimentieren. Ich habe mir den Raspberry Pi beschafft, um Funkmodule auf 433 MHz Basis auslesen zu können. Bis zur Realisierung dieses Zieles müssen allerdings einige Hürden gemeistert werden, die ich in diesem Artikel am Beispiele einer LED Steuerung beschreibe.

Hinweise:
Die Platinengröße des Raspberry Pi beträgt 56x85 mm

Was wird benötigt?
Vor der erstmaligen Inbetriebnahme des Raspberry Pi wird noch ein geeignetes Betriebssystem benötigt. Auch wenn es inzwischen möglich ist Windows 10 zu installieren, bietet sich eine optimierte Linux Version an. Es gibt viele Quellen für den Download im Internet. Empfehlen kann ich den Download von der raspberrypi.org Seite.

Auf der Download Seite werden zwei Varianten angeboten: NOOBS (New Out Of the Box Software) und RASPIAN. NOOBS hilft dem unerfahrenen Anwender das Betriebssystem auf der microSD Karte zu installieren, ich beschreibe hier den klassischen Weg: eine Image Datei (Speicherabbild) herunterladen und mit einer Zusatzsoftware auf die microSD Karte kopieren. Wer sich die Mühe sparen will, kann auch eine microSD Karte mit installiertem RASPIAN Betriebssystem im Internet kaufen.

RASPIAN ist das offiziell unterstützte Betriebssystem für den Raspberry Pi und es steht in zwei Varianten zur Verfügung: mit grafischem Desktop und einer Minimalversion ohne grafischen Desktop. Diese Beschreibung nutzt die Minimalversion:



Auf Download ZIP klicken:



Nach Klick auf OK wird die ZIP Datei (ca. 348 MB) im Download Verzeichnis abgelegt.
In das Download Verzeichnis wechseln und mit [rechte Maustaste] Alle extrahieren die ZIP Datei entpacken:



Das Zielverzeichnis kann nach Belieben geändert werden.
Auf Extrahieren klicken. In diesem Beispiel wird das Verzeichnis 2018-03-13-raspbian-stretch-lite angelegt und das Speicherabbild hineinkopiert: 2018-03-13-raspbian-stretch-lite.img
Dieses Image besitzt eine Größe von 1,73 GByte.

Wie kommt das Speicherabbild auf die microSD Karte?

Auch dafür gibt es viele kostenlose Tools im Internet. Ich nutze dafür den open source Win32 Disk Imager (Link). microSD Karte über entsprechenden Adapter mit PC verbinden. Nach Download, Installation und Start:



Image Datei und Datenträger auswählen und auf Schreiben klicken.



Sicherheitswarnung mit Yes bestätigen.

Nach ca. zwei Minuten ist der Vorgang abgeschlossen. Der Disk Imager kann geschlossen und die microSD Karte aus dem PC entfernt werden.

microSD Karte auf der Unterseite des Raspberry Pi 3 einschieben und entsprechende Peripherie (Monitor, Maus, Tastatur und zuletzt das Netzteil) anschließen. Sobald der Raspberry Pi mit Strom versorgt ist, sollte Linux (basierend auf Debian) booten.


Die wichtigsten Anschlüsse des Raspberry Pi. Zwischen HDMI und Sound befindet sich noch der Anschluss für eine Raspberry Camera

Die Anmeldung erfolgt mit dem Benutzer pi und dem Passwort raspberry.
Wichtig: bei deutscher Tastatur ist an Stelle von 'y' die Taste 'z' zu drücken, da noch keine deutsche Tastatur hinterlegt ist.

Anschließend sollte sich das Betriebssystem mit der Eingabeaufforderung pi@raspberrypi:~ $ melden:



Hinweis: Dieser und die folgenden Screenshots wurden mit einem SSH Tool erstellt. Mit diesem Tool kann man auf den Raspberry zugreifen, ohne dass Monitor, Maus und Tastatur angeschlossen sein müssen. Dazu später mehr.

Deutsches Tastatur Layour einstellen

sudo raspi-config

Hinweis:auf der deutschen Tastatur entspricht 'ß' dem Bindestrich



Select 4 Localisation Options, I1 Change Locale, de-DE.UTF-8 UTF-8
Select 4 Localisation Options, I3 Change Keyboard Layout, German

Es wird empfohlen das Passwort zu ändern: Select 1 Change User Password

Netzwerk

Der Raspberry_Pi verfügt sowohl über eine Netzwerk Schnittstelle (Ethernet) sowie über ein WLAN Interface. Dieses lässt sich über 2 Network Options konfigurieren.

Nach erfolgreicher Netzwerk Anbindung muss noch die IP Adresse ermittelt werden:

ip a oder ifconfig

Abhängig von der Netzwerkanbindung (Ethernet oder WLAN) ist die IP Adresse unter eth0 oder wlan0 zu finden. Im Heimnetzwerk beginnt diese üblicherweise mit 192.168.x.x. Diese IP Adresse merken/notieren.

Zugriff über SSH Client erlauben

sudo raspi-config

Select 5 Interfacing Options, P2 SSH, Ja (Would you like the SSH server to be enabled?)

Danach ist der Zugriff über SSH möglich. Ein beliebtes Tool ist PUTTY, das es auch als portable Version gibt. Suche im Internet nach "Download PUTTY". Nach Herunterladen, Installation (nicht bei portabler Version) und Start:



IP Adresse eingeben und auf Open klicken. Die SSH Verbindung zum Raspberry Pi wird aufgebaut.



Nach der Anmeldung ist der Zugriff auf den Raspberry Pi ohne angeschlossene Tastatur, Maus und Monitor möglich.

Damit ist die Basiskonfiguration abgeschlossen.

LED über GPIO ein- und ausschalten


GPIO steht für General Purpose Input Output und bietet die Möglichkeit, über Ein- und Ausgangskanäle an den Raspberry angeschlossene Hardware zu steuern. Das Ein- und Ausschalten einer LED ist für die ersten Tests die einfachste Variante.

Für den Versuchsaufbau ist ein Breadboard sehr hilfreich, da die erforderlichen Bauteile nur gesteckt und nicht verlötet werden müssen.

Breadboards gibt es in unterschiedlichen Ausführungen. Eine größere Variante (165 x 55 mm) sieht z.B. so aus:



Bei diesen Steckboards ist es wichtig zu wissen, dass bestimmte Kontakte miteinander verbunden sind. Im folgenden Bild mit roten Strichen verdeutlicht:



Für den Versuchsaufbau mit einer LED und einem Widerstand reicht auch ein kleines Breadboard (47 x 35 mm):

  

Welche LED?

Jede handelsübliche LED kann eingesetzt werden. Die LED wird über einen Vorwiderstand betrieben. Um diesen zu berechnen, benötigt man im Idealfall das Datenblatt der LED. Ist dieses nicht vorhanden, da die LED aus der Bastelkiste kommt, sollte man von einer LED Betriebsspannung von 2 Volt und einem Betriebsstrom von 20 mA ausgehen.



Eine LED lässt den Strom nur in eine Richtung fließen, es ist daher wichtig zu wissen, welcher Anschlussdraht an die positive Spannung (Anode) und welcher Anschlussdraht an die Masse (Kathode) angeschlossen wird. Der längere Anschlussdraht ist die Anode, muss also an die positive Spannung (GPIO Port) angeschlossen werden.

Welcher Widerstand?

Für die Berechnung des Widerstandes benötigt man die Formel der Ohmschen Gesetze: U = R * I (U=Spannung in Volt, R=Widerstand in Ohm, I=Strom in Ampere). Der Schaltungsaufbau ist einfach: der GPIO Ausgang (Spannung mit 3,3 Volt) wird an die Anode der LED angeschlossen, die Kathode der LED an den Vorwiderstand und der Vorwiderstand wird mit der Masse verbunden:



Wird der GPIO Ausgang aktiviert, dann stehen an diesem Anschluss 3,3 Volt zur Verfügung. Die Betriebsspannung der LED beträgt 2 Volt. Am Widerstand verbleiben daher noch 1,3 Volt. Sollen durch die LED 20 mA (also 0,020 Ampere) fließen, errechnet sich der Vorwiderstand mit der Formel: R = U / I. R = (3,3 V - 2 V) / 0,02 A = 65 Ohm.

Widerstände sind mit Farbcodes kodiert:



Gängige Kohlewiderstände sind mit vier Farbringen gekennzeichnet, es gibt allerdings auch Metallschichtwiderstände mit fünf Farbringen. Bei Kohlewiderständen geben drei Ringe den Wert und der vierte Farbring die Toleranz an.

  

Der obige Widerstand besitzt die Farbringe rot (2), violett (7), braun (x 10) und silber (10%). Damit ergeben sich 270 Ohm mit einer Toleranz von 10%, d.h. der eigentliche Wert des Widerstandes liegt zwischen 243 Ohm und 297 Ohm. Nach obiger Berechnung benötige ich aber einen Widerstand mit 65 Ohm (Farbringe blau - grün - schwarz). Der vorliegende Widerstand besitzt den vierfachen Wert! Ist das ein Problem? Für den Versuchsaufbau ist das unbedenklich. Ein größerer Widerstand reduziert den Strom. Ergebnis: die LED leuchtet nicht so stark. Grundsatz: ist der berechnete Widerstandswert nicht verfügbar, dann besser einen Widerstand mit höherem Wert nehmen, als einen niedrigeren.

Kann ich die LED ohne Vorwiderstand betreiben?

Das sollte keinesfalls erfolgen, da dadurch die LED zerstört werden kann. Eventuell kann auch der Raspberry Schaden nehmen.

Vorwiderstand zwischen LED und Anode oder zwischen LED und Kathode?

Beide Varianten sind erlaubt. Es gibt keinen Unterschied. Der Widerstand begrenzt den Strom vor und nach der LED.

Versuchsaufbau

Um den Raspberry Pi mit dem Breadboard zu verbindern, benötigt man die Belegung der Steckleiste.



Die GPIO Ports können über die GPIO Nummer oder den Pin der Steckerleiste angesprochen werden. Das ist bei der Programmierung zu berücksichtigen! Für den Anschluss einer LED werden nur zwei Pins an der Steckerleiste benötigt: die Masse (GND, Ground) und ein beliebiger GPIO Pin. In diesem Beispiel werden die Pins 39 (GND, Masse) und 40 (GPIO21) benutzt.



Das schwarze Kabel verbindet die Masse (GND, Pin 39) mit dem Breadboard (Reihe 2). Die Steckplätze A, B, C, D und E in der Reihe 2 sind miteinander verbunden. Der 270 Ohm Widerstand wird mit einer Seite in 2B gesteckt und mit dem anderen Ende auf 2G. Steckplätze F, G, H, I und J in der Reihe 2 sind ebenfalls miteinander verbunden. Die Kathode der LED (kürzerer Anschluss) wird auf 2H gesteckt, die Anode der LED (längerer Anschluss) auf 1H. Jetzt wird noch die Anode 1J über das rote Kabel mit dem Pin 40 (GPIO21) verbunden.

Programmierung

Jetzt fehlen noch ein paar Zeilen Programmierung, um die LED zum Leuchten zu bringen. Üblicherweise nutzt man beim Raspberry Pi die Programmiersprache Python, die auch für einen Anfänger schnell zu verstehen ist. Im Internet gibt es viele Python Tutorials, die sich auch für Einsteiger eignen, z.B. www.python-kurs.eu.

Der Programmcode muss über einen Editor eingegeben werden. Als Editor nutze ich in diesem Beispiel nano, der etwas gewöhnungsbedürftig ist, aber für die wenigen Zeilen Programmcode ausreicht.

nano led.py

1import RPi.GPIO as GPIO
2import time
3GPIO.setmode(GPIO.BCM)
4LED=21
5GPIO.setup(LED,GPIO.OUT)
6GPIO.output(LED,True)
7time.sleep(5)
8GPIO.output(LED,False)
9GPIO.cleanup()

Code abspeichern: [Strg] X, mit J und [Enter] bestätigen.

Die Spannung steigt. Geht die LED an und nach 5 Sekunden wieder aus? Zum Ausführen des Programmcodes wird Python mit dem Namen der Datei aufgerufen.

python led.py

Programmcode am PC bearbeiten und auf den Pi übertragen

Für einfache Beispiele reicht der im Linux Betriebssystem enthaltene Editor nano aus. Ich bevorzuge es, den Quellcode am PC mit Notepad++ zu bearbeiten und diesen dann über FTP an den PI zu übertragen. Auch hier empfehle ich einen freien FTP Client: FileZilla. Nach Download, Installation und Start von FileZilla muss einmalig im Servermanager (Menüpunkt: Datei - Servermanager) die Verbindung zum Pi eingerichtet werden.






Bevor Sie den neuen Eintrag abspeichern, empfehle ich, im Reiter Erweitert den Standard Pfad sowohl auf dem PC (Lokales Standard-Verzeichnis) als auch dem Pi (Standard-Verzeichnis auf Server) entsprechend einzustellen. Das hat den Vorteil, dass nach dem Verbindungsaufbau zum PI die erforderlichen Verzeichnisse bereits angezeigt werden.

Hinweis:

In FileZilla sollte auch der bevorzugte Editor (Notepad++, Microsoft Visual Code, ...) hinterlegt werden (Menüpunkt: Bearbeiten - Einstellungen - Bearbeiten von Dateien - Benutzerdefinierten Editor verwenden).

Nach dem Verbindungsaufbau zum Pi können Sie die oben mit nano erstellte Datei per Doppelklick auf den PC übertragen, dort editieren und wieder auf den Pi kopieren. Ein weiterer Vorteil besteht darin, dass Sie jetzt automatisch eine Sicherungskopie auf dem PC vorliegen haben.

433MHz Daten empfangen

Die technischen Voraussetzungen, um Daten über einen 433Mhz Receiver zu empfangen sind minimal. Den erforderlichen Empfänger (wird fast immer zusammen mit einem Sender geliefert) kostet nur 2-3 Euro (einfach bei amazon oder eBay nach raspberry pi 433Mhz suchen).



Die üblichen Empfänger Module besitzen 4 Anschlüsse im 2,54 mm Raster und sind damit gut für die Breadboard Versuchsaufbauten geeignet. Auf der Rückseite sind normalerweise die Anschlussbezeichnungen aufgedruckt. Von der Bestückungsseite aus gesehen befindet sich ganz links der VCC Pin (5 Volt), dann folgen die beiden Datenpins und der Masseanschluss GND. Diese einfachen und extrem preiswerten 433MHz Empfänger werden ohne Datenblatt geliefert und auch die Internet Recherche liefert keine guten Ergebnisse. Empfohlen wird in fast allen Beiträgen den neben dem GND Pin liegenden Datenpin zu nutzen.

Für die Verbindung zum Pi werden lediglich drei Steckbrücken männlich/weiblich benötigt:




Um jetzt Daten von 433MHz Sendern (Temperatursensoren, Steckdosen Fernbedienungen, ...) auszulesen, ist leider wesentlich mehr Aufwand erforderlich, als eine LED anzusteuern. Stöbert man im Internet zu diesem Thema, wird häufig die Bibliothek wiringpi angeführt. Aus zwei Gründen greife ich nicht auf diese Library zu: erstens funktioniert diese nicht mit denen bei mir verfügbaren 433MHz Sendern und zweitens möchte ich selbst verstehen, welche Datenströme übertragen werden.

Leider gibt für die 433 MHz Übertragung kein Standard Protokoll. Der Datenstrom hängt nicht nur von dem im 433MHz Sender verbauten Chip ab, sondern auch von den proprietären Protokollen des Herstellers.

Aus diesem Grund ist zuerst ein Programm erforderlich, das den Datenstrom erkennt und anzeigt.

Das folgende Programm liest in einer Endlos-Schleife den Status des GPIO Ports 27 aus. Ändert sich der Wert von 0 auf 1 oder von 1 auf 0 wird die zeitliche Differenz zur letzten Änderung berechnet und ausgegeben. Es wird mindestens ein vollständiger Block eingelesen. Ist die Pause größer als 50 ms, dann wird die Schleife abgebrochen.

1from datetime import datetime
2import RPi.GPIO as GPIO
3MAX_DURATION = 90
4RECEIVE_PIN = 27
5GPIO.setmode(GPIO.BCM)
6GPIO.setup(RECEIVE_PIN, GPIO.IN)
7cumulative_time = 0
8beginning_time = datetime.now()
9count_iterations = 0
10pinstatus = 0
11timetemp = datetime.now()
12firstblock = 0
13while cumulative_time < MAX_DURATION:
14   pinstatustemp = GPIO.input(RECEIVE_PIN)
15   time_delta = datetime.now() - beginning_time
16   if pinstatus <> pinstatustemp:
17      t = datetime.now() - timetemp
18      timetemp = datetime.now()
19      print str(time_delta) + ";" + str(t.microseconds) + ";" + str(pinstatustemp)
20      if firstblock == 1 and t.microseconds > 50000:
21         break
22      pinstatus = pinstatustemp
23      firstblock = 1
24   count_iterations=count_iterations+1
25   cumulative_time = time_delta.seconds
26print count_iterations, ' loops'
27GPIO.cleanup()

Download Source rechts Maustaste, Ziel speichern unter ...


Für die ersten Tests nutze ich eine Steckdosen Fernbedienung von HOMEeasy (4 Kanäle ein/aus, Master ein/aus).

Um das Ergebnis nach der erfolgreichen Aufzeichnung ausgeben zu können, empfiehlt es sich die Ausgabe auf eine Datei umzuleiten, z.B.

python 433e.py >433e.txt

Die Werte stehen nach maximal 90 Sekunden in der Datei 433e.txt zur Verfügung. Mit FileZilla kann die Datei auf den lokalen PC übertragen und anschließend ausgewertet werden. Die ersten Zeilen sehen z.B. so aus:

0:00:00.507586;507441;1
0:00:00.508189;667;0
0:00:00.512720;4425;1
0:00:00.513336;610;0
0:00:00.513993;650;1
0:00:00.514588;547;0
0:00:00.515262;709;1
0:00:00.516426;1146;0
0:00:00.516530;91;1

Eine halbe Sekunde (507586 Mikrosekunden = 507,586 Millisekunden = 0,508 Sekunden) nach Start des Programms erfolgt der erste Wechsel am GPIO Port 27 von 0 auf 1. Der Port bleibt 588 µs auf high bevor wieder low anliegt. Das sieht nach dem "Startschuss" aus. 4516 µs später liegt für 601 µs ein high Signal an, gefolgt von vielen Wechseln high/low und low/high, die unterschiedlich lang sind.

Jetzt empfiehlt es sich nach Mustern zu suchen, da 433MHz Sender die Daten üblicherweise mehrfach übertragen, um Übetragungsfehler zu minimieren. Dazu lese ich die gesammelten Daten in Excel ein und suche in dem Datenstrom nach längeren high Werten (> 2000 µs), da zwischen den Wiederholungen immer ein eindeutig längerer high-Wert gesendet wird. Kopiert man diese Blöcke nebeneinander, dann sieht das Ergebnis in Excel folgendermaßen aus:



Sehr schön zu erkennen, dass jeder Befehl 10x übertragen wird und die Länge der jeweiligen high/low Phasen recht gut zusammenpassen.

Aber wie können diese high/low Phasen jetzt in "echte" Werte übersetzt werden? Dazu müsste man jetzt wissen, welche Codierung der Hersteller für die Funksteckdosen verwendet. Leider gibt es dafür keine verlässlichen Quellen. Bei der Recherche findet man häufig das Stichwort Manchester Code, aber auch dieser Code scheint nicht normiert zu sein.

Beispiel für das Timing:



In der ersten Variante besteht der Wert 0 aus 275 µs high und 275 µs low, 1 aus 275 µs high und 1225 µs low.
Variante 2 definiert den Wert 0 aus 375 µs high und 1125 µs low, 1 aus 1125 µs high und 375 µs low. Darüber hinaus gibt es für 0 noch eine Kurzvariante: 375 µs high und 375 µs low.

Um jetzt herauszufinden, was wirklich in dem Datenstrom steckt, ist es hilfreich verschiedene Schaltvorgänge der Fernbedienung aufzuzeichnen und dann zu vergleichen, z.B. Kanal 1 ein, Kanal 1 aus, Kanal 2 ein, Kanal 2 aus, Master ein, Master aus, usw. Auch mit den DIP-Schaltern in der Fernbedienung kann man noch experimentieren.

Die folgende Aufstellung zeigt den jeweils dritten Befehl für die Vorgänge Kanal 1 EIN, 1 AUS, 2 EIN und 2 AUS. Farblich hervorgehoben werden alle Timings > 500 µs.



Da es sowohl lange high als auch lange low Phasen gibt, kann es sich nur um die zweite Variante der Codierung handeln. Damit lässt sich der Datenstrom in Binärcode übersetzen:





Hier noch ein paar nützliche Befehle auf der RASPIAN Kommandozeilenebene:

ls Inhalt des Verzeichnisses anzeigen
mkdir [name] Verzeichnis [name] erstellen
cd [name] In das Verzeichnis [name] wechseln
rmdir [name] Verzeichnis [name] löschen
rm -r [name] Verzeichnis [name] rekursiv löschen
sudo shutdown -h now Raspberry Pi herunterfahren (nicht einfach ausschalten)

01.01.2019

Feedback gerne an folgende E-Mail Adresse: pi@lasona.de