Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspberry:raspberry_gpio_first_steps

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
raspberry:raspberry_gpio_first_steps [2015/02/02 09:46] gpipperrraspberry:raspberry_gpio_first_steps [2015/02/02 20:14] (aktuell) – [Eine LED ein und ausschalten über einen Taster] gpipperr
Zeile 1: Zeile 1:
 +===== 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 ====
 +
 +
 +<code bash>
 +
 +cat /sys/class/gpio/gpiochip0/ngpio
 +
 +54
 +
 +</code>
 +
 +
 +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:
 +<code bash>
 +
 +yum install python-setuptools
 +easy_install -U RPIO
 +
 +</code>
 +
 +
 +
 +Dokumentation: http://pythonhosted.org/RPIO/ 
 +Oder:
 +<code python>
 +import RPIO
 +help(RPIO)
 +</code>
 +
 +== 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. <fc #008000>GPIO 27</fc> => PIN 13 => Wert lautet <fc #800000>13</fc>
 +  * **GPIO.BCM**   => GPIO Port Nr => <fc #008080>GPIO 27</fc> => Wert lautet <fc #800000>27</fc>
 +
 +
 +=== 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:
 +<code python>
 +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()
 +
 +</code>
 +
 +=== 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):
 +<code python>
 +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()
 +
 +</code>
 +
 +
 +==Interrupt Methode verwenden:==
 +Lösung 2 – Interrupt setzen:
 +<code python>
 +
 +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()
 +
 +</code>
 +
 +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
 +
  
raspberry/raspberry_gpio_first_steps.txt · Zuletzt geändert: 2015/02/02 20:14 von gpipperr