===== 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