V tem delu si bomo ogledali kako v Arduino okolju uporabljamo digitalne vhode in izhode, digitalno analogni pretvornik ter serijska vrata. Arduino okolje ponuja veliko poenostavitev, ki olajšajo prvi pristop k programiranju mikrokontrolerjev, lahko pa postanejo omejujoče. Ogledali si bomo najpomembnejše ukaze za osnovne operacije, nato pa pokukali v ozadje. Videli bomo, da Arduinov mikrokontroler skriva še marsikaj.
Digitalne linije
Arduino nam daje preko priključne letve na voljo 14 digitalnih linij (D0-D14), ki so lahko bodisi digitalni vhodi ali izhodi. Iz vsake lahko beremo ali nanjo pišemo logično stanje HIGH ali LOW. HIGH ustreza 5V, LOW pa 0V. Recimo, da želimo uporabiti priključek 3 na katerega je priključeno stikalo ali gumb. Če hočemo iz njega brati, moramo pred tem priključek definirati kot digitalni vhod. To storimo z ukazom:
pinMode(3,INPUT);Priključki so ob resetu sicer privzeti kot vhodi, vendar je inicializacija registrov vedno dobra praksa. Priporočam, da namesto številk priključkov uporabljate imena, ki nekaj pomenijo. Če imate na ta priključek npr. priklopljeno stikalo (kot na sliki 1) uporabite to ime.
Stanje beremo z ukazom:
stanje=digitalRead(stikalo); Celoten program, ki bere stanje in ga vsako sekundo izpiše preko serijskih vrat bi izgledal takole: const int stikalo=3; boolean state; void setup(){ pinMode(stikalo,INPUT); Serial.begin(19200); } void loop(){ state=digitalRead(stikalo); Serial.println(state); delay(1000); }AVRji temeljijo na CMOS tehnologiji zato bo ukaz prebral visoko logično vrednost (HIGH), če je napetost večja od cca 2.5V (Vcc/2) in LOW, če je nižja. Pri vaših aplikacijah se vedno potrudite, da bodo vrednosti daleč od mejnih, torej kar se da blizu 0 oziroma 5V.
Če želimo priključek uporabiti kot izhod imamo na voljo ukaz, ki smo ga že spoznali:
pinMode(stikalo, OUTPUT);nato vrednost nastavimo z
digitalWrite(stikalo,HIGH);ali
digitalWrite(stikalo,LOW);Smiselna pa je tudi naslednja kombinacija ukazov, čeprav na prvi pogled morda ne izgleda tako:
pinMode(stikalo, INPUT); digitalWrite(stikalo,HIGH);Priključek smo definirali kot analogni vhod, nato pa nanj pišemo? Najprej razložimo, kaj ta kombinacija naredi, nato pa še zakaj je taka. Ko uporabimo ukaz digitalWrite, ko je priključek definiran kot vhod, dejansko na priključek priključimo “pull-up” upor. To se seveda zgodi kar v čipu. Ta upor je velik nekaj 10 k Ohmov in nas razbremeni fizične priključitve pull-up upora. Služi nam večinoma za to, da imamo na priključku neko znano napetost, tudi ko nanj ni nič priključeno. Sicer bi na priključku imeli neko nedefinirano stanje (po domače bi rekli, da plava). Stvar je zelo uporabna ravno pri stikalih. Zakaj pa se to naredi na tak način? To je direktna posledica zasnove mikrokontrolerja. Ukaz digitalWrite ne naredi nič drugega kot nastavi ustrezne bite v PORTx registrih, ti registri pa priklapljajo pull-up upore, ko je priključek definiran kot vhod. Ko je definiran kot izhod ti registri hranijo izhodno stanje priključkov (HIGH ali LOW). Smer (vhod ali izhod) je podana v DDRx registrih: 1 pomeni izhod, 0 pa vhod. x je splošno ime za skupino priključkov – na ATmega328P je x lahko B,C ali D. Za naš konkreten primer moramo x zamenjati s pravo vrednostjo. Iz tabele v prejšnjem članku je razvidno, da Arduino poimenovanje priključka D3 ustreza priključku PD3. To pomeni 4. bit vrat PORTD. (Šteti začnemo od 0.) Registra, ki ju iščemo sta torej DDRD in PORTD. Registra imata po 8 bitov, lastnosti našega priključka (PD3) pa se nastavljajo na 4. bitu. Zapleteno?
Na ta način bi zgornji dve vrstici napisali takole:
bitClear(DDRD,3);
namesto pinMode(stikalo, INPUT);bitSet(PORTD,3);
namesto digitalWrite(stikalo,HIGH);Funkcija bitClear sprejme dva parametra. Register in zaporedno številko bita ter ga postavi na 0 (LOW). Podobno naredi bitSet, le da ga postavi na 1 (HIGH).
Programiranje z Arduino (2)
2013_SE212_48