LAKI PINGVINI<>
012017<><>

Stonoga zvana GPIO

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 unosi mnogo zabune kod korisnika Raspberry Pi računara je činjenica da ne postoji jedinstven način obeležavanja pinova. Najjednostavniji je svakako onaj koji izvode GPIO interfejsa označava sa brojevima. Konektor možemo posmatrati kao skup od dvadeset redova u dve kolone. Pin u prvom redu i prvoj koloni nosi oznaku 1 (napajanje 3,3 volta). Pin u prvom redu i drugoj koloni nosi oznaku dva (napajanje pet volti). Pin u drugom redu i prvoj koloni oznaku 3 (GPIO2), drugi u drugoj koloni 4(pet volti) i tako dalje. Dakle, neparni u prvoj i parni pinovi u drugoj koloni. Takav vid označavanja se još naziva i fizičkim. Sledeći način se odnosi na shemu koja se naziva Broadcom označavanje (BCM) i predstavlja markiranje pinova po nazivima koje koristi proizvođač mikroprocesora. Iako je suštinski najpogodniji za preciziranje funkcija konektora, njegove oznake nije lako zapamtiti, pa je pri ruci uvek korisno imati referentnu tabelu/ilustraciju. Treći popularni način označavanja je vezan za biblioteku WiringPi koja omogućava programiranje vrlo slično onome kako se to radi na platformi Arduino.

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

Kao što vidimo, GPIO pinovi mogu imati do šest različitih funkcija koje su označene pozicijama Alt0 do Alt5. Pozicija Alt2 je za sada neiskorišćena na svim pinovima. Ovo je primer porta koji ima pet aktivnih funkcija, dok ostali najčešće imaju manje, uglavnom dve ili tri.

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Ć

 
BunsenLabs Linux
Kada se pakao smrzne
Stonoga zvana GPIO
Šta mislite o ovom tekstu?
Arduino: Rad sa ekranom (2)
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera