Cu totii ne-am plictisit de jucariile clasice care sunt mereu vesele si care inspira un aer pozitiv. Eu o sa fac o jucarie pasiva-agresiva care va impartasi ura si glume, o jucarie mai amuzanta care nu este detinata copiilor, va fi fioroasa cu ochii rosii si o voce agresiva, dar sub o cochilie safe de baby yoda.
Jucăria este compusă dintr-un modul principal cu microcontroler, senzori de mișcare, boxa portabila, LED-uri rosii.
Jucaria va avea un corp de baby yoda in care voi pune piese hardware ca sa devina “inteligenta”. Aceasta are 2 butoane pe brate ca sa poti interactiona cu ea, dar nu doar atat, si un accelerometru (WOW), astfel sa-si dea seama daca o zgudui prea tare sau daca o arunci in sus. Foloseste o tehnologie wireless foarte avansata numita Bluetooth ca sa se conecteze la (TOATE) boxele portabile pornite in jur si sa-si faca glasul auzit (E si o unealta de terorism din acest motiv). Are mai multe interactiuni gata de folosit de catre useri, este rezistenta, lipita si rezista la cazaturi (si la copii de 3 ani, am testat).
Toate modulele comunică cu microcontrolerul (ESP32 sau similar). Codul rulează local, cu opțională conectare la internet pentru generarea de replici.
Poza prototip 1:
Poza prototip 2:
Poza dupa lipit complet:
Platformă: Arduino IDE
Librării folosite:
Surse 3rd-party:
Funcționalități:
Algoritmi și structuri:
Funcții implementate (etapa 3):
Laboratoare utilizate:
Well, proiectul a fost un succes. Pot sa afirm ca am invatat o gramada de skill-uri noi, desi ma asteptam sa fie mult mai liniar procesul. Am inceput fara sa stiu cum se foloseste un breadboard, cu un tutorial de 10 minute in care imi explica cum sunt pinii uniti, cum sa nu-ti arzi componentele, cum sa fac un simplu circuit cu un led, cum sa folosesc esp32, cum sa codez in arduino IDE, cum sa lipesc componente, am si cusut, cum ar trebuii sa ai un plan inainte sa actionezi, de asemenea desi nu a ajuns in varianta finala (din fericire) am invatat de Rest Api , comunicare http pentru a obtine date (datorita multor erori cu modulele de card SD 3 module in total si lipsei de memorie pentru esp32 stocam in cloud audio-urile si le extrageam pe bucati , dar asta afecta calitatea). Un succes ingineresc si am obtinut o jucarie interactiva si skill-uri noi.
Versiune finala: final_baby_yoda.zip
Versiuni extra: versiuni_testari.zip
Pentru a executa codul: deschide Arduino IDE, instaleaza toate bibliotecile din include, apoi apasa pe upload si tine apasat cand apare connecting pe butonul de boot pana se scrie in memorie, apoi poti elibera, asteapta 2-3 secunde sa se conecteze la boxa si esti good to go.
Initial totul a fost bine, inainte sa adaug audio, aveam un breadboard cu 4 butoane, 2 led-uri , 2 rezistente si un detector de obiect in fata. Se printa cand apasam butonul, aveam debounce, led-urie erau aprinse si detectorul de obiect afisa cand ceva ii intra in fata, simteam cum proiectul nu o sa-mi ia chiar asa mult, parea simplu tot, eram increzator ca sa adaug audio e un simplu upload pe placuta, dar nu a fost deloc asa… Ma gandeam deja cum o sa adaug voice recognition si prompt-uri de gpt, deoarece totul e simplu si merge de la sine, am avut o zi buna in care ma simteam invingator.
A 2-a etapa din crearea proiectului a fost prin implementarea audio-ului, am invatat ce e un convertor analogic digital si am aflat ca nu am, de asemenea nu se gasea vreunul la un pret accesibil si care sa vina repede, asa ca m-a lovit o idee, ESP32 are bluetooth, sigur e usor sa pui sunet pe o boxa portabila, hai sa incerc asa ceva. Intai as putea sa pun un sunet random, ceva ce pot genera cu o functie , ca sa verific daca chiar ma pot conecta la boxa. Am aflat ca exista biblioteci pentru esp32 care chiar ar face chestia asta, totusi… nu prea functioneaza. Am stat sa citesc documentatia https://github.com/pschatzmann/ESP32-A2DP vreo 4 ore, simteam ca o fi totul ok, daaaaar, functiile nu mai mergeau, nu mai erau compatibile intre ele, nu mergeau cu esp-ul meu cred, asa ca am zis call it a day si am lasat-o pe ziua urmatoare. Ziua urmatoare citit alta documentatie de la https://github.com/cfint/esp32-a2dp-sink, SI MAI RAU, NU MERGEA NIMIC, nu mai tin minte clar erorile, dar era imposibil.
Doborat de inposibilitatea de a reda audio, am zis sa intreb inteligenta artificiala ca sigur stie. Am pierdut 8 ore (fara gluma) de rotit in cerc, am folosit combo-ul suprem de Claude, Chat GPT si Gemeni AI, dar fiecare venea cu o alta interpretare. Gemeni Ai zicea ca e imposibil sa faci asta, poti doar sa pui un audio si treb sa te conectezi incontinuu ceea ce vine cu mare delay, Chat Gpt e antrenat pe o versiune mult mai veche a celor 2 biblioteci si mereu venea cu cod vechi, am incercat sa ii parsez documentatia si codul de mai multe ori, totusi, nu mergea, nu voia sa inteleaga, am schimbat si versiunile de mai multe ori, dar NIMIC, nu mergea deloc, Claudette venea cu cod care chiar compila si ma uimea, doar ca facea complet altceva, incerca sa il faca pe esp32 sa se conecteze la un device ca el sa primeasca date, nu sa fie el sursa, ceea ce m-a indus in eroare grav rau de tot. Doborat nu stiam ce sa fac, nu mergea nimic, parea ca singura solutie ar fi sa cumpar modul dac si buffer si sa le conectez, desi nici asa nu aveam siguranta ca ar merge. Ideea cu boxa era doar sa fac un prototip ca apoi sa il modific in dac, desi simteam cum ar fi mult mai ok sa cumpar o boxa mica, sa o separ de placuta si sa o pun in cap-ul yoda-ului deoarece e greu sa bati calitatea unui produs extern cu baterie interna si so on. De asemenea pentru boxe bune mi-ar trebuii si amplificator, ceea ce din nou n-am gasit la pret ok. Nu eram dispus sa platesc 200 lei. Apoi am incercat singur sa fac codul cu Bluetooth.h, nu ma asteptam sa mearga, am gasit o metoda sa dau play la un vector de valori si BOOOM A MERS.
AUDIO FUNCTIONAL in functie de o functie matematica sinusoida. Asta da succes, de aici o sa fie totul foarte usor, dar nu a fost deloc asa. IARA ERORI, nu pot pune un audio al meu desi ar fi doar de schimbat vectorul. Ayaye, prompt engineering si 2 ore mai departe si mi-a reparat codul magic fara sa schimbe mai nimic, inca nu stiu eroare. Ok ok, acum hai sa pun altceva decat un vector random care scoate sunete de cernobyl, hai sa pun o melodie. Pun un audio de 3 secunde si BOOM, codul se restarteaza la infinit. Am stat o gramada sa aflu ce era, apoi m-a lovit, poate e overflow la memorie, am fost inspirat sa intreb gpt-ul ce inseamna codurile alea cand se da restart si mi-a confirmat ca asta ar fi. Nu m-a lovit din prima car ar fi asta deoarece era un audio de 3 secunde, cum atat de putin sa ma doboare. Iar derutat si frustrat. Totusi am aflat ca daca faci vectorii constanti sa incarca in flash, ceea ce inseamna ca pot sa abuzez memoria. Am incatcat si da overflow cu 130% din memorie. Totusi am citit ca pot sa schimb distributia memoriei din Arduino IDE, asa ca din 2MB de flash am avut 3MB.
Apas pe buton 1, BOXA S-A CONECTAT SI BOOOOOOOOOOM: AUD AUDIO-UL CLAR, LACRIMI IN Ochi. Totusi iar cu eroare, daca prin metoda mea de play se termina fisierul nu pot sa il redai, am reincercat sa reapelez totul cum am facut la start si nu mergea. Totusi daca resetam esp-ul mergea. Am rezolvat ulterior problema aplicand un sunet de fundal 0 ca sa nu sa se mai termine sesiunea (ulteori am reusit altfel). Acm aveam un audio functional si eram fericit. Totusi nu aveam memorie destula deci am zis sa folosesc un modul MP3.
La optimus era sold modulul de mp3, la ardushop era transportul mai mare, pe emag 10 zile livrarea, ce pot face? Colegul meu iulian avea 3 module, “Bai iulian, iti dau 20 lei pe un modul. Iulian: Ok”. Urma sprint-ul 2 asa ca am decis sa merg la ardushop sa iau o statie de lipit 100 lei, o ora de drum, apoi sa merg la Iulian in CHIAJNA inca jumatate de ora sa ii cumpar piesa, am mai stat si cu el ca asa e dragut, apoi spre casa pe fuga sa prezint ceva la etapa de Software. Ajung acasa dupa inca o ora jum de drum, total 3 ore jumatate pierdute ca sa iau componentele , testez modulul mp3 si…. nu mergea. De ce nu mergea inca nu stiu, poate modulul ars, poate cardul prost, de fapt ambele. Dar urma sa aflu ulterior, modulul nu mergea si eram iar suparat. In chit am primit si un voltmetru si cand citeam GND → VCC era doar un VOLT, am incercat sa ridic piesa sa vad daca ceva nu era lipit bine si apoi….
S-a rupt yay, ma spanzur, asta era in mintea mea. Pun cardul sd in telefon sa vad daca e ok, parea ok, card cautat prin casa prin telefoanele vechi, de vreo 8-10 ani dar parea functional (PAREA). Ok, ce fac acm?
Cand ma gandeam sa fac tts cu gpt, ma gandeam ca o sa iau cu rest mesajele, astfel m-a lovit, de ce nu-mi fac un server unde sa stochez melodiile si le iau. Asta am facut, am stocat melodiile pe un server hostat pe laptop-ul meu, esp32 avand si wifi am putut sa am o retea locala la care sa fie conectati. Am aflat cum sa implementez asta si am trecut la testat, inca vreo 6-7 ore ca sa iau primul rezultat dar asta era la ordinea zilei. Dau play la un audio de vreo 30 secunde, complet revolutionar pentru mine sii….merge…nu prea, se auzea prost, blocat, era delay mare intre buton, nu era deloc bu, ca idee audio-ul de 30 sec se termina in 5 minute , blyat, e ora 4 dimineata maine am laborator de la 8, ma trezesc la 6, hai ca prezint asa, macar folosesc cuvantul cloud ca de ce nu, poate ma puncteaza. Ajung la laborator, incerc sa folosesc jucaria si realizez ca nu mai sunt pe reteaua locala si nu merge instant jucaria, hai sa fac hotspot, pun cablu sa dau upload la numele retelei si a parolei dar stai, NU SE CONECTEAZA ESP32 la ARDUINO IDE, S-A ARS? (nu), aveam un alt cablu , care nu are si fir de date, doar de incarcare, se deschidea esp, dar nu se conecta la porturile usb ca sa pot sa dau upload…Derutat m-am gandit la asta dupa o ora si am cerut un cablu de la un coleg, aceasi eroare, eram frustrat, apoi era alt coleg cu esp32 si cu microusb si cu cablul lui mergea, relief macar merge esp32, ok , hai sa schimb reteaua dar stai, nu accepta arduino ide sebi's iphone ca nume din cauza virgulei, nu stiam cum sa ma conectez pe guest fara parola (eu aveam camp de user si parola, nu stiam cum sa modific in 10 min tot), asa ca la laborator am aratat un video de acasa de cum aproape mergea audio-ul si peird 0.4 pe lab, nu e vina laborantului, e vina mea , ayaye.
Caut sa cumpar piese si realizez ca nu am timp destul pentru deadline, apelez colegi, mesaje, unul dintre ei are modul usb care ii merge si nu mai are nevoie de el. Alo , Marius, imi dai si mie modulul tau pe 20 lei, DA. YAYYYYY. Mai erau 4 zile pana la deadline, nu aveam timp sa comand nimic. Vine modulul si…NU MERGE
NU MERGE, e cardul? Cardul e citibil, trece teste de coruptie, e FAT32 CE DRACU ARE? Avea melodia pe el si nu mergea sa o citesc, desi postata de pe telefon (nu am gaura pentru adaptor in laptop), panica. Las proiectul pe ultimele 2 zile ca sa fac tema la IA, ce dracu ma fac? Am mers la magazine sa caut carduri sub 32 GB, deoarece treb FAT32, nicaieri, noroc ca am gasit in carefour si am scapat. Ajung acasa sa verific si… MERGE…apoi nu mai merge, frecam cardul si modulul si in 1 din 20 incercari mergea, nu avea sens, nu faceam nimic diferit, vedeam numele fisierelor uneori dar majoritatea timpului nu. 6 ore de debug sii….nimic, toti pinii ok, alimentat la 3.3V cum era in datasheet dar nimic… OK…CE MA FAC? Citesc pinii cu voltmetru si SCK era la 2.2V desi trebuia 3V, am zis, o ard , nu o ard, nu am ce face alimentez la 5V SI MERGEA. BA CHIAR MERGEA MEREU, AM PLANS, EMOTII LA GREU, CHIAR A FUNCTIONAT. Pun gangnam style si merge, se aude perfect, emotii. OK ACUM POT SA MA APUC.
Apoi codat muuuuulte ore, dormit ambele zile pana la 4 dimi , 4 ore de somn pe seara, dar e gata. I-am adaugat destule si sunt fericit. Singura chestie pe care as fi vrut sa o fac ar fi fost sa bag boxa in jucarie dar nu am timp sa cumpar o boxa mai mica. Dupa arsuri cu cionaul, lipit in camera mea fara ventilator si ameteli e gata produsul, cusut, lipit, merge. Apoi cand il bag in jucarie se rupe un pin… ORA 3, maine e ddl, apoi dupa un hack taind un cablu si schimband-ul cu altul a mers. Ok oficial merge, nu se rupe, trece testele. GOOD PROIECT FINALIZAT.
ALTA SESIUNE DE LACRIMI (nu plang de obicei) si gata.