Marin Alexandru-Gabriel - Master AAC1
Arduino este un proiect hardware open source bazat pe microcontroller-ele ATMEGA8 sau ATMEGA168, produse de Atmel. Poate fi folosit pentru a construi obiecte interactive, primind date de intrare de la o gamă variată de senzori şi controlând diverse periferice. Hardware-ul poate fi extins prin diverse module, ale căror scheme sunt publice, astfel încât pot fi la rândul lor extinse şi îmbunătăţite de utilizatori.
Mediul integrat de dezvoltare Arduino a fost proiectat astfel încât să fie uşor de folosit de oameni care nu au cunoştinţe avansate de hardware sau software. În acelaşi timp, Arduino IDE este suficient de flexibil pentru a putea fi folosit şi de utilizatorii avansaţi. Bazat pe mediul de dezvoltare Processing, Arduino IDE este open source şi poate fi extins prin librării C++. Nu în ultimul rând, Arduino IDE este disponibil în versiuni pentru Windows, Mac OS şi Linux, cross-platform-ul fiind unul dintre marile sale avantaje.
Sparrow v3 este nodul senzorial folosit în cadrul laboratorului de Wireless Sensor Networks şi este echipat cu trei tipuri de senzori: temperatură, umiditate și luminozitate ambientală. Acesta dispune de un microcontroller Atmega128RFA1, care încorporează un transmiţător radio conform cu standardul IEEE 802.15.4, peste care se poate implementa popularul protocol Zigbee.
Zigduino este un shield compatibil cu Arduino care prezintă, ca şi Sparrow v3, un microcontroller Atmega128RFA1. În ceea ce priveşte suportul software, creatorii Zigduino au realizat un fork la repository-ul oficial de Arduino, în care au adus modificările necesare pentru a programa dispozitivul folosind Arduino IDE. Acest suport va fi folosit pentru a programa şi nodul senzorial Sparrow v3.
Pentru a introduce suportul de Zigduino în Arduino IDE este nevoie să se urmeze paşii de mai jos:
1. Se instalează Arduino IDE: http://www.arduino.cc/en/Main/Software (versiunea 1.0.5 - Zigduino-1.0 este compatibil doar cu Arduino-1.0x);
2. Se descarcă arhiva Zigduino-1.0: https://github.com/logos-electromechanical/Zigduino-1.0;
3. Se înlocuieşte folder-ul Arduino\hardware\tools\avr cu Zigduino-1.0-new-extension\hardware\tools\avr;
4. Se copiază în Arduino\hardware\arduino\cores folder-ul Zigduino-1.0-new-extension\hardware\arduino\cores\zigduino;
5. Se înlocuieşte fişierul Arduino\hardware\arduino\boards.txt cu Zigduino-1.0-new-extension\hardware\arduino\boards.txt;
6. Se copiază în Arduino\hardware\arduino\variants folder-ele zigduino _r1 şi zigduino_r2 din Zigduino-1.0-new-extension\hardware\arduino\variants.
După aceşti paşi ar trebui să fie vizibile doua intrări pentru Zigduino în Tools→Boards (în meniul Arduino IDE).
Notă: Daca IDE-ul era pornit, va fi nevoie de un restart.
Bootloader-ul folosit este Zigduino-1.0-new-extension\hardware\arduino\bootloaders\atmega\ATmegaBOOT_168_atmega128rfa1.hex. Pentru a îl scrie în memoria flash se poate folosi Flash Programmer-ul din AtmelStudio (Tools→Device Programming).
Pentru a compila şi executa codul de mai jos pe un nod Sparrow folosind Arduino IDE paşii sunt următorii:
1. Se creează un proiect nou şi se copiază codul de mai jos (File→New);
2. În Tools→Programmer se alege USBasp;
3. În Tools→Board selectaţi Zigduino_r1;
4. Se alege portul COM la care a fost conectat nodul din Tools→Serial Port;
5. Se uploadează proiectul, folosind butonul de Upload.
#include <util/delay.h> int main(void) { // Serial needs interrupts. sei(); DDRB = (1<<PB5); PORTB = 0x00; // Print a message on the Serial interface Serial.begin(9600); Serial.println("Demo of how to use Serial and blink LEDs"); Serial.end(); // Make the LED blink while(1) { // Change the LED's state PORTB ^= (1<<PB5); // Wait 1 sec _delay_ms(1000); } return 0; }
Senzorul de umiditate şi temperatură de pe Sparrow v3 este de tipul SHT21 şi este conectat la interfaţa I2C a microcontroller-ului. Pentru a citi date de la acest senzor s-au folosit fişierele sht21.c si sht21.h oferite ca suport în laboratorul doi:
1. În folder-ul Arduino\libraries se creează un nou folder, numit sht21;
2. Se copiază sht21.c si sht21.h în folder-ul creat anterior;
3. Se schimbă extensia fişierului .c în .cpp;
După aceşti paşi se va putea importa header-ul sht21.h în proiectul Arduino: #include “sht21.h”, aşa cum se va vedea în proiectul următor.
Notă: Dacă IDE-ul era pornit, va fi nevoie de un restart.
Folosind mediul de dezvoltare Arduino IDE modificat conform paşilor prezentaţi anterior s-a creat un proiect de monitorizare senzorială bazat pe comunicare radio între mai multe noduri Sparrow v3, pornind de la scheletul de cod oferit în laboratorul doi, secţiunea Stări de low power pentru Sparrow v3.
Topologia reţelei folosite este formată dintr-un nod-gateway, care ascultă permanent mediul de transmisie, şi mai multe noduri care citesc date de la toate tipurile de senzori la intervale regulate de timp, apoi intră în sleep, pentru a consuma cât mai puţină energie.
Gateway-ul este singurul nod care primeşte pachete (nu există comunicare între noduri non-gateway, aşa cum se poate observa în imaginea de mai jos).
Gatewayul aşteaptă să primească un pachet integral de la unul din celelalte noduri. Acest eveniment este detectat o dată cu declanşarea excepţiei de TRX24_RX_END, în al cărei handler este parsat pachetul primit (acesta conţine informaţii despre id-ul nodului sursă şi valori citite de la senzorii nodului sursă). Informaţiile parsate sunt trimise de către gateway pe interfaţa serială, după care se aşteaptă următorul pachet.
Aşa cum s-a menţionat anterior, înainte de a citi date de la senzori pentru a le trimite către gateway, celelalte noduri rămân într-o stare de sleep pentru o perioadă prestabilită. Această stare, caracterizată de un consum redus de energie, presupune dezactivarea tuturor senzorilor, urmată de trecerea microcontroller-ului în sleep.
Mecanismul utilizat pentru ieşirea din acestă stare este reprezentat de activarea MAC symbol counter-ului şi a întreruperii SCNT_CMP1_vect, care se declanşează atunci când registrul Symbol Counter are aceeaşi valoare cu registrul Symbol Counter Output Compare, acesta din urmă fiind iniţializat în prealabil cu o valoare corespunzătoare pentru perioada de sleep dorită. Ieşirea din starea de sleep este reprezentată practic de declanşarea întreruperii SCNT_CMP1_vect.
Proiectul este ataşat în secţiunea Resurse.
Pentru a monitoriza datele trimise de noduri a fost creată o interfaţă grafică în Processing, cu o coloană de butoane şi o zonă de grafice, aşa cum se poate obseva în video-ul de mai jos. Datele pentru grafice sunt citite de pe interfaţa serială, unde sunt trimise de nodul-gateway.
Monitorizarea începe după apăsarea butonului Start. Cu ajutorul celorlalte butoane se poate alege unul dintre cele trei noduri precum şi modul graficelor. Se pot afişa grafice pentru valorile citite de la senzorii de temperatură, luminozitate şi umiditate (fie toate graficele în acelaşi timp, fie doar unul dintre ele).
Notă: Programul alege automat prima interfaţă COM alocată aşa că este nevoie să se asigure faptul că nodul este conectat astfel.
Arduino Sketch - Proiectul low power de monitorizare senzorială
Processing Sketch - Interfaţa grafică