Anda di halaman 1dari 18

http://www.robofun.

ro

Curs Gratuit Arduino si Robotica

Textul si imaginile din acest document sunt licentiate


Attribution-NonCommercial-NoDerivs CC 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 !ebsite " blog printare sau orice alt mijloc# atat timp cat nu aduci nici un $el de modi$icari acestuia% Codul sursa din acest document poate $i utili&at in orice $el de scop de natura comerciala sau nu $ara nici un $el de limitari%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

Arduino Leonardo pe post de tastatura


Exact daca ai un Arduino 'eonardo poti sa-l $aci sa se comporte ca o tastatura sau un mouse absolut obisnuite (din punct de vedere al calculatorului#% Este o $acilitate a noului microcontroller Atmega()u*% Tot ce ai $acut este ca in codul Arduino sa apele&i libraria +e,board si calculatorul (la care ai conectat Arduino prin -.B# se va comporta ca si cum ai $i apasat taste pe tastatura obisnuita% /nainte de a trece mai departe este necesar sa iti atrag atentia asupra unui lucru care ar putea $i neplacut% /mediat ce ai programat placa sa trimita taste apasate catre calculator Arduino le va trimite tot timpul pana cand ii spui sa se opreasca% .ingurul mod in care ii poti spune sa se opreasca este incarcand alt program% Dar daca ai pus placa sa trimita taste prea rapid atunci nu vei putea $ace acest lucru pentru ca se vor apasa taste c0iar in mediul de de&voltare acolo unde vei vrea sa scrii codul% Ca sa nu se intample asta ai grija ca sa existe un mecanism prin care sa opresti trimiterea de taste (cum ar $i un buton conectat la Arduino sau un dela, mare pus un setup#% Cu un dela, in setup poti oricand sa dai un reset placii alt$el incat sa o $orte&i sa rule&e $unctia setup si apoi cat timp placa sta in dela, tu ii vei putea modi$ica programul% Exemplu 1 void setup() { delay(15000); Keyboard.begin(); } void loop() { Keyboard.print("Hello!"); delay(10000); }

/n exemplul de mai sus nu $acem altceva decat sa initiali&am modul tastatura (+e,board%begin(## si apoi sa trimitem la $iecare 12 secunde sirul de caractere 34ello3 (exact ca si cum am apasa pe tastatura consecutiv tastele 4 e l l o% Am pus un dela, in setup de 15 secunde in ideea ca atunci cand vei vrea sa sc0imbi programul placii sa poti da un reset si ast$el sa ai la dispo&itie 15 secunde pentru a incarca noul program% Cu Arduino 'eonardo poti apasa si tastele CT6' A'T sau .4/7T ca mai jos%

http://www.robofun.ro/forum

http://www.robofun.ro Exemplu 2 c ar ctrlKey ! K"#$%"&'$(')%; void setup() { Keyboard.begin(); delay(15000); } void loop() { delay(1000); Keyboard.press(ctrlKey); Keyboard.press(*n*); delay(100); Keyboard.release+ll(); delay(,0000); }

Curs Gratuit Arduino si Robotica

Dupa ce au trecut cele 15 secunde din setup Arduino apasa tasta CT6' (si o mentine apasata# apoi apasa tasta 3n3 si apoi eliberea&a ambele taste% E$ectul pe majoritatea sistemelor de operare este desc0iderea unei $erestre noi% 8ai jos lista tuturor comen&ilor asociate tastaturii emulate de Arduino% Keyboard.begin() - desc0ide o sesiune de emulare tastatura% Este necesar sa apele&i aceasta comanda inainte de a le putea $olosi pe restul% Keyboard.end() - inc0ide o sesiune de emulare tastatura% Keyboard.press(<TASTA>) - apasa si mentine apasata o tasta (utila pentru a trimite combinatii de taste gen CT6' 9 N#% Keyboard.print(<SIR_DE_TASTE>) - apasa si eliberea&a o tasta sau un sir de taste% -til pentru a apasa o tasta sau un sir de taste apasate succesiv spre calculator% Keyboard.println(<SIR_DE_TASTE>) - acelasi lucru ca print doar ca la $inal apasa si tasta ENTE6% -til pentru a introduce in$ormatie intr-un document text si a trece automat la linie noua% Keyboard.release(<TASTA>) - eliberea&a o tasta apasata anterior (cu +e,board%press(##% Keyboard.releaseAll() - eliberea&a toate tastele apasate anterior (cu +e,board%press(## Keyboard.write(<TASTA>) http://www.robofun.ro/forum

http://www.robofun.ro apasa si eliberea&a o tasta%

Curs Gratuit Arduino si Robotica

Arduino Leonardo pe post de mouse


Exact in acelasi mod cum emulea&a tastatura Arduino 'eonardo poate $i va&ut de calculator si ca mouse% Poate misca cursorul pe ecran la orice po&itie si poate simula apasarea pe butoanele mouse-ului% Exemplu 1 void setup(){ -ouse.begin(); } void loop(){ -ouse..ove(50/ 50/ 0); delay(10000); }

Codul de mai sus initiali&ea&a modul mouse iar apoi la $iecare 12 secunde misca pointer-ul mouse-ului cu 52 de pixeli pe $iecare axa% 8ai jos lista tuturor comen&ilor asociate controlului mouse-ului din Arduino 'eonardo% Mouse.begin() initiali&ea&a modul de control al mouse-ului% Mouse.end() inc0ide sesiunea de emulare mouse% Mouse. li !(<"#T$%>) - apasa si eliberea&a un buton al mouse-ului% :alori posibile sunt 8;-.E<'E7T 8;-.E<6/=4T 8;-.E<8/DD'E% Ast$el 8ouse%clic>(8;-.E<'E7T# generea&a un clic> obisnuit pe butonul din stanga al mouse-ului% Mouse.&o'e(<(>)*<+>)*<S,R$-->) - generea&a o miscare a cursorului de mouse pe $iecare axa in parte% Primul parametru este miscarea pe axa ori&ontala al doilea pe axa verticala iar al treilea repre&inta deplasarea rotitei de scroll% Mouse.press(<"#T$%>) - apasa ($ara a elibera# unul dintre butoanele mouse-ului% :alori posibile sunt 8;-.E<'E7T 8;-.E<6/=4T 8;-.E<8/DD'E% Ast$el http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

8ouse%press(8;-.E<'E7T# este ca si cum am apasa manual pe butonul din stanga al mouse-ului $ara a-l elibera% Mouse.release() eliberea&a unul dintre butoanele mouse-ului apasate anterior cu 8ouse%press% :alori posibile sunt 8;-.E<'E7T 8;-.E<6/=4T 8;-.E<8/DD'E%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

Logare presiune atmosferica, umiditate, nivel de iluminare si temperatura in Excel, cu Arduino Leonardo
7olosindu-ne de capacitatea lui Arduino 'eonardo de a emula o tastatura devine $oarte simplu sa logam in$ormatie pe calculator% Tot ce avem de $acut este sa apasam din Arduino acele taste corespun&atoare valorilor citite (ca sa cand le-am introduce manual din tastatura#% Acest proiect $oloseste un sen&or B8P2?5 (presiune atmos$erica si temperatura# un sen&or de lumina bric> si un sen&or de umiditate bric> impreuna cu un Arduino 'eonardo pentru a introduce periodic in$ormatie intr-un document Excel% Primul pas este conectarea componentelor la Arduino ca in sc0ema de mai jos% Probabil ca la prima vedere sc0ema de conectare pare un $el de paianjen cu multe picioare dar daca vei reveni la sc0ema de conectare pentru $iecare sen&or in parte (in sectiunea unde $iecare sen&or este pre&entat separat# atunci lucrurile vor deveni mult mai simple% Cele doua componente bric> sunt conectate la 5: si =ND pentru alimentare iar apoi la pinii analogici A2 si A1% .en&orul B8P2?5 este conectat la cei doi pini /)C .DA si .C' (care in ca&ul Arduino 'eonardo sunt in partea din stanga sus#%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

8ai departe codul sursa nu $ace altceva decat sa combine exemplele care demonstrea&a citirea datelor de la sen&ori cu cel care demostrea&a utili&area Arduino 'eonardo pe post de tastatura%
0include 12ire. 3 0include 14-5065. 3 4-5065 dps ! 4-5065(); long 'e.perature ! 0/ 5ressure ! 0; void setup(void) { 7erial.begin(8900); 2ire.begin(); delay(1000); dps.init(); delay(5000); Keyboard.begin(); } void loop(void) { dps.get'e.perature(:'e.perature); dps.get5ressure(:5ressure); int nivel;lu.inare ! analog)ead(1); int nivel<.iditate ! analog)ead(0); Keyboard.print(7tring('e.perature)); Keyboard.print(K"#$);=H'$+))>2); Keyboard.print(7tring(5ressure)); Keyboard.print(K"#$);=H'$+))>2); Keyboard.print(7tring(nivel;lu.inare)); Keyboard.print(K"#$);=H'$+))>2); Keyboard.print(7tring(nivel<.iditate)); Keyboard.println();

Mouse cu accelerometru si Arduino Leonardo


Acest proiect se ba&ea&a pe capacitatea placii Arduino 'eonardo de a se comporta ca mouse% Prin combinarea unui Arduino 'eonardo cu un accelerometru pe ( axe vom obtine un mouse pe care il vom controla prin miscarea mainii% Poti $olosi orice $el de accelerometrul doresti% /n cele ce urmea&a vom $olosi un accelerometru AD@'((5 pentru simplitate% Accelerometrul se conectea&a la Arduino in modul obisnuit ca in sc0ema mai jos%

http://www.robofun.ro/forum

http://www.robofun.ro
0de?ine 7"@7;4;%;'+'"$A , 0de?ine 7"@7;4;%;'+'"$# , void setup() { 7erial.begin(8900); analog)e?erence("A'")@+%); -ouse.begin(); } void loop() { ?loat B+cc!read+cc(0); ?loat y+cc!read+cc(1); ?loat C+cc!read+cc(D); 7erial.print("+cceleratie AE "); 7erial.print(B+cc/F"(); 7erial.print("+cceleratie #E "); 7erial.print(y+cc/F"(); 7erial.println(); delay(50);

Curs Gratuit Arduino si Robotica

-ouse..ove(B+cc G 7"@7;4;%;'+'"$A/ y+cc G 7"@7;4;%;'+'"$#/ 0); } ?loat read+cc(int port) { int value!analog)ead(port); int .iliHolts!.ap(value/0/10D,/0/,,00)I,,00JD; ?loat acc!(?loat).iliHoltsJ,90; return acc; }

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

Arduino 3.3 V Arduino GND Arduino Analog0 Arduino Analog1 Arduino Analog2 Arduino 3.3

ADXL335 VCC ADXL335 GND ADXL335 X ADXL335 Y ADXL335 Z Arduino AREF

Constantele .EN./B/'/TATE<@ si .EN./B/'/TATE<Y de$inesc cat de mult se misca mouse-ul pe ecran atunci cand miscam accelerometrul% Cu cat valorile pentru aceste constante sunt mai mari cu atat mouse-ul se va misca mai mult pe ecran atunci cand miscam accelerometrul% Esti liber sa te joci cu aceste constante pana cand miscarea pe ecran este exact asa cum vrei tu% Principiul de $unctionare al acestui mouse se ba&ea&a pe $aptul ca in orice locatie de pe Pamant avem o acceleratie gravitionala 1g indreptata intotdeauna pe directia verticala% Cand accelerometrul AD@'((5 este orientat pe directie ori&ontala atunci pe axa @ si pe axa Y acceleratiile citite sunt &ero% Este o acceleratie de 1g citita pe axa A% Atunci cand inclinam accelerometrul in plan acceleratia de 1g care se mani$esta doar pe axa A cand accelerometrul este ori&ontal incepe sa se mani$este si pe axele @ si Y % Ast$el daca inclinam accelerometrul la un ung0i de *5 de grade pe axa @ vom avea o acceleratie de 2%5g pe axa @%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

Acceleratiile citite de accelerometru sunt inmultite cu o valoare constanta (in ca&ul nostru cu ( valoarea constantei .EN./B/'/TATE<@# si mouse-ul este miscat pe ecran corespun&ator valorii obtinute% Poate vei spune ca o deplasare de ( pixeli atunci cand accelerometrul este inclinat maximum este putin dar adu-ti aminte ca $unctia loop se executa non-stop ast$el incat mouse-ul este miscat cu ( pixeli la $iecare 52 de milisecunde (pentru ca in loop exista o instructiune delay(50)#% Daca ti se pare complicat sa tii mouse-ul $ix pe ecran (pentru ca este destul de di$icil sa tii AD@'((5 per$ect ori&ontal# atunci putem imbunatati programul de mai sus prin setarea unei &one in care mouse-ul nu se misca deloc pe ecran ca mai jos (modi$icarile in bold# B
0de?ine 0de?ine #de ine #de ine 7"@7;4;%;'+'"$A , 7"@7;4;%;'+'"$# , Z!NA"#!AR$A"X 0.3 Z!NA"#!AR$A"Y 0.3

void setup() { 7erial.begin(8900); analog)e?erence("A'")@+%); -ouse.begin(); } void loop() { ?loat B+cc!read+cc(0); ?loat y+cc!read+cc(1); ?loat C+cc!read+cc(D); 7erial.print("+cceleratie AE "); 7erial.print(B+cc/F"(); 7erial.print("+cceleratie #E "); 7erial.print(y+cc/F"(); 7erial.println(); delay(50);

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

in% &i'(areX ) 0* i +a,'+-A((. / Z!NA"#!AR$A"X. 0 &i'(areX ) -A(( 1 2EN2343L3$A$E"X* 5

int miscareY = 0;
i 5 -ouse..ove(.iscareA/ .iscare#/ 0); } ?loat read+cc(int port) { int value!analog)ead(port); int .iliHolts!.ap(value/0/10D,/0/,,00)I,,00JD; ?loat acc!(?loat).iliHoltsJ,90; return acc; } +a,'+6A((. / Z!NA"#!AR$A"Y. 0 &i'(areY ) 6A(( 1 2EN2343L3$A$E"Y*

Am introdus doua constante A;NA<8;A6TA<@ si A;NA<8;A6TA<Y care de$inesc valorile acceleratiei sub care mouse-ul nu $ace nici o miscare% Ast$el daca tii accelerometrul intr-o po&itie aproape de ori&ontala mouse-ul nu se misca deloc pe ecran% /n $inal ca sa poti misca simplu accelerometrul iti sugere& sa il prin&i pe o manusa de piele (cumparata de la standul cu elemente de protectie din 4ornbac0 Brico.tore sau Practi>er#% -rmatoarea extindere a acestui proiect este sa adaugi sistemului si doua butoane bric> obtinand ast$el un mouse per$ect $unctional% .c0ema de conectare este cea de mai jos% Butoanele le poti monta pe cate un deget al $iecarei manusi ast$el incat sa le poti apasa cu degetul mare (prin suprapunerea degetului mare peste unul dintre cele doua degete pe care sunt lipite butoanele#%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

0de?ine 0de?ine 0de?ine 0de?ine

7"@7;4;%;'+'"$A , 7"@7;4;%;'+'"$# , K>@+$->+)'+$A 0., K>@+$->+)'+$# 0.,

#de ine 47$!N1"83N 9 #de ine 47$!N1"83N 10 #de ine DE4!7NCE"$3#E 100 void setup() { 7erial.begin(8900); analog)e?erence("A'")@+%); :in#ode+47$!N1"83N; 3N87$.* :in#ode+47$!N2"83N; 3N87$.*

http://www.robofun.ro/forum

http://www.robofun.ro
-ouse.begin(); } long la'%4u%%on8re''1 ) 0* long la'%4u%%on8re''2 ) 0* void loop() {

Curs Gratuit Arduino si Robotica

in% ,u%on1 ) digi%alRead+47$!N1"83N.* in% ,u%on2 ) digi%alRead+47$!N2"83N.* i +,u%on1 )) 1. 0 i ++&illi'+. < la'%4u%%on8re''1. / DE4!7NCE"$3#E. 0 la'%4u%%on8re''1 ) &illi'+.* #ou'e.(li(=+47$$!N"LEF$.* 5 5 i +,u%on2 )) 1. 0 i ++&illi'+. < la'%4u%%on8re''2. / DE4!7NCE"$3#E. 0 la'%4u%%on8re''2 ) &illi'+.* #ou'e.(li(=+47$$!N"R3G>$.* 5 5 ?loat B+cc!read+cc(0); ?loat y+cc!read+cc(1); ?loat C+cc!read+cc(D); 7erial.print("+cceleratie AE "); 7erial.print(B+cc/F"(); 7erial.print("+cceleratie #E "); 7erial.print(y+cc/F"(); 7erial.println(); delay(50); int .iscareA ! 0; i? (abs(B+cc) 3 K>@+$->+)'+$A) { .iscareA ! B+cc G 7"@7;4;%;'+'"$A; } int .iscare# ! 0; i? (abs(y+cc) 3 K>@+$->+)'+$#) { .iscare# ! y+cc G 7"@7;4;%;'+'"$#; } -ouse..ove(.iscareA/ .iscare#/ 0); } ?loat read+cc(int port) { int value!analog)ead(port); int .iliHolts!.ap(value/0/10D,/0/,,00)I,,00JD; ?loat acc!(?loat).iliHoltsJ,90; return acc; }

De remarcat in codul de mai sus este constanta DEB;-CE<T/8E% Asa cum http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

am povestit mai pe larg in cadrul sectiunii despre butoane bric> atunci cand se apasa un buton semnalul receptionat de catre Arduino varia&a de cateva ori intre 2 si 1 (nu trece instantaneu din 2 in 1#% Acest lucru se intampla datorita $aptului ca atunci cand apasam butonul lamelele metalice care inc0id contactul nu se ating per$ect% Ca sa evitam ca Arduino sa citeasca mai multe apasari de buton vreme de 122 de milisecunde dupa prima apasare receptionata (valoarea lui DEB;-NCE<T/8E# vom ignora orice alta apasare% Acest lucru inca permite conceptul de dublu clic> (doar ca di$erenta intre doua clic>-uri succesive va $i exact DEB;-NCE<T/8E milisecunde#% Daca dublu clic> nu este sesi&at corect de calculatorul tau poti sa micsore&i valoarea acestei constante sau sa modi$ici pe calculator durata intre cele doua clic>-uri succesive pentru a obtine un dublu clic>%

http://www.robofun.ro/forum

http://www.robofun.ro

Curs Gratuit Arduino si Robotica

A easta*a*.ost*le tia*/0.*In*.inal)*as*'rea*sa*te*rog*sa*ne*o.eri*.eedba !* asupra * a estei * le tii) * pentru * a * ne * per&ite * sa * le * .a e& * &ai * bune * pe* ur&atoarele. Este*'orba*despre*un*sonda1* u*2*intrebari*(ori are*este*optionala))*pe* are*il*poti*a esa*dand* li !*ai i.* Sau*ne*poti* onta ta*dire t*prin*e&ail*la* onta t3robo.un.ro*. Iti*&ultu&i&) E 4ipa*Robo.un.R$

http://www.robofun.ro/forum