Curs Gratuit Arduino si Robotica · Conectarea la Arduino se face folosind patru fire, ca in figura...

8

Transcript of Curs Gratuit Arduino si Robotica · Conectarea la Arduino se face folosind patru fire, ca in figura...

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Textul si imaginile din acest document sunt licentiate

Attribution-NonCommercial-NoDerivsCC BY-NC-ND

Codul sursa din acest document este licentiat

Public-Domain

Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website / blog, printare, sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara

nici un fel de limitari.

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Arduino Leonardo, accelerometru MMA8452Q si Excel

Arduino 3.3 V MMA8452Q 3.3V

Arduino GND MMA8452Q GND

Arduino SDA MMA8452Q SDA

Arduino SCL MMA8452Q SCL

MMA8452Q este un accelerometru relativ ieftin, suficient de capabil pentru pretul lui. Suporta trei game de acceleratie (2g, 4g, 8g). Conectarea la Arduino se face folosind patru fire, ca in figura de mai sus. Putem utiliza un accelerometru de acest tip impreuna cu un Arduino Leonardo pentru a construi o aplicatie ce detecteaza vibratiile cum ar fi cele produse de un cutremur. Datele vor fi salvate intr-un fisier excel pentru a fi stocate in caz ca vrei sa le utilizezi la ceva anume. Sau se pot construi mai multe module de acest gen si interconectate intr-o retea iar daca sunt gestionate de catre un server pot fi transformate intr-o adevarata retea de detectie a cutremurelor.

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Cum functioneaza?

Accelerometrul se alimenteaza direct de la platforma Arduino si comunica cu microcontroller-ul prin doua fire: SDA si SCL. Orice vibratie mica, orice fel de miscare aplicata accelerometrului provoaca o schimbare la cele trei variabile de iesire. Variabilele de iesire sunt raportate la cele trei axe de coordonate: X, Y, Z.

Astfel daca accelerometrul va sta cu axa Z perpendiculara pe planul orizontal, la iesire vei observa trei valori. Primele doua valori, X si Y vor oscila in jurul valorii lui 0, pentru ca nu actioneaza nici o forta asupra lor dar oscileaza pentru ca e posibil ca accelerometrul sa aibe o usoara inclinatie. Dar asupra lui Z actioneaza forta gravitationala. Imaginea luata din Excel arata mai bine aceasta situatie(coloanele sunt in ordinea: X, Y si Z, cel din urma fiind in jurul valorii de 250, aproximativ 1g).

Cum incarci datele in Excel ? In primul rand, vrem ca datele referitoare la vibratii sa se incarce in Excel doar atunci cand se detecteaza vibratii si nu incontinuu. Apoi datele vor fi grupate in cate 10 esantioane si se va face o medie. Va exista si un threshold sau valoare limita, depinde cum vrei sa o numesti.

Daca media celor 10 esantioane depaseste valoarea thresholdului atunci Arduino va incarca datele in Excel si va realiza acest lucru pentru 10 secunde. Apoi va realiza din nou o mediere asupra altor 10 esantioane si din nou va testa daca s-a depasit thresholdul iar daca nu, el va ramane in standby(nu va transmite nimic in Excel).

Cum transmite Arduino Leonardo setul de date in Excel ? Arduino Leonardo se va comporta ca o tastatura sau keyboard emulator. Exista niste functii interesante care realizeaza acest lucru si vom vedea in continuare.

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Codul sursa.

Avem doua directive ce reprezinta defapt librariile: I2C pentru protocol si libraria accelerometrului. Se initializeaza si obiectul accel. Librariile se vor copia in directorul libraries din directorul arduino.

arduino-1.0.1-windows/arduino-1.0.1/libraries/I2C/I2C.cpparduino-1.0.1-windows/arduino-1.0.1/libraries/I2C/I2C.harduino-1.0.1-windows/arduino-

1.0.1/libraries/MMA8453_n0m1/MMA8453_n0m1.cpparduino-1.0.1-windows/arduino-

1.0.1/libraries/MMA8453_n0m1/MMA8453_n0m1.h

#include <I2C.h>#include <MMA8453_n0m1.h>MMA8453_n0m1 accel;

Se declara variabilele de tip int:

int contor;int X[10];int Y[10];int Z[10];int mediaX, mediaY, mediaZ;int thresX, thresY, thresZ;

Functia setup initializeaza variabilele declarate mai sus, adresa accelerometrului, modul de lucru al senzorului si emularea tastaturii. Aici am stabilit si valorile de threshold si le poti modifica daca vrei sa modifici sensibilitatea senzorului la vibratii.

void setup(){ mediaX=0; mediaY=0; mediaZ=0; thresX=10; thresY=10; thresZ=300;

accel.setI2CAddr(0x1D); //change your device address if necessary, default is 0x1C accel.dataMode(true, 2); //enable highRes 10bit, 2g range [2g,4g,8g] Keyboard.begin(); }

Loop() este compusa din mai multe bucle for. Prima bucla se ocupa de esantionul de date, zece la numar. Citirile de la accelerometru sunt salvate in trei vectori: X, Y, Z.

for (contor=0; contor <= 9; contor++) { accel.update(); X[contor]=accel.x();

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Y[contor]=accel.y(); Z[contor]=accel.z(); }

Se executa o alta bucla for care aduna toate elementele vectorilor. Adunarea se imparte la 10, adica se realizeaza media aritmetica. Media este utila daca apare o vibratie generata de o alta sursa, care nu ne intereseaza si vrem sa o eliminam.

for (contor=0; contor <= 9; contor++) { mediaX=mediaX+X[contor]; mediaY=mediaY+Y[contor]; mediaZ=mediaZ+Z[contor]; } mediaX=mediaX/10; mediaY=mediaY/10; mediaZ=mediaZ/10;

Se compara cele trei medii cu 3 valori de threshold iar daca una dintre cele 3 medii(am folosit functia OR) depaseste valoarea de threshold, se incarca datele in Excel. Echivalent, daca apare o vibratie anormala si este importanta, aceasta este salvata in Excel prin apelarea functiei tipareste(). Am introdus si o intarziere pentru ca a emula o tastatura la o viteza foarte mare, inseamna sa soliciti procesorul putin mai mult. Am folosit intarzierea si ca etalon pentru a crea o perioada de aproximativ 10 secunde in care datele sunt incarcate in Excel.

if (mediaX > thresX || mediaY > thresY || mediaZ > thresZ) { for (contor=0; contor < 50; contor++){ accel.update(); tipareste(); delay(100); }

Functia tipareste are urmatoarea forma. Se printeaza valorile x, y si z prin functia keyboard.print(). Dar pentru o ordonare frumoasa in Excel se transmite Enter, sageata dreapta si sageata sus. Pentru asta se apeleaza functiile keyboard.write(). In Excel se intampla cum ai vazut in imaginea capturata mai sus. Datele sunt ordonate de sus in jos.

void tipareste(){ Keyboard.print(accel.x()); Keyboard.write(KEY_RETURN); Keyboard.write(KEY_RIGHT_ARROW); Keyboard.write(KEY_UP_ARROW); Keyboard.print(accel.y()); Keyboard.write(KEY_RETURN); Keyboard.write(KEY_RIGHT_ARROW); Keyboard.write(KEY_UP_ARROW);

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Keyboard.print(accel.z()); Keyboard.write(KEY_RETURN); Keyboard.write(KEY_RIGHT_ARROW); Keyboard.write(KEY_UP_ARROW); Keyboard.write(KEY_DOWN_ARROW); Keyboard.write(KEY_LEFT_ARROW); Keyboard.write(KEY_LEFT_ARROW); Keyboard.write(KEY_LEFT_ARROW); Keyboard.write(KEY_LEFT_ARROW); }

Vedere din ansamblu:

Concluzie.

Am optat sa montez accelerometrul cu un surub direct pe Arduino, din cauza ca este simplu. Aplicatia nu detecteaza vibratiile foarte mici. Personal am dat volumul tare pe o melodie rock dar vibratiile produse nu au fost detectate de senzor. Aici intra in calcul si valoarea de threshold dar si sensibilitatea accelerometrului pe gama de lucru(2, 4 sau 8g).

In schimb aplicatia da rezultate foarte bune la vibratiile banale. In cazul unui cutremur, stim ca miscarea se poate propaga pe orizontala sau pe verticala, adica pe una dintre cele 3 axe.

Va urez succes in constructie.

http://www.robofun.ro/forum

http://www.robofun.ro Curs Gratuit Arduino si Robotica

Aceasta a fost lectia 15. In final, as vrea sa te rog sa ne oferi feedback asupra acestei lecti i , pentru a ne permite sa le facem mai bune pe urmatoarele.

Este vorba despre un sondaj cu 4 intrebari (oricare este optionala), pe care il poti accesa dand click aici . Sondajul este complet anonim.

Sau ne poti contacta direct prin email la [email protected] .

Iti multumim,

Echipa Robofun.RO

http://www.robofun.ro/forum