Gpiozero forritasafnið

Á Raspberry Pi tölvunni eru 40 pinnar sem nýtast vel til að tengja tölvuna við næruhverfi hennar. Sumir pinnanna hafa ákveðin hlutverk, eins og að gefa ákveðan spennu (annars vegar 3,3 V og hins vegar 5 V) en 26 pinnanna (merktir 2-17) eru svokallaðir GPIO pinnar en það stendur fyrir General Purpose Input/Output.

Þeir eru nefnilega gerðir til að geta tengst við alls kyns tæki og þá er hægt að skilgreina eftir hentugleika. Rétt nokkur varnaðarorð til að byrja með: Pinnana má nota til að gefa frá sér eða nema 3,3 V spennu en eru aðeins gefnir upp að þola 16 mA. Ef farið er yfir þetta er möguleiki á að skemma þann pinna.

Það er hægt að stýra og lesa af GPIO pinnunum með ýmsu móti í Python, en tvö forritasöfn eru sérstaklega gagnleg: RPi.GPIO og gpiozero. Þetta fyrra er eldra og er nokkuð hrátt. Notandinn þarf t.a.m. að skilgreina hvort pinnar séu í úttaks- eða inntaksham og kanna hvort inntakspinnar séu háir og lágir. Gpiozero er nýrra og býr yfir ýmissi virkni sem einfaldar notandanum lífið talsvert.

Fyrstu skref

Gpiozero er vel skjalað með góðum leiðbeiningum um það hvernig einföld verkefni eru sett saman. Þau ættu að duga sem einföld grunnskref fyrir flóknari verkefni. Hér fyrir neðan eru íslenskir útdrættir á nokkrum þeirra.

Ljóstvistur

Ljóstvistinn þarf að tengja við númeraðan GPIO pinna á Raspberry Pi tölvunni og í gegnum viðnám við jörð. Hægt er að stýra honum með því að kveikja á honum og af, eða með því að stýra styrk hans með púlsvíddarmótun (e. PWM, Pulse Width Modulation):

from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

Ef þú vilt stýra ljósstyrknum er hægt að nota púlsvíddarmótunina (PWM):

from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)

while True:
    led.value = 0  # off
    sleep(1)
    led.value = 0.5  # half brightness
    sleep(1)
    led.value = 1  # full brightness
    sleep(1)

Hnappur

Þú getur tengt hnapp við GPIO pinna til þess að hafa áhrif á forritið þitt. Til dæmis með því að láta það bíða eftir að smellt sé á hnapp eða hlusta eftir hnappsmellum. Prufaðu að tengja hnapp eins og myndin sýnnir og keyrðu kóðann að neðan.

from gpiozero import Button

button = Button(2)

while True:
    if button.is_pressed:
        print("Button is pressed")
    else:
        print("Button is not pressed")

Þú getur svo breytt forritinu til þess að stýra ljósaperu með því að nota skipanirnar úr ljóstvistaforritinunum hér að ofan.

Haldið lengra

Við höfum nú séð nokkur mikilvæg verkfæri forritunar: while-lykkjur og skilyrðissetningar (if-else). Fleiri gagnleg sem við munum kynnast eru: for-lykkjur, föll og klasar. Skoðum föllin fyrst.

Föll eru gagnleg til þess að einfalda kóða með því að búa til nýja skipun sem jafngildir skipunum sem koma oft fyrir í forritinu okkar. Til dæmis ef við erum oft að blikka ljósi þrisvar eða ætlum að búa til forrit sem tekur inn bókstaf og blikkar ljósi í samræmi við mors-kóða bókstafsins.

from gpiozero import LED
from time import sleep

led = LED(17)

def blikka_thrisvar():
    led.on()
    sleep(1)
    led.off()
    sleep(1)
    led.on()
    sleep(1)
    led.off()
    sleep(1)
    led.on()
    sleep(1)
    led.off()
    sleep(1)

Athugum að við getum einfaldað þennan kóða umtalsvert. Annars vegar getum við búið til annað fall sem inniheldur eitt blikk og endurtekið það þrisvar:

from gpiozero import LED
from time import sleep

led = LED(17)

def blikka():
    led.on()
    sleep(1)
    led.off()
    sleep(1)

def blikka_thrisvar():
    blikka()
    blikka()
    blikka()

Eða með því að nota for-lykkju:

from gpiozero import LED
from time import sleep

led = LED(17)

def blikka_thrisvar():
    for i in range(3):
        led.on()
        sleep(1)
        led.off()
        sleep(1)

Föll eru ákaflega gangleg fyrirbæri og því eru forritasöfn (eins og gpiozero, time, math og fleiri) full af gagnlegum föllum. Til dæmis er gpiozero með föll fyrir ljóstvista sem koma ís staðinn fyrir algengar aðgerðir:

from gpiozero import LED
from time import sleep

led = LED(17)

def blikka_thrisvar(lengd):
    led.blink(n=3,on_time=lengd,off_time=lengd)

blikka_thrisvar(0.5)

Ítarefni