LEDs aansturen met de Raspberry Pi GPIO pins

Met deze notebook zullen we de General Purpose Input/Output (GPIO) pinnen op de Raspberry Pi gebruiken om een LED lampje te laten branden.

GPIO pinnen zijn de 40 (genummerde) pinnen tegenover de HDMI aansluiting waarop verbindingsdraden aangesloten kunnen worden.

Daarvoor moeten we echter een manier afspreken met de Raspberry Pi om de verschillende pinnen van mekaar te onderscheiden en dat doen we als volgt met de functie setmode.

IPython Instructies:

Plaats je cursor in de cel hieronder en druk Shift+Enter of klik op de Play knop in de menubalk bovenaan om de code in de cel uit te voeren

  • Shift + Enter: Voer de cel uit en spring naar de volgende cel
  • Ctrl + Enter: Voer de cel uit, maar blijf op de huidige cel staan
  • Alt + Enter: Voer de cel uit en maak een nieuwe cel aan

Zolang er een [*] staat links van de cel is de code nog aan het lopen. Zodra de code beëindigd is, komt er een volgnummmer en wordt eventuele output uitgeprint onder de cel


In [ ]:
#GPIO bibliotheek inladen
import RPi.GPIO as GPIO
#BCM (Broadcom) modus instellen voor het nummeren van de pins
GPIO.setmode(GPIO.BCM)

BCM is de nummering die gegraveerd is op de Raspberry Pi case die we gebruiken en die ook op het afgedrukte Pinout schema terug te vinden is.

Opgelet: een LED is een diode en het is dus belangrijk om de stroom er in de juiste richting door te sturen. Het verschil tussen de korte en lange aansluiting van de LED is dus van belang.

Het lange eind verbinden we met GPIO18 op de Pi. Maar om te vermijden dat de LED (en bijgevolg de Pi misschien ook) teveel stroom te verwerken krijgt, moeten we nog een resistor in serie met de LED plaatsen.

Volg de illustratie -en let op dat je een resistor met lage waarde gebruikt, zoals 220-360 Ohm-:

En dan moeten we de Raspberry Pi enkel nog vertellen dat we pin GPIO18 graag zouden gebruiken als output, zodat we de spanning op die pin kunnen wijzigen.


In [ ]:
# Als we een variabele maken met de naam PIN en de waarde 18, kunnen we deze overal gebruiken en
# toch makkelijk wijzigen als de LED naar een andere pin verplaatst wordt.
PIN = 18

# pin instellen als output
GPIO.setup(PIN, GPIO.OUT)

Nu alle GPIO instellingen gebeurd zijn, kunnen we pin 18 aan het werk zetten.

Hiervoor laden we eerst de time bibliotheek in, die tijdsgerelateerde functionaliteit beschikbaar maakt: time.sleep(x) is een functie die de computer vertelt dat hij x aantal seconden moet wachten voor hij verder gaat met de volgende instructie.


In [ ]:
import time

# Eeuwig loopen (herhalen)
while True:
    # pin 18 uitschakelen
    GPIO.output(PIN, 0)
    # halve seconde wachten
    time.sleep(.5)
    # pin 18 weer inschakelen
    GPIO.output(PIN, 1)
    # halve seconde wachten
    time.sleep(.5)
    #... en opnieuw ...

Nota: Om de code te onderbreken kan je:

  • in de menubalk op de stop knop drukken
  • in het menu bovenaan Kernel > Interrupt kiezen
  • een keyboard shortcut gebruiken door tweemaal i te typen (enkel terwijl de cel zich in command modus (grijs rand) bevindt.

Pulse Width Modulation

Nu kunnen we binaire commando's sturen ("aan" en "uit"), maar de GPIO bibliotheek laat ons ook toe om een gesimuleerd analoog signaal te sturen, ook wel PWM genoemd. Dit bestaat erin om snel af te wisselen tussen aan en uit signalen en de verhouding tussen de totale "aan" en de totale "uit" tijd te gebruiken om een analoog niveau tussen 0 en 1 te simuleren.

bvb 75% van de tijd "aan" == een duty cycle van 75% == een analoog signaal van 75% van de maximale amplitude

In het geval van een LED uit zich dat in het feller of zwakker schijnen van de LED, in het geval van een motor kan het geïnterpreteerd worden als een beoogde snelheid of stand van de as.


In [ ]:
#reset the GPIO
PIN = 18
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)

In [ ]:
# PWM frequentie instellen in Hz (cycles per seconde)
led = GPIO.PWM(PIN, 60)

# Starten met PWM
led.start(0)

try:
    while True:
        # duty cycle telkens met 1% verhogen
        for dc in range(0, 101, 1):
            led.ChangeDutyCycle(dc)
            time.sleep(0.05)
        # en weer omlaag ...
        for dc in range(100, -1, -1):
            led.ChangeDutyCycle(dc)
            time.sleep(0.05)
except KeyboardInterrupt:
    pass
led.stop()

In [ ]:
GPIO.cleanup()