Arduino – Ziua doi – Digitalul şi valurile

În primul tutorial am vazut cum se aprinde şi se stinge un led. Făcurăm asta cu ajutorul comenzilor digitalWrite(13,HIGH) şi digitalWrite(13,LOW). Cineva însă (nu eu, pentru că eu nu aş fi avut această întrebare decât eventual la un tutorial despre motoare…) ar putea să se întrebe “Păi de ce să avem doar HIGH şi LOW? Adică avem doar APRINS şi STINS? De ce nu avem şi… nu ştiu… PE JUMĂTATE APRINS? ca la becurile alea şmechere care îţi fac lumina din cameră mai blândă atunci când ai o întâlnire cu cineva pe care vrei să vrăjeşti…”.

Ei bine, am aflat că pentru astfel de situaţii, Arduino nu… pare… să fie pregătit. Cu alte cuvinte, ar trebui ca Arduino să poată emite ceea ce se numeşte “semnal analog”.

Ce este semnalul analog?

Pentru a explica ce este semnalul analog, ne putem gândi la sunete. Sunetele sunt semnale analogice, semnale ce variază în putere (amplitudine) şi frecvenţă. Cu alte cuvinte, atunci când vorbim noi transmitem semnale care variază în putere. Nu vorbim la fel de tare non-stop (cred ca ne-ar fi imposibil…). Prin urmare, sunetul uman arată precum undele.

Cum am traduce asta la becul minune? Ei bine, am putea transmite mai puţin sau mai mult voltaj pentru a reduce sau a mări luminozitatea becului.

Care e “problema” Arduino-ului şi ce este PWM?

“Problema” Arduino-ului este că el nu ştie să transmită către pinii săi decât “HIGH”… Adică nu ştie să trimită decât 5 volţi sau nimic.

“Şi atunci ce ne facem?”, ai putea întreba. Simplu… Ne păcălim simţurile. “Cum adică”, Adică facem în aşa fel încât ochiul să creadă că led-ul are mai puţină lumină, obligându-l de fapt să se aprindă şi să se stingă la distanţe mici de timp. Cu cât distanţa de timp între aprinderi este mai mică cu atât va da impresia ochiului că ledul este “mai puternic aprins”. Şi cu cât distanţa între aprinderi este mai mare cu atât vom da ochiului impresia că ledul “îşi pierde din putere”.

OK… Deci avem 5 volţi, avem 0 volţi şi avem perioade între aprins (Taprins) şi stins (Tstins).

Aşadar, în imaginea de mai sus putem vedea că într-un ciclu (numit în acest caz “ciclu de umplere”… nu mă întrebaţi de ce… încă nu le am cu electronica, dar am citit despre el în manualul primit cu kitul de la Robofun.ro), avem voltaj timp de 25% din ciclu (în engleză i se spune Duty cycle) şi lipsă de voltaj timp de 75% din ciclu, totul învârtindu-se în modularea grosimii acestui puls (de unde şi… Pulse Width Modulation).

Dacă un ciclu de umplere este suma lui Taprins şi Tstins, atunci grosimea pulsului va fi egală cu Taprins / (Taprins + Tstins).

Ttotal = Taprins + Tstins

D = Taprins/Ttotal

Să ne întoarcem în lumea noastră…

Ai un televizor color de pe vremea lu’ Pazvante Chioru’? Dacă ai şi te uiţi de aproape vei vedea că culoarea este făcută din trei culori: roşu, verde şi albastru. Atunci când se doreşte obţinerea culorii negre, pur si simplu pixelii (punctele) sunt stinşi, atunci când se doreşte o culoare anume, aceasta se obţine din aprinderea, în diferite grade, a celor trei culori. Atunci când se doreşte obţinerea culorii albe, toate cele trei culori sunt aprinse la maxim. Dar care este acest maxim. Ei bine, multe calcule care implică tot felul de calcule pe 8 biţi au decis pentru noi că combinaţia maximă de culori la care se poate ajunge în privinţa RGB este de 255*255*255. Împreună cu valoarea 0, putem spune că intensitatea luminii poate avea 256 de trepte, iar combinaţia celor trei culori împreună cu aceste trepte pot da peste 16 milioane de culori.

Prin urmare lumina maximă a unui led este 255, în timp ce lumina minimă a unui bec este 0. Acum, dacă vrem să aprindem un led doar pe jumătate, ajungem la o valoare de 256/2 = 148. Şi 148 este valoarea acelui ciclu de umplere (Duty cycle). Din fericire, noi nu trebuie să calculăm Taprins/Ttotal, deoarece Arduino le are cu limbajul.

Ne putem folosi de analogWrite(). AnalogWrite() este felul Arduino-ului de a te păcăli că are ieşire analoagă, el realizând de fapt tocmai acest PWM. Tu trebuie doar să îi transmiţi valoarea ciclului de umplere.

Unde testăm acest… PWM?

E bine că ai pus această întrebare. Arduino poate emula ieşirea/intrarea anlogă doar pe anumiţi pini. Aceşti pini, pot fi identificaţi după tilda (~) care însoţeşte numărul pinului. Astfel, dacă te uiţi pe un Arduino Uno, vei putea vedea că doar anumiţi pini au această tildă: ~3, ~5, ~6, ~9, ~10 şi ~11.

Să trecem la partea distractivă

Voi presupune că, în afară de Arduino Uno ţi-ai luat şi kitul Arduino pentru începători, pentru că acesta conţine elementele care ne vor trebui pentru a exemplifica acest episod, anume două fire de conectare tată-tată şi un led (nu contează culoarea…).

Cele două  fire le vom conecta la led. Celelalte capete ale firelor le vom conecta la pinul 11 şi GND, având grijă ca pinul 11 să fie aferent IN-ului de la led, şi GND-ul plăcii să fie aferent GND-ului ledului.

Acum, să conectăm Arduino-ul la calculator… Dacă ai urmat tutorialul anterior vei observa că imediat ce s-a conectat la calculator, ledul din fabricaţie al plăcii Arduino a reluat ritmul de aprindere/stingere setat atunci.

Acum hai să deschidem IDE-ul. El ar trebui să se deschidă cu ultimul script folosit. Hai să îl modificăm puţin…

Astfel, de data asta nu vom mai folosi pinul 13, ci pinul 11. Hai să modificăm doar partea aceasta (peste tot, în loc de 13 scriem 11)… Acum, selectăm Sketch>Verify/Compile şi apoi Sketch>Upload pentru a încărca programul modificat pe placa Arduino. Dacă totul a decurs cum trebuie, acum, în locul ledului 13, ar trebui să se aprindă ledul 11.

Acum să modificăm programul puţin:

void setup() {
  pinMode(11,OUTPUT);
}

void loop() {
  analogWrite(11,10);
}

Hai să compilăm şi să rulăm progrămelul… Ei? Se vede o lumină mai slabă?

Hai să facem valurile acum

void setup() {
  pinMode(11,OUTPUT);
}

void loop() {
  for(int i=0; i<255; i++)
  {
    analogWrite(11,i);
    delay(50);
  }
  for(int i=255; i>0; i--)
  {
    analogWrite(11,i);
    delay(50);
  }
}

 

Lasă un răspuns

Your email address will not be published. Required fields are marked *

No spam? * Time limit is exhausted. Please reload CAPTCHA.