Benutzer-Werkzeuge

Webseiten-Werkzeuge


raspberry:raspberry_gpio_first_steps

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 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):

 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:

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

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
raspberry/raspberry_gpio_first_steps.txt · Zuletzt geändert: 2015/02/02 20:14 von Gunther Pippèrr