- Material som krävs:
- Kretsschema:
- Scheman och förklaringar:
- Förstå
- Spela pianotoner på Arduino:
- Programmering av Arduino:
- Spela, spela in, spela upp och upprepa! :
Arduino har varit en välsignelse för människor som inte är från elektronikbakgrunden att enkelt bygga saker. Det har varit ett bra prototypverktyg eller för att prova något coolt, i det här projektet ska vi bygga ett litet men roligt piano med Arduino. Detta piano är ganska enkelt med bara 8 tryckknappar och summer. Den använder Arduinos tonfunktion () för att skapa olika typer av pianotoner på högtalaren. För att krydda det lite har vi lagt till inspelningsfunktionen i projektet, detta gör att vi kan spela en melodi och spela upp den igen upprepade gånger vid behov. Låter intressant rätt !! Så låt oss få bygga….
Material som krävs:
- Arduino Uno
- 16 * 2 LCD-skärm
- Summer
- Trimmer 10k
- SPDT-omkopplare
- Tryckknapp (8 Nos)
- Motstånd (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Bakbord
- Anslutande ledningar
Kretsschema:
Det kompletta Arduino Piano-projektet kan byggas ovanpå en brädbräda med några anslutningsledningar. Kretsschemat som är gjord med hjälp av fritzing som visar projektets brädbräda visas nedan
Följ bara kretsschemat och anslut kablarna i enlighet därmed, tryckknapparna och summern som används med en kretskortsmodul men i faktisk hårdvara har vi bara använt strömbrytaren och summern, det borde inte förvirra dig mycket eftersom de har samma typ av stift. Du kan också hänvisa till nedanstående bild av hårdvaran för att göra dina anslutningar.
Värdet på motstånden från vänster är i följande ordning, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k och 10k. Om du inte har samma DPST-omkopplare kan du använda normal vippströmbrytare som den som visas i kretsschemat ovan. Låt oss nu titta på schemat för projektet för att förstå varför vi har gjort följande anslutningar.
Scheman och förklaringar:
Schemat för kretsschemat som visas ovan ges nedan, det gjordes också med hjälp av Fritzing.
En huvudanslutning som vi måste förstå är att hur vi har anslutit de 8 tryckknapparna till Arduino genom Analog A0-stiftet. I grund och botten behöver vi 8 ingångsstift som kan anslutas till de 8 ingångsknapparna, men för projekt som detta kan vi inte använda 8 stift på mikrokontrollen bara för tryckknappar eftersom vi kan behöva dem för senare användning. I vårt fall har vi LCD-skärmen som ska anslutas.
Så vi använder Arduinos analoga stift och bildar en potentialdelare med varierande motståndsvärden för att slutföra kretsen. På det här sättet, när varje knapp trycks in, kommer en annan analog spänning att matas till den analoga stiftet. En provkrets med endast två motstånd och två tryckknappar visas nedan.
I det här fallet kommer ADC-stiftet att motta + 5V när tryckknapparna inte trycks in. Om den första knappen trycks in blir den potentiella delaren fullbordad genom 560R-motståndet och om den andra knappen trycks in tävlas den potentiella delaren med 1,5 k-motstånd. På detta sätt kommer spänningen som mottas av ADC-stiftet att variera beroende på formlerna för potentialdelaren. Om du vill veta mer om hur den potentiella avdelaren fungerar och hur du beräknar värdet på spänningen som mottas av ADC-stiftet kan du använda den här sidan för potentiell avdelare.
Förutom detta är alla anslutningar raka framåt, LCD: n är ansluten till stift 8, 9, 10, 11 och 12. Summern är ansluten till stift 7 och SPDT-omkopplaren är ansluten till stift 6 på Arduino. Hela projektet drivs via USB-porten på den bärbara datorn. Du kan också ansluta Arduino till en 9V- eller 12V-strömförsörjning via DC-uttaget och projektet fungerar fortfarande på samma sätt.
Förstå
Arduino har en praktisk tonfunktion () som kan användas för att generera varierande frekvenssignaler som kan användas för att producera olika ljud med en summer. Så låt oss förstå hur funktionen fungerar och hur den kan användas med Arduino.
Innan det borde vi veta hur en Piezo-summer fungerar. Vi kanske har lärt oss om Piezo-kristaller i vår skola, det är inget annat än en kristall som omvandlar mekaniska vibrationer till el eller tvärtom. Här tillämpar vi en variabel ström (frekvens) för vilken kristallen vibrerar och därmed producerar ljud. Därför, för att få Piezo-summern att göra lite ljud måste vi få Piezo-elektriska kristaller att vibrera, tonhöjden och tonen beror på hur snabbt kristallen vibrerar. Därför kan ton och tonhöjd styras genom att variera frekvensen för strömmen.
Okej, så hur får vi en variabel frekvens från Arduino? Det är här tonfunktionen () kommer in. Tonen () kan generera en viss frekvens på en specifik stift. Tidslängden kan också nämnas vid behov. Syntaxen för ton () är
Syntaxton (stift, frekvens) ton (stift, frekvens, varaktighet) Parametrar stift: stiftet som tonfrekvensen genereras på: tonfrekvensen i hertz - osignerad int varaktighet: tonens varaktighet i millisekunder (valfritt1) - osignerad lång
Värdena på stift kan vara vilken som helst av din digitala stift. Jag har använt stift nummer 8 här. Frekvensen som kan genereras beror på storleken på timern på ditt Arduino-kort. För UNO och de flesta andra vanliga kort är den lägsta frekvensen som kan produceras 31Hz och den högsta frekvensen som kan produceras är 65535Hz. Men vi människor kan bara höra frekvenser mellan 2000Hz och 5000 Hz.
Spela pianotoner på Arduino:
Okej, innan jag ens börjar med detta ämne, låt mig göra det klart att jag är en nybörjare med musiknoter eller piano, så snälla förlåt mig om något som nämns under denna rubrik är gibberish.
Vi vet nu att vi kan använda tonerfunktionen i Arduino för att producera några ljud, men hur kan vi spela toner av en viss ton med samma. Tur för oss finns det ett bibliotek som heter “pitches.h” skrivet av Brett Hagman. Detta bibliotek innehåller all information om vilken frekvens som motsvarar vilken ton på ett piano. Jag blev förvånad över hur bra det här biblioteket faktiskt kunde fungera och spela nästan varje ton på ett piano, jag använde samma för att spela piano noterna till Pirates of Caribbean, Crazy Frog, Mario och till och med titanic och de lät fantastiska. hoppsan! Vi blir lite av ämnet här, så om du är intresserad av det, kolla in melodier med Arduino-projektet. Du hittar också mer förklaring om pitches.h- biblioteket i det projektet.
Vårt projekt har bara 8 tryckknappar så att varje knapp bara kan spela en viss musiknot och därmed helt och hållet kan vi bara spela 8 noter. Jag valde de mest använda tonerna på ett piano, men kan du välja valfri 8 eller till och med utvidga projektet med fler tryckknappar och lägga till fler toner.
De toner som valts i detta projekt är tonerna C4, D4, E4, F4, G4, A4, B4 och C5 som kan spelas med knapparna 1 till 8 respektive.
Programmering av Arduino:
Tillräckligt med teori låt oss komma till den roliga delen av programmering av Arduino. Det kompletta Arduino-programmet ges i slutet av denna sida, du kan hoppa ner om du vill eller läser vidare för att förstå hur koden fungerar.
I vårt Arduino-program måste vi läsa den analoga spänningen från stift A0, sedan förutsäga vilken knapp som trycktes in och spela respektive ton för den knappen. När vi gör detta bör vi också spela in vilken knapp användaren har tryckt på och hur länge han / hon har tryckt, så att vi kan återskapa tonen som spelades av användaren senare.
Innan vi går till den logiska delen måste vi förklara vilka åtta toner vi kommer att spela. Respektive frekvens för anteckningarna hämtas sedan från pitches.h- biblioteket och sedan bildas en matris som visas nedan. Här är frekvensen att spela not C4 262 och så vidare.
int-anteckningar = {262, 294, 330, 349, 392, 440, 494, 523}; // Ställ in frekvens för C4, D4, E4, F4, G4, A4, B4,
Därefter måste vi nämna till vilka stift LCD-skärmen är ansluten till. Om du följer exakt samma scheman som anges ovan behöver du inte ändra någonting här.
konst int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Stift till vilka LCD är ansluten LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Därefter i vår installationsfunktion vi initiera bara LCD-modulen och serie monitor för felsökning. Vi visar också ett intromeddelande bara för att se till att saker och ting fungerar som planerat. Nästa , inne i huvudslingan funktionen har vi två medan slingor.
En stund-loop kommer att köras så länge SPDT-omkopplaren är placerad i inspelning mer. I inspelningsläget kan användaren betala de önskade tonerna och samtidigt sparas tonen som spelas. Så medan loop ser ut så här nedan
medan (digitalRead (6) == 0) // Om vippomkopplaren är inställd i inspelningsläge {lcd.setCursor (0, 0); lcd.print ("Inspelning.."); lcd.setCursor (0, 1); Detektera-knapp (); Play_tone (); }
Som du kanske har märkt har vi två funktioner inuti while-slingan. Den första funktionen Detect_button () används, hitta vilken knapp användaren har tryckt på och den andra funktionen Play_tone () används för att spela respektive ton. Förutom denna funktion registrerar funktionen Detect_button () också vilken knapp som trycks ned och Play_tone () -funktionen registrerar hur länge knappen trycktes in.
Inuti Detect_button () funktion vi läser den analoga spänningen från stiftet A0 och jämför det med vissa fördefinierade värden att ta reda på vilken knapp har tryckts in. Värdet kan bestämmas antingen med hjälp av spänningsdelningsräknaren ovan eller med hjälp av den seriella monitorn för att kontrollera vilket analogvärde som läses för varje knapp.
ogiltig Detect_button () { analogVal = analogRead (A0); // läs den analoga volgen på stift A0 pev_button = knapp; // kom ihåg den tidigare knappen som användaren tryckt på om (analogVal <550) -knappen = 8; om (analogVal <500) knapp = 7; om (analogVal <450) knapp = 6; om (analogVal <400) knapp = 5; om (analogVal <300) knapp = 4; om (analogVal <250) knapp = 3; om (analogVal <150) knapp = 2; om (analogVal <100) knapp = 1; om (analogVal> 1000) -knappen = 0; / **** Spela in de tryckta knapparna i en matris *** / om (knapp! = pev_knapp && pev_knapp! = 0) { inspelad_knapp = pev_knapp; button_index ++; inspelad_knapp = 0; button_index ++; } / ** Slut på inspelningsprogram ** / }
Som sagt, inuti denna funktion spelar vi också in sekvensen där knapparna trycks in. De inspelade värdena lagras i en matris med namnet recording_button. Vi kontrollerar först om det trycks ned på en ny knapp, om vi trycker på det kontrollerar vi också om det inte är knappen 0. Där knapp 0 är ingenting men ingen knapp trycks in. Inuti if-slingan lagrar vi värdet på indexplatsen som ges av variabeln button_index och sedan ökar vi också indexvärdet så att vi inte skriver för mycket på samma plats.
/ **** Spela in de tryckta knapparna i en matris *** / if (knapp! = Pev_knapp && pev_knapp! = 0) { inspelad_knapp = pev_knapp; button_index ++; inspelad_knapp = 0; button_index ++; } / ** Slut på inspelningsprogram ** /
Inuti Play_tone () -funktionen spelar vi respektive ton för knappen som trycks in genom att använda flera om villkor. Vi kommer också att använda en matris med namnet recording_time inom vilken vi kommer att spara den tid som knappen trycktes in för. Funktionen liknar inspelning av knappsekvens genom att vi använder millis () -funktionen för att bestämma hur länge varje knapp trycktes in, också för att minska storleken på variabeln delar vi värdet med 10. För knapp 0, vilket innebär att användaren inte är genom att trycka på något spelar vi ingen ton under samma varaktighet. Den fullständiga koden inuti funktionen visas nedan.
ogiltig Play_tone () { / **** Spela in tidsfördröjningen mellan varje knapptryckning i en array *** / if (button! = pev_button) { lcd.clear (); // Rengör sedan det note_time = (millis () - start_time) / 10; inspelad tid = noteringstid; time_index ++; starttid = millis (); } / ** Slut på inspelningsprogram ** / if (knapp == 0) { noTone (7); lcd.print ("0 -> Paus.."); } om (knapp == 1) { ton (7, anteckningar); lcd.print ("1 -> NOTE_C4"); } om (knapp == 2) { ton (7, anteckningar); lcd.print ("2 -> NOTE_D4"); } om (knapp == 3) { ton (7, anteckningar); lcd.print ("3 -> NOTE_E4"); } om (knapp == 4) { ton (7, anteckningar); lcd.print ("4 -> NOTE_F4"); } om (knapp == 5) { ton (7, anteckningar); lcd.print ("5 -> NOTE_G4"); } om (knapp == 6) { ton (7, anteckningar); lcd.print ("6 -> NOTE_A4"); } om (knapp == 7) { ton (7, anteckningar); lcd.print ("7 -> NOTE_B4"); } om (knapp == 8) { ton (7, anteckningar); lcd.print ("8 -> NOTE_C5"); } }
Slutligen efter inspelning måste användaren växla DPST till den andra riktningen för att spela den inspelade tonen. När detta är gjort bryter programmet ut från den föregående while- slingan och går in i den andra while-loop där vi spelar tonerna i sekvensen av knapparna som trycks ned under en tid som tidigare spelats in. Koden för att göra detsamma visas nedan.
medan (digitalRead (6) == 1) // Om vippomkopplaren är inställd i spelläge { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Spelas nu.."); för (int i = 0; i <sizeof (inspelad_knapp) / 2; i ++) { fördröjning ((inspelad tid) * 10); // Vänta innan du betalar nästa melodi om ( recording_button == 0) noTone (7); // användarintryck på någon annan knappsignal (7, anteckningar - 1)]); // spela upp ljudet som motsvarar den knapp som användaren trycker på } } }
Spela, spela in, spela upp och upprepa!:
Gör hårdvaran enligt kretsschemat som visas och ladda upp koden till Arduino-kortet och dess visade tid. Placera SPDT i inspelningsläge och börja spela de toner du väljer, genom att trycka på varje knapp kommer en annan ton. Under detta läge visar LCD-skärmen “ Inspelning…” och på den andra raden ser du namnet på den anteckning som för närvarande trycks ned enligt nedan.
När du har spelat din ton växlar du SPDT-omkopplaren till andra sidan och LCD-skärmen ska visa " Now Playing.." och börja sedan spela den ton du just spelade. Samma ton spelas om och om igen så länge vippomkopplaren hålls i det läge som visas på bilden nedan.
Det fullständiga arbetet med projektet finns i videon nedan. Hoppas att du förstod projektet och gillade att bygga det. Om du har några problem med att skapa det här inlägget i kommentarsektionen eller använder forumen för teknisk hjälp med ditt projekt. Glöm inte att kolla demonstrationsvideon nedan.