- Materiale necesare:
- Diagrama circuitului:
- Scheme și explicații:
- Înțelegerea
- Redarea tonurilor de pian pe Arduino:
- Programarea Arduino:
- Redați, înregistrați, reluați și repetați! :
Arduino a fost un avantaj pentru oamenii care nu provin din mediul electronic pentru a construi lucruri cu ușurință. A fost un instrument excelent de prototipare sau pentru a încerca ceva interesant, în acest proiect vom construi un pian mic, dar distractiv, folosind Arduino. Acest pian este destul de simplu, cu doar 8 butoane și buzzer. Folosește funcția tone () a Arduino pentru a crea diferite tipuri de note de pian pe difuzor. Pentru a-l condimenta puțin, am adăugat funcția de înregistrare în proiect, aceasta ne permite să redăm o melodie și să o redăm în mod repetat, atunci când este necesar. Sună interesant corect !! Deci, să începem să construim…
Materiale necesare:
- Arduino Uno
- Afișaj LCD 16 * 2
- Buzzer
- Tundere 10k
- Comutator SPDT
- Buton (8 numere)
- Rezistoare (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Breadboard
- Conectarea firelor
Diagrama circuitului:
Proiectul Arduino Piano complet poate fi construit deasupra unei plăci cu câteva fire de conectare. Schema de circuit realizată folosind fritzing care arată vizualizarea proiectului este prezentată mai jos
Doar urmați schema circuitului și conectați firele în consecință, butoanele și buzzer-ul, așa cum sunt utilizate cu un modul PCB, dar în hardware-ul actual am folosit doar comutatorul și buzzerul, nu ar trebui să vă deruteze prea mult, deoarece au același tip de pin. De asemenea, puteți face referire la imaginea de mai jos a hardware-ului pentru a vă face conexiunile.
Valoarea rezistențelor din stânga este în următoarea ordine, 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k și 10k. Dacă nu aveți același comutator DPST, puteți utiliza comutatorul de comutare normal ca cel prezentat în diagrama de mai sus. Acum să analizăm schemele proiectului pentru a înțelege de ce am făcut următoarele conexiuni.
Scheme și explicații:
Schema pentru schema de circuit care este prezentată mai sus este dată mai jos, a fost realizată și folosind Fritzing.
O conexiune principală pe care trebuie să o înțelegem este că am conectat cele 8 butoane la Arduino prin pinul analog A0. Practic avem nevoie de 8 pini de intrare care pot fi conectați la cele 8 butoane de intrare, dar pentru proiecte de acest gen nu putem folosi 8 pini ai microcontrolerului doar pentru butoane, deoarece s-ar putea să le avem nevoie pentru o utilizare ulterioară. În cazul nostru avem afișajul LCD pentru a fi interfațat.
Deci, folosim pinul analogic al Arduino și formăm un divizor de potențial cu valori diferite ale rezistenței pentru a finaliza circuitul. În acest fel, când fiecare buton este apăsat, o tensiune analogică diferită va fi furnizată pinului analogic. Un circuit de probă cu doar două rezistențe și două butoane sunt prezentate mai jos.
În acest caz pinul ADC va primi + 5V când butoanele nu sunt apăsate, dacă primul buton este apăsat, atunci divizorul de potențial se finalizează prin rezistorul 560R și dacă al doilea buton este apăsat, atunci divizorul de potențial este concurat folosind 1.5 k rezistor. În acest fel, tensiunea primită de pinul ADC va varia în funcție de formulele divizorului potențial. Dacă doriți să aflați mai multe despre modul în care funcționează divizorul potențial și cum să calculați valoarea tensiunii primite de pinul ADC, puteți utiliza această pagină a calculatorului divizorului potențial.
În afară de aceasta, toate conexiunile sunt directe, LCD-ul este conectat la pinii 8, 9, 10, 11 și 12. Buzzer-ul este conectat la pinul 7, iar comutatorul SPDT este conectat la pinul 6 al Arduino. Proiectul complet este alimentat prin portul USB al laptopului. De asemenea, puteți conecta Arduino la o sursă de 9V sau 12V prin mufa DC și proiectul va funcționa în continuare la fel.
Înțelegerea
Arduino are o funcție de ton util () care poate fi utilizată pentru a genera semnale de frecvență variabile care pot fi utilizate pentru a produce sunete diferite folosind un buzzer. Deci, să înțelegem cum funcționează funcția și cum poate fi utilizată cu Arduino.
Înainte de asta, ar trebui să știm cum funcționează un buzzer Piezo. S-ar putea să fi învățat despre cristalele piezo în școala noastră, nu este altceva decât un cristal care convertește vibrațiile mecanice în electricitate sau invers. Aici aplicăm un curent variabil (frecvență) pentru care cristalul vibrează astfel producând sunet. Prin urmare, pentru a face zgomotul Piezo să producă ceva zgomot, trebuie să facem cristalul electric Piezo să vibreze, tonul și tonul zgomotului depind de cât de repede vibrează cristalul. Prin urmare, tonul și tonul pot fi controlate prin variația frecvenței curentului.
Bine, deci cum obținem o frecvență variabilă de la Arduino? Aici intervine funcția tone (). Tonul () poate genera o anumită frecvență pe un anumit pin. Durata de timp poate fi menționată, de asemenea, dacă este necesar. Sintaxa pentru tone () este
Ton de sintaxă (pin, frecvență) ton (pin, frecvență, durată) Parametri pin: pinul pe care se generează frecvența tonului: frecvența tonului în hertz - durata int nesemnată: durata tonului în milisecunde (opțional1) - nesemnat lung
Valorile pinului pot fi oricare dintre pinul digital. Am folosit pinul 8 aici. Frecvența care poate fi generată depinde de dimensiunea temporizatorului de pe placa Arduino. Pentru UNO și majoritatea celorlalte plăci comune, frecvența minimă care poate fi produsă este de 31Hz, iar frecvența maximă care poate fi produsă este de 65535Hz. Cu toate acestea, noi, oamenii, putem auzi doar frecvențe între 2000Hz și 5000 Hz.
Redarea tonurilor de pian pe Arduino:
Bine, înainte de a începe acest subiect, permiteți-mi să precizez că sunt un novice cu note muzicale sau pian, așa că vă rog să mă iertați dacă ceva menționat la această rubrică este un tâmpit.
Acum știm că putem folosi funcția de tonuri în Arduino pentru a produce unele sunete, dar cum putem reda tonurile unei anumite note folosind aceeași. Norocos pentru noi există o bibliotecă numită „pitches.h” scrisă de Brett Hagman. Această bibliotecă conține toate informațiile despre frecvența care este echivalentă cu nota pe un pian. Am fost surprins de cât de bine ar putea de fapt să funcționeze această bibliotecă și să cânte aproape fiecare notă la un pian, am folosit același lucru pentru a cânta notele de pian ale Piraților din Caraibe, Crazy Frog, Mario și chiar titanic și au sunat minunat. Hopa! Aici suntem puțin dezactivați subiectul, așa că, dacă sunteți interesat de acest lucru, verificați melodiile folosind proiectul Arduino. Veți găsi, de asemenea, mai multe explicații despre biblioteca pitches.h în acel proiect.
Proiectul nostru are doar 8 butoane, astfel încât fiecare buton poate reda o singură notă muzicală și astfel putem reda doar 8 note. Am selectat cele mai folosite note pe un pian, dar poți să selectezi 8 sau chiar să extinzi proiectul cu mai multe butoane și să adaugi mai multe note.
Notele selectate în acest proiect sunt notele C4, D4, E4, F4, G4, A4, B4 și C5 care pot fi redate folosind butoanele 1 la 8 respectiv.
Programarea Arduino:
Destul de teorie ne permite să ajungem la partea distractivă a programării Arduino. Programul complet Arduino este oferit la sfârșitul acestei pagini. Puteți sări în jos dacă doriți sau citiți mai departe pentru a înțelege cum funcționează codul.
În programul nostru Arduino trebuie să citim tensiunea analogică de la pinul A0, apoi să prezicem ce buton a fost apăsat și să redăm tonul respectiv pentru butonul respectiv. În timp ce facem acest lucru, ar trebui să înregistrăm și ce buton a apăsat utilizatorul și cât timp a apăsat, astfel încât să putem recrea tonul care a fost redat de utilizator ulterior.
Înainte de a merge la partea logică, trebuie să declarăm ce 8 note vom juca. Frecvența respectivă pentru note este apoi preluată din biblioteca pitches.h și apoi se formează un tablou așa cum se arată mai jos. Aici frecvența de redare a notei C4 este 262 și așa mai departe.
note int = {262, 294, 330, 349, 392, 440, 494, 523}; // Setați frecvența pentru C4, D4, E4, F4, G4, A4, B4,
În continuare trebuie să menționăm la ce pini este conectat ecranul LCD. Dacă urmați exact aceleași scheme prezentate mai sus, atunci nu trebuie să schimbați nimic aici.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pinii la care este conectat ecranul LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Apoi, în interiorul funcției noastre de configurare , inițializăm doar modulul LCD și monitorul serial pentru depanare. De asemenea, afișăm un mesaj introductiv doar pentru a ne asigura că lucrurile funcționează conform planificării. Apoi , în interiorul funcției de buclă principală avem două bucle de timp.
O buclă while va fi executată atâta timp cât comutatorul SPDT este plasat în înregistrare mai mult. În modul de înregistrare, utilizatorul poate plăti sunetele necesare și, în același timp, va fi salvat și tonul redat. Deci, bucla while arată așa mai jos
while (digitalRead (6) == 0) // Dacă comutatorul de comutare este setat în modul de înregistrare {lcd.setCursor (0, 0); lcd.print („Înregistrare..”); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
După cum ați fi observat, avem două funcții în bucla while. Prima funcție Detect_button () este utilizată pentru a găsi ce buton a apăsat utilizatorul și a doua funcție Play_tone () este utilizată pentru a reda tonul respectiv. În afară de această funcție, funcția Detect_button () înregistrează și butonul care este apăsat și funcția Play_tone () înregistrează cât timp a fost apăsat butonul.
În interiorul Detect_button () funcția am citit analogic de tensiune de la PIN - ul A0 și se compară cu unele valori predefinite pentru a afla ce buton a fost apăsat. Valoarea poate fi determinată fie utilizând calculatorul divizor de tensiune de mai sus, fie utilizând monitorul serial pentru a verifica ce valoare analogică este citită pentru fiecare buton.
void Detect_button () { analogVal = analogRead (A0); // citiți tensiunea analogică pe pinul A0 butonul pev_button =; // amintiți-vă butonul anterior apăsat de utilizator dacă butonul (analogVal <550) butonul = 8; buton if (analogVal <500) = 7; buton if (analogVal <450) = 6; buton if (analogVal <400) = 5; buton if (analogVal <300) = 4; buton if (analogVal <250) = 3; buton if (analogVal <150) = 2; buton if (analogVal <100) = 1; buton if (analogVal> 1000) = 0; / **** Înregistrați butoanele apăsate într- o matrice *** / if (buton! = buton pev && buton pev! = 0) { buton înregistrat = buton pev; button_index ++; buton_înregistrat = 0; button_index ++; } / ** Programul de sfârșit de înregistrare ** / }
După cum sa spus, în interiorul acestei funcții înregistrăm și secvența în care sunt apăsate butoanele. Valorile înregistrate sunt stocate într-o matrice numită înregistrat_buton. Mai întâi verificăm dacă este apăsat un buton nou, dacă este apăsat, verificăm și dacă nu este butonul 0. Unde butonul 0 nu este altceva decât butonul apăsat. În bucla if stocăm valoarea pe locația indexului dată de variabila button_index și apoi creștem această valoare a indexului astfel încât să nu scriem peste aceeași locație.
/ **** Înregistrați butoanele apăsate într- un tablou *** / if (button! = Pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; buton_înregistrat = 0; button_index ++; } / ** Programul de sfârșit de înregistrare ** /
În interiorul Play_tone () funcția vom reda tonul respectiv pentru butonul apăsat utilizând mai multe în cazul în care condițiile. De asemenea, vom folosi o matrice numită înregistrat_ timp în interiorul căruia vom salva durata de timp pentru care a fost apăsat butonul. Operația este similară cu înregistrarea secvenței butoanelor prin utilizarea funcției millis () pentru a determina cât timp a fost apăsat fiecare buton, de asemenea, pentru reducerea dimensiunii variabilei împărțim valoarea la 10. Pentru butonul 0, ceea ce înseamnă că utilizatorul nu este apăsând orice, nu redăm niciun ton pentru aceeași durată. Codul complet din interiorul funcției este prezentat mai jos.
void Play_tone () { / **** Înregistrați întârzierea dintre fiecare apăsare a butonului într-o matrice *** / if (button! = pev_button) { lcd.clear (); // Apoi curăță-l note_time = (millis () - start_time) / 10; timp_înregistrat = timp_notă; time_index ++; start_time = millis (); } / ** Programul de sfârșit de înregistrare ** / if (buton == 0) { noTone (7); lcd.print ("0 -> Pauză.."); } if (buton == 1) { ton (7, note); lcd.print ("1 -> NOTE_C4"); } if (buton == 2) { ton (7, note); lcd.print ("2 -> NOTE_D4"); } if (buton == 3) { ton (7, note); lcd.print ("3 -> NOTE_E4"); } if (buton == 4) { ton (7, note); lcd.print ("4 -> NOTE_F4"); } if (buton == 5) { ton (7, note); lcd.print ("5 -> NOTE_G4"); } if (buton == 6) { ton (7, note); lcd.print ("6 -> NOTE_A4"); } if (buton == 7) { ton (7, note); lcd.print ("7 -> NOTE_B4"); } if (buton == 8) { ton (7, note); lcd.print ("8 -> NOTE_C5"); } }
În cele din urmă, după înregistrare, utilizatorul trebuie să comute DPST în cealaltă direcție pentru a reda tonul înregistrat. Când se face acest lucru, programul iese din bucla while anterioară și intră în cea de-a doua buclă while, unde redăm notele în secvența butoanelor apăsate pentru o durată care a fost înregistrată anterior. Codul pentru a face același lucru este prezentat mai jos.
while (digitalRead (6) == 1) // Dacă comutatorul de comutare este setat în modul Redare { lcd.clear (); lcd.setCursor (0, 0); lcd.print („Acum se joacă..”); for (int i = 0; i <sizeof (înregistrat_buton) / 2; i ++) { întârziere ((înregistrat_timp) * 10); // Așteptați înainte de a plăti următoarea melodie dacă (înregistrat_buton == 0) noTone (7); // cu ușurință, utilizatorul atinge orice alt buton (7, note - 1)]); // redă sunetul corespunzător butonului atins de utilizator } } }
Redați, înregistrați, reluați și repetați!:
Realizați hardware-ul conform schemei de circuite prezentate și încărcați codul pe placa Arduino și timpul afișat. Poziționați SPDT în modul de înregistrare și începeți să redați tonurile la alegere, apăsând fiecare buton se va produce un ton diferit. În acest mod, ecranul LCD va afișa „ Înregistrare…” și pe a doua linie veți vedea numele notei care este apăsată în prezent, așa cum se arată mai jos.
După ce ați redat tonul, comutați comutatorul SPDT pe cealaltă parte, iar ecranul LCD ar trebui să afișeze „ Now Playing..” și apoi începeți redarea tonului pe care tocmai l-ați redat. Același ton va fi redat din nou și din nou, atâta timp cât comutatorul de comutare este menținut în poziția așa cum se arată în imaginea de mai jos.
Funcționarea completă a proiectului poate fi găsită în videoclipul prezentat mai jos. Sper că ați înțeles proiectul și v-a plăcut să îl construiți. Dacă aveți probleme în construirea acestui post, postați-le în secțiunea de comentarii sau utilizați forumurile pentru ajutor tehnic în proiectul dvs. De asemenea, nu uitați să verificați videoclipul demonstrativ prezentat mai jos.