Raspberry Pi GPIO

Ein weiteres Project mit dem Raspberry Pi. Diesmal wird kein Aufsatz benutzt sondern Peripherie verkabelt. Wie der Raspberry Pi aufgesezt wird kann man in https://www.hs-augsburg.de/homes/sebkl/dva-bericht/sense-hat.html#raspberry-pi nachlesen.

Ultraschall Sensor

Hier wurde mit Hilfe des [HC-SR04] Ultraschall Distanz Moduls, die Distanz von einem Objekt vor dem Gerät in cm ausgegeben. Die Verkabelung sieht bei diesem Projekt wie folgt aus.

Abb.:Nr.1 Schaltung für das Projekt

Wie funktioniert nun das HC-SR04? Hierzu ist wichtig die Pins des Geräts zu beachten. VCC ist die benötigte Versorgungsspannung von 5V. Trig steht für Triggereingang, da dieser benötigt wird eine fallende Flanke für mindestens 10μs an das Modul zu senden. Echo steht für den Ausgang des Messergebnises. Dieses gibt das Messergebnis aus nachdem Trig das 40 kHz Signal ausgesendet hat.

Abb.:Nr.2 Der HC-SR04

Die Distanz Ermittlung funktionert indem das Modul ein Signal von 200μs schickt. Empfängt das Modul ein Echo innerhalb der nächsten 200ms so ändert sich der Ausgang, welcher nach Betätigung der Taktflanke auf High ist, auf Low.

Jetzt wird natürlich die gesamte Zeit zurückgegeben die das Signal hin und zurück gebraucht hat. Um nun eine Distanz auszugeben die zwischen Gerät und Objekt ist, muss gerrechnet werden. Die Schallgeschwindigkeit beträgt ungefähr 342m/s. Gibt uns nun das Echo eine Zeit von beispielsweise 400μs also 0,4ms zurück, so lässt sich die Distanz wie folgt berechnen. (343mm * 0,4ms) / 2 * 100 Das Ergebnis dieser Rechnung ergibt 6,8cm. In dem Code für das Programm sieht das dann so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def getDistance():
    GPIO.output(trigPin, GPIO.HIGH)
    Start = time.time()
    time.sleep(0.00001)
    GPIO.output(trigPin,GPIO.LOW)
    Stop = time.time()

    while GPIO.input(echoPin) == GPIO.LOW:
        Start = time.time()

    while GPIO.input(echoPin) == GPIO.HIGH:
        Stop = time.time()

    diff = Stop - Start

    distance = (diff * 343) / 2 * 100

    return distance

In dieser Funktion wird die Start und Stopzeit gemessen und abgespeichert. Dann wird die Stop Zeit von der Start Zeit abgezogen und das Ergebnis der Funktion getDistance zurückgegeben.

Das alles wird in einer Schleife zum Schluss immer wieder aufgerufen und der jeweilige Wert auf dem Terminal des Raspberry-Pi’s angezeit.

Video Nr.1 Funktion der Distanzmessung

Der gesamte Code kann unter https://r-n-d.informatik.hs-augsburg.de:8080/dvati/berichte-ws21/2/-/blob/main/RaspberryGPIO/soundmeter.py nachgelesen werden.

Bewegungssensor

In diesem Versuch soll gezeigt werden, wie mittels eines Sensors für Wärmestrahlung und eines Raspberry Pi ein Bewegungssensor implementiert werden kann. Die hierfür benötigten Komponenten sind:

  • Ein Raspberry Pi
  • Jumper - Kabel
  • Ein Wärmestrahlungs - Sensor (wie z.B. der [HC-SR501])
  • 1 x LED
  • 1 x Widerstand mit 220 Ohm

Der HC-SR501

Abb.:Nr.3 Der HC-SR501

Die Funktionsweise dieses Sensors beruht auf dem pyroelektrischen Effekt. Ein Kirstall im Inneren der weißen Kuppel stellt einen Dipol dar, bei welchem infolge auftreffender Wärmestrahlung aus der Umgebung mittels Ausdehung eine Änderung des Potentialmoments auftritt. Diese Änderung wird abgegriffen, wobei durch genannte Potentialänderung ein Stromfluss stattfindet, welcher sich messen lässt und somit als Signal für das Vorhandensein einer Wärmequelle dient. Die weiße Kuppel auf dem Sensor dient dabei der Bündelung der Wärmestrahlen, um die Sensivität des Sensors zu erhöhen. Durch die Verwendung von zwei Kristallen wird obendrein die Genauigkeit verbessert, da das „Rauschen“ aus dem Hintergrund somit besser von einer nahen Wärmequelle differenziert werden kann und es somit zu weniger Fehlalarmen kommt. Bei Detektion werden die Messwerte der beiden Kristalle in einer sogenannten Koparatorschaltung verglichen und bei poisitvem Ergebnis beider mittels des Signal - Pin (siehe Abbildung unten) der Wert 1 ausgegeben, welcher von einem angeschlossenen Gerät dann als Ereignis interpretiert und in einem Programm verwendet werden kann.

Abb.:Nr.4 Einstellmöglichkeiten des HC-SR501

Wie in der Abbildung oben zu sehen, gibt es diverse Möglichkeiten zum Einstellen des Sensors. Zum einen lässt sich seine Sensivität einstellen, d.h. auf welche Entfernung er bei Detektion von Wärme ein Signal ausgibt. Bei diesem Sensor ist eine Festlegung von 4 - 7 Meter möglich, dies kann mittels Drehung am vorhergesehenen Poti eingestellt werden. Weiterhin kann eingestellt werden, wie lange der Sensor im Falle einer Detektion das Signal an den OUTPUT - Pin gibt, was durch Drehung des anderen Potis erreicht wird. Schließlich kann mittels einer Brücke bestimmt werden, in welchem Modus sich der Sensor befindet. Hierbei hat man die Wahl zwischen einem Single - und einem Repeatable Trigger - Modus. Dies legt fest, ob der Sensor nach einer Detektion weiterhin auf Bewegung reagiert oder nicht. Beim Repeatable - Modus also wird bei jeder Bewegung das Signal für die mittels Poti eingestellte Zeit angezeigt, bei jeder weiteren Detektion wird diese jedoch wieder zurückgesetzt. Beim Single - Modus hingegen kann daher bei der Ausgabezeit keine Bewegung registriert werden.

Versuchsaufbau und Code

Zur Versuchsdurchführung muss zuallerserst der Sensor sowie die LED mit dem Raspberry Pi verkabelt werden. Dabei wird an einem 5 - Volt - Output des Pi’s der VCC Pin sowie am Ground des Pi’s der GND - Pin des Sensors angeschlossen. Den mittleresn, also den Data - Pin des Sensors, verdrahtet man mit einem beliebigen GPIO - Pin des Pi’s, hier wurde der 12. Pin des Boards (GPIO 18) gewählt. Nun schaltet man die LED in Reihe mit einem 220 - Ohm Widerstand und schließt die eine Seite an einem weiteren Ground des Pi und die andere an einem weiteren GPIO - Pin (hier GPIO 17) an.

Zuerst werden die hier verwendeten Bibliotheken eingebunden, Variablen für die verwendeten Pins angelegt sowie festgelegt, welche Pins OUTPUT generieren bzw. auf INPUT warten. Im Übrigen werden 2 Variablen, read und write, angelegt, welche für die spätere Programmlogik benötigt werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  import RPi.GPIO as GPIO
  import time
  import datetime

  GPIO.setmode(GPIO.BOARD)

  PIR_GPIO = 12
  LED_GPIO = 3
  BUZZER_GPIO = 40
  GPIO.setup(PIR_GPIO,GPIO.IN)
  GPIO.setup(LED_GPIO, GPIO.OUT)
  GPIO.setup(BUZZER_GPIO, GPIO.OUT)
  GPIO.output(LED_GPIO, 0)
  GPIO.output(BUZZER_GPIO, 0)

  data=0
  wait=0

Im Anschluss werden zwei while - Schleifen abgefragt. Die erste while-Schleife dient dabei zur Sicherstellung der Einsatzbereitschaft des Sensors, da dieser zu Programmstart keine Detektion anzeigen sollte. Denn bei Anlegen einer Spannung infolge der Ausführung des Python - Skripts kommt es unter Umständen zu Fehldetektionen. Anschließend wird eine Enlosschleife durchgeführt, welche zu Beginn den Wert ausliest, welcher vom Data - Pin des Sensors stammt. Ist dieser gleich 1, so wird eine Ausgabe im Terminal mit entsprechender Nachricht ausgegeben und die LED leuchtet für kurze Zeit auf. Ist hingegen der Wert 0 wird „Detektiere…“ ausgegeben. Die Variable wait in der Schleife stellt dabei sicher, dass diese Ausgabe nur einmal pro Detektionsvorgang ausgegeben wird.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  while GPIO.input(PIR_GPIO)==1:
    data=0
    print ("Detektiere...")

  while True:
    data=GPIO.input(PIR_GPIO)
    if data==1 and wait==0:
    print ("ALARM! %s: Detektion!" % datetime.datetime.now() )
    GPIO.output(LED_GPIO, 1)
    GPIO.output(BUZZER_GPIO, 1)
    wait=1

    elif data==0 and wait==1:
    GPIO.output(LED_GPIO, 0)
    GPIO.output(BUZZER_GPIO, 0)
    print ("Detektiere..." )
    wait=0

Der gesamte Code kann unter https://r-n-d.informatik.hs-augsburg.de:8080/dvati/berichte-ws21/2/-/blob/main/RaspberryGPIO/soundmeter.py nachgelesen werden.

Fazit

Ähnlich wie der Arduino, welcher Untersuchungsgegenstand der letzten Versuche war, ist es möglich die Pins des Raspberry zu nutzen, um Sensoren und Aktoren auszulesen und anzusprechen. Im Gegensatz zum Arduino jedoch ist es aufgrund der Bauweise als vollumfänglicher Ein - Platinen - Computer möglich, neben C++ auch in Python Skripte zu schreiben und mit diesen die Pins anzusprechen. Im Angesicht der rasant zunehmenden Popularität von Python stellt dies natürlich einen ernormen Vorzug gegenüber dem Arduino dar.

Literaturangaben

[HC-SR04]Anleitung und Datenblatt zum Modul (besucht am 22.11.21) https://www.mikrocontroller.net/attachment/218122/HC-SR04_ultraschallmodul_beschreibung_3.pdf
[HC-SR501]Anleitung und Datenblatt zum Modul (besucht am 23.11.21) https://wolles-elektronikkiste.de/hc-sr501-pir-bewegungsmelder