- Materials necessaris:
- Esquema de connexions:
- Esquema i explicació:
- Comprensió del
- Reproducció de tons de piano a Arduino:
- Programació de l'Arduino:
- Reprodueix, grava, repeteix i repeteix. :
Arduino ha estat una gran ajuda per a les persones que no pertanyen a l’electrònica per construir coses fàcilment. Ha estat una gran eina de prototipatge o per provar alguna cosa interessant, en aquest projecte construirem un piano petit però divertit amb l’Arduino. Aquest piano és pràcticament senzill, amb només 8 botons polsadors i zumbador. Utilitza la funció tone () d’Arduino per crear diversos tipus de notes de piano a l’altaveu. Per condimentar-lo una mica, hem afegit la funció de gravació al projecte, cosa que ens permet reproduir-lo i gravar-lo de nou repetidament quan calgui. Sona interessant oi !! Així que anem a construir…
Materials necessaris:
- Arduino Uno
- Pantalla LCD de 16 * 2
- Zumbador
- Talladora 10k
- Commutador SPDT
- Polsador (8 números)
- Resistències (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Taula de pa
- Connexió de cables
Esquema de connexions:
El projecte Arduino Piano complet es pot construir a la part superior d’una taula amb alguns cables de connexió. A continuació es mostra el diagrama de circuits realitzat amb fritzing que mostra la vista del projecte a la taula de treball

Simplement seguiu l’esquema del circuit i connecteu els cables en conseqüència, els botons i el brunzidor que s’utilitzen amb un mòdul PCB, però en el maquinari real només hem utilitzat l’interruptor i el brunzidor. No us hauria de confondre molt perquè tenen el mateix tipus de pin. També podeu consultar la imatge següent del maquinari per establir les vostres connexions.

El valor de les resistències de l’esquerra és en l’ordre següent: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k i 10k. Si no teniu el mateix commutador DPST, podeu utilitzar un commutador normal com el que es mostra al diagrama de circuits anterior. Vegem ara els esquemes del projecte per entendre per què hem establert les connexions següents.
Esquema i explicació:
Els esquemes del diagrama de circuits que es mostra a continuació es donen a continuació, també es va fer amb Fritzing.

Una de les principals connexions que hem d’entendre és que hem connectat els 8 botons a l’Arduino mitjançant el pin Analog A0. Bàsicament necessitem 8 pins d'entrada que es puguin connectar als 8 botons d'entrada, però per a projectes com aquest no podem utilitzar 8 pins del microcontrolador només per als botons de pressió, ja que és possible que els necessitem per a un ús posterior. En el nostre cas, tenim la pantalla LCD per a la interfície.
Per tant, fem servir el pin analògic de l’Arduino i formem un divisor de potencial amb valors de resistència variables per completar el circuit. D'aquesta manera, quan es prem cada botó, es subministrarà un voltatge analògic diferent al pin analògic. A continuació es mostra un circuit de mostra amb només dues resistències i dos polsadors.

En aquest cas, el pin ADC rebrà + 5 V quan no es premen els botons, si es prem el primer botó, el divisor de potencial es completa a través de la resistència 560R i, si es prem el segon botó, el divisor de potencial es competeix mitjançant l'1,5 k resistència. D'aquesta manera, el voltatge rebut pel pin ADC variarà en funció de les fórmules del divisor de potencial. Si voleu obtenir més informació sobre com funciona el divisor de potencial i com calcular el valor de la tensió que rep el pin ADC, podeu utilitzar aquesta pàgina de calculadora de divisor de potencial.
A part d'això, totes les connexions són directes, la pantalla LCD està connectada als pins 8, 9, 10, 11 i 12. El brunzidor està connectat al pin 7 i el commutador SPDT està connectat al pin 6 d'Arduino. El projecte complet s’alimenta a través del port USB del portàtil. També podeu connectar l’Arduino a una font de 9V o 12V mitjançant la presa de corrent continu i el projecte continuarà funcionant igual.
Comprensió del
L'Arduino té una pràctica funció de to () que es pot utilitzar per generar senyals de freqüència variables que es poden utilitzar per produir diferents sons mitjançant un timbre. Així doncs, entenem com funciona la funció i com es pot utilitzar amb Arduino.
Abans d’això, hem de saber com funciona un brunzidor piezoelèctric. Podríem haver après sobre els cristalls piezoelèctrics a la nostra escola, no és res més que un cristall que converteix les vibracions mecàniques en electricitat o viceversa. Aquí apliquem un corrent (freqüència) variable per al qual el cristall vibra produint so. Per tant, per fer que el brunzidor piezoelèctric faci soroll, hem de fer vibrar el cristall elèctric piezoelèctric, el to i el to del soroll depèn de la velocitat amb què el cristall vibri. Per tant, el to i el to es poden controlar variant la freqüència del corrent.
D’acord, doncs, com obtenim una freqüència variable d’Arduino? Aquí és on entra la funció tone (). El tone () pot generar una freqüència particular en un pin específic. La durada del temps també es pot esmentar si cal. La sintaxi de tone () és
To de sintaxi (pin, freqüència) to (pin, freqüència, durada) Paràmetres pin: pin en què es genera la freqüència del to: la freqüència del to en hertz - durada int sense signatura: la durada del to en mil·lisegons (opcional1) - sense signar llarg
Els valors del pin poden ser qualsevol dels vostres pins digitals. He utilitzat el pin número 8 aquí. La freqüència que es pot generar depèn de la mida del temporitzador de la placa Arduino. Per a UNO i la majoria de les altres plaques comunes, la freqüència mínima que es pot produir és de 31Hz i la freqüència màxima que es pot produir és de 65535Hz. No obstant això, els humans només podem escoltar freqüències entre 2000Hz i 5000Hz.
Reproducció de tons de piano a Arduino:
D'acord, fins i tot abans de començar amb aquest tema, deixeu-me clar que sóc un novell amb notes musicals o piano, així que si us plau, perdoneu-me si alguna cosa que s'esmenta en aquest capítol és una tonteria.
Ara sabem que podem utilitzar la funció de tons a Arduino per produir alguns sons, però com podem reproduir els tons d’una nota en particular fent servir el mateix. Per sort, hi ha una biblioteca anomenada "pitches.h" escrita per Brett Hagman. Aquesta biblioteca conté tota la informació sobre quina freqüència equival a una nota del piano. Em va sorprendre el bon funcionament d’aquesta biblioteca i tocar gairebé totes les notes en un piano; vaig fer servir el mateix per tocar les notes de piano de Pirates of Caribbean, Crazy Frog, Mario i fins i tot de titànic i sonaven increïbles. Vaja! Ens estem quedant una mica fora del tema aquí, així que si esteu interessats en això, consulteu les melodies que utilitzeu el projecte Arduino. També trobareu més explicacions sobre la biblioteca pitches.h en aquest projecte.
El nostre projecte només té 8 polsadors, de manera que cada botó pot reproduir només una nota musical concreta i, per tant, només podem tocar només 8 notes. He seleccionat les notes més utilitzades en un piano, però es poden seleccionar 8 o fins i tot ampliar el projecte amb més botons i afegir més notes.
Les notes seleccionades en aquest projecte són les notes C4, D4, E4, F4, G4, A4, B4 i C5 que es poden reproduir mitjançant els botons 1 a 8 respectivament.
Programació de l'Arduino:
Ja n’hi ha prou de teoria per arribar a la part divertida de programar l’Arduino. El programa complet d'Arduino es dóna al final d'aquesta pàgina. Podeu saltar cap avall si desitgeu o llegiu més per entendre com funciona el codi.
Al nostre programa Arduino hem de llegir la tensió analògica del pin A0, després predir quin botó es va prémer i reproduir el to corresponent per a aquest botó. En fer-ho, també hem d’enregistrar quin botó ha premut l’usuari i quant de temps ha premut, de manera que puguem recrear el to que l’usuari hagi reproduït més endavant.
Abans d’anar a la part lògica, hem de declarar quines 8 notes tocarem. La freqüència respectiva de les notes es pren de la biblioteca pitches.h i es forma una matriu com es mostra a continuació. Aquí la freqüència de reproducció de la nota C4 és 262, etc.
int notes = {262, 294, 330, 349, 392, 440, 494, 523}; // Estableix la freqüència per a C4, D4, E4, F4, G4, A4, B4,
A continuació, hem d'esmentar a quins pins està connectada la pantalla LCD. Si seguiu exactament els mateixos esquemes donats anteriorment, no haureu de canviar res aquí.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pins als quals està connectat el LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
A continuació, dins de la nostra funció de configuració , inicialitzem el mòdul LCD i el monitor sèrie per a la depuració. També mostrem un missatge d'introducció només per assegurar-nos que les coses funcionin tal com estava previst. A continuació , dins de la funció de bucle principal tenim dos bucles while.
S'executarà un bucle mentre es mantingui el commutador SPDT a la gravació més. En el mode de gravació, l'usuari pot pagar els tons necessaris i, al mateix temps, també es guardarà el to que s'està reproduint. Per tant, el bucle while té el següent aspecte
while (digitalRead (6) == 0) // Si l'interruptor de commutació està configurat en mode de gravació {lcd.setCursor (0, 0); lcd.print ("Enregistrament.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Com haureu notat , tenim dues funcions dins del bucle while. La primera funció Detect_button () s'utilitza per trobar quin botó ha premut l'usuari i la segona funció Play_tone () s'utilitza per reproduir el to respectiu. A part d’aquesta funció, la funció Detect_button () també registra quin botó s’està pressionant i la funció Play_tone () registra el temps que es va prémer el botó.
Dins de la funció Detect_button () llegim el voltatge analògic del pin A0 i el comparem amb alguns valors predefinits per esbrinar quin botó s’ha premut. El valor es pot determinar mitjançant la calculadora divisora de tensió anterior o mitjançant el monitor sèrie per comprovar quin valor analògic es llegeix per a cada botó.
void Detect_button () { analogVal = analogRead (A0); // llegir el voltatge analògic al pin A0 pev_button = button; // recorda el botó anterior premut per l’usuari if (analogVal <550) button = 8; botó if (analogVal <500) = 7; botó if (analogVal <450) = 6; botó if (analogVal <400) = 5; botó if (analogVal <300) = 4; botó if (analogVal <250) = 3; botó if (analogVal <150) = 2; botó if (analogVal <100) = 1; botó if (analogVal> 1000) = 0; / **** Registre els botons premuts en una matriu *** / if (button! = pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; botó_enregistrat = 0; button_index ++; } / ** Programa de fi de gravació ** / }
Com s'ha dit, dins d'aquesta funció també enregistrem la seqüència en què es premen els botons. Els valors enregistrats s’emmagatzemen en una matriu anomenada botó_registrat. Primer comprovem si hi ha un botó nou premut; si es prem, també comprovem si no és el botó 0. On el botó 0 no és res, però no es prem cap botó. Dins del bucle if emmagatzemem el valor a la ubicació de l’índex donada per la variable button_index i, a continuació, també augmentem aquest valor de l’índex de manera que no escrivim excessivament a la mateixa ubicació.
/ **** Recordeu els botons premuts en una matriu *** / if (button! = Pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; botó_enregistrat = 0; button_index ++; } / ** Programa de fi de gravació ** /
Dins de la funció Play_tone () reproduirem el to corresponent per al botó premut fent servir diverses condicions si . També utilitzarem un array anomenat recording_time dins del qual guardarem la durada del temps durant la qual es va prémer el botó. L’operació és similar a la seqüència de botons d’enregistrament mitjançant la funció millis () per determinar quant de temps es va prémer cada botó, també per reduir la mida de la variable dividim el valor per 10. Per al botó 0, el que significa que l’usuari no prement qualsevol cosa no reproduïm cap to durant la mateixa durada. A continuació es mostra el codi complet dins de la funció.
void Play_tone () { / **** Enregistreu el retard de temps entre cada botó que premeu en una matriu *** / if (button! = pev_button) { lcd.clear (); // Després netegeu-lo note_time = (millis () - start_time) / 10; temps_recordat = temps_nota; time_index ++; hora_inici = millis (); } / ** Programa de fi de gravació ** / if (botó == 0) { noTone (7); lcd.print ("0 -> Pausa.."); } if (botó == 1) { to (7, notes); lcd.print ("1 -> NOTE_C4"); } if (botó == 2) { to (7, notes); lcd.print ("2 -> NOTE_D4"); } if (botó == 3) { to (7, notes); lcd.print ("3 -> NOTE_E4"); } if (botó == 4) { to (7, notes); lcd.print ("4 -> NOTE_F4"); } if (botó == 5) { to (7, notes); lcd.print ("5 -> NOTE_G4"); } if (botó == 6) { to (7, notes); lcd.print ("6 -> NOTE_A4"); } if (botó == 7) { to (7, notes); lcd.print ("7 -> NOTE_B4"); } if (botó == 8) { to (7, notes); lcd.print ("8 -> NOTE_C5"); } }
Finalment, després de gravar, l' usuari ha de canviar el DPST cap a l'altra direcció per reproduir el to gravat. Quan es fa això els programa surt de l'anterior , mentre que bucle i entra en el segon bucle while en el qual tocar les notes en l'ordre dels botons pressionats per una durada que va ser gravada prèviament. A continuació es mostra el codi per fer el mateix.
while (digitalRead (6) == 1) // Si l'interruptor de commutació està configurat en mode de reproducció { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Ara s'està reproduint.."); for (int i = 0; i <sizeof (gravat_butó) / 2; i ++) { delay ((enregistrat_hora) * 10); // Espereu abans de pagar la següent sintonia si ( gravat_butó == 0) noTone (7); // a força de l'usuari toqueu qualsevol altre botó (7, notes - 1)]); // reproduir el so corresponent al botó tocat per l'usuari } } }
Reprodueix, grava, repeteix i repeteix.:
Feu el maquinari segons el diagrama del circuit que es mostra i pengeu el codi a la placa Arduino i el seu temps mostrat. Col·loqueu l'SPDT al mode d'enregistrament i comenceu a reproduir els tons que trieu, prement cada botó es produirà un to diferent. Durant aquest mode, la pantalla LCD mostrarà " Enregistrament…" i a la segona línia veureu el nom de la nota que s'està pressionant, tal com es mostra a continuació.

Un cop hàgiu reproduït el to, canvieu l'interruptor SPDT a l'altre costat i la pantalla LCD hauria de mostrar " Ara s'està reproduint.." i, a continuació, comenceu a reproduir el to que acabeu de reproduir. Es reproduirà el mateix to una i altra vegada sempre que l’interruptor de palanca es mantingui en la posició tal com es mostra a la imatge següent.

El funcionament complet del projecte es pot trobar al vídeo que es mostra a continuació. Espero que hagueu entès el projecte i us hagi agradat construir-lo. Si teniu problemes per crear aquest missatge, publiqueu-los a la secció de comentaris o utilitzeu els fòrums per obtenir ajuda tècnica del vostre projecte. No oblideu també consultar el vídeo de demostració que es mostra a continuació.
