Raspberry PI (RPi) je majhen in priročen, vendar čisto pravi računalnik. Kar težko je verjeti, da je bilo mogoče na tako majhno ploščico tiskanega vezja (85 x 55 mm) vgraditi prav vse, kar računalnik potrebuje za svoje delovanje. Osnova operacijskega sistema je Linux in vse njegove izpeljanke so prirejene tudi za delovanje na RPi. Najprimernejši je Raspbian, izpeljanka Debiana, odvisno od naših potreb pa lahko naložimo tudi operacijske sisteme na primer Pidora remix ali RaspBMC.
Avtor: Bojan Kovač
Na RPi imamo tudi možnost priključitve vhodno-izhodnih funkcij, posamezni priključki so vhodi, drugi izhodi, na razpolago pa imamo tudi serijsko komunikacijo prek UART-a in prek USB vodila. RPi se skratka lahko poveže z našo aplikacijo na različne načine in z njo komunicira. Sam zase lahko deluje kot krmilnik, lahko pa je tudi le vgrajen sistem, ki deluje kot vhodno-izhodna enota nekega večjega sistema, s čimer ga razbremenimo na primer prikazovanja na ekranu ali zajemanja vnosa s tipkovnice. Omeniti velja, da z njim uporabljamo običajne USB naprave, spominske ključke, miške in tipkovnice, ki jih je vsepovsod dovolj in jih lahko najdemo tudi s cenami pod 10 EUR.
Ta vsebina je samo za naročnike
Podrobno in nekoliko bolj profesionalno obvladovanje periferije je v svojih člankih opisal kolega Simon Fabčič, jaz pa bi temu dodal le še preprosto upravljanje z digitalnimi vhodi in izhodi prek priljubljenega grafičnega programskega »jezika« Scratch, kjer lahko vizualno, z grafičnimi simboli ustvarimo programe in jih v tem okolju tudi preizkusimo. Namen tega programa je bil od vsega začetka vzbuditi željo po ustvarjanju, prikazati programiranje kot zanimivo izkušnjo in del igre ter osvojiti način razmišljanja, ki ga potrebujemo za programiranje. Vse je prepuščeno nam in našim zmožnostim: začetniki bodo začeli s preprostejšimi primeri, naprednejše pa bo želja po nekem bolj dovršenem izdelku najbrž zapeljala v zelo zapletena prepletanja množice podprogramov.
Strojna oprema
Elektroniku je zelo pomembno, da ima na razpolago priključke, prek katerih njegov program komunicira z zunanjim svetom. Avtorji strojne opreme RPi so to očitno vedeli (najbrž lastne izkušnje..!) in pripravili razširitveni konektor s 26 priključki, prek katerega imamo do procesnega jedra dostop z zunanjega sveta, programska oprema pa skrbi za to, da se v odvisnosti od procesnih parametrov rezultati lahko odražajo tudi na izhodnih priključkih tega konektorja.
Vgrajeni mikrokontroler pa je izjemno občutljiv in že na začetku moram poudariti, da je treba vhode in izhode, ki so dostopni na tem konektorju, uporabljati »po pameti« in jih čim bolj zaščititi, saj vodijo neposredno na mikrokontroler, katerega lahko celo najmanjša neprevidnost v najslabšem primeru tudi uniči.
Za vhode RPi je značilno, da »lebdijo« v zraku in sami po sebi nimajo nekega določenega logičnega nivoja, zato jim »osnovni« nivo zagotovimo prek (šibkega) pull-up ali pull-down upora, recimo 10 kΩ. S tem zagotovimo začetni logični nivo vhoda, tudi če nanj nismo ničesar priključili. Pomembno je, da jih na priključke povezujemo prek zaščitnih uporov in ne neposredno na napajanje (GND ali Vcc). Potem z vhodnim serijskim uporom zagotovimo, da v nobenem primeru ne bo mogel teči večji tok, kot ga zmorejo dati posamezni izhodi RPi (največ 16 mA). Pri napajanju s 3,3 V je to 206 Ω ali prva naslednja standardna vrednost 220 Ω. Zakaj moramo biti tako previdni?
Recimo, da tipko povežemo zaporedno s pull-up uporom proti masi. Če jo pritisnemo, bomo na vhodu GPIO priključka lahko prebrali nizek logični nivo, sicer pa bo zaradi pull-up upora visok.
Če bi v programu nastavili nek, sicer vhodni priključek, da bi deloval kot izhodni (kar lahko naredimo že z zelo preprostim ukazom), bi v primeru, ko bi bila tipka pritisnjena in bi istočasno postavili izhodni priključek v stanje z visokim logičnim nivojem (Vcc), povzročili kratek stik med Vcc napajanjem (katerega vir je v notranjosti mikrokontrolerja) in maso (GND), kar bi v trenutku uničilo vsaj izhodni priključek, najverjetneje pa celotna V/I vrata ali celo sam mikrokontroler. Če pa z zaščitnim serijskim uporom (v shemi na sliki 2 je označen z R2) morebitni izhodni tok omejimo, se to ne more zgoditi.
Pri izhodih RPi, ki so dostopni na GPIO konektorju je pomembno tudi to, da poleg omejitve izhodnega toka na izhodnih priključkih preprečimo tudi inverzno napetost na posameznem priključku, ki prav tako lahko povzroči nepopravljivo škodo. Sicer pa je vse našteto tako že »klasika« načrtovanja elektronskih vezij s polprevodniki, ki jo moramo imeti vedno v mislih, ko priključujemo nanje naprave »zunanjega sveta«.
Ker je napajalna napetost 3,3 V, je na nobenem priključku ne smemo prekoračiti. Zagotoviti je treba, da logični nivoji ostanejo znotraj meja, ki jih dovoljuje vgrajeni mikrokontroler (ARM 11).
Najprimernejši način za zagotavljanje ustreznih nivojev je, da uporabimo kar napajalno napetost 3,3 V, ki je dostopna na razširitvenem konektorju RPi s 26 priključki in sicer na priključku 1 in 17. Pazimo, da te napetosti pomotoma ne zamenjamo z napajanjem + 5 V, ki sta na priključkih 2 in 4. Mase (GND) imamo prav tako na razpolago in sicer na priključkih 6, 9, 14, 20 in 25.
Operacijski sistem Raspbian
Na SD kartico sem naložil »svežo« različico slike diska z naloženim Raspbian OS, ki je za delovanje Scratcha najprimernejši. Dobite pa ga v paketu NOOBS (New Out Of the Box Software) na uradni spletni strani Raspberry PI.
V paketu je več različnih operacijskih sistemov, ki delujejo na RPi, med njimi pa izbiramo v uvodnem meniju, preden se začne prva namestitev.
Oddaljeno namizje XRDP
Navadil sem se delati v OS Windows, zato sem si na RPi takoj naložil program XRDP, prek katerega lahko do namizja RPi dostopam z oddaljene lokacije znotraj in tudi zunaj lokalnega omrežja. Podpira varno SSH povezavo in omogoča izbiro med tremi različnimi nivoji varnosti. Naložimo ga z ukazno vrstico v oknu LXTerminala:
sudo apt-get install xrdp
Vse se zgodi samodejno, po uspešni namestitvi pa se v oknu LXTerminala izpiše, glej sliko 4.
Od tega trenutka naprej se lahko povežemo z RPi prek oddaljenega računalnika, če poznamo IP številko, ki mu je bila dodeljena.
Udobnost programiranja prek oddaljenega namizja je v tem, da imamo v ozadju lahko vsa naša običajna opravila, kot je pošta, program za risanje shem, povezavo s spletom, urejamo lahko Wordov dokument in tabelo v Excelu. Vse to so orodja, ki jih pri delu vsakodnevno uporabljamo, smo jih plačali in v redu delujejo, zato se jim ne želimo odreči, ampak smo jim dodali tudi povezavo z RPi, ki s tem postane še bolj priročen: ne potrebujemo ne miške, ne tipkovnice, niti zaslona! Z mrežnim kablom ga priključimo na lokalno omrežje in že v dvajsetih sekundah lahko vstopimo na njegovo namizje.
Dodatek GPIO4 za Scratch
Namestili smo čisto “svežo” različico operacijskega sistema Raspbian, ki ima že v osnovi nameščen program Scratch, zato moramo zdaj namestiti le še dodatek GPIO4, ki bo omogočil delo z vhodi in izhodi. V okno LXTerminala bomo sedaj vpisali ukaz, s katerim si bomo s spleta naložili datoteko s skripto:
sudo wget http://goo.gl/dANpKr -O isgh4.sh
in potem še ukaz za zagon te datoteke, ki bo poskrbela za namestitev našega Scratch GPIO4 dodatka:
sudo bash isgh4.sh pi
Moje uporabniško ime je pi in pi na koncu ukaza pomeni, da bo program nameščen na mojem namizju. Če imate drugačno uporabniško ime, ga vpišete namesto pi. Potem ustavimo in ponovno zaženemo RPi.
Ko bo namestitev končana, se bosta na namizju pojavili dve novi sličici, ScratchGPIO4 in ScratchGPIO 4plus (slika 6). Slednja, PLUS različica omogoča zagon Scratch programa skupaj z izpopolnjenim modulom za naprednejšo uporabo vhodno-izhodnih priključkov, tudi povezavo s servo motorji. Uporabljali bomo različico ScratchGPIO4. Več o programu ScratchGPIO4 lahko najdete na spletni strani podjetja Cymplecy na http://cymplecy.wordpress.com/scratchgpio/, kjer boste našli tudi cel kup primerov aplikacij, ki so bile narejene s tem »jezikom«. Opozoriti vas moram, da programi delujejo le, ko jih naložimo in poženemo znotraj Scratch programa in da programa na nikakršen meni znan način ne moremo izvoziti v takšni obliki, ki bi omogočala, da bi ga lahko kasneje samostojno pognali vsaj v LXterminalu.
V marcu 2014 je RPi praznoval že svoj drugi rojstni dan (14. marec zapišemo lahko kot 3.14., kar je število Pi), vendar še do sedaj niso poenotili označevanja priključkov, ki so dostopni uporabniku na priključnih letvicah.
Avtorji Scratch različice GPIO4 so označevanje poenostavili tako, da naslavljamo številko priključka na konektorju in s tem morda nekoliko zmanjšal zmedo, ki sicer vlada v zvezi z označevanjem in imenovanjem posameznih priključkov. Kako so razporejeni vhodi in izhodi na GPIO konektorju RPi, prikazuje slika 7. Z rdečo barvo so označeni izhodi, z zeleno pa vhodi, kot so določeni v programu ScratchGPIO4 in jih kot senzorje najdemo na spisku vhodnih tipal. Žal lahko uporabljamo le tako določene vhode in izhode, čeprav obstaja ukaz, s katerim lahko oboje spremenimo – vendar meni ni uspelo »preurediti« vhodov tako, da bi popolnoma ustrezali naši razširitveni ploščici za RPi, ki smo jo imenovali iRadio za Raspberry PI. Izhodi so sicer v redu, pri vhodih pa imamo od treh tipk samo zadnjo (SW3) povezano na GPIO priključek, ki so ga programerji dodatka iz podjetja Cymplecy določili kot vhod (GPIO21). »Ne pomaga nobena žavba!« Prav gotovo bi lahko pod drobnogled vzeli vse programe, ki so vezani na delovanje GPIO, vendar to ne vem kakšnega posebnega smisla nima! Končno je vse to le pomožni programček, ki je vezan na Scratch in najbrž bi lahko hitreje napisali svoj lastni program, ki bi opravljal enake naloge.
Omejili se bomo torej na tri izhode, za LED1 (GPIO23), LED2 (GPIO19), in LED3 (GPIO7), ter na en sam vhod, SW3 (GPIO21).
Osnovni gradniki programiranja v Scratchu
V programu ScratchGPIO4 bodo za nas pomembne le štiri glavne skupine gradnikov in sicer za upravljanje toka programa (Control), za zaznavanje (Sensing), za bloke z logičnimi in aritmetičnimi operacijami in operatorji (Operators) in spremenljivke (Variables). Ne bomo se spuščali globoko v vse podrobnosti in možnosti tega programa, saj je naš namen la preizkusiti delovanje GPIO in možnost povezave določenih priključkov s programom.
Na hitro bi opisal le Control skupino, katere gradnike bomo uporabljali v vsakem programu. Gre za gradnike, s katerimi program poženemo (ko kliknemo zeleno zastavico ali pritisnemo katero od tipk na tipkovnici, recimo presledek – space), gradnike za oblikovanje programskih zank, v katerih se ponavlja izvajanje programa, ter nam najpomembnejši gradnik Broadcast, s katerim bomo upravljali s stanji na izhodih.
Svetujem vam, da se na začetku vsakega novega programa najprej »znebite« mačka, torej sličice, ki se vedno pojavi v oknu, ki predstavlja oder. Scratch je bil pač ustvarjen za mlade in njim je to najbrž »cool«!
Mačka torej »povlečemo s scene« in ga odložimo v okno z gradniki, kjer bo v trenutku izginil…
Program za vklop in izklop posameznih LED diod
Naš namen je na preprost način preizkusiti upravljati s priključenimi napravami glede na različne dogodke in zaznavanje. Najprej bomo naredili »programska stikala«, s katerimi bomo lahko neodvisno upravljali z našimi tremi LED diodami. Naredili bomo šest programčkov, tri za vklop in tri za izklop teh LED diod.
Vsak posamezni programček se ob kliku na zeleno zastavico izvede samo enkrat, kar je lepo razvidno iz zadnjega ukaza Stop script. Sličice s tipkami in napise sem za boljšo predstavo dodal kasneje v programu za obdelavo slik.
Branje tipke SW3
Sledi še kratek programček, s katerim lahko z eno tipko istočasno vklopimo ali izklopimo vse tri LED diode, ki jih imamo na razširitveni ploščici iRadio. Omenili smo že, da so tipke na naši razširitveni ploščici iRadio povezane tako, da je mogoče kot vhod brati le zadnjo tipko SW3, ker je povezana na vhod GPIO21, ki so ga tudi razvijalci programa GPIO4 določili kot vhodni priključek.
Najbrž ste tudi že ugotovili, da so barve posameznih gradnikov odvisne od tega, kateri skupini pripadajo. Zelena barva označuje, da je gradnik iz skupine operatorjev in na programčku, s katerim beremo tipko, so kar nekajkrat uporabljeni. Na sliki 11 vidimo na skrajni desni strani meni z vsemi predstavniki »zelenih« skupaj. Na skrajni desni strani sem poskusil v treh korakih pojasniti, kako sem sestavil posamezno »IF« testiranje. Vse spremenljivke, ki jih v programu uporabljamo, moramo pred tem ustvariti tako, da jim preprosto damo imena. Poskusite, nič lažjega!
V prvem primeru razmišljamo takole:
»Naj se preveri, če je vrednost spremenljivke »Gori« enaka 1!«
V drugem primeru rečemo:
»Naj se preveri, če je tipka na priključku GPIO21 pritisnjena!«
To sta dva pogoja, ki morata biti izpolnjena, v IF stavku pa se sprašujemo, ali sta izpolnjena ali ne. Program razvijamo tako, da gradnike vlečemo iz knjižnice na levi strani in jih lepimo med sabo, kot bi bili magnetni. Na takšen način »programiranja« se kar hitro navadimo, prisiljeni pa smo prej nekoliko razmisliti, da se naloge že na začetku prav lotimo.
V tem programčku sem določil tudi dve spremenljivki, s katerima vplivam na pravilno izvajanje programa. To sta spremenljivki Gori in Svetlo. Spremenljivka Gori si nam zapomni zadnje stanje izhoda, ko smo postavili ali izbrisali izhod. Spremenljivka Svetlo je informacija, ali smo v zadnjem prehodu zanke kaj spreminjali ali ne. Če smo, spremenimo tudi vrednost spremenljivke Gori, sicer ne naredimo nič. Uporaba druge spremenljivke je pomembna zato, ker spremenljivke Gori ne smemo spreminjati znotraj zanke, v kateri se z IF stavkom sprašujemo po njeni vrednosti, saj bi bil že v naslednjem IF stavku (v katerem se sprašujemo po njej) izpolnjen pogoj, da njeno vrednost spet spremenimo. V »prazni« zanki Repeat until… počakamo, da je tipka spuščena, s čimer preprečimo, da bi se luči izmenično prižigale in ugašale, dokler je tipka pritisnjena. Uporabnik mora pred naslednjim vklopom ali izklopom tipko vsaj za trenutek (v katerem beremo tipko) spustiti, drugače izvajanje programa ostane znotraj te zanke. Vidimo tudi, da pred tem izvedemo vse spremembe na izhodih, kar pomeni, da ta zanka ne vpliva na hitrost izvajanja funkcije (vklop ali izklop se izvede točno v tistem trenutku, ko je pritisnjena tipka), ampak le preverja pogoj, ki smo ga postavili za nadaljevanje izvajanja programske zanke.
Zaključek
Program Scratch za »grafično« programiranje nam pomaga, da se programiranja naučimo hitreje in da pred začetkom dobro premislimo, kako se ga bomo lotili. Razmislek seveda ni nič slabega, saj nam vzbudi razmišljanje v smeri reševanja naloge in pomaga ustvariti dober koncept, ki je osnova za uspešno rešitev določene naloge. Potrebno je razčleniti delovanje in medsebojno odvisnost vhodov in izhodov, na drugi strani pa določiti metodo, s katero bomo to dosegli. Programi lahko na zunaj, z vidika uporabnika delujejo enako, vendar je mogoče popolnoma enak odziv doseči s povsem različnimi metodami. Tako lahko rečemo, da je metod toliko, kolikor je programerjev in da ni slabih rešitev, če je cilj dosežen. Seveda pa je mogoče vsako, še tako »dobro« programsko kodo optimizirati, s čimer dobimo krajši in bolj pregleden program, ki se tudi hitreje izvaja.