Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Cześć chłopaki, To jest moja pierwsza instrukcja, mam nadzieję, że Ci się spodoba!!
Zasadniczo w tym projekcie użyłem komunikacji szeregowej między moim Arduino a laptopem, aby przesłać dane muzyczne z mojego laptopa do Arduino. I wykorzystanie TIMERÓW Arduino do odtwarzania danych jako sygnału PWM.
Chciałem nadmienić, że ten projekt nie jest dla początkujących!!!.
Właściwie ten projekt był jednym z najdłuższych, ponieważ musimy zrobić wiele rzeczy, aby to zadziałało.
UWAGA
Zrobiłem drugą część tej instrukcji, która jest o wiele łatwiejsza i wymaga minimalnych problemów do pracy
Link do drugiej części (najłatwiejszy).
Krok 1: Rzeczy, których potrzebujemy do tego projektu (wymagania)
1. Płytka Arduino (możemy użyć dowolnej płytki (328, 2560) tj. Mega, Uno, Mini itp., ale z określonymi różnymi pinami)
2. Komputer PC lub laptop z systemem Linux (użyłem Fedory 29) lub Live USB z systemem Linux
3. Deska do krojenia chleba lub płyta perforowana
4. Podłączanie przewodów
5. TC4420 (sterownik Mosfet lub coś takiego)
6. Power Mosfet (kanał N lub P, proszę odpowiednio podłączyć) (użyłem kanału N)
7. Głośnik lub transformator Flyback (Tak, dobrze to przeczytałeś!!)
8. Odpowiedni zasilacz (0-12 V) (użyłem własnego zasilacza ATX)
9. Radiator (uratowałem ze starego komputera)
10. Komputer z systemem Windows i pendrive.
Aby poznać szczegóły działania każdego komponentu i tego projektu, przeczytaj następny krok.
Zrobiłem drugą część tej instrukcji, która jest o wiele łatwiejsza i wymaga minimalnych problemów do pracy. Link do drugiej części (najłatwiejszy).
Krok 2: Zrozumienie zasady działania
Ach!! najdłuższa część instruktażu, czytanie i pisanie tej sekcji jest nudne.
Przede wszystkim musimy uzyskać przegląd, jak to naprawdę działa.
to, co tutaj robimy, polega na tym, że najpierw konwertujemy nasz utwór MP3 na plik WAV, a ten plik na plik nagłówkowy C za pomocą oprogramowania, które znajduje się w łączu. Ten kod C w rzeczywistości zawiera 8-bitowe (dlaczego 8-bitowe? Czytaj dalej) próbki danych, które musimy odtwarzać za pomocą naszego Arduino ze stałą szybkością lub prędkością, która jest określona zgodnie z naszą częstotliwością próbkowania.
Teoria sygnału audio.
Dla tych, którzy nie wiedzą, jaka jest częstotliwość próbkowania lub szybkość transmisji: -
Częstotliwość próbkowania jest zdefiniowana jako liczba sampli, które gramy w ciągu sekundy (zwykle mierzona w Hz lub KHz).
Aby dowiedzieć się więcej w szczegółach:-kliknij tutaj
Standardowe częstotliwości próbkowania to 44100 Hz (najlepsza jakość), 32000 Hz, 22050 Hz itp
co oznacza, że 44100 próbek jest używanych w ciągu sekundy, aby odpowiednio wygenerować falę.
tzn. każda próbka musi być odtwarzana w stałych odstępach czasu 1/44100=22,67 uS.
Następnie pojawia się głębia bitowa sygnału audio, która zwykle jest miarą tego, jak dokładnie dźwięk jest reprezentowany w cyfrowym audio. Im wyższa głębia bitowa, tym dokładniejszy dźwięk cyfrowy.
Ale z Arduino lub dowolnym innym mikrokontrolerem z zegarem 16Mhz pozwala nam używać nas tylko do 8-bitów. Wyjaśnię dlaczego.
Na stronie nr 102 w arkuszu danych 328p znajduje się wzór: - Arkusz danych
Nie będę wdawał się w szczegóły, dlaczego używam tej formuły.
częstotliwość sygnału = sygnał zegara / N x (1+TOP)
Sygnał zegara = 16 MHz (płyta Arduino)
N=preskaler (1 to wartość dla naszego projektu)
TOP=wartość od 0 do 2^16(Dla 16-bitowego licznika timera) (255=2^8 (8-bit) dla naszego projektu)
otrzymujemy wartość częstotliwości Signal = 62,5 kHz
Oznacza to, że częstotliwość fali nośnej zależy od głębokości bitowej.
Załóżmy, że jeśli użyjemy wartości TOP = 2^16=65536 (tj. głębia bitowa 16-bitowa)
wtedy otrzymujemy wartość częstotliwości Signal = 244 Hz (której nie możemy użyć)
OKK… Więc tyle teorii na temat działania sygnałów audio wystarczy, więc wróćmy do projektu.
Kod C wygenerowany dla utworu można skopiować do Arduino i odtworzyć, ale jesteśmy ograniczeni do 3-sekundowego odtwarzania dźwięku z częstotliwością próbkowania 8000 Hz. Ponieważ ten kod C jest plikiem tekstowym, a zatem nie jest skompresowany, a raczej zdekompresowany. I zajmuje zbyt dużo miejsca. (np. plik kodu C z 43-sekundowym dźwiękiem z próbkami 44, 1 KHz zajmuje do 23 MB). A nasz Arduino Mega daje nam przestrzeń około 256 Kb.
A więc jak będziemy odtwarzać utwory za pomocą Arduino. To nie jest możliwe. Ta instrukcja jest fałszywa. Nie martw się czytelników, Dlatego musimy wykorzystać jakiś rodzaj komunikacji między Arduino z baaardzo dużymi prędkościami (do 1 Mb/s), aby przesłać dane audio do Arduino.
Ale ile dokładnie prędkości potrzebujemy, aby to zrobić?
Odpowiedź to 44000 bajtów na sekundę, co oznacza prędkość ponad 44000*8=325 000 bitów/s.
Potrzebujemy innego urządzenia peryferyjnego z dużą pamięcią, aby przesłać te dane do naszego Arduino. I to będzie nasz komputer z Linuksem (dlaczego komputer z Linuksem??? czytaj dalej, aby dowiedzieć się więcej na ten temat.)
Ahaa… Oznacza to, że możemy używać komunikacji szeregowej… Ale czekaj… Serial jest możliwy przy prędkościach do 115200 bitów/s, co oznacza (325000/115200=3), że jest trzy razy wolniejsze niż wymagane.
Nie, moi przyjaciele, nie jest. Użyjemy prędkości lub szybkości transmisji 500 000 bitów/s z kablem o długości do 20-30 cm, czyli 1,5 raza szybciej niż jest to wymagane.
Dlaczego Linux, a nie Windows ???
Tak więc musimy wysyłać próbki w odstępach (również określonych powyżej) 1/44100=22,67 uS z naszym komputerem.
Jak więc możemy to zaprogramować?
Możemy użyć C++ do wysłania bajtu danych przez Serial w odstępach czasu za pomocą jakiejś funkcji uśpienia
jak nanosleep, Chrono itp., itd….
for(int x=0;x
sendData(x);
nanosen (22000);// 22uS
}
ALE NIE, TO NIE DZIAŁA W WINDOWS również nie działało w ten sposób na Linuksie (ale znalazłem inny sposób, który możesz zobaczyć w załączonym kodzie).
Ponieważ nie możemy osiągnąć takiej szczegółowości za pomocą okien. Aby osiągnąć taką szczegółowość, potrzebujesz Linuksa.
Problemy, które znalazłem nawet z Linuksem…
możemy osiągnąć taką szczegółowość przy użyciu Linuksa, ale nie znalazłem takiej funkcji, aby uśpić mój program dla 22uS.
Funkcje takie jak nanosleep, Chrono nanosleep itp. również nie działają, ponieważ zapewniają sen tylko powyżej 100 uS. Ale potrzebowałem dokładnie, dokładnie 22 uS. Przeszukałem każdą stronę w Google i eksperymentowałem ze wszystkimi możliwymi funkcjami dostępnymi w C/C++, ale nic nie działało dla mnie. Potem wymyśliłem własną funkcję, która okazała się dla mnie prawdziwym urokiem.
A mój kod zapewnia teraz dokładny, precyzyjny stan uśpienia 1uS lub więcej !!!
Więc omówiliśmy trudną część, a reszta jest łatwa…
I chcemy wygenerować sygnał PWM za pomocą Arduino o określonej częstotliwości, również częstotliwości fali nośnej. (62,5 KHz (jak obliczono powyżej) dla dobrej odporności sygnału).
Tak więc do tworzenia PWM musimy użyć tak zwanych TIMERÓW Arduino. Nawiasem mówiąc, nie będę się za bardzo rozpisywał, ponieważ znajdziesz wiele samouczków na temat TIMERÓW, ale jeśli ich nie znajdziesz, to komentarz poniżej zrobię jeden.
Użyłem sterownika Mosfet TC4420, aby uratować nasze piny Arduino, ponieważ czasami nie mogą dostarczyć tak dużego prądu do napędzania tranzystora MOSFET.
To była prawie teoria tego projektu, teraz możemy zobaczyć schemat obwodu.
UWAGA UWAGA UWAGA
Właściwie ten projekt został celowo bardzo trudny (powiem dlaczego), jest inna metoda, która wymaga noPC tylko Arduino i głośnika w moim nextinstructable. Link jest tutaj.
*Głównym celem tego projektu jest wykorzystanie komunikacji szeregowej i poznanie jej mocy oraz nauczenie się, jak możemy zaprogramować nasz komputer tak, aby wykonywał zadania dokładnie w tak precyzyjnych odstępach czasu.*
Krok 3: Schemat
Połącz wszystkie komponenty, jak pokazano na schemacie. Masz tutaj dwie opcje:-
1. Podłącz głośnik (podłączony do 5 V)
2. Podłącz transformator Flyback (podłączony do 12 V)
Próbowałem obu. I oba działają całkiem dobrze.
Zastrzeżenie:-
*Polecam używanie transformatora Flyback z ostrożnością, ponieważ może to być niebezpieczne, ponieważ wytwarza wysokie napięcia. I nie ponoszę odpowiedzialności za żadne szkody.*
Krok 4: Konwertuj plik MP3 na WAV za pomocą Audacity
Przede wszystkim pobierz oprogramowanie
1. Audacity, wyszukiwanie i pobieranie z Google
2. Aby przekonwertować plik WAV na kod C, pobierz aplikację okna o nazwie WAVToCode
Możesz dowiedzieć się, jak korzystać z oprogramowania WAVToCode z tego linku i pobrać je z tego linku.
Podam również szczegółowe instrukcje dotyczące korzystania z obu programów.
Zobacz zdjęcia połączone z tą instrukcją.
W tym kroku przekonwertujemy MP3 na Wav. (Postępuj zgodnie ze zdjęciami, szybkość projektu musi wynosić 44100Hz)
W następnym kroku skonwertujemy plik wav do kodu C.
Krok 5: WAV do kodu C
Śledź zdjęcia.
Zobacz ostatnie dwa zdjęcia, zmiany muszą być dokładnie takie same, Duże litery powinny być duże, a małe małe, W przeciwnym razie podczas kompilacji wystąpi błąd składni.
(Widać, że piosenka 1min 41s zajęła 23mb miejsca.)
Zmień nazwę i długość utworu odpowiednio na nazwę i czas trwania utworu.
I zapisz plik C Code.
Zrób to ze wszystkimi utworami, w które chcesz grać z Arduino
Krok 6: Utwórz plik końcowy i odpal swój Linux
Dodaj wszystkie przekonwertowane utwory do pliku podanego w tym łączu.
I śledź zdjęcia.
Wgraj kod do Arduino, który załączyłem.
Zapamiętaj nazwy plików C Code (np. lifestyle, dollar, weare), ponieważ musimy podać dokładnie te same nazwy w naszym kodzie z uwzględnieniem wielkości liter.
Na koniec odpal Fedora Live USB lub inny i zainstaluj kompilator gcc, a następnie korzystając z instrukcji kompilacji z folderu skompiluj program i uruchom go.
Na koniec będziesz mógł posłuchać utworów z Speaker lub Flyback.
Dziękujemy za przeczytanie tej instrukcji i proszę o komentarz, jeśli Ci się spodoba.
UWAGA Uczyniłem drugą część tej instrukcji, która jest o wiele łatwiejsza i wymaga minimalnych problemów do pracy. Link do drugiej części (najłatwiejszy)