D. Ghid practic și exemple de cod


D.1 Introducere

Ca referință, sunt date câteva exemple practice de interfațare ca ilustrare utilizând platforma Arduino (http://arduino.cc). În acest capitol este prezentat un exemplu de cod. Două programe mai mari sunt utilizate pe partea de PC gazdă pentru a capta și a vizualiza datele care sunt scrise în Processing (http://www.processing.org).

Așa cum s-a explicat în capitolul 1, Introducere, ecosistemul Arduino a devenit un standard de facto în ultimii ani pentru educație, hobby, și utilizarea Do-It-Yourself (DIY). Deși există multe plăci și microcontrolere disponibile care depășesc Arduino (combinația Atmel AVR RISC) în preț, performanța și conectivitatea, prin ușurința de utilizare, suport larg și gamă largă de aplicații, sistemul Arduino a pătruns în domeniul mecatronic al cercetării și al ingineriei. Kit-urile de pornire (vezi Fig. D.1) conținând Arduino, breadboard, cablu USB și componente elementare sunt disponibile pe scară largă.

image

Figura D.1 Kit tipic de pornire Arduino.

Pentru a începe cu sistemul Arduino, Mediul de Dezvoltare Integrat (IDE) prezentat în Fig. D.2 trebuie să fie descărcat și instalat pe un sistem PC gazdă care rulează Mac OSX, Windows sau Linux. În unele cazuri, trebuie să fie instalate și drivere pentru conexiunea USB-Serial. După instalare, placa utilizată (adică o placă Arduino UNO) trebuie selectată în meniul "Tools" -> "Board". Portul serial folosit trebuie să fie selectat în meniul "Tools" -> "port". Apoi, sistemul este gata de utilizare.

image

Figura D.2 Arduino IDE.

Processing este un mediu software open-source dezvoltat de Casey Raes și Benjamin Fry (http://www.processing.org). El a fost în curs de dezvoltare din 2001 și are o comunitate largă și activă de utilizatori. Acesta permite proiectarea și dezvoltarea de software pentru designeri, artiști și studenți într-un context vizual. Processing folosește limbajul de programare Java, dar permite o sintaxă simplificată (cel puțin pentru a începe cu el). Un set foarte larg de biblioteci pentru vizualizarea datelor, comunicarea serială etc. permite un ciclu de dezvoltare rapidă. Processing rulează pe toate sistemele principale de operare (Windows, Mac OSX și Linux).

În această lucrare, alegerea pentru Processing a fost făcută pentru a oferi o opțiune liberă de utilizat, instructivă și transparentă pentru captarea și vizualizarea datelor de pe partea PC-ului gazdă. Inutil să spun că nu este în niciun caz o condiție prealabilă pentru utilizarea acestor exemple. Codul Arduino poate fi pur și simplu adaptat la datele de ieșire într-un format care poate fi procesat de alte programe de analiză (convenționale), cum ar fi MatLab sau Labview. Exemple de date de ieșire *.csv care pot fi importate în orice program de calcul tabelar vor fi afișate, de asemenea.

D.2 Convertorul analogic-digital pe Arduino

Placa Arduino UNO are un convertor Analogic-Digital de 10 biți (ADC) încorporat, care este multiplexat la șase canale de intrare. Alte versiuni de microcontrolere Atmel care sunt folosite pe diferite plăci ar putea oferi mai multe canale sau configurații diferite. Pe plăcile "Due" și "Zero", de exemplu, sunt utilizate microcontrolerele ARM care oferă o rezoluție de 12 biți.

Tensiunea de referință a ADC pe placa Arduino UNO este conectată standard la tensiunea de alimentare (5,0 V), vezi referința online https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/. Tensiunea de referință poate fi conectată cu ajutorul funcției analogReference () la tensiunea de alimentare (DEFAULT), dar și la o tensiune internă de referință de 1,1 V sau o tensiune externă. Tensiunea externă poate fi oferită folosind un pin marcat AREF pe placă. Rețineți că modul de referință din software (EXTERNAL) trebuie schimbat înainte de a aplica tensiunea externă, în caz contrar tensiunea de referință generată intern și referința externă sunt scurtcircuitate.

În implementarea curentă a funcției analogRead () se ia o singură măsurătoare pe un singur pin. Pentru perioade mai rapide de eșantionare, este posibilă accesarea directă a regiștrilor de control ai ADC și utilizarea abordării continue de rulare sau întrerupere. În exemplele discutate numai funcționalitatea standard este utilizată.

D.2.1 Exemplu de cod Arduino

Următorul cod este un mod simplu de ieșire a valorilor analogice ale șase pini de intrare disponibili la portul serial. Valorile sunt transmise ca întreg în simbolurile ASCII care pot fi citite de om. Fiecare valoare este precedată de un caracter A, B, C sau X, Y, Z. Rata baud de transmisie este definită în instrucțiunea Serial.begin (), rata de eșantionare este setată prin timpul de buclă. În implementarea curentă, timpul de buclă este de 50 ms, astfel încât rata de eșantionare este de 20 Hz.

image
image

Acest format de date se potrivește cu formatul necesar pentru schița de procesare din secțiunea D.2.2 . Totuși, este posibil ca formatul de ieșire să corespundă și altor cerințe. Datele seriale pot fi înregistrate la PC-ul gazdă folosind orice emulator de terminal (serial). În IDE-ul Arduino este disponibil un simplu "Serial Monitor" pentru trimiterea și primirea datelor prezentate în fig. D.3. Se poate seta oprirea (carriage return, line feed) și rata de transfer. Din acest monitor, datele pot fi copiate și inserate direct într-o foaie de calcul, dacă formatul datelor este corect.

image

Figura D.3 Monitor serial.

Prin înlocuirea liniilor dintre comentariul "// output" și următorul bit, același cod poate fi folosit pentru a afișa un fișier separat prin virgulă care poate fi importat direct într-un program de calcul tabelar. În loc de anteturi, fiecare valoare este separată cu o "," și fiecare linie de valori este închisă cu o newline.

image

Arduino are un instrument integrat de plotter serial în IDE (în versiuni după 1.5.8) care utilizează același format (adică valori separate printr-un delimitator, cum ar fi o virgulă sau un spațiu) pentru a trasa o serie de valori într-un grafic.

O abordare diferită ar fi utilizarea firmware-ului standardizat pe Arduino, cum ar fi Firmata (https://github.com/firmata/arduino). Folosind un protocol mai elaborat (decât cel descris mai sus), o gazdă poate solicita o citire analogică, o citire digitală sau seta (control) un pin de ieșire digitală. Firmware-ul rămâne același și transformă Arduino într-o interfață "transparentă". Deoarece scopul acestui capitol este de a oferi o perspectivă prin utilizarea exemplelor simple și clare, această opțiune nu este elaborată în continuare aici.

D.2.2 Exemplu de cod Processing

Processing poate fi descărcat (http://www.processing.org) și instalat pe sisteme care rulează Windows, Mac OSX și Linux. Mediul de dezvoltare integrată (IDE) este prezentat în figura D.4 și seamănă cu editorul lui Arduino. În unele cazuri sub Linux trebuie să fie instalată o altă versiune de Java. Distribuțiile normale de Processing vin cu un compilator Java pre-ambalat.

image

Figura D.4 Cod graphwriter în Processing.

În Processing, următorul cod poate fi utilizat pentru a vizualiza semnalele Arduino. El așteaptă date seriale la 9600 baud în ASCII direct (adică numere citibile de către oameni), valori întregi între 0 și 1023 precedate de o literă A, B, C sau X, Y, Z. În partea de sus a codului, trebuie să fie selectat portul serial corect (ca număr dintr-o listă) și rata baud. Când schița este rulată pentru prima dată, ar putea fi necesară generarea fontului ecranului utilizat. Aplicația Processing va furniza instrucțiunile necesare pentru a face acest lucru.

image
image
image

De asemenea, este posibil să se adauge scalare și offset la grafice, precum și să se înregistreze un fișier text cu valori separate prin virgulă pentru procesarea ulterioară utilizând un program de calcul tabelar. Pentru a face ca schița să răspundă la diferite apăsări de taste, în schiță trebuie adăugat următorul cod:

image

Codul a fost testat cu versiuni de Processing 1.5.x, 2.0.x și 3.0.x. Deși Processing este în continuă dezvoltare, compatibilitatea înapoi (și înainte) a programelor și schițelor este bună. În figura D.5 este prezentat graficul a șase semnale diferite.

image

Figura D.5 Ieșirea GraphWriter în Processing.

D.3 Detectarea capacitivă

În capitolul 5, Senzori capacitivi (Secțiunea 5.3.2), este afișată o configurație pentru măsurarea capacitivă utilizând o placă Arduino. Implementarea în software pentru facilitarea citirii capacitive este simplă. În această secțiune se vor prezenta exemple de detectare a capacității externe și de detectare a capacității interne.

D.3.1 Citirea capacitivă directă

Următoarea funcție poate fi utilizată pentru a realiza o citire capacitivă a unei tensiuni analogice folosind un rezistor fix (adică 100 kΩ) și un condensator fix (adică 100 nF). Acest principiu este explicat în secțiunea 5.4 și poate fi integrat în software-ul de scriere a graficelor (graph writer) care este explicat în secțiunea anterioară. O schiță de ieșire a unei singure citiri capacitive și de ieșire a acesteia prin portul serial într-un format care poate fi interpretat de Processing graph writer este prezentat mai jos:

image
image

Pentru detectarea capacitivă externă este necesar să folosiți doi pini: un pin dedicat ca ieșire pentru încărcarea și descărcarea condensatorului și un pin de intrare cu impedanță ridicată pentru a detecta momentul în care nivelul sarcinii este mai mare sau mai mic de 2,5 V (nivelul de declanșare al pinului de intrare). Se va utiliza o strategie similară pentru măsurarea timpului de încărcare utilizat în exemplul anterior, dar de această dată timerul intern "micros ()" va fi utilizat împreună cu o întrerupere externă. Arduino UNO are doi pini (pinii 2 și 3) care pot fi utilizați pentru a declanșa un bit de cod prin semnalizare externă.

image
image

D.3.2 Detectarea capacitivă folosind o bibliotecă externă

Următorul cod utilizează o bibliotecă dedicată pentru Arduino numită "CapacitiveSensor" care poate fi obținută online (http://playground.arduino.cc/Main/CapacitiveSensor). Acest exemplu folosește cursorul liniar din două părți explicat în secțiunea 5.4.3 pentru a detecta poziția liniară a vârfului degetului. Un pin dedicat (pinul 4) este folosit pentru încărcarea ambelor condensatoare de folie pe o singură parte printr-un rezistor de 10 MΩ. Pentru fiecare dintre secțiunile de folie A și B se utilizează un pin diferit (2 și 6) pentru a detecta nivelul de încărcare sau descărcare.

În acest caz este prezentată schița completă Arduino. Datele seriale pot fi vizualizate cu schița Processing graph writer.

image
image

Citirea capacitivă într-un sistem încorporat poate fi literalmente consumatoare de timp. Deși biblioteca prezentată este ușor de implementat, măsurătorile împiedică controlerul să facă ceva (altceva) între timp. Abordarea comandată de întrerupere în al doilea exemplu încearcă să ofere o soluție pentru aceasta.

Este bine să realizăm că, de îndată ce contactul electric se face între o placă capacitivă de detectare și mâna umană, timpul de încărcare se poate apropia de infinit (sau este limitat de software). Pentru funcționare fiabilă este important să nu se facă o conexiune electrică între utilizator și placa de detectare.

D.4 Detectarea magnetică

Așa cum este descris în capitolul 6, senzorii inductivi și magneți, mulți senzori magnetici sau inductivi conțin electronică integrată pentru procesarea semnalului, astfel încât acestea pot fi interfațate cu un sistem încorporat fie prin conectarea unei tensiuni analogice la un ADC, fie prin conectarea unei magistrale de comunicație dedicate I2C sau SPI.

Senzori tip-transformator, cum ar fi LVDT sau selsin/resolver necesită o abordare diferită. Deși există soluții dedicate, ar putea fi înțelept să ilustrăm cum să conectăm unul dintre acești senzori la un sistem încorporat cu minimum de componente suplimentare. Abordarea și schemele necesare sunt prezentate în secțiunea 6.4.2.

D.4.1 Schița osciloscopului Arduino

În codul Arduino furnizat, caracteristica principală este de a emite o undă sinusoidală pe trei canale diferite. Deoarece semnalele vor fi generate ca modulație a lățimii pulsului (PWM), mai degrabă decât tensiuni analogice, va fi adăugat un filtru low-pass simplu pentru filtrarea zgomotului de comutare PWM nedorit. Deoarece semnalul de întoarcere are o natură periodică mai degrabă decât o tensiune variabilă continuu în timp, un osciloscop este o abordare mai convenabilă pentru a vizualiza datele senzorului. Următoarea schiță generează un șir cu semnalul utilizat ca ieșire. Apoi, captează o fereastră de 480 de valori și le transmite în mod serial la Processing. Motivul de a alege 480 de valori este că ar trebui să fie posibilă împărțirea numărului în trei perioade întregi, astfel încât să poată fi generat un semnal trifazat.

Codul utilizează un timer overflow pentru setarea nivelelor de semnal analogic la intervalul de timing corect, în acest caz la 4,8 kHz. Rata baud utilizată este puțin mai mare decât standardul: 38400 Bd în loc de 9600 Bd.

image

În void setup() este posibilă selectarea diferitelor forme de undă (triunghi, pătrat, dinte de fierăstrău) dar, de obicei, unda sinusoidală dă cel mai neted răspuns, fără a introduce alte componente de înaltă frecvență în semnalul generat. Ele sunt păstrate în ilustrație; schița poate fi folosită și ca osciloscop de uz general (de joasă frecvență ).

D.4.2 Procesarea schiței de osciloscop

În Processing din nou, este necesară o schiță puțin mai mare. Fiecare cadru de 480 de valori este primit și afișat de 10 ori pe secundă. Se adaugă o opțiune pentru a adăuga un cursor (cu butonul din stânga și din dreapta al mouse-ului). Ieșirea schiței este prezentată în figura D.6.

image

Figura D.6 Trasarea în Processing.org a ieșirii schiței de osciloscop din Arduino.

Folosind butoanele, pot fi efectuate ajustări mici în offset, amplitudine și scala de timp. Când schița este rulată pentru prima dată, ar putea fi necesară generarea fontului ecranului utilizat. Aplicația Processing va furniza instrucțiunile necesare pentru a face acest lucru. Codul schiței este următorul:

image
image
image

D.5 Detectare optică

În domeniul mecatronic al roboticii unul dintre cei mai frecvent folosiți senzori de poziție este encoderul incremental rotativ. Senzorii sunt de obicei compatibili cu nivelele logice ale sistemelor încorporate, astfel încât acestea să poată fi interfațate direct cu microcontrolere. În microcontroler există un număr de opțiuni pentru măsurarea poziției. Cea mai bună alegere depinde de rezoluția dorită (de exemplu, unică, jumătate din full-quadrature) și eficiența codului. O serie de opțiuni sunt schițate în secțiunile următoare.

D.5.1 Abordarea timer-ului de eșantionare

Encoderele incrementale au de obicei două ieșiri de semnal A și B care diferă în fază cu 90°. Această performanță are patru opțiuni unice de semnalizare (așa cum este descris și prezentat în secțiunea 7.2.3). O opțiune de măsurare a fiecărei faze posibile a encoderului incremental este prin utilizarea unei rutine de eșantionare care funcționează pe o frecvență mai înaltă (criteriul Nyquist) decât cea mai mare rată de impuls așteptată a encoderului. Rețineți că, deoarece variabila de poziție este accesată atât din sfera de aplicare a buclei principale, cât și din rutina de întrerupere, aceasta trebuie declarată ca fiind "volatilă".

image
image

D.5.2 Întrerupere externă

Toate plăcile din seria Arduino au pini care pot fi folosiți pentru a declanșa o întrerupere externă. La schimbarea sau starea semnalului, va fi executat un bit de cod (rutina de servire a întreruperii). Pe Arduino Uno sunt disponibili doi pini de întrerupere externă pe pinii 2 și 3 (https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/).

În exemplul următor, numai una dintre faze este utilizată pentru a declanșa o întrerupere externă, cealaltă fază este utilizată pentru a determina direcția de rotație. Declanșatorul pentru întrerupere poate fi un front RISING sau FALLING sau o CHANGE mai generic.

image
image

D.5.3 Întrerupere externă, cuadratură completă

Este, de asemenea, posibil să utilizați ambele întreruperi externe și să le activați pe o CHANGE a intrării. Următorul cod detectează poziția în plin cadran:

image

D.5.4 Encoder liniar de gri

Un exemplu ilustrativ al unui encoder liniar de gri este următorul. Un șir liniar de senzori de reflexie prezentat în figura D.7 (https://www.pololu.com/product/960) a fost descrisă ca în secțiunea 5.3.2 unde ieșirea este măsurată ca sarcină capacitivă.

Senzorul optic poate fi interfațat și pentru măsurarea directă a tensiunii de ieșire. Pentru intrare este necesară o bandă reflectorizantă care utilizează un model codificat în gray care a fost descrisă în secțiunea 7.2.3. Un exemplu de această bandă de codare liniară poate fi generat pe hârtie.

image

Fig. D.7 Bandă encoder reflectorizantă liniară: Pololu (https://www.pololu.com/product/960).

Următoarea schiță din Processing scoate un fișier *.pdf care poate fi tipărit ca bandă de codare, rezoluție de 8 biți, folosind "biți" de 1.0 x 1.0 cm. Această bandă este prezentată în figura D.8 .

image
image

Figura D.8 Banda de codare gray

Fișierul generat prezintă o bandă de encoder completă, a se vedea figura D.8.

În Arduino, următoarea schiță interfațează senzorul liniar și transmite valoarea decodificată:

image

D.6 Citire ulterioară

Atât Arduino, cât și Processing au fost în continuă dezvoltare începând cu 2005 și respectiv 2001. Deși comunitățile și dezvoltatorii sunt foarte activi, din fericire, tehnologia de bază, factorul de formă și principalele idei nu s-au schimbat dramatic în ultimul deceniu. Multe plăci noi vor fi disponibile în seria Arduino, multe biblioteci și funcționalități noi vor fi adăugate la Processing. Exemplele schițate în acest capitol sunt menite să fie cât mai "generice" pentru a menține utilitatea pe o perioadă mai lungă de timp.

Distribuitorii și producătorii precum Adafruit (http://learn.adafruit.com), Sparkfun (https://learn.sparkfun.com/) și Studioul Seeed (https://www.seeedstudio.com/) lucrează continuu pentru a face fiecare nou senzor, transmițător, protocol sau tehnologie disponibil ecosistemului, din care fac parte culturile Arduino și Maker. Surse neprețuite de informații sunt website-urile producătorilor respectivi. Pe lângă acestea, revistele DIY (Make: magazine, MagPi și Elektor) pot fi văzute ca o resursă inestimabilă pentru domeniul aplicațiilor mecatronice. Cu acest capitol sperăm să reducem și mai mult decalajul dintre lumea mecatronică industrială și lumea DIY Maker.