- Wymagane materiały:
- Schemat obwodu:
- Schemat i wyjaśnienie:
- Zrozumienie
- Odtwarzanie dźwięków fortepianu na Arduino:
- Programowanie Arduino:
- Odtwarzaj, nagrywaj, odtwarzaj i powtarzaj! :
Arduino jest dobrodziejstwem dla osób, które nie są z wykształcenia elektroniką, aby łatwo tworzyć rzeczy. To było świetne narzędzie do prototypowania lub do wypróbowania czegoś fajnego, w tym projekcie zamierzamy zbudować małe, ale zabawne pianino za pomocą Arduino. Ten fortepian jest prawie prosty z zaledwie 8 przyciskami i brzęczykiem. Wykorzystuje funkcję tone () Arduino do tworzenia różnych typów nut fortepianowych na głośniku. Aby trochę urozmaicić, dodaliśmy do projektu funkcję nagrywania, dzięki czemu możemy odtworzyć melodię, nagrać ją i odtworzyć ją wielokrotnie, gdy jest to wymagane. Brzmi interesująco, prawda! Więc zacznijmy budować…
Wymagane materiały:
- Arduino Uno
- Wyświetlacz LCD 16 * 2
- Brzęczyk
- Trymer 10k
- Przełącznik SPDT
- Przycisk (8 numerów)
- Rezystory (10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k, 10k)
- Płytka prototypowa
- Przewody łączące
Schemat obwodu:
Cały projekt Arduino Piano można zbudować na płytce stykowej za pomocą kilku przewodów połączeniowych. Schemat obwodu wykonany przy użyciu fritzingu, który przedstawia widok płytki prototypowej projektu, pokazano poniżej
Wystarczy postępować zgodnie ze schematem obwodu i odpowiednio podłączyć przewody, przyciski i brzęczyk, jak w przypadku modułu PCB, ale w rzeczywistości używaliśmy tylko przełącznika i brzęczyka, nie powinno to zbytnio mylić, ponieważ mają ten sam typ pinów. Możesz również zapoznać się z poniższym obrazem sprzętu, aby wykonać połączenia.
Wartość rezystorów od lewej jest w następującej kolejności: 10k, 560R, 1,5k, 2,6k, 3,9, 5,6k, 6,8k, 8,2k i 10k. Jeśli nie masz tego samego przełącznika DPST, możesz użyć normalnego przełącznika dwustabilnego, takiego jak pokazano na schemacie powyżej. Spójrzmy teraz na schematy projektu, aby zrozumieć, dlaczego dokonaliśmy następujących połączeń.
Schemat i wyjaśnienie:
Schematy schematu obwodu, który pokazano powyżej, podano poniżej, został on również wykonany przy użyciu Fritzing.
Jednym z głównych połączeń, które musimy zrozumieć, jest to, w jaki sposób podłączyliśmy 8 przycisków do Arduino przez analogowy pin A0. Zasadniczo potrzebujemy 8 pinów wejściowych, które można podłączyć do 8 przycisków wejściowych, ale w takich projektach nie możemy użyć 8 pinów mikrokontrolera tylko do przycisków, ponieważ możemy ich potrzebować do późniejszego użycia. W naszym przypadku mamy do czynienia z wyświetlaczem LCD.
Więc używamy analogowego pinu Arduino i tworzymy potencjalny dzielnik ze zmiennymi wartościami rezystorów, aby uzupełnić obwód. W ten sposób po naciśnięciu każdego przycisku na pin analogowy zostanie podane inne napięcie analogowe. Przykładowy obwód z tylko dwoma rezystorami i dwoma przyciskami pokazano poniżej.
W tym przypadku pin ADC otrzyma + 5V, gdy przyciski nie są wciśnięte, jeśli pierwszy przycisk zostanie naciśnięty, wtedy dzielnik potencjału zostanie zakończony przez rezystor 560R, a jeśli drugi przycisk zostanie naciśnięty, dzielnik potencjału zostanie dopasowany za pomocą 1,5 rezystor k. W ten sposób napięcie odbierane przez pin ADC będzie się zmieniać w zależności od wzorów dzielnika potencjału. Jeśli chcesz dowiedzieć się więcej o tym, jak działa dzielnik potencjału i jak obliczyć wartość napięcia odbieranego przez pin ADC, możesz skorzystać z tej strony kalkulatora potencjalnego dzielnika.
Poza tym wszystkie połączenia są proste, wyświetlacz LCD jest podłączony do pinów 8, 9, 10, 11 i 12. Brzęczyk jest podłączony do pinu 7, a przełącznik SPDT jest podłączony do pinu 6 Arduino. Cały projekt jest zasilany przez port USB laptopa. Możesz również podłączyć Arduino do zasilania 9V lub 12V przez gniazdo DC i projekt nadal będzie działał tak samo.
Zrozumienie
Arduino ma przydatną funkcję tone (), która może być używana do generowania sygnałów o zmiennej częstotliwości, które mogą być używane do generowania różnych dźwięków za pomocą brzęczyka. Zobaczmy więc, jak działa ta funkcja i jak można jej używać z Arduino.
Wcześniej powinniśmy wiedzieć, jak działa buzzer piezo. Być może dowiedzieliśmy się o kryształach piezoelektrycznych w naszej szkole, to nic innego jak kryształ, który przekształca wibracje mechaniczne w elektryczność lub odwrotnie. Tutaj stosujemy zmienny prąd (częstotliwość), przy którym kryształ wibruje, wytwarzając dźwięk. Dlatego, aby buzzer Piezo wydawał trochę hałasu, musimy wprawić kryształ piezoelektryczny w wibracje, wysokość i ton hałasu zależy od szybkości wibracji kryształu. Stąd ton i wysokość mogą być kontrolowane przez zmianę częstotliwości prądu.
Ok, więc jak możemy uzyskać zmienną częstotliwość z Arduino? W tym miejscu pojawia się funkcja tone (). Funkcja tone () może generować określoną częstotliwość na określonym pinie. W razie potrzeby można również podać czas trwania. Składnia funkcji tone () to
Ton składni (pin, częstotliwość) ton (pin, częstotliwość, czas trwania) Parametry pin: pin, na którym generowana jest częstotliwość tonu: częstotliwość tonu w hercach - unsigned int duration: czas trwania tonu w milisekundach (opcjonalnie1) - długi bez znaku
Wartości pinów mogą być dowolnymi cyfrowymi pinami. Użyłem tutaj numeru PIN 8. Częstotliwość, która może zostać wygenerowana, zależy od wielkości timera na twojej płycie Arduino. W przypadku płyt UNO i większości innych popularnych płyt minimalna częstotliwość, jaką można wytworzyć, to 31 Hz, a maksymalna częstotliwość, jaką można wytworzyć, to 65535 Hz. Jednak my, ludzie, słyszymy tylko częstotliwości między 2000 Hz a 5000 Hz.
Odtwarzanie dźwięków fortepianu na Arduino:
Okay, zanim jeszcze zacznę ten temat, pozwólcie mi wyjaśnić, że jestem nowicjuszem z nutami muzycznymi lub fortepianem, więc proszę mi wybaczyć, jeśli cokolwiek wspomnianego w tym nagłówku jest bełkotem.
Teraz wiemy, że możemy użyć funkcji tonów w Arduino do wytworzenia niektórych dźwięków, ale jak możemy odtworzyć dźwięki określonej nuty za pomocą tego samego. Na szczęście dla nas istnieje biblioteka o nazwie „pitches.h”, której autorem jest Brett Hagman. Ta biblioteka zawiera wszystkie informacje o tym, jaka częstotliwość jest odpowiednikiem której nuty na fortepianie. Byłem zaskoczony, jak dobrze ta biblioteka mogła faktycznie działać i zagrać prawie każdą nutę na fortepianie, użyłem tego samego, aby zagrać nuty fortepianu Pirates of Caribbean, Crazy Frog, Mario, a nawet Titanic i brzmiały niesamowicie. Ups! Stajemy się trochę poza tematem, więc jeśli jesteś tym zainteresowany, sprawdź odtwarzanie melodii za pomocą projektu Arduino. Znajdziesz również więcej wyjaśnień na temat biblioteki pitches.h w tym projekcie.
Nasz projekt ma tylko 8 przycisków, więc każdy przycisk może zagrać tylko jedną konkretną nutę, a więc w sumie możemy zagrać tylko 8 nut. Wybrałem najczęściej używane nuty na fortepianie, ale czy możesz wybrać dowolne 8 lub nawet rozszerzyć projekt o więcej przycisków i dodać więcej nut.
Nuty wybrane w tym projekcie to nuty C4, D4, E4, F4, G4, A4, B4 i C5, które można zagrać odpowiednio za pomocą przycisków od 1 do 8.
Programowanie Arduino:
Dość teorii, przejdźmy do przyjemnej części programowania Arduino. Kompletny Arduino Program jest podany na końcu tej strony można zeskoczyć jeśli chętny lub czytać dalej, aby zrozumieć, jak działa kod.
W naszym programie Arduino musimy odczytać napięcie analogowe z pinu A0, następnie przewidzieć, który przycisk został naciśnięty i odtworzyć odpowiedni dźwięk dla tego przycisku. Robiąc to, powinniśmy również zarejestrować, który przycisk użytkownik nacisnął i jak długo naciskał, abyśmy mogli później odtworzyć ton, który był grany przez użytkownika.
Przed przejściem do części logicznej musimy zadeklarować, które 8 nut będziemy grać. Odpowiednia częstotliwość nut jest następnie pobierana z biblioteki pitches.h, a następnie tworzona jest tablica, jak pokazano poniżej. Tutaj częstotliwość odtwarzania nuty C4 wynosi 262 i tak dalej.
int notes = {262, 294, 330, 349, 392, 440, 494, 523}; // Ustaw częstotliwość dla C4, D4, E4, F4, G4, A4, B4,
Następnie musimy wspomnieć, do których pinów jest podłączony wyświetlacz LCD. Jeśli wykonujesz dokładnie te same schematy podane powyżej, nie musisz tutaj niczego zmieniać.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Piny, do których podłączony jest LCD LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Następnie, w ramach naszej funkcji konfiguracji , po prostu inicjalizujemy moduł LCD i monitor szeregowy w celu debugowania. Wyświetlamy również wiadomość wprowadzającą, aby upewnić się, że wszystko działa zgodnie z planem. Następnie wewnątrz funkcji głównej pętli mamy dwie pętle while.
Jedna pętla while będzie wykonywana tak długo, jak przełącznik SPDT będzie dalej nagrywał. W trybie nagrywania użytkownik może zapłacić żądane tony, a jednocześnie odtwarzany dźwięk zostanie również zapisany. Więc pętla while wygląda jak poniżej
while (digitalRead (6) == 0) // Jeśli przełącznik jest ustawiony w trybie nagrywania {lcd.setCursor (0, 0); lcd.print ("Nagrywanie.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Jak pewnie zauważyłeś , w pętli while mamy dwie funkcje. Pierwsza funkcja Detect_button () służy do znalezienia przycisku, który użytkownik nacisnął, a druga funkcja Play_tone () jest używana do odtworzenia odpowiedniego tonu. Oprócz tej funkcji funkcja Detect_button () rejestruje również, który przycisk jest naciśnięty, a funkcja Play_tone () rejestruje, jak długo przycisk był wciśnięty.
Wewnątrz Detect_button () funkcji czytamy napięcie analogowe z pin A0 i porównać ją z pewnych ustalonych wartości, aby dowiedzieć się, który przycisk został naciśnięty. Wartość można określić, korzystając z powyższego kalkulatora dzielnika napięcia lub używając monitora szeregowego, aby sprawdzić, jaka wartość analogowa jest odczytywana dla każdego przycisku.
void Detect_button () { analogVal = analogRead (A0); // odczytaj analogowe napięcie na pinie A0 pev_button = przycisk; // zapamiętuje poprzedni przycisk wciśnięty przez użytkownika if (analogVal <550) button = 8; przycisk if (analogVal <500) = 7; przycisk if (analogVal <450) = 6; przycisk if (analogVal <400) = 5; przycisk if (analogVal <300) = 4; przycisk if (analogVal <250) = 3; przycisk if (analogVal <150) = 2; if (analogVal <100) przycisk = 1; przycisk if (analogVal> 1000) = 0; / **** Rcord wciśnięte przyciski w tablicy *** / if (przycisk! = pev_button && pev_button! = 0) { nagrany_button = pev_button; button_index ++; przycisk_zapisu = 0; button_index ++; } / ** Koniec programu nagrywania ** / }
Jak już powiedziano, w ramach tej funkcji rejestrujemy również sekwencję, w jakiej naciskane są przyciski. Zarejestrowane wartości są przechowywane w tablicy o nazwie przycisk zapisany. Najpierw sprawdzamy, czy jest wciśnięty nowy przycisk, jeśli jest wciśnięty to sprawdzamy również czy nie jest to przycisk 0. Gdzie przycisk 0 to nic, ale żaden przycisk nie jest wciśnięty. Wewnątrz pętli if przechowujemy wartość w lokalizacji indeksu podanej przez zmienną button_index, a następnie zwiększamy również tę wartość indeksu, aby nie nadpisywać w tym samym miejscu.
/ **** Rcord wciśnięte przyciski w tablicy *** / if (przycisk! = Pev_button && pev_button! = 0) { registered_button = pev_button; button_index ++; przycisk_zapisu = 0; button_index ++; } / ** Koniec programu nagrywania ** /
Wewnątrz Play_tone () funkcji zagramy odpowiedni ton naciśniętego przycisku przy użyciu wielu razie warunkach. Użyjemy również tablicy o nazwie nagrane_czas, w której zapiszemy czas, przez jaki przycisk został naciśnięty. Operacja jest podobna do nagrywania sekwencji przycisków, ponieważ używamy funkcji millis (), aby określić, jak długo każdy przycisk był wciśnięty, również w celu zmniejszenia rozmiaru zmiennej dzielimy wartość przez 10. Dla przycisku 0, co oznacza, że użytkownik nie jest naciskając cokolwiek nie gramy żadnego dźwięku przez ten sam czas. Pełny kod wewnątrz funkcji jest pokazany poniżej.
void Play_tone () { / **** Rcord opóźnienie czasowe między każdym naciśnięciem przycisku w tablicy *** / if (button! = pev_button) { lcd.clear (); // Następnie wyczyść note_time = (millis () - start_time) / 10; nagrany_czas = nuta_czas; time_index ++; start_time = millis (); } / ** Koniec programu nagrywania ** / if (przycisk == 0) { noTone (7); lcd.print ("0 -> Pauza.."); } if (przycisk == 1) { ton (7, notatki); lcd.print ("1 -> NOTE_C4"); } if (przycisk == 2) { ton (7, notatki); lcd.print ("2 -> NOTE_D4"); } if (przycisk == 3) { ton (7, notatki); lcd.print ("3 -> NOTE_E4"); } if (przycisk == 4) { ton (7, notatki); lcd.print ("4 -> NOTE_F4"); } if (przycisk == 5) { ton (7, notatki); lcd.print ("5 -> NOTE_G4"); } if (przycisk == 6) { ton (7, notatki); lcd.print ("6 -> NOTE_A4"); } if (przycisk == 7) { ton (7, notatki); lcd.print ("7 -> NOTE_B4"); } if (przycisk == 8) { ton (7, notatki); lcd.print ("8 -> NOTE_C5"); } }
Wreszcie po nagraniu użytkownik musi przełączyć DPST na inny kierunek, aby odtworzyć nagrany dźwięk. Kiedy to nastąpi przerwy programów z poprzedniego podczas pętli i wchodzi do drugiego podczas pętli, gdzie gramy nuty w sekwencji przycisków tłoczonych na okres, który został wcześniej nagrany. Kod umożliwiający to samo pokazano poniżej.
while (digitalRead (6) == 1) // Jeśli przełącznik jest ustawiony w trybie odtwarzania { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Teraz odtwarzane.."); for (int i = 0; i <sizeof (nagrany_przycisk) / 2; i ++) { opóźnienie ((nagrany_czas) * 10); // Czekaj przed zapłaceniem następnej melodii if ( registered_button == 0) noTone (7); // użytkownik nie może dotknąć dowolnego przycisku else ton (7, notatki - 1)]); // odtwórz dźwięk odpowiadający przyciskowi dotkniętemu przez użytkownika } } }
Odtwarzaj, nagrywaj, odtwarzaj i powtarzaj!:
Wykonaj sprzęt zgodnie z pokazanym schematem obwodu i prześlij kod na płytkę Arduino i pokazany czas. Ustaw SPDT w trybie nagrywania i zacznij odtwarzać wybrane tony, naciśnięcie każdego przycisku da inny dźwięk. W tym trybie na wyświetlaczu LCD zostanie wyświetlony komunikat „ Nagrywanie…”, aw drugiej linii pojawi się nazwa aktualnie naciskanej nuty, jak pokazano poniżej
Gdy zagrasz swój dźwięk, przełącz przełącznik SPDT na drugą stronę, a na wyświetlaczu LCD powinien pojawić się komunikat „ Now Playing..”, a następnie zacznij odtwarzać dźwięk, który właśnie zagrałeś. Ten sam dźwięk będzie odtwarzany wielokrotnie, o ile przełącznik jest utrzymywany w pozycji pokazanej na poniższym obrazku.
Pełne działanie projektu można obejrzeć na poniższym filmie. Mam nadzieję, że rozumiesz projekt i cieszysz się jego budowaniem. Jeśli masz jakiekolwiek problemy z budowaniem tego, napisz je w sekcji komentarzy lub skorzystaj z forum, aby uzyskać pomoc techniczną w swoim projekcie. Nie zapomnij również zapoznać się z filmem demonstracyjnym podanym poniżej.