Raspberry Pi Interfaces - [Teil 1]

Die Schnittstellen des Raspberry Pi - Teil 1

Der Siegeszug der Arduinos und Raspberry Pis liegt unbestritten an den Anschlussmöglichkeiten von elektronischen Bauteilen und der einfachen Programmierung eigener Projekte. Endlich nicht nur teure PCs mit fertigen Anwendungsprogrammen und Spielen, sondern Computer und Controller für die Ausbildung, Bastelprojekte, interaktive Installationen von Künstlern, Heimautomation, sogar industrielle Anwendungen für Menschen aller Altersklassen.

Die ersten Gehversuche macht man sinnvollerweise mit den sogenannten GPIO Ports, an denen LEDs und Taster angeschlossen werden. GPIO steht für General Purpose Input/Output. Im heutigen Blog wollen wir jedoch die Zweitbelegung einiger Pins anschauen, denn darüber erhalten wir Zugang zu teilweise sehr schnellen Elektronik-Schnittstellen (engl. Interfaces).

Abbildung 1: Pinbelegung am Raspberry Pi

Die hier dargestellte Pinbelegung gilt übrigens für alle Raspberry Pi-Modelle seit 2013.  Zu beachten ist nur, dass die Pin-Nummer nicht gleich der GPIO-Nummer ist. Die Schnittstellen liegen nach der entsprechenden Konfiguration (siehe unten) an Pin 7 (Eindrahtbus=1-wire), an Pins 3 und 5 (I²C oder I2C oder IIC = Inter-Integrated Circuit), an Pin 8 und 10 (UART=Universal Asynchronous Receiver/Transmitter=Com-Schnittstelle) sowie Pins 19,21,23 und 24 oder26 (SPI = Serial Peripheral Interface, aka 4-Wire Serial Bus).

Die Aktivierung erfolgt unter Einstellungen/Raspberry Pi-Konfiguration auf der Registerkarte „Schnittstellen“. Hier aktiviert man die gewünschte Schnittstelle mit einem Mausklick. Bei einigen Schnittstellen ist ein Neustart des Raspi notwendig. Deshalb vorher also ggf. die Arbeiten mit Python oder Anwendungsprogrammen abspeichern. Übrigens: So einfach war das in den ersten Jahren nach Einführung des Raspberry Pi nicht. Da musste man sich noch mit Begriffen wie raspi-config, config.txt, Device Tree und blacklist herumschlagen. Die kann man heute getrost vergessen.

Abbildung 2: Raspberry Pi-Konfiguration, SSH (Secure Shell/Fernzugriff) und I2C Aktiviert

Im Weiteren werden wir praktische Anwendungen für die einzelnen Schnittstellen sehen, die Sie gerne nachbauen und in eigene Projekte integrieren können.

Als typischen Vertreter für den Eindraht-Bus werden wir weiter unten die Temperatursensoren vom Typ DS18B20 betrachten.

Am I2C-Bus (engl. Aussprache I square C) werden wir (in einem der nächsten Blog-Beiträge) LCD – Displays und einen kombinierten Temperatur-, Druck- und Luftfeuchtigkeit-Sensor anschließen. Wer möchte, kann weitere ICs wie die Real Time Clock an diesem Bus betreiben.

Über die Com-Schnittstelle (UART, RX/TX) kann man den Raspberry Pi mit einem Arduino oder ESP-Micro-Controller verbinden. Auch dies zeigen wir in einem anderen Blog-Beitrag.


Und den SPI nutzen wir in einem weiteren Blog-Beitrag für zwei selbst gebaute Paddles, also Spielecontroller für eines der ältesten Computerspiele: „Pong“. Dies geht am Raspi nur mit einem Analog-Digital-Wandler (ADC), z.B. dem MCP3008, den wir an den SPI-Bus anschließen.

Hier nun Schaltung und Python-Programm für den Eindraht-Bus (1-wire-interface):

Abbildung 3: Temperatursensor DS18B20 

Zunächst einmal überrascht die Tatsache, dass das Anschlusskabel diese Temperatursensors drei Adern hat, wo er doch Eindraht-Bus heißt. Die Erklärung ist ganz einfach: Jedes elektronische Bauteil benötigt eine Spannungsversorgung, also das rote Kabel an 3,3V (Pin 1) und das schwarze an GND (Pin 6).

Das dritte, meist gelbe Kabel ist die Datenleitung, die die Messwerte an der Schnittstelle ausgibt. Hier wird als Rückleitung die Masseverbindung mitgenutzt. Zu beachten ist noch, dass der Eindraht-Bus über einen Pull-up-Widerstand von 4,7 kOhm zusätzlich an 3,3 V angeschlossen wird.

Abbildung 4: Schaltbild Raspberry Pi mit Temperatursensore DS18B20

Wie Sie sehen, gibt es zwei Bauformen: Wie im fritzing-Schaltbild abgebildet ein kleiner Dreibeiner, den man leicht mit einem Transistor verwechseln kann. Und wie auf dem Bild oben, gut gekapselt mit einem langen Kabel. Diese Bauform eignet sich auch für Flüssigkeiten oder im Außenbereich.

Wir aktivieren in der Raspberry Pi-Konfiguration den Eindraht-Bus. Danach ist ein Neustart erforderlich. Durch diesen Neustart wird ein Unterverzeichnis angelegt, in dem der Sensor seine Daten ablegt. Das Lesen der Daten machen wir in zwei Schritten:

Zuerst suchen wir das neu angelegte Unterverzeichnis. Dafür öffnen wir den Dateimanager und suchen das Verzeichnis /sys/bus/w1/devices. In diesem Verzeichnis befindet sich ein Unterverzeichnis, dessen Name mit 28- beginnt. Dahinter befindet sich eine lange Zeichenfolge – eine individuelle und eindeutige ID für den Temperatursensor. Haben wir zwei DS18B20 parallel angeschlossen (z.B. für Innen- und Außentemperatur), erhalten wir zwei solcher Unterverzeichnisse.

Wir wechseln in das Unterverzeichnis 28-xxxxxxxxxxxxxxx und sehen ganz am Ende die Datei w1_slave, die beim Einschalten bzw. beim Neustart des Raspi neu angelegt wurde.

Diese Datei wollen wir uns anschauen, denn darin stecken die gewünschten Daten. Dafür kopieren wir den gesamten Dateipfad und wechseln ins Terminal. Hier wollen wir in dieses Unterverzeichnis wechseln, also change directory = cd und Einfügen des Dateipfads. Bitte daran denken, dass im Terminal der Shortcut für Einfügen nicht Strg+V, sondern Umschalt+Strg+V ist.

Abbildung 5: Bildschirmfoto Dateimanager des Raspberry Pi

Nun geben wir den Befehl cat w1_slave ein und erhalten nach ca. einer Sekunde eine zweizeilige Ausgabe mit vielen Hexadezimalzahlen. Die können wir zum Glück ignorieren, uns interessieren nur die letzten Angaben je Zeile. Am Ende der ersten Zeile sollte YES stehen, dann war die Messung erfolgreich. Und am Ende der zweiten Zeile t=12345, eine fünfstellige Zahl – die Temperatur mit drei Nachkommazahlen. Den Wert müssen wir also durch 1000 teilen und mit maximal einer Nachkommastelle anzeigen, denn drei Nachkommastellen würden eine falsche Genauigkeit vorspiegeln. Die Genauigkeit des Sensors liegt bei ca. 0,5°C.

 Abbildung 6: Temperaturanzeige im Terminal

Diese Abfrage können wir selbstverständlich auch mit einem Python Programm automatisieren:

Abbildung 7: Bildschirmfoto des Programmcodes

Hier der Python Code:

#! /usr/bin/python3
# Temperaturmessung mit dem DS18B20
# Eindraht-Bus in der Konfiguration aktivieren, Neustart erforderlich
# Den gelben Draht an Pin 7 und über 4,7 kOhm an 3,3 V
# Den roten Draht an 3,3 V und den schwarzen Draht an Masse

# Modul time importieren
import time

# Eingabe des Unterverzeichnisses - ändern Sie den Namen hinter 28-
device_folder = '/sys/bus/w1/devices/28-0215812177ff'
device_file = device_folder + '/w1_slave'

# Selbst definierte Funktion, um die Sensordaten zu lesen
def read_temp_raw():
    f = open(device_file, 'r') # öffnet die Datei w1_slave im Unterverzeichnis
    lines = f.readlines() 
    f.close()
    return lines

# Selbst definierte Funktion, um die Sensordaten zu prüfen und umzuwandeln
def read_temp():
    lines = read_temp_raw() # ruft die eben definierte Funktion zum Lesen der Daten auf

    # Wenn die erste Zeil nicht+- 'YES' enthält, 0,2s warten
    # und die Daten erneut lesen
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()

    # Suchen der Zeichenfolge "t="
    equals_pos = lines[1].find('t=')

    # Wenn 't=' gefunden ist, Zahlenstring dahinter auslesen und umwandeln 
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

# Ausgabe der Temperatur im Sekundentakt
try:
    while True:
        print("Temperatur = ",round(read_temp(),1))
        time.sleep(1)
except KeyboardInterrupt:
    print("... und tschüß!")

Teile des Codes stammen aus dem CamJam EduKit 2, bei dem allerdings noch Schritte vorhanden sind, die heute nicht mehr nötig sind, seit der Eindraht-Bus in der Konfiguration aktiviert wird.

Soweit der Überblick über die Schnittstellen des Raspberry Pi, die wir als Zweitbelegung der GPIOs aktivieren können, sowie das Auslesen von Temperaturdaten am Eindraht-Bus. 

In der Fortsetzung werde ich den Schwerpunkt auf die SPI-Schnittstelle legen, an der wir die fehlenden analogen Eingänge am Raspberry Pi „nachrüsten“ können.


3 Kommentare

Bernd Albrecht

Bernd Albrecht

@ Ulrich: Ja, der Temperatursensor DS18B20 benötigt auch in der gekapselten Bauform den Pull-up-Widerstand. Zwei Anmerkungen: Wenn zwei oder mehr Sensoren parallel geschaltet werden, genügt dennoch ein Widerstand. Und es geht nichts kaputt, wenn man es ohne den Widerstand ausprobiert. Die Messungen sind nur nicht zuverlässig.

Ulrich

Ulrich

Schöner knackiger Artikel. Bevor ich es nachbaue noch eine Frage: muss der pull-up Widerstand auch für den fertig konfektionierten Temperatursensor beachtet werden, oder ist er da schon integriert?
Grüsse

Hans Schulz

Hans Schulz

Danke! Ich bin begeistert! Bitte weiter so!

Beste Grüße aus dem Allgäu

Hans

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert