7-kanałowy equalizer MSGEQ7
Układ MSGEQ7 jest graficznym equalizerem, który dzieli spektrum dźwiękowe na siedem zakresów częstotliwości 63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz oraz 16kHz, udostępniając informację o amplitudzie każdej z nich. Zaletą tego układu jest brak konieczności stosowania dodatkowym filtrów, gdzie do działania wystarczy kilka rezystorów i kondensatorów. Układ może być zasilany napięciem z przedziału 2.7 ÷ 5.5V pobierając przy tym zaledwie 1mA. Całość sterowana jest dwoma sygnałami RESET oraz STROBE, którymi przełączamy multiplekser "wyrzucający" na pin DC Out wartość amplitudy kolejnego zakresu.
Wyprowadzenia układu i schemat aplikacyjny
Sterowanie układem
Sterownie MSGEQ7 jest bardzo proste, bowiem należy przed odczytem kolejnych wartości zakresów zresetować multiplekser podając na pin RESET stan wysoki, a następnie stan niski (aktywując tym samym linię sterującą STROBE). Każde kolejne przejście sygnału STROBE w stan niski, powoduje wystawienie określonego napięcia na linii DC OUT kolejnego zakresu częstotliwości, które to z kolei możemy odczytać analogowym wejściem w Arduino.
Przykładowy program
Na początek spróbujemy wyświetlić w monitorze szeregowym odczytane wartości dla poszczególnych zakresów częstotliwości, aby dowiedzieć się nieco więcej o wynikach. Najlepiej do tego celu wykorzystać generator przebiegu sinusoidalnego o określonej częstotliwości. Jednak jeśli nie posiadamy takiego generatora na stanie, z pełnym powodzeniem możemy wykorzystać dowolny program. Ja w tym celu skorzystałem z aplikacji PA Tone dla Androida, który pozwala nie tylko na wybór częstotliwości dźwięku, ale również formy jego przebiegu. Dla nas oczywiście odpowiednim wyborem będzie sinusoida.
- iint STROBE_PIN = 4;
- int RESET_PIN = 2;
- int ANALOG_PIN = A0;
- int bandValues[7];
- int bandNo;
- char buf[4];
- void setup()
- {
- Serial.begin(115200);
- pinMode(RESET_PIN, OUTPUT);
- pinMode(STROBE_PIN, OUTPUT);
- // RESET
- digitalWrite(RESET_PIN, LOW);
- digitalWrite(STROBE_PIN, HIGH);
- }
- void readMSGEQ7()
- {
- digitalWrite(RESET_PIN, HIGH);
- digitalWrite(RESET_PIN, LOW);
- for (bandNo = 0; bandNo < 7; bandNo++)
- {
- digitalWrite(STROBE_PIN, LOW);
- delayMicroseconds(30);
- bandValues[bandNo] = analogRead(ANALOG_PIN);
- digitalWrite(STROBE_PIN, HIGH);
- }
- }
- void loop()
- {
- // pobieramy amplitudy
- readMSGEQ7();
- // wyswietlamy kolejne zakresy
- for (bandNo = 0; bandNo < 7; bandNo++)
- {
- sprintf(buf, "%4d", bandValues[bandNo]);
- Serial.print(buf);
- Serial.print(" ");
- }
- Serial.println();
- }
Wynkiem działania powyższego programu jest wyświetlanie w monitorze szeregowym, wartości amplitud poszczególnych zakresów częstotliwości.
Przykładowy program z WS2812
Odczytane wartości poszczególnych amplitud, możemy połączyć ze sterowaniem matrycą diod WS2812, dając nam tym samym porządany efekt końcowy:
- #include <Adafruit_NeoPixel.h>
- int STROBE_PIN = 4;
- int RESET_PIN = 2;
- int ANALOG_PIN = A0;
- int WS2812_PIN = 7;
- int bandValues[7];
- int bandNo;
- char buf[4];
- Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, WS2812_PIN, NEO_GRB + NEO_KHZ800);
- void setup()
- {
- Serial.begin(115200);
- strip.begin();
- strip.show();
- pinMode(RESET_PIN, OUTPUT);
- pinMode(STROBE_PIN, OUTPUT);
- digitalWrite(RESET_PIN, LOW);
- digitalWrite(STROBE_PIN, HIGH);
- }
- void readMSGEQ7()
- {
- digitalWrite(RESET_PIN, HIGH);
- digitalWrite(RESET_PIN, LOW);
- for (bandNo = 0; bandNo < 7; bandNo++)
- {
- digitalWrite(STROBE_PIN, LOW);
- delayMicroseconds(30);
- bandValues[bandNo] = analogRead(ANALOG_PIN);
- digitalWrite(STROBE_PIN, HIGH);
- }
- }
- void setBar(byte bandNo, int level)
- {
- byte toY = map(level, 100, 900, 0, 8);
- for (int y = 0; y < toY; y++)
- {
- strip.setPixelColor((bandNo*8)+y, strip.Color(255, 0, 0));
- }
- }
- void drawBar()
- {
- strip.show();
- }
- void loop()
- {
- readMSGEQ7();
- strip.clear();
- for (bandNo = 0; bandNo < 7; bandNo++)
- {
- setBar(bandNo, bandValues[bandNo]);
- }
- drawBar();
- }
Materiał filmowy
Reklama
Komentarze
Jak zrobić żeby było więcej częstotliwości? Aktualnie jest 7 a chce 10?
Nie znam wyspecjalizowanego układu na 10 zakresów, ale można to osiągnąć programowo używając Fast Fourier Transformation (FFT). Na standardowej ATmedze wyciągniesz nawet 16 zakresów
W jaki sposób mogę użyć FFT na arduino dla sygnału z mini-jack?
Mierze napięcie na wyjściu jack za pomocą arduino i nie bardzo wiem jak przeprowadzić transformatę tego sygnału.
W tak zwanym międzyczasie zakupiłem MSGEQ7, zrobiłem wszystko tak jak na schemacie, jedyne co zmieniłem to:
sprintf(buf, "%4d", bandValues[bandNo]);
Serial.print(buf);
na:
Serial.print(bandValues[bandNo]);
ponieważ nie chciało mi wyświetlać poprawnie wartości na serial monitorze, teraz jest ok, tylko że wartości w chwili kiedy podaje sygnał "zerowy" lub obojętnie jaki inny sygnał o różnych częstotliwościach, dostaję takie wyniki:
472 473 472 473 474 472 473
487 485 486 487 488 486 487
467 467 467 467 467 467 466
481 481 482 483 483 483 483
462 462 463 463 463 463 463
478 478 479 479 479 479 478
457 457 456 457 456 457 457
476 474 475 476 476 477 475
455 455 455 455 455 455 455
473 474 475 474 473 476 475
454 454 453 452 452 452 453
469 469 470 471 471 471 471
450 450 451 452 452 451 451
466 465 466 467 466 466 466
I tak ciągle. Jaka może być przyczyna? Dodam, że użyłem kondensatorów 100nF i 10nF dla napięcia 100V, czy to ma jakieś znaczenie?
P.S. przepraszam, że w dwóch postach.
Aby zwiększyć liczbę zakresów należy zwielokrotnić liczbę układów i przesunąć środkową częstotliwość za pomocą układu RC (8 pin).
Najprościej jest podwoić liczbę kanałów do 14. Wtedy na drugim układzie dobieramy kondensator 66pF (najlepiej 2x33pF równolegle) wtedy częstotliwości drugiego układu wynoszą ok 40, 100, 250, 630, 1.6K, 4k, 6.3kHz.
Witam,
A gdyby tak zrobić coś takiego tylko na wyświetlaczu lcd?.
Była by mozliwość jakiejś pomocy z Pana strony?
np na 8x1 w postaci pasków.
cos tego typu
Postaram się pomóc :) w czym jest problem?
https://drive.google.com/file/d/0B_VdpZ2HaJETVkNGdW5kbGRBZ0k/view?usp=sharing
Tylko tyle zdołałem napisać nie mam pomysłu jak zrobic funkcje wysiwetlania odczytów na lcd.
Specjalnie dla Ciebie, powrócę do tego na YT :)
czy chodzi ci o 16 słupków czy 7 bo ja osobiście staram się zrobić na 16 kanłów?
W loop masz drobny kłopot:
digitalWrite(RESET_PIN, HIGH);
digitalWrite(RESET_PIN, LOW);
przy takiej kombinacji sygnał RESET będzie trwał dosłownie ultra krótką chwilę. Pomiędzy wstaw choćby delay(1)
Poza tym, po resecie również trzeba dać chwilkę na wystabilizowanie układu.
Super projekt, fajna sprawa :)
Witam,
bardzo fajny projekt, po przeczytaniu artykułu nasuwa mi się jedno pytanie, czy zastąpienie wejścia Jack przez mikrofon bardzo wpłynie ja jakość otrzymanego sygnału? Czy w ogóle jest to możliwe?
Tak, jest to możliwe - być może będzie potrzebny wzmacniacz jakiś
Mam pytanie o rolę R1 i R3 w układzie. Wszędzie na necie widzę, że na input jest tylko 10 nF, a Ty dałeś dodatkowo spore rezystory na każdy z kanałów zanim je zmostkowałeś. Zrobiłem układ wg. twojego schematu i mam tylko odpowiedzi na 6 i 7 bandzie. Reszta reaguje minimalnymi wzrostami i to sporadycznie.
Można bezpiecznie wyrzucić rezystory i zobaczyć co się stanie? Czy lepiej zrobić wtedy mono i tylko jeden kanał połączyć.
R1 i R3 pełni rolę dzielnika napięcia dla sygnału wejściowego
Witam.
Zrobiłem jak na schemacie ale monitor wyświetla mi " Z“H€HZ“H€HZ“H€HZ“H€HZ“H€HZ“H€HZ“H€HZ‘H€HZ‘HHZ‘HLZ‘HLZŃ‘HLZŃ" nie wiem czemu
Masz odpowiednio ustawioną prędkość seriala i monitora?
Podobnie jak koledze szymks mi rowniez wyswietla jedynie zblizone do siebie wartosci poszczegolnych czestotliwosci brak jakiej kolwiek reskcji na zmiane sygnalu co moze byc nie tak
Udało Ci sie coś z tym zrobić? Szukałem rozwiązania u różnych źródeł i nic nie znalazłem. Obawiam się że może to być wina układu scalonego. Ktoś jest nam w stanie pomóc? Jest jakiś sposób na przetestowanie działania tego układu?
Właśnie jestem na etapie składania projektu. Ciekawe czy u mnie będzie działać. Nie mam jeszcze kondensatora 10nf muszę kupić. Zastanawiam się dlaczego może nie działać. A gnd (jack) i gnd arduino są połączone?
Cześć,
podłączyłem wszystko tak jak na schemacie posiłkując się notą katalogową, ale chyba coś nie do końca mi działa. Na wyjściu cały czas otrzymuję 0 dla wszystkich kanałów. Docelowo chcę podłączyć mikrofon ze wzmacniaczem max9812, ale kiedy daję sygnał audio nie zmienia to wyniku. Nie znalazłem również rozwiązania mojego problemu w internecie? Masz może pomysł, co może być przyczyną takiego zachowania układu?
Mam ten sam problem cały czas zera
jak odłączę zasilanie to wtedy wychodzą kosmiczne cyfry
Cześć,
robię właśnie oświetlenie meblościanki z użyciem tego układu.
Przerobile już różne warianty z podłączeniem, łącznie z Twoim. Mam ciągle jeden problem. Jak testuję układ, tak jak Ty to robisz, to pierwsze trzy kanały i ostatni dochodzą do 900 przy odpowiednich częstotliwościach a 4,5,6 kanal nie dochodzą do 300. Czy to układ popsuty moze byc? Dzięki za wszelkie sugestie
Pozdrawiam
Tomek
Czy mógłbyś pokazać schemat połączenia wszystkich elementów lub większe/wyraźniejsze zdjęcie?
A czy mógłbym wiedzieć gdzie kupiłeś taki wyświetlacz??
spróbuj tu : http://elty.pl/pl/p/Matryca-RGB-LED-8x8-WS2812/1163
ew. na ebay
Również siadłem do tego projektu i podzielę się swym doświadczeniem.
MSGEQ7 kupowałem na aliexpressie i tu może być przyczyna problemów wielu osób. Kupiowałem 2x po 2szt. Po złożeniu układu i uruchomieniu na układach z pierwszego zakupu okazało się że jeden scalak pokazuje te same wartości dla wszystkich częstotliwości (jak już kilku osobom wcześniej) a drugi tylko wartość dla jednego pasma. Straciłem dużo czasu oby dojść co jest przyczyną. Elementy dobrałem już z prawie z 1% tolerancją, z płytki prototypowej przeniosłem się na drukowaną aby wyeliminować ew. problem styków i dalej nic. Kupiłem drugą parkę i układ zaczął działać, ale okazało się oba układy mają tylko 5 pasm 100, 300, 1k, 3k i 10k. ???? Powinien się chyba nazywać MSGEQ5 :) O dziwo wszystkie układy miały identyczne oznaczenia serii/partii. Dopiero za trzecim razem gdy zakupu dokonałem na ebay\'u (jest drożej) otrzymałem działające 7 pasmowe scalaki.
W kwestii uzupełnienia mojej wcześniejszej wypowiedzi ciekawy materiał o zakupionych MSGEQ7
Zmontowałem na płytce stykowej dwa razy. 2 godziny śledzenia przewodów itd i nic ale w końcu udało się.
na 7 układów 1- 100% sprawny a drugi pokazuje 6 kanałów a reszta 5 sztuk nawet nie reaguje. Troszkę jaja sobie Chińczycy robią
ale działa najważniejsze udało się
czy wyjscie radia https://www.sparkfun.com/products/12938
można podłączyć do takich 2-ch equalizerów (left and right) ?
Zamierzam zastosowac dwa uklady jeden na prawy drugi na lewy kanal. Pytanie ktore mi sie nasuwa : czy wejscia STROBE i RESET dwoch układów poga byc podpiete pod dwa piny (zsumowane). A wyjscie OUT z kazdego ukladu osobno pod piny analogowe?
Czy możliwe by było przerobienie sygnału wystawianego na ekran ledowy na 5 sygnałów do pomp wodnych? Tak by zasymilować grającą fontanne?