Stückliste

  • Windows PC
  • MicroSD-Karte, ggf. mit Adapter für den PC
  • Raspberry Pi
  • externe Tastatur und Maus 
  • GPIO-Kabel, Micro-USB-Kabel, LAN-Kabel
  • Breadboard
  • Temperatur-, Druck- und Luftfeuchtigkeitssensor

 


Bild 2.1: Anschlüsse des Raspberry Pi

Vorbereitungen

Um ein Betriebssystem auf dem Raspberry Pi zu installieren, ist zunächst eine formatierte microSD-Karte nötig, auf die die im Internet heruntergeladene Software geladen wird. Anschließend wird die microSD-Karte in den Raspberry Pi eingelegt.

Zum Formatieren werden folgende Schritte ausgeführt:

  • Rechtsklick auf das "Start"-Symbol
  • Auf "Ausführen" klicken
  • "cmd" in das Feld eingeben und ausführen
  • In das sich öffnende Fenster "diskpart" eingeben
  • In das neu geöffnete Fenster folgende Befehle in dieser Reihenfolge eingeben:
  1. list disk
  2. select disk x (wobei "x" die Nummer der microSD-Karte ist)
  3. clean
  4. create partition primary
  5. select partition 1
  6. active
  7. format fs=fat32 quick
  8. assign
  9. exit

Das Betriebssystem Raspbian kann hier heruntergeladen werden. Es eignet sich das “Raspbian Buster with Desktop” Image. Mit dem Programm Win32 Disk Imager kann die microSD-Karte mit dem Betriebssystem dann nach abgeschlossenem Download und Entpacken der ZIP-Datei beschrieben werden.

Hierzu muss der Win32 Disk Imager gestartet werden, das zuvor heruntergeladene Raspbian Image ausgewählt und anschließend der Laufwerksbuchstabe der microSD Karte angewählt werden. Mit einem Klick auf ,,schreiben" wird der Vorgang gestartet.

Die microSD-Karte wird nun in den RaspberryPi auf der Rückseite in die passende Vorrichtung gesteckt. Der Pi muss außerdem über den HDMI-Ausgang an einen Bildschirm angeschlossen werden und per USB Maus und Tastatur bedient werden. Zusätzlich kann direkt auch die Internetanbindung per LAN erfolgen, bevor der Pi durch das Anschließen des Micro-USB Kabels automatisch gestartet wird. 

Bootet der Pi, erfolgt eine einfache Einrichtung von Sprache, Passwort und WLAN-Verbindung. Das vorgeschlagene Update kann hierbei ausgelassen werden, da die nötigen Updates für die hier verwendeten Programme im Folgenden sowieso noch manuell installiert werden. 

Der Sensor arbeitet in einem Spannungsbereich zwischen 1,2 V und 3,6 V, daher muss er an den 3,3 V-Spannungspin des RPi angeschlossen werden. Außerdem verwendet der Sensor das sogenannte I²C-Protokoll. Dies ermöglicht die Übertragung der digitalen Signale des Sensors, sodass er mit dem RaspberryPi kommunizieren kann. Die Signalübertragung geschieht mithilfe eines sogenannten Bussystems, also einem Leitungssystem, durch das die Signale gesendet werden. Für I²C wird eine Takt- und eine Datenleitung benötigt. Die Taktleitung wird an den SCL-Pin (Serial CLock) angeschlossen, die Datenübertragung geschieht mit dem SDA-Pin (Serial DAta). Für beide sind Pins am Raspberry vorgesehen, die Anleitung, wie genau alles angeschlossen werden muss folgt später.

Der I2C-Bus

Bei unserem Projekt verwenden wir einen Sensor und den Raspberry Pi, mit dessen Hilfe die Auswertung funktioniert. Doch wir haben., wie beschrieben, nur eine Datenleitung, die die beiden verbindet. Gibt es ein Problem, wenn beide gleichzeitig senden? Angenommen, der Mikrocontroller sendet ein Signal an den Sensor und “fragt” nach dessen Daten. Doch der Sensor ist so konfiguriert, dass er, ohne Aufforderung, dauerhaft seine Messwerte weitergibt. Von beiden Teilnehmern werden Daten durch die Leitung gesendet, am Ende kommt Datenmüll dabei heraus, denn niemand weiß mehr, was wozu gehört.

Für dieses Problem ist in I²C die Lösung integriert: Es arbeitet nach dem Master/Slave-Prinzip. Nur der Master darf “ungefragt” auf die Leitung zugreifen, der Slave nicht. In unserem Beispiel ist der Raspberry Pi der Master, der Sensor der Slave. Der Mikrocontroller fordert den Sensor auf, ihm seine Daten zu senden. So steht die Leitung immer entweder dem Master oder dem Slave voll zur Verfügung, nie senden beide gleichzeitig und es kommt zu keinem Datenstau.

An die Pins am Raspberry Pi kann man auch mehrere Geräte gleichzeitig anschließen, die mit dem I²C-Protokoll arbeiten. Diese können mithilfe von Adressen weiterhin separat angesprochen werden.

Für das weitere Vorgehen wird nun der RPi heruntergefahren und gemäß Bild 1 mit den GPIO-Anschlussstellen über die Jumperkabel mit dem Sensor verbunden. Es eignet sich ein Breadboard zum Anschluss des Sensors, da man so die Jumperkabel nicht am Sensor anlöten muss.

Anschluss des Sensors


Bild 2.2: Anschlussbezeichnungen des BME280 mit den dazugehörigen Pins am RPi

Achtung: Falls die folgenden Befehle per Copy/Paste eingegeben werden, muss darauf geachtet werden dass die Bindestriche manuell eingegeben werden, da es sonst zu einem Fehler bei der Ausführung des Befehls kommt!

Zum Auslesen der Sensordaten wird die Programmiersprache Python verwendet, da diese Sprache recht leicht verständlich ist und man darüber sehr gut die Pins des Raspberry Pi‘s direkt ansteuern kann. Python ist bereits im Betriebssystem Raspbian vorinstalliert. Um die beiden für die Datenübertragung relevanten Pins des Sensors anzusteuern (für das Auslesen der Sensordaten) muss allerdings noch das oben angesprochene I²C-Protokoll manuell installiert werden.

Um den I²C-Bus nutzen zu können, muss das dazugehörige Modul geladen werden. Ein Modul stellt eine Erweiterung des sogenannten Kernels des Betriebssystem des Raspberrys dar. Der Kernel eines Betriebssystems ist ein tiefliegender Bestandteil von dessen Struktur und hat die Aufgabe, die Kommunikation zwischen Software und Hardware zu ermöglichen. Dies kann sowohl die Hardware des Gerätes selbst, wie z.B. dessen Prozessor oder Speicher, oder externe Hardware wie Sensoren sein. Die Erweiterung, die wir hinzufügen, ermöglicht folglich die Kommunikation des Sensors mit dem Betriebssystem des Raspberry Pi.

Um das Modul zu laden, muss im “/etc/modules”-Verzeichnis ein neuer Eintrag hinzugefügt werden. Module, die hier platziert werden, werden dauerhaft implementiert. Es gibt auch die Möglichkeit, Module mit dem modprobe-Befehl zu laden, allerdings verschwinden so geladene Module bei einem Neustart wieder. Wir laden es dauerhaft, damit die Kommunikation über I2C im weiteren Verlauf des Projekts auch nach dem Herunterfahren möglich bleibt. Dazu wird im Terminal  sudo nano /etc/modules aufgerufen. Der Befehl "nano" öffnet hierbei einen einfachen Editor, mit dem es möglich ist, Dateien in dem hinter dem Befehl angegebenen Verzeichnis zu bearbeiten. Dort soll nun eine Zeile mit  i2c dev hinzugefügt werden. Unter Umständen ist diese Zeile bereits vorhanden, dann muss die Datei nicht weiter bearbeitet werden. Das Modul ermöglicht den Zugang zu den angeschlossenen i2c-Geräten, was es z.B. möglich macht, später die angeschlossenen Geräte, die mit dem I2C-Protokoll arbeiten, anzuzeigen. Hier gibt es für Interessierte genauere Informationen (auf Englisch) und ein Programmierbeispiel in C dazu.

Das Endresultat soll folgendermaßen aussehen:

/etc/modules

Bild 2.3: Bearbeitung der /etc/modules-Datei im Texteditor

In dem Terminal, dass sich mit nano geöffnet hat, können mit der Tastenkombination Strg+O die vorgenommenen Änderungen gespeichert werden. Mit Enter wird der Speicherort bestätigt und mit Strg+X wird der Texteditor wieder geschlossen.

Um als User des Raspberry Zugriff auf die I²C-Funktionen zu erhalten, wird sudo usermod -aG i2c pi in das Terminal eingegeben. Mit sudo erhält man besondere Rechte, vergleichbar mit Adminrechten bei Windows-PCs, die für manche Befehle nötig sind. Der Befehl "usermod -aG" ermöglicht es, dem Benutzer "pi" (also uns) beim "I2C" die nötigen Zugriffsrechte zu gewähren, sodass es zu keiner Fehlermeldung bei der Verwendung des Busses kommt.

Es muss weiterhin eine Änderung in der /boot/config.txt vorgenommen werden. Dieses Verzeichnis erlaubt Zugriff auf den sogenannten "device tree", es wird über  sudo nano /boot/config.txt aufgerufen. Dort muss die Zeile dtparam=i2c_arm=on auskommentiert (Entfernen des "#") bzw. neu hinzugefügt werden. Das Speichern und Schließen erfolgt wie zuvor. “Arm” nennt sich die Prozessorarchitektur des RPi, daher wird anschaulich, dass dieser Befehl dem i2c-Bus u.A. die Kommunikation mit dem Prozessor ermöglicht. Dies funktioniert ähnlich wie das Integrieren von Modulen, nur dass hier die benötigten Funktionen über den "device tree" eingebunden werden. Der "device tree" ist eine vom Raspberry Pi verwendete Datenstruktur, die die Hardwarekomponenten des Gerätes und externer Geräte wie unserem Sensor für das Kernel "beschreibt". So kann der Kernel diese Komponenten verwenden und folglich für eine funktionierende Kommunikation mit der Software sorgen.

Es ist nun ein Neustart des Raspberrys erforderlich, um die Änderungen zu übernehmen!

Als Letztes werden die I²C-Tools und Updates heruntergeladen und installiert. Für diese Schritte ist eine Internetanbindung notwendig, die einfach per LAN hergestellt werden kann.

Es werden nun die Befehle   sudo apt-get update,  sudo apt-get install i2c-tools und  sudo apt-get install python-smbus hintereinander ausgeführt. Ist dies erfolgreich gewesen, hat man Zugang zu einem neuen Befehl, mit dem man die angeschlossenen I²C-Geräte anzeigen lassen kann. Dazu muss der Befehl i2cdetect –y 1 in das Terminal angegeben werden. Hierbei ist die Verbindung zwischen dem Sensoranschluss und den Jumperkabeln zu prüfen, da ohne Kontakt eine Fehlermeldung auftritt und der Sensor nicht verbunden ist.

i2cdetect -y 1

Bild 2.4: Anzeige der Adressen der angeschlossenen I²C-Geräte

Sollte man mehrere Slaves gleichteitig mit dem i2c-Bus verwenden, so würden deren Adressen ebenfalls in dieser Tabelle auftauchen. Taucht in dieser Tabelle eine Adresse 76 auf, so kann mit dem Auslesen der Sensordaten begonnen werden.

Code

Im Folgenden kann der Code heruntergeladen werden, der dieses Auslesen ermöglicht. Dazu wird mit der "smbus"-Bibliothek gearbeitet, die verschiedene Funktionen zum Gewinnen der Daten bereitstellt. Genauere Informationen stehen als Kommentare im Code.

Wichtig: Alle hier heruntergeladenen Dateien müssen für die Konsolenanweisungen auf dem Desktop liegen!

BME280.py (klicken, Download startet automatisch). Der Quellcode lässt sich mit einem Python-Editor auf dem Raspberry einsehen.

Als nächstes folgt das Programm, welches mit den ausgelesenen Werten arbeiten soll. Später werden die Werte auch in der lokalen Datenbank gespeichert. Zunächst wird getestet, ob die Werte auch korrekt ausgelesen werden.

Dazu ist das folgende Beispielprogramm vorbereitet: 

Main1.py (klicken , Download startet automatisch).

Dies geschieht ebenfalls mit einer Python-Datei, die sich auf die für das Auslesen der Daten erstellte Datei bezieht, indem die darin erstellte Klasse importiert. 

Mit dem Befehl  sudo python /home/pi/Desktop/Main1.py kann das Programm nun ausgeführt werden und es sollte die gemessenen Sensordaten wie unten abgebildet ausgeben.

Asgabe der Sensordaten

Bild 2.5: Ausgabe von Main1.py

Zuletzt geändert: Donnerstag, 26. September 2019, 13:52