sâmbătă, 11 ianuarie 2014

ARDUINO SI COMENZI PRIN INTERFATA SERIALA


     Pot declara oficial: Arduino m-a prins. Nu voi face apologia avantajelor sau dezavantajelor acestei platforme dar tinand cont de pret si de simpliatate este prea tentanta sa nu fie bagata in seama.

Ok. Ieri m-am tot gandit cum as putea trimite comenzi placutei prin interfata seriala: ceva de genul sa aprind sau sa sting niste leduri utilizand doar comenzi gen consola (sechele de pe vremea MS DOS-ului). Dupa putina bataie de cap am gasit solutia. De fapt am facut doua programe : unul in care se comanda fiecare bit independent iar altul in care se trimite prin interfata seriala o secventa de bytes iar Arduino stinge si aprinde ledurile conform acelei secvente.

     In postul de azi voi prezenta primul program urmand ca intr-un post ulterior sa vorbesc si despre cea de-a doua varianta. Sa incepem:  

    Cand se citeste ceva de la portul serial intotdeauna se primeste informatia bit cu bit pana cand a fost atins un byte (adica au fost transmisi 8 biti). Daca nu exista alte constrangeri Arduino va stoca aceasta informatie intr-o variabila de tip char (de fapt este un byte care ia valori in domeniul codului ASCII 0-127). Cand am vorbit de constarngeri am incercat sa zic faptul ca se pot trimite mai multe caractere insa tinand cont de particularitatile transmisiei seriale, pentru a putea utiliza aceste date este nevoie ca ele sa fie salvate intr-un vector (array). Arduino dispune de o functie care face fix acest lucru " Serial.readBytes(arg1, arg2) ". Primul argument reprezinta un array in care se stocheaza datele primite prin portul serial iar cel de-al doilea argument reprezinta numarul de bytes care vor fi cititi. De exemplu:
Sa zicem ca avem definit un vector denumit " buffer[7]". Functia descrisa mai sus va lua primul argument arg1= buffer (de fapt este un pointer catre vectorul buffer) si daca dorim sa citim doar primle 3 caractere trimise arg2 va fi egal cu 3: Serial.readBytes(buffer, 3). 
Daca se trimite  secventa : "arduino" continutul vectorului buffer va fi:
  • buffer[0]='a'
  • buffer[1]='r'
  • buffer[2]='d'
Acum: pentru a putea face ceva cu aceste caractere este necesar sa ne legam de valorile lor din codul ASCII. Valoarea ASCII pentru 'a' este 97, pentru 'r' este  114 iar pentru 'd' este 100. Acum ca avem codurile putem manipula datele asa cum vrem.

Destul cu teoria. Sa vedem acum cum lucreaza programul. Utilizand un Arduino Mega 2560 se leaga la 8 pini ai acestuia (24,26,28,30,32,34,36,38) cate un led. Se trimite prin interfata seriala (personal utilizez programul Terminal ce poate fi descarcat de aici) numarul ledului urmat de starea dorita de exemplu: daca dorim sa aprindem ledul numarul 1 se scrie "11" iar daca dorim sa il stingem se scrie "10". 
     Codul este urmatorul:


     
     Ok. Acum sa vedem si ceva screenshot-uri:




     Acesta este programul Terminal in care s-a introdus comanda de aprindere a ledului numarul 1.

COMANDA 11

Acesta este efectul : ledul 1 este aprins. Apoi se trimit succesiv comenzile "21", "10" cu urmatoarele rezultate:

COMANDA 21

COMANDA 10


     Cam asta ar fi. In postul urmator voi arata cum se poate trimite o secventa de bytes in urma careia se pot aprinde ledurile in modul dorit de utilizator.

Niciun comentariu:

Trimiteți un comentariu