- Nødvendige materialer:
- Kretsdiagram:
- Skjema og forklaring:
- Forstå
- Spille pianotoner på Arduino:
- Programmering av Arduino:
- Spill, spill inn, spill av og gjenta! :
Arduino har vært en velsignelse for folk som ikke er fra elektronikkbakgrunnen, å bygge ting lett. Det har vært et flott verktøy for prototyping eller for å prøve noe kult, i dette prosjektet skal vi bygge et lite, men morsomt piano med Arduino. Dette pianoet er ganske vanlig med bare 8 trykknapper og summer. Den bruker tone () -funksjonen til Arduino for å lage forskjellige typer piano notater på høyttaleren. For å krydre det litt har vi lagt til innspillingsfunksjonen i prosjektet, dette gjør det mulig for oss å spille en melodi og spille den på nytt gjentatte ganger når det er nødvendig. Høres interessant ut !! Så la oss få bygge….
Nødvendige materialer:
- Arduino Uno
- 16 * 2 LCD-skjerm
- Summer
- Trimmer 10k
- SPDT-bryter
- Trykknapp (8 Nos)
- Motstander (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Brettbrett
- Koble ledninger
Kretsdiagram:
Det komplette Arduino Piano Project kan bygges på toppen av et brødbrett med noen tilkoblingsledninger. Kretsskjemaet laget ved hjelp av fritzing som viser breadboard-visningen av prosjektet er vist nedenfor
Bare følg kretsskjemaet og koble ledningene tilsvarende, trykknappene og summeren som brukes med en PCB-modul, men i faktisk maskinvare har vi bare brukt bryteren og summeren, det skal ikke forvirre deg mye fordi de har samme type pin. Du kan også se på bildet nedenfor av maskinvaren for å opprette tilkoblinger.
Verdien av motstandene fra venstre er i følgende rekkefølge, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k og 10k. Hvis du ikke har den samme DPST-bryteren, kan du bruke normal vippebryter som den som er vist i kretsskjemaet ovenfor. La oss nå se på skjemaene for prosjektet for å forstå hvorfor vi har gjort følgende forbindelser.
Skjema og forklaring:
Skjemaene for kretsskjemaet som er vist ovenfor er gitt nedenfor, det ble også laget med Fritzing.
En hovedforbindelse som vi må forstå er at hvordan vi har koblet de 8 trykknappene til Arduino gjennom den analoge A0-pinnen. I utgangspunktet trenger vi 8 inngangspinner som kan kobles til de 8 inngangsknappene, men for prosjekter som dette kan vi ikke bruke 8 pinner på mikrokontrolleren bare for trykknapper siden vi kanskje trenger dem for senere bruk. I vårt tilfelle har vi LCD-skjermen som skal grensesnitt.
Så vi bruker den analoge pinnen til Arduino og danner en potensiell skillelinje med varierende motstandsverdier for å fullføre kretsen. På denne måten vil hver analoge spenning tilføres den analoge pinnen når hver knapp trykkes. En prøvekrets med bare to motstander og to trykknapper er vist nedenfor.
I dette tilfellet vil ADC-pinnen motta + 5V når trykknappene ikke trykkes, hvis den første knappen trykkes inn, blir potensialdeleren fullført gjennom 560R-motstanden, og hvis den andre knappen trykkes, blir potensialdeleren konkurrert med 1,5 k motstand. På denne måten vil spenningen som mottas av ADC-pinnen variere basert på formlene for potensiell skillelinje. Hvis du vil vite mer om hvordan den potensielle skillelinjen fungerer, og hvordan du beregner verdien av spenningen som mottas av ADC-stiften, kan du bruke denne potensielle skillelinjen.
Annet enn dette er alle tilkoblingene rett frem, LCD-skjermen er koblet til pinnene 8, 9, 10, 11 og 12. Summeren er koblet til pinnen 7 og SPDT-bryteren er koblet til pinnen 6 på Arduino. Hele prosjektet drives av USB-porten på den bærbare datamaskinen. Du kan også koble Arduino til en 9V eller 12V forsyning gjennom DC-kontakten, og prosjektet vil fortsatt fungere det samme.
Forstå
Arduino har en hendig tone () -funksjon som kan brukes til å generere varierende frekvenssignaler som kan brukes til å produsere forskjellige lyder ved hjelp av en summer. Så la oss forstå hvordan funksjonen fungerer og hvordan den kan brukes med Arduino.
Før det skulle vi vite hvordan en Piezo-summer fungerer. Vi har kanskje lært om Piezo-krystaller på skolen vår, det er ingenting annet enn en krystall som omdanner mekaniske vibrasjoner til elektrisitet eller omvendt. Her bruker vi en variabel strøm (frekvens) som krystallet vibrerer for å produsere lyd. Derfor, for å få Piezo-summeren til å lage noe støy, må vi gjøre Piezo-elektriske krystaller til å vibrere, tonehøyde og tone av støy avhenger av hvor raskt krystallet vibrerer. Derfor kan tone og tonehøyde styres ved å variere strømens frekvens.
Ok, så hvordan får vi variabel frekvens fra Arduino? Det er her tone () -funksjonen kommer inn. Tonen () kan generere en bestemt frekvens på en bestemt pin. Varigheten kan også nevnes ved behov. Syntaksen for tone () er
Syntaks tone (pin, frekvens) tone (pin, frekvens, varighet) Parameter pin: pin som tonefrekvens skal genereres på: frekvensen til tonen i hertz - usignert int varighet: tonens varighet i millisekunder (valgfritt1) - usignert lang
Verdiene til pin kan være hvilken som helst av din digitale pin. Jeg har brukt pin nummer 8 her. Frekvensen som kan genereres, avhenger av størrelsen på tidtakeren på Arduino-kortet. For UNO og de fleste andre vanlige kort er den minste frekvensen som kan produseres 31Hz, og den maksimale frekvensen som kan produseres er 65535Hz. Imidlertid kan vi mennesker bare høre frekvenser mellom 2000Hz og 5000 Hz.
Spille pianotoner på Arduino:
Ok, før jeg begynner med dette emnet, la meg gjøre det klart at jeg er en nybegynner med musikalske toner eller piano, så vær så snill å tilgi meg hvis noe som er nevnt under denne overskriften, er plagsomt.
Vi vet nå at vi kan bruke tonefunksjonen i Arduino til å produsere noen lyder, men hvordan kan vi spille toner av en bestemt tone med det samme. Heldig for oss er det et bibliotek som heter “pitches.h” skrevet av Brett Hagman. Dette biblioteket inneholder all informasjon om hvilken frekvens som tilsvarer hvilken note på et piano. Jeg ble overrasket over hvor godt dette biblioteket faktisk kunne fungere og spille nesten hver tone på et piano, jeg brukte det samme til å spille piano-tonene til Pirates of Caribbean, Crazy Frog, Mario og til og med titanic, og de hørtes fantastiske ut. Beklager! Vi blir litt utenfor emnet her, så hvis du er interessert i det, sjekk ut å spille melodier ved hjelp av Arduino-prosjektet. Du vil også finne mer forklaring om pitches.h- biblioteket i det prosjektet.
Prosjektet vårt har bare 8 trykknapper, slik at hver knapp bare kan spille en bestemt musikalsk tone og dermed totalt kan vi bare spille 8 noter. Jeg valgte de mest brukte tonene på et piano, men kan du velge hvilken som helst 8 eller til og med utvide prosjektet med flere trykknapper og legge til flere notater.
Merkene valgt i dette prosjektet er tonene C4, D4, E4, F4, G4, A4, B4 og C5 som kan spilles med knappene 1 til 8.
Programmering av Arduino:
Nok av teorien, la oss komme til den morsomme delen av programmering av Arduino. Det komplette Arduino-programmet er gitt på slutten av denne siden, og du kan hoppe ned hvis du er ivrig eller leser videre for å forstå hvordan koden fungerer.
I vårt Arduino-program må vi lese den analoge spenningen fra pin A0, så forutsi hvilken knapp som ble trykket på og spill den respektive tonen for den knappen. Mens vi gjør dette, bør vi også registrere hvilken knapp brukeren har trykket på og hvor lenge han / hun har trykket, slik at vi kan gjenskape tonen som ble spilt av brukeren senere.
Før vi går til den logiske delen, må vi erklære hvilke 8 noter vi skal spille. Den respektive frekvensen for notene blir deretter hentet fra pitches.h- biblioteket, og deretter dannes en matrise som vist nedenfor. Her er frekvensen for å spille note C4 262 og så videre.
int-notater = {262, 294, 330, 349, 392, 440, 494, 523}; // Still frekvens for C4, D4, E4, F4, G4, A4, B4,
Deretter må vi nevne hvilke pinner LCD-skjermen er koblet til. Hvis du følger nøyaktig de samme skjemaene som er gitt ovenfor, trenger du ikke endre noe her.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pins som LCD er koblet til LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Deretter initialiserer vi bare LCD-modulen og den serielle skjermen i feilsøking i vår oppsettfunksjon . Vi viser også en intro-melding bare for å sikre at ting fungerer som planlagt. Neste inne i hovedsløyfen funksjon har vi to mens sløyfer.
Én mens sløyfe vil bli utført så lenge SPDT-bryteren er plassert i mer opptak. I opptaksmodus kan brukeren betale tonene som kreves, og samtidig lagres også tonen som spilles. Så mens løkken ser slik ut nedenfor
mens (digitalRead (6) == 0) // Hvis vippebryteren er satt i opptaksmodus {lcd.setCursor (0, 0); lcd.print ("Opptak.."); lcd.setCursor (0, 1); Detect_button (); Spilletone (); }
Som du kanskje har lagt merke til har vi to funksjoner i mens loop. Den første funksjonen Detect_button () brukes, finn hvilken knapp brukeren har trykket på, og den andre funksjonen Play_tone () brukes til å spille den respektive tonen. Bortsett fra denne funksjonen registrerer funksjonen Detect_button () også hvilken knapp som trykkes på, og Play_tone () -funksjonen registrerer hvor lenge knappen ble trykket.
Inne i Detect_button () funksjon lese vi den analoge spenning fra tappen A0 og sammenligne det med noen forhåndsdefinerte verdier for å finne ut hvilken knapp har blitt trykket. Verdien kan bestemmes ved å bruke spenningsdeler kalkulatoren ovenfor eller ved å bruke seriell skjerm for å sjekke hvilken analog verdi som leses for hver knapp.
ugyldig Detect_button () { analogVal = analogRead (A0); // les den analoge voltag på pin A0 pev_button = knapp; // husk forrige knapp som ble trykket av brukeren hvis (analogVal <550) knapp = 8; hvis (analogVal <500) knapp = 7; hvis (analogVal <450) knapp = 6; hvis (analogVal <400) knapp = 5; hvis (analogVal <300) knapp = 4; hvis (analogVal <250) knapp = 3; hvis (analogVal <150) knapp = 2; hvis (analogVal <100) knapp = 1; hvis (analogVal> 1000) knapp = 0; / **** Kord de trykkte knappene i en matrise *** / hvis (knapp! = pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; registrert_knapp = 0; button_index ++; } / ** Slutt på opptaksprogram ** / }
Som sagt, inne i denne funksjonen registrerer vi også sekvensen som knappene trykkes på. De registrerte verdiene lagres i en matrise som heter recording_button. Vi sjekker først om det er trykket på en ny knapp, hvis vi trykker på det, sjekker vi også om det ikke er knappen 0. Der knapp 0 ikke er noe, men ingen knapp trykkes. Inne i if-sløyfen lagrer vi verdien på indeksplasseringen gitt av variabelen button_index, og deretter øker vi også denne indeksverdien slik at vi ikke skriver for mye på samme sted.
/ **** Kord de trykkte knappene i en matrise *** / if (button! = Pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; registrert_knapp = 0; button_index ++; } / ** Slutt på opptaksprogram ** /
Inne i Play_tone () -funksjonen vil vi spille den respektive tonen for knappen som trykkes ved å bruke flere hvis forholdene. Vi vil også bruke en matrise med navnet recording_time der vi vil lagre tidsvarigheten knappen ble trykket på for. Operasjonen ligner på innspilling av knappesekvens ved å bruke millis () -funksjonen til å bestemme hvor lenge hver knapp ble trykket, også for å redusere størrelsen på variabelen deler vi verdien med 10. For knapp 0, som betyr at brukeren ikke er ved å trykke på noe spiller vi ingen tone i samme varighet. Den komplette koden i funksjonen er vist nedenfor.
ugyldig Play_tone () { / **** Kord tidsforsinkelsen mellom hvert knappetrykk i en matrise *** / if (button! = pev_button) { lcd.clear (); // Rengjør den deretter note_time = (millis () - start_time) / 10; registrert tid = merknadstid; time_index ++; starttid = millis (); } / ** Slutt på opptaksprogram ** / if (knapp == 0) { noTone (7); lcd.print ("0 -> Pause.."); } hvis (knapp == 1) { tone (7, notater); lcd.print ("1 -> NOTE_C4"); } hvis (knapp == 2) { tone (7, notater); lcd.print ("2 -> NOTE_D4"); } hvis (knapp == 3) { tone (7, notater); lcd.print ("3 -> NOTE_E4"); } hvis (knapp == 4) { tone (7, notater); lcd.print ("4 -> NOTE_F4"); } hvis (knapp == 5) { tone (7, notater); lcd.print ("5 -> NOTE_G4"); } hvis (knapp == 6) { tone (7, notater); lcd.print ("6 -> NOTE_A4"); } hvis (knapp == 7) { tone (7, notater); lcd.print ("7 -> NOTE_B4"); } hvis (knapp == 8) { tone (7, notater); lcd.print ("8 -> NOTE_C5"); } }
Til slutt, etter opptak, må brukeren veksle DPST til den andre retningen for å spille av den innspilte tonen. Når dette er gjort, bryter programmet ut av den forrige mens sløyfen går inn i den andre mens sløyfen hvor vi spiller tonene i rekkefølgen av knappene som er trykket inn i en varighet som tidligere ble spilt inn. Koden for å gjøre det samme er vist nedenfor.
while (digitalRead (6) == 1) // Hvis vippebryteren er satt i avspillingsmodus { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Spiller nå…"); for (int i = 0; i <sizeof (recording_button) / 2; i ++) { delay ((recording_time) * 10); // Vent på før du betaler neste sang hvis ( recording_button == 0) noTone (7); // bruker ikke berøre en annen knappetone (7, notater - 1)]); // spill av lyden som tilsvarer knappen som er berørt av brukeren } } }
Spill, spill inn, spill av og gjenta!:
Lag maskinvaren i henhold til kretsskjemaet som vises, og last opp koden til Arduino-kortet og den viste tiden. Plasser SPDT i opptaksmodus og begynn å spille tonene du ønsker, ved å trykke på hver knapp vil du få en annen tone. I denne modusen viser LCD-skjermen “ Opptak…” og på den andre linjen vil du se navnet på notatet som for øyeblikket trykkes på, som vist nedenfor.
Når du har spilt tonen, bytter du SPDT-bryteren til den andre siden, og LCD-skjermen skal vise " Now Playing.." og deretter begynne å spille tonen du nettopp spilte. Den samme tonen vil bli spilt igjen og igjen så lenge vippebryteren holdes i posisjon som vist på bildet nedenfor.
Fullstendig bearbeiding av prosjektet finner du i videoen nedenfor. Håper du forsto prosjektet og likte å bygge det. Hvis du har problemer med å bygge dette, legg dem inn i kommentarseksjonen eller bruk forumene for teknisk hjelp på prosjektet ditt. Ikke glem å sjekke demonstrasjonsvideoen gitt nedenfor.