===== Raspberry Pi Model B - GPIO Port einsetzen - erste Schritte =====
** Raspberry Pi Model B – Pidora Linux**\\
Als OS verwende ich die die Pidora Distribution, (siehe auch [[raspberry:pidora_quick_install|Pidora als Linux Betriebsystem für den Raspberry PI]].
Daher gegeben sich anscheinend kleinere Unterschied in Pfaden wie zum Beispiel im /sys .
==== Pin Belegung ====
Pin Belegung im Detail => http://elinux.org/RPi_Low-level_peripherals
Gesamtanzahl aller GPIO Pins (nur 17 davon können genützt werden):
{{ :raspberry:raspberry_gpio_v01.png?600 | GPIO Ports Raspberry Pi B - Revision 2}}
Pro Output Port können maximal 16mA, alle Pins zusammen höchstens 51mA Strom fließen.
Siehe auch: http://www.thebox.myzen.co.uk/Raspberry/Understanding_Outputs.html
====Abfragen der Ports über /sys ====
cat /sys/class/gpio/gpiochip0/ngpio
54
Mit dem Kommando "gpio" lassen sich die GPIO Ports direkt ansprechen
==== Abfrage mit Python mit RPIO ===
Library:
* https://pypi.python.org/pypi/RPIO
Installation über:
yum install python-setuptools
easy_install -U RPIO
Dokumentation: http://pythonhosted.org/RPIO/
Oder:
import RPIO
help(RPIO)
== Benennung der GPIO Ports in der Library ==
Für die Benennung der GPIO Ports stehen zwei Methoden zur Verfügung:
* **GPIO.BOARD** => PIN Nummer auf dem Board d.h. GPIO 27 => PIN 13 => Wert lautet 13
* **GPIO.BCM** => GPIO Port Nr => GPIO 27 => Wert lautet 27
=== Eine LED blinken lassen ===
Ziel: LED über eine GPIO Port blinken lassen
Schaltung:
* Pin 6 - Ground (-) - Widerstand 1KOhm
* Pin 15 - (+) der LED
{{ :raspberry:raspberry_gpio_led_first_example_v01.png?400 | Raspberry Pi GPIO - LED leuchtet bei HIGH}}
Wird der GPIO Port auf HIGH gesetzt, liegen 3,3 V an den Port an, die LED leuchtet.
Das „Hello Word“ beim der GPIO Programmierung:
import RPIO
import time
# supress warning
RPIO.setwarnings(False)
# Which RPIO Numbering you like to use
RPIO.setmode(RPIO.BCM)
# My RPIO PORTs
# OUT
out_port=27
RPIO.setup(out_port,RPIO.OUT)
#Frist Blink
for i in range(0,10):
#set the out port to HIGH
#LED ON
RPIO.gpio_function(out_port)
RPIO.output(out_port,RPIO.HIGH)
#wait a short moment
time.sleep(2)
#set the out port to LOW again
# LED OFF
RPIO.output(out_port,RPIO.LOW)
RPIO.gpio_function(out_port)
time.sleep(2)
# Clean up
RPIO.cleanup()
=== Eine LED ein und ausschalten über einen Taster===
Über einen Taster kann einen LED an- und ausgeschaltet werden.
Über einen Pull-down Widerstand wird der Pin 11 - GPIO 17 definiert auf Masse (= LOW ) gezogen. Wird der Schalter S1 betätigt, wird ein positives Potential auf den Pin 11 gelegt, der GPIO 17 wird als HIGH erkannt.
{{ :raspberry:raspberry_gpio_led_first_example_v02.png?400 |Raspberry Pi GPIO - LED leuchtet bei gedrückten Schalter }}
==Polling==
Lösung 1 - GPIO Port 17 Zustand prüfen und Out Port GPIO 27 auf HIGH setzen (LED leuchtet), dies ständig abfragen(pollen):
import RPIO
import time
# supress warning
RPIO.setwarnings(False)
# Which RPIO Numbering you like to use
RPIO.setmode(RPIO.BCM)
# My RPIO PORTs
# OUT
out_port=27
RPIO.setup(out_port,RPIO.OUT)
# IN Port with the Switch
in_port=17
RPIO.setup(in_port,RPIO.IN)
#endless loop
run=True
push_count=0
while run :
#if Switch is pushed set Output HIGH
if (RPIO.input(in_port)):
push_count+=1
RPIO.output(out_port,RPIO.HIGH)
#If not pushed set Output LOW
else:
RPIO.output(out_port,RPIO.LOW)
# Print status
print "Port 17 => {0:5} :: Button pressed:: {1} ".format(str(RPIO.input(in_port)), push_count)
time.sleep(2)
# end after 10 pushs
if (push_count > 10):
run=False
# Clean up
RPIO.cleanup()
==Interrupt Methode verwenden:==
Lösung 2 – Interrupt setzen:
import RPIO
import time
import signal
#globals
push_count=0
push_state=0
run=True
#define the interrupt function
def SetLed(gpio_id,val):
global push_count
push_count+=1
global push_state
if (push_state==0):
push_state=1
RPIO.output(out_port,RPIO.HIGH)
else:
RPIO.output(out_port,RPIO.LOW)
push_state=0
print "Port 17 => {0:5} :: Button pressed:: {1} ".format(str(push_state), push_count)
print "GPIO port {} :: Value :: {}".format(gpio_id, val)
# end after 10 pushs
if (push_count > 10):
clean_exit()
# Clean exit!
def clean_exit():
global run
RPIO.output(out_port,RPIO.LOW)
run=False
exit()
#define the handler if the program is stopped with ^c
def handler(signum, frame):
print "Catch Error {} - frame :: {}".format(signum,frame)
clean_exit()
# register the signal handler
signal.signal(signal.SIGINT, handler)
# supress warning
RPIO.setwarnings(False)
# Which RPIO Numbering you like to use
RPIO.setmode(RPIO.BCM)
# My RPIO PORTs
# OUT
out_port=27
RPIO.setup(out_port,RPIO.OUT)
# IN Port with the Switch
in_port=17
RPIO.setup(in_port,RPIO.IN)
# register the Interrupt
# RPIO.add_interrupt_callback(gpio_id, callback, edge='both', pull_up_down=RPIO.PUD_OFF, threaded_callback=False, debounce_timeout_ms=None)
RPIO.add_interrupt_callback(gpio_id=in_port,callback=SetLed, edge='rising', pull_up_down=RPIO.PUD_OFF, debounce_timeout_ms=25)
# Non Blocking wait (own Thread will do the interrupt handling)
RPIO.wait_for_interrupts(threaded=True)
#Do something others
while run:
print "I'm in a loop and doing other things"
time.sleep(2)
# Clean up
RPIO.cleanup()
In diesen Beispiel soll bei jeden Tastendruck (Pegelwechsel von LOW nach HIGH) ( edge='rising' ) die Interrupt Funktion aufgerufen werden.
Der Tastendruck schaltet die LED ein oder aus, je nachdem wie zuvor der Status war ( Variable push_stat ), nach 10 Tastendrücken wird beendet.
Programm wartet bis der Interrupt eintrifft und führt dann die definierte Funktion durch.
Damit aber das Programm währenddessen etwas anders tun kann, ist bei "RPIO.wait_for_interrupts(threaded=True)" das "threaded=True" gesetzt.
Die while Schleife wird ausgeführt und gleichzeitig kann der Interrupt empfangen werden.
Damit beim Beenden auch ein sauberer Zustand definiert wird, wird mit "clean_exit(): RPIO.output(out_port,RPIO.LOW)" die LED ausgeschaltet.
Damit aber das Programm auch sauber wieder stoppt, muss die Schleife explizit beendet werden (daher in der Clean Exit Funktion run auf false!, sonst wird nur der Interrupt Thread beendet!).
Wird das Script mit "^C" unterbrochen, sorgt der Signal Handler dafür den beim Exit des Programmes auch die Clean Exit Funktion aufgerufen wird.
siehe auch => http://pythonhosted.org/RPIO/rpio_py.html?highlight=dd_interrupt_callback#RPIO.add_interrupt_callback
==== Quellen ====
Siehe auch:
* http://www.fhemwiki.de/wiki/Raspberry_Pi:_GPIOs_schalten
* http://luketopia.net/2013/07/28/raspberry-pi-gpio-via-the-shell/
* http://log.liminastudio.com/writing/tutorials/tutorial-how-to-use-your-raspberry-pi-like-an-arduino
* https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/
Hardware:
* http://www.thebox.myzen.co.uk/Raspberry/Buffer_Board.html
Scratch Raspberry Pi control:
* http://www.pridopia.co.uk/rs-pi-set-scratch.html