- Nødvendige materialer:
- Kredsløbsdiagram:
- Skema og forklaring:
- Forståelse af
- Afspil klavertoner på Arduino:
- Programmering af Arduino:
- Spil, optag, afspil og gentag! :
Arduino har været en velsignelse for folk, der ikke er fra elektronikbaggrunden, for nemt at bygge ting. Det har været et fantastisk prototypeværktøj eller at prøve noget sejt, i dette projekt skal vi bygge et lille, men sjovt klaver ved hjælp af Arduino. Dette klaver er stort set almindeligt med kun 8 trykknapper og summer. Det bruger Arduinos tone () -funktion til at oprette forskellige typer klavernoter på højttaleren. For at krydre det lidt, har vi tilføjet optagefunktionen i projektet, dette gør det muligt for os at afspille en melodioptagelse og afspille den igen gentagne gange, når det er nødvendigt. Lyder interessant lige !! Så lad os 'komme i bygning….
Nødvendige materialer:
- Arduino Uno
- 16 * 2 LCD-skærm
- Summer
- Trimmer 10k
- SPDT-switch
- Trykknap (8 nr.)
- Modstande (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Brødbræt
- Tilslutning af ledninger
Kredsløbsdiagram:
Det komplette Arduino klaverprojekt kan bygges oven på et brødbræt med nogle forbindelsesledninger. Kredsløbsdiagrammet, der er lavet ved hjælp af fritzing, der viser breadboard-visningen af projektet er vist nedenfor
Følg blot kredsløbsdiagrammet og tilslut ledningerne i overensstemmelse hermed, trykknapperne og summeren som brugt med et printkortmodul, men i egentlig hardware har vi kun brugt kontakten og summeren, det bør ikke forvirre dig meget, fordi de har den samme type pin ud. Du kan også henvise til nedenstående billede af hardwaren for at oprette dine forbindelser.
Værdien af modstandene fra venstre er i følgende rækkefølge, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k og 10k. Hvis du ikke har den samme DPST-switch, kan du bruge normal vippekontakt som den, der er vist i kredsløbsdiagrammet ovenfor. Lad os nu se på skemaerne for projektet for at forstå, hvorfor vi har oprettet følgende forbindelser.
Skema og forklaring:
Skemaerne til kredsløbsdiagrammet, der er vist ovenfor, er angivet nedenfor, det blev også lavet ved hjælp af Fritzing.
En hovedforbindelse, som vi er nødt til at forstå, er, hvordan vi har tilsluttet de 8 trykknapper til Arduino gennem den analoge A0-pin. Dybest set har vi brug for 8 indgangsstifter, som kan tilsluttes de 8 indgangsknapper, men til projekter som dette kan vi ikke bruge 8 ben på mikrocontrolleren kun til trykknapper, da vi muligvis har brug for dem til senere brug. I vores tilfælde har vi LCD-skærmen, der skal forbindes.
Så vi bruger Arduino's analoge stift og danner en potentiel skillevæg med forskellige modstandsværdier for at fuldføre kredsløbet. Denne måde, når der trykkes på hver knap, tilføres den analoge pin forskellige analoge spændinger. Et prøvekredsløb med kun to modstande og to trykknapper er vist nedenfor.
I dette tilfælde modtager ADC-stiften + 5V, når der ikke trykkes på trykknapperne. Hvis der trykkes på den første knap, bliver den potentielle skillevæg færdig gennem 560R-modstanden, og hvis der trykkes på den anden knap, bliver den potentielle skillevæg konkurreret ved hjælp af 1.5 k-modstand. På denne måde vil spændingen, der modtages af ADC-stiften, variere baseret på formlerne for den potentielle opdeler. Hvis du vil vide mere om, hvordan den potentielle opdeler fungerer, og hvordan du beregner værdien af spændingen modtaget af ADC-stiften, kan du bruge denne potentielle opdelingsberegningsside.
Bortset fra dette er alle forbindelser lige fremad, LCD'et er forbundet til ben 8, 9, 10, 11 og 12. Summeren er forbundet til pin 7, og SPDT-kontakten er forbundet til pin 6 i Arduino. Det komplette projekt drives af USB-porten på den bærbare computer. Du kan også slutte Arduino til en 9V- eller 12V-forsyning gennem DC-stikket, og projektet fungerer stadig det samme.
Forståelse af
Arduino har en praktisk tone () -funktion, som kan bruges til at generere varierende frekvenssignaler, der kan bruges til at producere forskellige lyde ved hjælp af en summer. Så lad os forstå, hvordan funktionen fungerer, og hvordan den kan bruges med Arduino.
Før det skulle vi vide, hvordan en Piezo-summer fungerer. Vi har måske lært om Piezo-krystaller på vores skole, det er intet andet end en krystal, der omdanner mekaniske vibrationer til elektricitet eller omvendt. Her anvender vi en variabel strøm (frekvens), som krystallen vibrerer for at producere lyd. Derfor, for at få Piezo-summeren til at lave noget støj, er vi nødt til at få Piezo-elektriske krystaller til at vibrere, tonehøjde og tone afhænger af, hvor hurtigt krystallen vibrerer. Derfor kan tone og tonehøjde styres ved at variere strømens frekvens.
Okay, så hvordan får vi en variabel frekvens fra Arduino? Det er her, hvor tone () -funktionen kommer ind. Tonen () kan generere en bestemt frekvens på en bestemt pin. Tidsvarigheden kan også nævnes, hvis det kræves. Syntaksen for tone () er
Syntaks tone (pin, frekvens) tone (pin, frekvens, varighed) Parametre pin: den pin, hvor tonefrekvensen skal genereres: frekvensen af tonen i hertz - usigneret int varighed: varigheden af tonen i millisekunder (valgfri1) - usigneret lang
Værdierne for pin kan være enhver af dine digitale pin. Jeg har brugt pin nummer 8 her. Den frekvens, der kan genereres, afhænger af størrelsen på timeren på dit Arduino-kort. For UNO og de fleste andre almindelige kort er den mindste frekvens, der kan produceres, 31Hz, og den maksimale frekvens, der kan produceres, er 65535Hz. Men vi mennesker kan kun høre frekvenser mellem 2000Hz og 5000 Hz.
Afspil klavertoner på Arduino:
Okay, inden jeg selv begynder med dette emne, lad mig gøre det klart, at jeg er en novice med musiknoter eller klaver, så tilgiv mig, hvis noget, der er nævnt under denne overskrift, er pludrende.
Vi ved nu, at vi kan bruge tonerfunktionen i Arduino til at producere nogle lyde, men hvordan kan vi afspille toner fra en bestemt tone ved hjælp af den samme. Heldig for os er der et bibliotek kaldet “pitches.h” skrevet af Brett Hagman. Dette bibliotek indeholder alle oplysninger om, hvilken frekvens der svarer til hvilken note på et klaver. Jeg blev overrasket over, hvor godt dette bibliotek faktisk kunne fungere og spille næsten hver tone på et klaver, jeg brugte det samme til at spille klavernoter fra Pirates of Caribbean, Crazy Frog, Mario og endda titanic, og de lød fantastisk. Ups! Vi er lidt uden for emnet her, så hvis du er interesseret i det, skal du prøve at spille melodier ved hjælp af Arduino-projektet. Du finder også mere forklaring om pitches.h- biblioteket i det projekt.
Vores projekt har kun 8 trykknapper, så hver knap kun kan spille en bestemt musiknote, og således kan vi kun spille kun 8 toner. Jeg valgte de mest anvendte toner på et klaver, men kan du vælge en hvilken som helst 8 eller endda udvide projektet med flere trykknapper og tilføje flere toner.
De valgte toner i dette projekt er toner C4, D4, E4, F4, G4, A4, B4 og C5, som kan afspilles ved hjælp af knapperne 1 til 8.
Programmering af Arduino:
Nok af teorien, lad os komme til den sjove del af programmering af Arduino. Det komplette Arduino-program gives i slutningen af denne side, du kan hoppe ned, hvis du er ivrig eller læser videre for at forstå, hvordan koden fungerer.
I vores Arduino-program skal vi læse den analoge spænding fra pin A0, derefter forudsige, hvilken knap der blev trykket på og afspille den respektive tone for den pågældende knap. Mens vi gør dette, skal vi også registrere, hvilken knap brugeren har trykket på, og hvor længe han / hun har trykket, så vi kan genskabe den tone, der blev spillet af brugeren senere.
Inden vi går til den logiske del, skal vi erklære, hvilke 8 toner vi skal spille. Den respektive frekvens for noterne tages derefter fra pitches.h- biblioteket, og derefter dannes en matrix som vist nedenfor. Her er frekvensen for at spille note C4 262 og så videre.
int-toner = {262, 294, 330, 349, 392, 440, 494, 523}; // Indstil frekvens for C4, D4, E4, F4, G4, A4, B4,
Dernæst skal vi nævne, hvilke stifter LCD-skærmen er tilsluttet. Hvis du følger nøjagtigt de samme skemaer som angivet ovenfor, behøver du ikke ændre noget her.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Pins, som LCD er tilsluttet LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Derefter initialiserer vi bare LCD-modulet og den serielle skærm inden for fejlfinding i vores installationsfunktion . Vi viser også en intro-besked bare for at sikre, at tingene fungerer som planlagt. Næste , inde i vigtigste loop funktion har vi to mens sløjfer.
Én mens loop udføres, så længe SPDT-kontakten er placeret i optagelse mere. I optagetilstand kan brugeren betale de krævede toner, og samtidig gemmes den tone, der afspilles. Så mens løkken ser sådan ud nedenfor
mens (digitalRead (6) == 0) // Hvis vippekontakten er indstillet i optagetilstand {lcd.setCursor (0, 0); lcd.print ("Optagelse.."); lcd.setCursor (0, 1); Detect_button (); Afspilningstone (); }
Som du måske har bemærket, har vi to funktioner inde i while-sløjfen. Den første funktion Detect_button () bruges, find hvilken knap brugeren har trykket på, og den anden funktion Play_tone () bruges til at afspille den respektive tone. Bortset fra denne funktion registrerer funktionen Detect_button () også, hvilken knap der trykkes på, og Play_tone () -funktionen registrerer, hvor længe der blev trykket på knappen.
Inde i Detect_button () funktion vi læser den analoge spænding fra stiften A0 og sammenligne det med nogle foruddefinerede værdier for at finde ud af, hvilken knap der er trykket. Værdien kan bestemmes ved hjælp af spændingsdelerberegneren ovenfor eller ved hjælp af den serielle skærm til at kontrollere, hvilken analog værdi der læses for hver knap.
ugyldig Detect_button () { analogVal = analogRead (A0); // læs det analoge voltag på pin A0 pev_button = knap; // husk den forrige knap, der blev trykket på af brugeren, hvis (analogVal <550) knap = 8; hvis (analogVal <500) knap = 7; hvis (analogVal <450) knap = 6; hvis (analogVal <400) knap = 5; hvis (analogVal <300) knap = 4; hvis (analogVal <250) knap = 3; hvis (analogVal <150) knap = 2; hvis (analogVal <100) knap = 1; hvis (analogVal> 1000) knap = 0; / **** Kord de trykkede knapper i et array *** / hvis (knap! = pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; recording_button = 0; button_index ++; } / ** Afslutning af optagelsesprogram ** / }
Som sagt registrerer vi også inden for denne funktion den rækkefølge, som knapperne trykkes på. De registrerede værdier er gemt i en matrix med navnet recording_button. Vi kontrollerer først, om der er trykket på en ny knap, hvis der trykkes på, kontrollerer vi også, om det ikke er knappen 0. Hvor knap 0 ikke er noget, men der trykkes ikke på nogen knap. Inde i if-sløjfen lagrer vi værdien på indeksplaceringen givet af variablen button_index, og så øger vi også denne indeksværdi, så vi ikke skriver for meget på den samme placering.
/ **** Kord de trykkede knapper i en matrix *** / if (knap! = Pev_button && pev_button! = 0) { recording_button = pev_button; button_index ++; recording_button = 0; button_index ++; } / ** Afslutning af optagelsesprogram ** /
Inde i Play_tone () -funktionen spiller vi den respektive tone for den knap, der trykkes på, ved hjælp af flere hvis forhold. Vi bruger også en matrix med navnet recording_time, hvori vi gemmer den tidsvarighed, som knappen blev trykket på. Funktionen svarer til optagelse af knapsekvens, da vi bruger millis () -funktionen til at bestemme, hvor længe hver knap blev trykket, også for at reducere størrelsen på variablen dividerer vi værdien med 10. For knap 0, hvilket betyder, at brugeren ikke er ved at trykke på noget spiller vi ingen tone i samme varighed. Den komplette kode inde i funktionen er vist nedenfor.
ugyldigt Play_tone () { / **** Tegn tidsforsinkelsen mellem hvert tryk på en knap i en matrix *** / hvis (knap! = pev_button) { lcd.clear (); // Rens det derefter note_time = (millis () - start_time) / 10; recording_time = note_time; time_index ++; starttid = millis (); } / ** Afslutning af optagelsesprogram ** / if (knap == 0) { noTone (7); lcd.print ("0 -> Pause.."); } hvis (knap == 1) { tone (7, noter); lcd.print ("1 -> NOTE_C4"); } hvis (knap == 2) { tone (7, noter); lcd.print ("2 -> NOTE_D4"); } hvis (knap == 3) { tone (7, noter); lcd.print ("3 -> NOTE_E4"); } hvis (knap == 4) { tone (7, noter); lcd.print ("4 -> NOTE_F4"); } hvis (knap == 5) { tone (7, noter); lcd.print ("5 -> NOTE_G4"); } hvis (knap == 6) { tone (7, noter); lcd.print ("6 -> NOTE_A4"); } hvis (knap == 7) { tone (7, noter); lcd.print ("7 -> NOTE_B4"); } hvis (knap == 8) { tone (7, noter); lcd.print ("8 -> NOTE_C5"); } }
Endelig efter optagelse skal brugeren skifte DPST til den anden retning for at afspille den indspillede tone. Når dette er gjort, bryder programmet ud af den foregående while- loop og går ind i den anden while-loop, hvor vi spiller noterne i rækkefølgen af knapperne, der trykkes ned i en tidligere varighed. Koden til at gøre det samme vises nedenfor.
while (digitalRead (6) == 1) // Hvis vippekontakten er indstillet i afspilningstilstand { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Spiller nu.."); for (int i = 0; i <sizeof (recording_button) / 2; i ++) { delay ((recording_time) * 10); // Vent, inden du betaler næste melodi, hvis ( recording_button == 0) noTone (7); // bruger dint berøre en hvilken som helst knap anden tone (7, noter - 1)]); // afspil den lyd, der svarer til den knap, der er berørt af brugeren } } }
Spil, optag, afspil og gentag!:
Lav hardware ifølge det viste kredsløbsdiagram, og upload koden til Arduino-kortet og dets viste tid. Placer SPDT i optagetilstand, og start afspilningen af de toner, du vælger, ved at trykke på hver knap frembringes en anden tone. I denne tilstand viser LCD'et " Optagelse…", og på den anden linje vil du se navnet på den note, der aktuelt trykkes på som vist nedenfor
Når du har spillet din tone, skal du skifte SPDT-kontakten til den anden side, og LCD'et skal vise " Now Playing.." og derefter begynde at afspille den tone, du lige har spillet. Den samme tone afspilles igen og igen, så længe vippekontakten holdes i den position, som vist på nedenstående billede.
Den komplette bearbejdning af projektet kan findes i videoen nedenfor. Håber du forstod projektet og nød at bygge det. Hvis du har problemer med at opbygge dette, skal du poste dem i kommentarsektionen eller bruge foraerne til teknisk hjælp til dit projekt. Glem heller ikke at tjekke demonstrationsvideoen nedenfor.