Quelle: https://docs.microsoft.com/en-us/windows/iot-core/media/pinmappingsrpi/rp2_pinout.png
Pin Belegung

Grundlagen zur Steuerung von GPIO Pins. Alle Code-Beispiele sind in Python geschrieben.

Grundlagen

Zu Beginn muss die bei RaspberryPi bereits vorinstallierte Python Bibliothek importiert werden:

import RPi.GPIO as GPIO

Nun werden verschieden Beispiele gegeben.

Auswählen der PIN Nummerierung/Bezeichnung. Beispiel der GPIO 4 soll Angesteuert werden. Dieser ist auf den physikalischen PIN 7

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD) # Setzen der Bezeichnung
GPIO.setup(7, GPIO.OUT) # Pin7, GPIO 4 wird als Ausgang deklariert
GPIO.output(7, GPIO.HIGH) # Schalte Ausgang auf HIGH => z.B. LED leuchtet

 Alternativ:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
GPIO.output(4, GPIO.HIGH) # Schalte Ausgang auf HIGH => z.B. LED leuchtet

Es sollte nach jedem Programm auch immer wieder Aufgeräumt werden, damit alle PINS in einen definierten Zustand wieder zurückgesetzt werden.

GPIO.cleanup()

Einlesen:

Analog funktioniert das Einlesen der GPIO's

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.IN) # GPIO 4, Pin 7 wird als Eingang deklariert
in_value = GPIO.input(4) # Frage ab
print (in_value) # gebe aus

Um eindeutige Ergebnisse beim Einlesen zu erhalten, ist es häufig notwendig einen Pulldown oder Pullup Widerstand zu verwenden. Diese können auf dem RaspberryPi auch per Software dazugeschaltet werden.

#Beispiel an GPIO 4, natuerlich nur EINE Zeile/Anweisung verwenden!

# Pulldown-Widerstand (gegen Masse)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)

#Alternativ

# Pullup-Widerstand (gegen + 3,3 V)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_UP)

PWM-Steuerung

 Zusätzlich kann jeder GPIO auch mit einer PWM (Puls-Weiten-Modulation) versehen werden.

GPIO.setmode(GPIO.BCM)
# Erzeuge eine Instanz für die PWM Steuerung
#p = GPIO.PWM(channel, frequency)
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50

Zum Verständnis wird nun ein bisschen damit mal gespielt und jeder Befehl etwas ausführlich Erläutert. Leider muss dafür etwas Mathematik her.

Bei der PWM Steuerung können 2 Werte Manipuliert werden:

Frequenz: z.B. 50 Hz => 1 sec/50Hz = 20ms Periodendauer

Abtastrate: zischen 0% und 100%, 50% bie 20ms Periodendauer, würde also ein HIGH Pegel von 10 ms und LOW Pegel für 10ms verursachen.

LED-Steuern mit PWM:

Beispiel eine LED  Ihrer Leuchtkraft kontrollieren mit PWM:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50
pwm.start(50)

try:
  while True:
    time.sleep(2.0) # Warte 2 sekunden
    p.ChangeDutyCycle(10.0) # ändere auf 10% leuchtkraft
    time.sleep(2.0) # Warte 2 sekunden
    p.ChangeDutyCycle(80.0) # ändere auf 80% leuchtkraft
    time.sleep(2.0) # Warte 2 sekunden
    pwm.ChangeFrequency(10.0) # ändern der Frequenz, hat in diesem fall keine Auswirkung auf die LED, da das verhänis von LOW und HIGH gleich bleibt.
    time.sleep(2.0) # Warte 2 sekunden

#Abbruch mit STRG (CTRL) + 'C'
except KeyboardInterrupt:
  pwm.stop()
  GPIO.cleanup()



 Servo Steuern mit PWM

Beispiel Servo-Steuerung, etwas Anpruchsvoller:

Aus den Datenblatt lassen sich folgende Daten herauslesen:

Arbeitswinkel: 180° (500 - 2500 μsec)
Neutralposition: 1500 μsec

Es soll eine Standard Frequenz von 50Hz verwendet werden. Daraus resultiert nun die prozentuale Abtastrate um den Servo in seine verschiedene Positionen zu bringen.

Berechnen der Min und Max Werte:

Min = 500 μsec => 0,5 ms
Frequenz 50 Hz => 20 ms Periodendauer
MinValue = 0,5 / 20 = 0,025 * 100% = 2,5

Max = 2500 μsec => 2,5 ms
Frequenz 50 Hz => 20 ms Periodendauer
MaxValue = 2,5 / 20 = 0,125 * 100% = 12,5

Neutralposition: 1500 μsec => 7,5

Programmcode: Der Servo soll auf 0°, danach auf 180° Bewegt und zum Schluss in die Neutralposition gebracht werden, 90°.

 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM) # Setzen der Bezeichnung
GPIO.setup(4, GPIO.OUT) # GPIO 4, Pin 7 wird als Ausgang deklariert
p = GPIO.PWM(4, 50) #GPIO 4 mit Frequenz 50
pwm.start(7.5) # Neutral Position

try:
  while True:
    time.sleep(2.0) # Warte 2 sekunden
    p.ChangeDutyCycle(2.5) # 0 Grad
    time.sleep(2.0) # Warte 2 sekunden
    p.ChangeDutyCycle(12.5) # 180 Grad
    time.sleep(2.0) # Warte 2 sekunden
    p.ChangeDutyCycle(7.5) # 90 Grad
    time.sleep(2.0) # Warte 2 sekunden

#Abbruch mit STRG (CTRL) + 'C'
except KeyboardInterrupt:
  pwm.stop()
  GPIO.cleanup()

 

Anmerkung: Sehr Praktisch ist, das auch damit die Ausgangsspannung für analoge Verbraucher im Prinzip kontrolliert werden kann. Dabei wird die Trägheit Ausgenutzt, welche dafür sorgt, das durch das steuern der HIGH und LOW Phasen eine mittlere Spannung erzeugt wird.