Sensoren und Aktoren mit Raspberry Pi

(siehe: Setup des RPi)
(siehe: Anschlüsse des RPi)

Verwendete Bauteile

LED

An den Ausgängen des RPi liegt eine Spannung von 3,3V an. Wenn über der LED eine Spannung von 2V abfällt, muss gemäß der Maschenregel über dem Widerstand eine Spannung von 1,3V abfallen. Geht man von 15mA Stromfluss in der LED aus, erhält man folgenden Vorwiderstandswert:
R = U / I = 1,3V / 0,015 A = 86 Ω
Hier wird ein 100Ω-Widerstand aus der E6-Normreihe verwendet.

Aufbau

Anschluss einer LED mit dem Raspberry Pi

Code

Das folgende Python-Script (led_blink.py) lässt die LED mit einer Frequenz von 0,5s blinken.

#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

LED_PIN = 27
BLINK_INTERVAL = 500   # in milliseconds

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)

while True:
  GPIO.output(LED_PIN, True)
  time.sleep(BLINK_INTERVAL/1000.0)
  GPIO.output(LED_PIN, False)
  time.sleep(BLINK_INTERVAL/1000.0)

Führt man das Script nun aus, fängt die LED an zu blinken:
sudo python led_blink.py

Mikrotaster (Button)

Aufbau

siehe: Ausschalter für Raspberry Pi

Code

#! /usr/bin/env python

import RPi.GPIO as GPIO
import time

PIN_BUTTON = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    input_state = GPIO.input(PIN_BUTTON)
    if input_state == False:
        print('Button Pressed')
        time.sleep(0.2)

Temperatur-Sensor DHT22

Aufbau

Anschluss eines DHT22-Moduls mit dem Raspberry Pi

Code

Zunächst wird die Adafruit-DHT-Library für Python installiert und verwendet:
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python setup.py install

Alternativ kann die Library auch mit pip installiert werden:
sudo apt-get install python-pip
sudo python -m pip install --upgrade pip setuptools wheel
sudo pip install Adafruit_DHT

#!/usr/bin/python

import Adafruit_DHT
import time

PIN_DHT22 = 4    # GPIO4

while True:
    humidity, temperature = Adafruit_DHT.read_retry(Adafruit_DHT.DHT22, PIN_DHT22)
    if humidity is not None and temperature is not None:
        print('Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity))
    else:
        print('Failed to get reading. Try again!')
    time.sleep(1)
Ausgabe des DHT22-Programms in der Konsole
Abb.: Ausgabe des DHT22-Programms in der Konsole

Fotowiderstand LDR (GL55xx)

Aufbau

Der GL55xx ist ein analoger Sensor, der nicht nur HIGH und LOW kennt. Da aber der RPi keinen eingebauten ADC (Analog-Digital-Converter) besitzt, müssen man entweder einen ADC (z.B. den MCP3008) verwenden oder sich mit einem Trick behelfen: ein Keramik-Kondensator (hier: 1µF).

Anschluss eines LDR mit dem Raspberry Pi

Code

Der Kondensator lädt sich über die Zeit auf und erreicht irgendwann eine Spannung über 2V, was für den RPi einen Übergang von LOW nach HIGH am GPIO27 bedeutet.
Der Widerstand im LDR ändert sich je nach den Lichtverhältnissen und damit lädt sich auch der Kondensator langsamer oder schneller auf und benötigt somit mehr Zeit, um ein HIGH am GPIO27 zu erreichen, d.h. das folgende Skript misst die Zeit, wie lange sich der Kondensator auflädt, um den Widerstand des LDR zu ermitteln.

#!/usr/bin/python

import RPi.GPIO as GPIO
import time

PIN_M = 17
PIN_T = 27

GPIO.setmode(GPIO.BCM)
capacity = 0.000001
adj = 2.130620985
i = 0
t = 0

while True:
    GPIO.setup(PIN_M, GPIO.OUT)
    GPIO.setup(PIN_T, GPIO.OUT)
    GPIO.output(PIN_M, False)
    GPIO.output(PIN_T, False)
    time.sleep(0.2)
    GPIO.setup(PIN_M, GPIO.IN)
    time.sleep(0.2)

    GPIO.output(PIN_T, True)
    starttime = time.time()
    endtime = time.time()
    while (GPIO.input(PIN_M) == GPIO.LOW):
        endtime = time.time()
    timeDiff = endtime-starttime

    res = (timeDiff/capacity)*adj
    i = i + 1
    t = t + res
    if i==10:
        t = t/i
        print(t)
        i = 0
        t = 0

Servo-Motor

Aufbau

Anschluss eines Servo-Motors mit dem Raspberry Pi

Code

Das folgende Python-Script initialisiert den Servo-Motor mit 50Hz der PWM am GPIO-Pin 18. Dann legt man eine Anfangsspannung von 2,5V fest. In der While-Schleife werden nacheinander 7,5, 12,5 und dann 2,5 als DutyCycle für die Ausrichtung des Motors festgelegt. (hier entsprechen 2,5 = 0°, 7,5 = 90° und 12,5 = 180°).

#!/usr/bin/python

import RPi.GPIO as GPIO
import time

PIN_SERVO = 18   # =GPIO18

GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN_SERVO, GPIO.OUT)

servo = GPIO.PWM(PIN_SERVO, 50)
servo.start(2.5)

try:
  while True:
    servo.ChangeDutyCycle(7.5)
    time.sleep(1)
    servo.ChangeDutyCycle(12.5)
    time.sleep(1)
    servo.ChangeDutyCycle(2.5)
    time.sleep(1)
except KeyboardInterrupt:
    servo.stop()
zurück