This is an old revision of the document!
La Arduino se leaga accelerometrul care va comunica prin I2C datele obtinute la un anumit interval de timp
bine stabilit. Tot la Arduino avem conectat si modulul cu cardul SD care comunica prin intermediul SPI.
Pe card in prealabil am descarcat niste sunete/melodii, in functie de aplicatia dorita. Atunci cand primim
informatia de la accelerometru, in functie de aceasta alegem ori un sunet specific de pe card, ori un sunet
random dintr-un pool ales de dinainte (ca jucaria sa para mai complexa si sa nu se plictiseasca copiii).
Odata ce avem sunetul dorit de pe card (in format WAV), il trimitem catre speaker care ii da play.
Jucaria are 3 moduri in care se poate afla: IDLE, TAMBOURINE si LIGHTSABER. Atunci cand deschidem pentru prima data jucaria, aceasta va prezenta singura modul de functionare. Dupa finalul mesajului vocal, se va alege o melodie random dintr-un pool de 20 de cantece. Apoi, atata timp cat se afla in modul IDLE, jucaria va da play dupa fiecare melodie la una noua imediat cum s-a terminat precedenta.
In modul TAMBOURINE poti sa ajungi din celelalte 2 moduri miscand de 3 ori consecutiv jucaria. Daca insa o misti de 3 ori atunci cand este in acest mod, atunci se trece in starea de IDLE. In modul de tamburina se extrag de la giroscop date despre cum este miscata jucaria. In functie de miscarea cea mai puternica se poate da play la unul dintre cele 6 sunete din setul curent. Sunt 6 sunete, corespunzator fiecarei directii de rotiri (pozitive sau negative) pe cele 3 axe OX, OY si OZ. Se mai poate da play si la un al 7-lea sunet in caz ca jucaria este lovita. Jucaria are 5 set-uri de cate 7 sunete din care se alege unul la intamplare atunci cand se face tranzitia in modul de tamburina.
In modul LIGHTSABER poti sa ajungi din celelalte 2 moduri lovind de 3 ori la rand jucaria. Daca insa o lovesti de 3 ori atunci cand este deja in acest mod, atunci trece in modul de IDLE. In modul de sabie laser avem mai multe sunete pentru miscari lente si miscari rapide care sunt alese la intamplare, in functie de viteza cu care este miscata sabia. Daca se detecteaza o lovitura, in functie de puterea impactului se alege un sunet random dintr-un pool prestabilit.
Jucaria are un buton de lock care o data ce este apasat blocheaza starea jucariei in starea curenta si nu se mai face schimbarea indiferent de cum este miscata jucaria. Pentru a putea schimba din nou modul de functionare, trebuie sa se mai apese o data pe buton pentru deblocare. Pe jucarie mai exista si butonul de ON/OFF, iar dupa ce inchizi jucaria, aceasta va retine modul de functionare in care era si va incepe cu acesta, dar va debloca automat jucaria, asa ca daca se doreste sa nu se mai poata schimba modul, atunci trebuie apasat din nou butonul de lock.
Pentru acest proiect am realizat cat de importanta este legatura hardware-software si ca software-ul poate sa fie perfect scris, dar daca hardware-ul nu functioneaza, atunci e degeaba. Am invatat aceasta lectie dupa ce doar 2 componente din tot proiectul au functionat din prima, restul venind stricate de la magazin. A trebuit sa testez foarte mult hardware-ul sa ma asigur ca functioneaza corect inainte de a incepe sa scriu codul propriu zis pentru proiect.
Cea mai importanta componenta pentru proiect a fost biblioteca TMRpcm.h pentru ca era singura pe care am gasit-o sa dea play la melodii pe un speaker si nu un buzzer. Fiind insa singura, marea majoritate a problemelor au fost cauzate de ea. Am invatat ca trebuie sa fiu flexibil in dezvoltarea programelor si sa fiu deschis la schimbari rapide. Initial foloseam alta biblioteca pentru a ma ajuta sa citesc date de pe giroscop, dar a trebuit sa modific si sa caut altceva pentru ca nu functiona impreuna cu biblioteca pentru sunete. In plus, biblioteca TMRpcm.h poate sa dea play la melodii doar daca sunt de tip .wav, cu frecventa 16kHz Mono si encoding de tipul unsigned 8-bit PCM, ceea ce este o forma foarte specifica de fisier, asa ca a trebuit sa iau manual toate cele 82 de melodii si sa le convertesc folosind Audacity la tipul dorit.
Cea mai importanta lectie invatata a fost ca pentru aplicatiile embedded trebuie sa facem management de memorie, mult, foarte mult. Probabil pentru acest proiect am intalnit cel mai ciudat bug din viata mea. Biblioteca TMRpcm.h consuma multa memorie din cei 2K ai Arduino, dar mai are particularitatea ca daca folosesti mai mult de 80% din memorie, nu mai functioneaza. Am petrecut multe ore la debug aici pentru ca nu intelegeam de ce dintr-odata nu mai functioneaza speaker-ul. Dupa mult chin si jale m-am prins de problema asa ca a trebuit sa introduce toate numele de fisiere audio in memoria Flash si sa am mare grija la cum gestionez memoria.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.