This shows you the differences between two versions of the page.
pm:prj2021:amocanu:music-with-arduino-accelerometer [2021/05/28 14:43] doina.chiroiu [Descriere generala] |
pm:prj2021:amocanu:music-with-arduino-accelerometer [2021/06/01 20:34] (current) doina.chiroiu |
||
---|---|---|---|
Line 17: | Line 17: | ||
=== Schema bloc === | === Schema bloc === | ||
- | {{:pm:prj2021:amocanu:schema_bloc_music_with_arduino_accelerometer.png?650|}} | + | {{:pm:prj2021:amocanu:schema_bloc_music_with_arduino_accelerometer.png?600|}} |
+ | |||
+ | {{:pm:prj2021:amocanu:schema_fizic_music_with_arduino_accelerometer.jpeg?500|}} | ||
+ | |||
+ | {{:pm:prj2021:amocanu:schema_fizic_wrapped_music_with_arduino_accelerometer.jpeg?500|}} | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
* Arduino UNO | * Arduino UNO | ||
* MPU6500 Accelerometer & Giroscope Module | * MPU6500 Accelerometer & Giroscope Module | ||
+ | * 8x8 Leds Matrix | ||
+ | * Keyboard | ||
+ | * Speakers | ||
* Breadboard | * Breadboard | ||
* Fire de legatura | * Fire de legatura | ||
+ | === Schema electrica === | ||
+ | {{:pm:prj2021:amocanu:schema_electrica_music_with_arduino_accelerometer.png?600|}} | ||
+ | |||
+ | Detalii hardware: | ||
+ | * modul MPU-6050 | ||
+ | Pentru conectarea accelerometrului, am conectat VCC-ul la 5V, GND la GND, și cele două seriale de date astfel: SCL la A5, SDA la A4. Astfel, se realizează comunicația I2C necesară. | ||
+ | * 8x8 Leds Matrix | ||
+ | În vederea folosirii unui obiect ledController, a trebuit sa conectez pinii DIN, CLK și DS. | ||
+ | Am ales pentru acest element pinii D11, D13 si D12. | ||
+ | * Keypad | ||
+ | Se conecteaza pinii corespunzători liniilor 1 și 2 (pinii D2 și D3) și pinii pentru cele 4 | ||
+ | coloane (pinii D4, D5, D6 și D7). Astfel, se va vor mapa acești pini pe vectorul de | ||
+ | keys ({{1, 2, 3, A}, {4, 5, 6, B}}), pe care îl utilizăm în crearea obiectului intermediar keypad. | ||
+ | * Speakers | ||
+ | Fiecare speaker este conectat la GND cu un fir, și cu celălalt la un pin aferent. | ||
+ | Am folosit pinii 8, 9 și 10 pentru cele 3 speakere. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Software Design ===== | ||
+ | |||
+ | Proiectul meu constă, la nivel de cod, în implementarea | ||
+ | programului ce va fi încărcat în placa (folosind Arduino IDE) | ||
+ | și în implementarea programului ce procesează datele share-uite | ||
+ | de către Arduino prin terminalul serial (folosind Processing IDE). | ||
+ | |||
+ | În ceea ce privește bibliotecile necesare, am folosit: | ||
+ | * ItemI2Cdev.h | ||
+ | * ItemMPU6050.h | ||
+ | * LedControl.h | ||
+ | * Keypad.h | ||
+ | * Wire.h | ||
+ | |||
+ | Structurile auxiliare sunt, în mare parte, structuri standard C. | ||
+ | Pe lângă acestea, am utilizat totuși o structură Grid, | ||
+ | necesară compunerii obiectului LedController ce servește | ||
+ | afișării pe matricea de leduri, și un obiect Keypad pentru | ||
+ | abstractizarea logicii tastaturii folosite. | ||
+ | |||
+ | Detalii de implementare: | ||
+ | |||
+ | == note & game muzicale == | ||
+ | Am folosit o varietate de note muzicale, din game diferite, | ||
+ | pe care le-am grupat cate 10 in 6 grupuri stocate în vectorul | ||
+ | “melodies”. Astfel, avem 6 teme muzicale disponibile. | ||
+ | |||
+ | == setup() == | ||
+ | Pentru a realiza conexiunea cu senzorul MPU-6050, solicităm | ||
+ | adresa corespunzătoare (0x68). După ce am preluăm adresa | ||
+ | conexiunii de tip I2C, vom trezi senzorul setând 0 pe acea | ||
+ | adresă. | ||
+ | Pentru calibrare, am setat flaguri pe cele 3 adrese unde preluăm | ||
+ | datele pentru cele 3 axe (X, Y, Z). | ||
+ | |||
+ | == loop() == | ||
+ | După cererea de receptionare de la adresa MPU, începe transmisia de | ||
+ | la acea adresa pentru a prelua mărimile de acceleratie, rotație și timp. | ||
+ | Fiindu-mi necesare aceste mărimi, folosesc în total 14 registre (2 pentru | ||
+ | măsurarea timpului, câte 2 pentru datele de pe fiecare axă - deci în total 6 | ||
+ | pentru acceleratie și două pentru rotație). | ||
+ | |||
+ | Stocăm datele în variabile ținute global în program, și începem procesarea | ||
+ | acestora pentru a le putea reprezenta pe ieșirile noastre. | ||
+ | * Redarea sunetelor | ||
+ | Am procesat valorile măsurate ale accelerației: AcX, AcY. AcZ astfel: | ||
+ | Calculez offset-ul obținut pe fiecare axa, și mapăm acele valori | ||
+ | în range-ul [0, 8] pentru a folosi rezultatul pentru afișarea pe | ||
+ | matricea de leduri. | ||
+ | |||
+ | Am procesat valorile măsurate ale rotației: GyX, GyY. GyZ astfel: | ||
+ | Calculăm unghiurile de rotație: roll - axa X, pitch - axa Y, rbe - axa Z. | ||
+ | Formulele utilizate sunt: | ||
+ | roll = atan(GyY / sqrt(pow(GyX, 2) + pow(GyZ, 2))) * 180 / PI; // rotation X-axis | ||
+ | pitch = atan(-1 * GyX / sqrt(pow(GyY, 2) + pow(GyZ, 2))) * 180 / PI; // rotation Y-axis | ||
+ | rbe = atan(GyZ / sqrt(pow(GyX, 2) + pow(GyY, 2))) * 180 / PI; // rotation Z-axis | ||
+ | |||
+ | Datele roll, pitch și rbe sunt puse terminalul serial. | ||
+ | |||
+ | Pentru a găsi sunetul corespondent din gama curentă, vom mapa aceste date la | ||
+ | range-ul [0, 10], rezultatul reprezentand în final indexul din vectorul de sunete -> | ||
+ | melodies[theme][index]. Acest sunet va fi invocat pe difuzoare. | ||
+ | |||
+ | * Leds Matrix | ||
+ | După maparea datelor în range-ul [0, 8] (dimensiunea matricii), se va seta | ||
+ | ledul corespunzător acestei mapari, prin obiectul ledController. | ||
+ | Astfel, valorile recepționate de la accelerometrul cu giroscop se pot pune | ||
+ | în corespondență cu aprinderea unui led în spațiul matricii. | ||
+ | Obținem deci, o reprezentare vizuală a mișcării accelerometrului. | ||
+ | |||
+ | * Keypad | ||
+ | Pe lângă interacțiunea prin accelerometru și interpretarea mișcării acestuia, | ||
+ | instrumentul dispune de interacțiune printr-o tastatură. | ||
+ | Obiectul keypad este intermediarul în cod pentru citirea unei taste. Lucrăm cu | ||
+ | primele doua linii de taste, incarcand semnăturile lor în vectorul keys[]. | ||
+ | |||
+ | La apăsarea unei taste cu semnătura unei cifre de la 1 la 6, se va seta | ||
+ | o tema muzicala din cele 6 disponibile si va porni instrumentul. | ||
+ | La apăsarea tastei ‘A’, voi trezi încă un difuzor dintre cele 3 disponibile | ||
+ | pentru un plus de volum. Cand se apasa ‘A’ a treia oară, volumul revine | ||
+ | la stadiul inițial. | ||
+ | La apăsarea tastei ‘B’, voi invoca notele din gama curentă la rand, pentru | ||
+ | a reprezenta la nivel de sunet o melodie simplă. | ||
+ | |||
+ | |||
+ | <note>Legat de procesarea datelor in cadrul PC-ului, am implementat un program | ||
+ | ce realizează design-ul accelerometrului (în mod simplist), și îi stimulează rotația | ||
+ | cu datele preluate de pe portul de comunicație.</note> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Rezultatul Final ===== | ||
+ | * [[https://github.com/ina55/Music-With-Arduino-Accelerometer|cod github]] | ||
+ | * [[https://youtu.be/glB5WJHGV5o|video]] | ||
+ | |||
+ | ===== Concluzie ===== | ||
+ | Proiectul m-a învățat foarte multe despre lumea Arduino și posibilitatile nenumărate pe care | ||
+ | le avem în implementarea prin plăcute. | ||
+ | Una dintre provocările majore a fost realizarea conexiunii I2C, între plăcuta Arduino UNO și | ||
+ | modulul de accelerometru cu giroscop MPU-6050. Pe langa studiul în ceea ce privește legarea serialelor de date, am implementat în totalitate sistemul de recepționare a datelor. | ||
+ | Ulterior, o alta etapa importanta a fost procesarea datelor cu formule matematice, pentru obținerea unor rezultate relevante: sunete și afișare în concordanță cu mișcarea efectuata. | ||
+ | |||
+ | Acest proiect m-a familiarizat cu programarea plăcuțelor Arduino, dar și cu utilizarea perifericelor (tastatura, afișarea prin matrice de leduri) și cu modul de funcționare a unui | ||
+ | senzor MPU. | ||
+ | |||
+ | Mi-a plăcut să lucrez la proiect și am învățat câte probleme poate pune hardware-ul într-o | ||
+ | astfel de aplicație, invatand sa mă adaptez. | ||
+ | |||
+ | ===== Download ===== | ||
+ | {{:pm:prj2021:amocanu:music-with-arduino-accelerometer-master.zip|}} | ||
+ | |||
+ | ===== Bibliografie / Resurse ===== | ||
+ | https://www.instructables.com/Accelerometer-MPU-6050-Communication-With-AVR-MCU/ | ||
+ | |||
+ | https://www.electronicwings.com/arduino/mpu6050-interfacing-with-arduino-uno | ||
+ | |||
+ | |||
+ | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |