Malina i 40 pinova Kada smo opisivali platformu Arduino Uno (SK 10/2016) rekli smo da mikrokontroler Atmega328P ima mnogo više funkcija nego što ima nožica i da je to postignuto zahvaljujući GPIO interfejsu. GPIO je skraćenica za General Purpose Input/Output, što bi se moglo prevesti kao opštenamenski ulazno/izlazni interfejs. Reč je o tehnologiji koja omogućuje da konektori mikroprocesora imaju više različitih funkcija koje se određuju programskim putem. Ideja o kreiranju jeftinog malog računara iz koje se izrodio Raspberry Pi pojavila se još 2006. godine kada je Iben Apton, direktor studija kompjuterskih nauka koledža St. Džons iz Kembridža, zaključio da učenici uopšte nemaju predstavu o tome kako funkcionišu računari i da je potrebno napraviti nešto što bi u britanskom školstvu odigralo ulogu koju je početkom osamdesetih godina imao računar BBC Micro. Kada se pojavio na tržištu, a reč je o početku 2012. godine, Arduino je već bio planetarni hit, a „uradi sam” projekti za njega niču kao pečurke posle kiše. To je svakako bio dodatni podstrek da i „malina” dobije konektor za povezivanje hardverskih dodataka. Prva generacija uređaja imala je GPIO port sa 26 pinova, što je u suštini bilo dovoljno za realizaciju svih hardverskih projekata, ali je od modela B+ taj broj povećan na 40. Sada na raspolaganju imamo 26 pinova sa GPIO funkcijom (ranije 17), četiri pina sa napajanjem od 3,3 i pet volti (po dva za svaki), osam pinova za uzemljenje priključenih uređaja (ranije ih je bilo pet) i dva pina koja imaju posebnu funkciju koju za sada nećemo objašnjavati, a ukoliko želite da vaša „malina” ne ode na smetlište, preporučuje se da se sa njima ne igrate (često su označeni kao DNC ili Do Not Connect). Iako se po navici čitav blok interfejsa naziva GPIO, pinovi koji imaju funkciju napajanja ne poseduju dodatne funkcije. Naše zanimanje će biti skoncentrisano na verziju interfejsa sa četrdeset pinova, pošto je stare verzije teško (mada ne i nemoguće) pronaći na tržištu. Takav interfejs imaju modeli A+, B+, Pi 2, Pi 3 i Zero. Prebrojavanje iglica Ono što ne valja je činjenica da usled sve te zbrke sa nazivima može lako doći do pogrešnog povezivanja, što često dovodi do kvara na računaru. Posebnu pažnju treba posvetiti pinovima od pet volti koji, ukoliko se spoje sa nekim od U/I pinova ili sa napajanjem od 3,3 volta uzrokuju nepopravljive posledice, jer „malina” nije tolerantna na napon od pet Volti, kao što je slučaj kod nekih modela Arduina. Često ćete čuti preporuku da ukoliko ne koristite ove pinove, treba da ih izolujete i tako smanjite rizik od kvara. Dovoljno je nehotično spojiti prve dve iglice i da vaša ljubljena „malina” završi u večnim lovištima. Sledeća stvar koju je potrebno znati je ta da se GPIO pinovi smeju opterećivati naponom do 16 miliampera. Što se tiče napajanja, opterećenje 5V pinova ne bi smelo biti preko 300-500 miliampera (u zavisnosti od modela), dok je maksimum za pinove od 3,3 volta samo 50 miliampera. Pritom nemojte gubiti iz vida da se ovo odnosi na oba pina napajanja, dakle, u pitanju je sumarna vrednost. Svi GPIO pinovi računara Raspberry Pi dolaze unapred inicijalizovani za primanje ulaznih podataka i imaju visok ulazni otpor, a prateći pull-up i pull-down otpornici nisu aktivni, pa se nalaze u takozvanom plutajućem stanju, to jest, mogu imati varijabilnu vrednost. Ovo se ne odnosi jedino na pinove GPIO0 i GPIO1 koji obavljaju SDA i SCL funkcije I2C interfejsa. Pinovi GPIO14 i GPIO15 inicijalno funkcionišu kao TX i RX linije UART serijskog interfejsa, što je alternativna GPIO funkcija ugrađenog mikroprocesora. To znači da nije potrebno nikakvo programsko ukazivanje na to da su pinovi u ulaznom režimu, odnosnom njihov napon je u stanju logičke jedinice. Još da napomenemo da potrošnja struje pinova uključenih u stanje izlaza iznosi osam miliampera. Prikazivanje cele lepeze GPIO funkcija bio bi preveliki posao. Ograničićemo se na demonstraciju pina pod rednim brojem 35. On podržava sledeće modalitete rada: Alt0 PCM_FS – PCM PCM audio interfejs, frame sync Alt1 SD11 SMI Data 11 (Sec. Memory Interface) Alt2 rezervisano Alt3 BSCSL SCL/ SCLK Broadcom Serial Control Slave Clock / SPI Clock Alt4 SPI1_MISO SPI1 Master In Serial Out Alt5 PWM1 Pulse Width Modulation 1 Sve pinove generalno možemo podeliti po sledećim glavnim grupama: 3,3V, 5V: Preuzimanje struje za pokretanje priključenih uređaja GND: Uzemljenje DNC: Do Not Connect, pinovi specijalne namene GPIO: pinovi sa funkcijom GPIO UART: Universal asynchronous receiver/transmitter), klasični serijski interfejs (8,10) I2C: Inter-Integrated Circuit, jednostavni serijski interfejs. Za rad su mu osim napona i uzemljenja potrebne još samo dve žice. (3,5) SPI: Serial Peripheral Interface Bus, još jedna vrsta serijskog interfejsa koja funkcioniše po principu Master/Slave i dozvoljava istovremeni rad sa većim brojem uređaja. (SPI0: 12,19,21,23 i SPI1: 35,36,38,40 ) Funkcije označene kao UART, I2C i SPI takođe pripadaju GPIO pinovima, ali obavljaju specifične zadatke koje ćemo ukratko da spomenemo. UART je tradicionalno korišćen za pristup iz konzolnog režima (komandna linija, korisno za konfiguracije bez monitora), ali i za vezu sa drugim uređajima kao što je, recimo, Arduino. Uz upotrebu konvertora Serial-to-USB, „malinu” možemo povezati sa desktop računarom ili sa nekim periferijskim dodatkom. Funkcioniše tako što se uređaji koji komuniciraju međusobno „dogovore” o parametrima prenosa, tako da nije potrebna klok sinhronizacija. Uvek imajte na umu da je ovde reč o naponu od 3,3 volta, dok je kod drugih sličnih uređaja on uglavnom pet volti (pa i više). Za njegovu implementaciju se koriste fizički pinovi 8 i 10. Sledeći interfejs nosi naziv I2C (ponegde se označava kao I2C, IIC ili TWI) i jedan je od popularnih načina za ostvarivanje serijske veze na ovakvoj vrsti uređaja. Osim neizbežnog napona i uzemljenja, koristimo dve dodatne žice za signale SDA i SCL. SDA je skraćenica za Serial DAta line , koristi se za prenos podataka i smešten je na fizičkom pinu broj 3, dok SCL označava Serial Clock Line, služi za sinhronizaciju prenosa i nalazi se na pinu broj 5. O SPI interfejsu smo nešto više govorili u članku o platformi Arduino, pa vam preporučujemo da pogledate taj tekst. Reč je o standardu koji nalazi veliku praktičnu primenu u industriji, a po performansama je znatno ispred I2C. Za razliku od klasičnog asinhronog interfejsa, ovde je prenos podataka usklađen sa taktom, pa se ubraja u grupu sinhronih interfejsa. Za prenos podataka se osim naponskih linija koriste sledeći signali: MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Serial Clock), CE0 i CE1 (Chip Enable 0 i 1). Pin Oznaka Funkcija 19 MOSI prenos od mastera prema slejvu 21 MISO prenos od slejva prema masteru 23 SCLK takt sinhronizacije uredjaja 24,26 CE0/CE1 izbor uredjaja Ono što je potrebno znati je da uređaji mogu imati različite oznake za ove funkcije. Neke od najčešćih privodimo u sledećoj tabeli: Master Slejv MOSI, SIMO, SDI DI, DIN, SI, MTST MISO, SOMI, SDO DO, DOUT, SO, MRSR SCLK SCK, CLK CE, CS, SS nCS, CS, CSB, CSN, nSS, STE, SYNC Puštanje u pogon Da bi se koristile usluge GPIO interfejsa, potrebno je odraditi određene korake u okviru operativnog sistema. Kada se radi o Linuks distribuciji Raspbian, ona je najčešće već spremna za upotrebu, jedino pojedine funkcije mogu biti isključene zbog uštede energije, pa ih je potrebno aktivirati. Ukoliko se koristi neka druga Linuks distribucija ili radimo sa nekim sličnim SBC računarom koji se na ovaj ili onaj način javlja klonom Raspberry Pi, moraćemo da obavimo nekoliko manjih intervencija. U radu sa Linuksom, uvek je dobra praksa pre instalacije nekog programa obnoviti postojeće fajlove na računaru. Dakle, kucamo: sudo apt-get update sudo apt-get upgrade Zatim pomoću Git komande kopiramo sors fajlove biblioteke na računar i kompajliramo ih: git clone git://git.drogon.net/wiringPi cd wiringPi ./build Ukoliko Git nije prethodno instaliran, kucamo sledeće sudo apt-get install git Da bismo proverili da li je sve prošlo kako treba, kucamo: gpio –v Trebalo bi da se pojavi tekst sa osnovnim podacima o biblioteci. Ako je sve do sada prošlo ispravno, kucanjem: gpio readall dobijamo tabelu sa trenutnim stanjem GPIO interfejsa našeg uređaja. Kada se pojavi nova verzija biblioteke WiringPi, vrlo je poželjno da je instalirate na računar. To se postiže vrlo jednostavno uz pomoć sledećih naredbi: cd ~/wiringPi git pull ./build Postoji mogućnost instalacije putem deb paketa, ali ona za sada nije oficijalna i ne podržava najnovije verzije biblioteke. Kao što smo ranije napomenuli, biblioteka WiringPi koristi svoj specifičan sistem označavanja pinova. Osim njega je od verzije dva moguće koristiti BCM varijantu kao i označavanje putem fizičkog broja pina. Nakon završetka procesa instalacije, moguće je upravljanje GPIO direktno iz bash linije preko posebne istoimene komande, recimo: $gpio mode 2 out $gpio write 2 1 $gpio write 2 0 Ako pogledamo shemu (slika dole), videćemo da je katoda LE diode povezana sa GND pinom na fizičkoj lokaciji broj 6 preko otpornika od 330 oma (najčešće mogu poslužiti i drugi u opsegu 200-600 oma), dok je anoda povezana na pinom broj 2 u WiringPi sistemu označavanja, što odgovara fizičkoj poziciji pina 13. Gornji kod u prvoj liniji pinu 2, po WiringPi sistemu označavanja, dodeljuje funkciju izlaza. Posle toga preko funkcije write postavljamo port u stanje logičke jedinice, da bismo ga zatim isključili (postavili napon izlaza na logičku nulu). Ukoliko bismo posle komande gpio dodali argument -g, to bi značilo da će se koristiti nazivi koji odgovaraju označavanju po BCM rasporedu, dok se bez tog argumenta podrazumeva rad po rasporedu WiringPi. Kada se ovome dodaju postojeće komande uslovnih skokova, mogu se dobiti dosta moćne skripte koje manipulišu sa GPIO portovima. Međutim, daleko je udobnije pisati C programe onako kako se to radi kod Arduina. Jedan od najjednostavnijih primera koji demonstrira upotrebu biblioteke WiringPi je onaj koji pali i gasi LED lampicu: #include <wiringPi.h> int main (void) { wiringPiSetup () ; // inicijalizacija pinMode (2, OUTPUT) ; // pin 2 (13) je izlaz for (;;) // beskonacna petlja { digitalWrite (2, HIGH); // upali LED delay (500) ; // pauza 1/2 sek. digitalWrite (2, LOW); delay (500) ; // pauza 1/2 sek. } return 0 ; // nema greske } Nakon što otkucamo program, potrebno je da ga kompajliramo: gcc -Wall -o blink blink.c -lwiringPi sudo ./blink Python Nije nikakva tajna da je Python zadnjih godina vrlo popularan programski jezik koga mnogi vole zbog njegove elegancije, lakoće i velikih mogućnosti proširenja putem brojnih dodatnih modula. Kada je u pitanju platforma Raspberry Pi, Python je vrlo često korišćen kao jezik za upravljanje potencijalima GPIO porta. Naredni primer demonstrira kako se ovaj jezik koristi da bi se obavio posao koji smo u prethodnom primeru napisali za programski jezik C: # uvozimo module za rad sa GPIO i vremenom import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # BCM oznacavanje GPIO.setup(7, GPIO.OUT) # pin 7 je izlazni for x in range(100): # petlja od 100 ciklusa GPIO.output(27,True) # logicko 1 na BCM port 27 (13) time.sleep(.5) # pauza 1/2 sek. GPIO.output(27,False) # logicka 0 na port 27 time.sleep(.5) GPIO.cleanup() # reinicijalizacija portova Kod možemo unositi direktno preko prozora interpretera ili ga prethodno sačuvati kao fajl sa ekstenzijom .py. Pokretanje programa vršimo na sledeći način: sudo python naziv.py Program je dovoljno jednostavan da mu nije potrebno detaljnije objašnjenje. Jedino je potrebno obratiti pažnju na funkciju GPIO.cleanup koja nakon završetka rada vraća sve pinove interfejsa u početno stanje. Alternativna varijanta bi bila da umesto For-Next petlje koristimo beskonačnu petlju koja se u Pythonu ostvaruje na sledeći način: while True: # kod za beskonacno ponavljanje Umesto modula GPIO po želji možemo koristiti modul pod nazivom RPIO koji predstavlja proširenu i naprednu verziju pomenutog GPIO. Da bismo ga koristili prethodno moramo instalirati Python verziju 2.7: sudo apt-get install python-dev Posle toga, jedan od načina za instaliranje ovog modula bi mogao da izgleda ovako: sudo apt-get install python-setuptools sudo apt-get install python-dev ili ovako: git clone https://github.com/metachris/RPIO.git cd RPIO sudo python setup.py install Jedna od važnih stvari koje donosi ovaj modul je podrška za rad sa prekidima (interaptima), što je tehnika koja u rukama znalca postaje vrlo moćno oružje. Pre ili kasnije, praktično svi korisnici koji intenzivno programiraju ponašanje GPIO portova putem jezika Python dolaze do ovog modula i koriste ga kao osnovu za svoj rad. To bi u najkraćim crtama bilo osnovno štivo vezano za upravljanje GPIO portovima. Igor S. RUŽIĆ |
| ||||||||||||||||
Home / Novi broj | Arhiva • Opšte teme | Internet | Test drive | Test run | PD kutak | CeDeteka | WWW vodič • Svet igara Svet kompjutera Copyright © 1984-2018. Politika a.d. • Redakcija | Kontakt | Saradnja | Oglasi | Pretplata • Help • English | |
SKWeb 3.22 |