SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

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.

  1. iint STROBE_PIN = 4;
  2. int RESET_PIN = 2;
  3. int ANALOG_PIN = A0;
  4.  
  5. int bandValues[7];
  6. int bandNo;
  7.  
  8. char buf[4];
  9.  
  10. void setup()
  11. {
  12.   Serial.begin(115200);
  13.  
  14.   pinMode(RESET_PIN, OUTPUT);
  15.   pinMode(STROBE_PIN, OUTPUT);
  16.  
  17.   // RESET
  18.   digitalWrite(RESET_PIN, LOW);
  19.   digitalWrite(STROBE_PIN, HIGH);
  20. }
  21.  
  22. void readMSGEQ7()
  23. {
  24.   digitalWrite(RESET_PIN, HIGH);
  25.   digitalWrite(RESET_PIN, LOW);
  26.  
  27.   for (bandNo = 0; bandNo < 7; bandNo++)
  28.   {
  29.     digitalWrite(STROBE_PIN, LOW);
  30.     delayMicroseconds(30);
  31.     bandValues[bandNo] = analogRead(ANALOG_PIN);
  32.     digitalWrite(STROBE_PIN, HIGH);
  33.   }
  34. }
  35.  
  36. void loop()
  37. {
  38.   // pobieramy amplitudy
  39.   readMSGEQ7();
  40.  
  41.   // wyswietlamy kolejne zakresy
  42.   for (bandNo = 0; bandNo < 7; bandNo++)
  43.   {
  44.     sprintf(buf, "%4d", bandValues[bandNo]);
  45.     
  46.     Serial.print(buf);
  47.     Serial.print(" ");
  48.   }
  49.  
  50.   Serial.println();
  51. }

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:

  1. #include <Adafruit_NeoPixel.h>
  2.  
  3. int STROBE_PIN = 4;
  4. int RESET_PIN = 2;
  5. int ANALOG_PIN = A0;
  6. int WS2812_PIN = 7;
  7.  
  8. int bandValues[7];
  9. int bandNo;
  10.  
  11. char buf[4];
  12.  
  13. Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, WS2812_PIN, NEO_GRB + NEO_KHZ800);
  14.  
  15. void setup()
  16. {
  17.   Serial.begin(115200);
  18.  
  19.   strip.begin();
  20.   strip.show();
  21.  
  22.  
  23.   pinMode(RESET_PIN, OUTPUT);
  24.   pinMode(STROBE_PIN, OUTPUT);
  25.  
  26.   digitalWrite(RESET_PIN, LOW);
  27.   digitalWrite(STROBE_PIN, HIGH);
  28. }
  29.  
  30. void readMSGEQ7()
  31. {
  32.   digitalWrite(RESET_PIN, HIGH);
  33.   digitalWrite(RESET_PIN, LOW);
  34.  
  35.   for (bandNo = 0; bandNo < 7; bandNo++)
  36.   {
  37.     digitalWrite(STROBE_PIN, LOW);
  38.     delayMicroseconds(30);
  39.     bandValues[bandNo] = analogRead(ANALOG_PIN);
  40.     digitalWrite(STROBE_PIN, HIGH);
  41.   }
  42. }
  43.  
  44. void setBar(byte bandNo, int level)
  45. {
  46.    byte toY = map(level, 100, 900, 0, 8);
  47.    
  48.    for (int y = 0; y < toY; y++)
  49.    {
  50.       strip.setPixelColor((bandNo*8)+y, strip.Color(255, 0, 0));
  51.    }
  52. }
  53.  
  54. void drawBar()
  55. {
  56.   strip.show();
  57. }
  58.  
  59. void loop()
  60. {
  61.   readMSGEQ7();
  62.  
  63.   strip.clear();
  64.  
  65.   for (bandNo = 0; bandNo < 7; bandNo++)
  66.   {
  67.     setBar(bandNo, bandValues[bandNo]);
  68.   }
  69.  
  70.   drawBar();
  71. }

Materiał filmowy

Reklama

Komentarze Komentarze
Avatar 1
v-cu Windows 7 / Safari 537.36
02 July 2015 - 11:03 Katowice

Jak zrobić żeby było więcej częstotliwości? Aktualnie jest 7 a chce 10?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
06 July 2015 - 21:49 Bytom

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

Avatar 1
Szymks Android 4.4 / Safari 537.36
05 February 2016 - 10:59 Brak informacji

W jaki sposób mogę użyć FFT na arduino dla sygnału z mini-jack?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
09 February 2016 - 07:11 Bytom

A co już wiesz? :)

Avatar 1
Szymks Windows / Safari 537.36
12 February 2016 - 23:59 Kraków

Mierze napięcie na wyjściu jack za pomocą arduino i nie bardzo wiem jak przeprowadzić transformatę tego sygnału.

Avatar 1
Szymks Windows / Safari 537.36
13 February 2016 - 00:07 Kraków

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.

Avatar 1
Alferx Windows / Safari 537.36
12 April 2017 - 22:50 Warszawa

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.

Avatar 1
Hudi Windows 7 / Safari 537.36
10 July 2015 - 11:55 Brak informacji

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

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 July 2015 - 22:38 Bytom

Postaram się pomóc :) w czym jest problem?

Avatar 1
Hudi Windows 7 / Safari 537.36
26 July 2015 - 18:57 Lublin

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.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
28 July 2015 - 06:22 Bytom

Specjalnie dla Ciebie, powrócę do tego na YT :)

Avatar 1
AW Windows / Safari 537.36
13 August 2015 - 22:18 Brak informacji

czy chodzi ci o 16 słupków czy 7 bo ja osobiście staram się zrobić na 16 kanłów?

Avatar 1
Arkadiusz Wernicki Windows / Safari 537.36
09 March 2017 - 21:01 Brak informacji

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.

Avatar 1
Konrad Windows 7 / Mozilla Firefox 43.0
22 January 2016 - 10:13 Warszawa

Super projekt, fajna sprawa :)

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
22 January 2016 - 23:25 Bytom

Dzięki :)

Avatar 1
Piotr Windows / Safari 537.36
15 February 2016 - 10:50 Olsztyn

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?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
21 February 2016 - 23:18 Bytom

Tak, jest to możliwe - być może będzie potrzebny wzmacniacz jakiś

Avatar 1
Szymon Windows / Mozilla Firefox 44.0
17 February 2016 - 00:02 Brak informacji

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ć.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
21 February 2016 - 23:19 Bytom

R1 i R3 pełni rolę dzielnika napięcia dla sygnału wejściowego

Avatar 2
shoker Windows 7 / Safari 537.36
01 April 2016 - 18:38 Brak informacji

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

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
05 April 2016 - 06:55 Bytom

Masz odpowiednio ustawioną prędkość seriala i monitora?

Avatar 1
Maly008 Linux x86_64 / Safari 537.36
08 April 2016 - 22:25 Brak informacji

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

Avatar 1
Szymks Android 4.4 / Safari 537.36
21 May 2016 - 13:17 Kraków

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?

Avatar 1
szymko82 Windows / Mozilla Firefox 51.0
08 March 2017 - 15:24 Ruda Śląska

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?

Avatar 1
Bartek Windows / Safari 537.36
12 August 2016 - 17:50 Poznań

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?

Avatar 1
krzych Windows 7 / Safari 537.36
11 November 2017 - 09:58 Brak informacji

Mam ten sam problem cały czas zera
jak odłączę zasilanie to wtedy wychodzą kosmiczne cyfry

Avatar 1
Vbreak Android 5.0 / Mozilla Firefox 49.0
26 September 2016 - 01:02 Brak informacji

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

Avatar 1
Jarek Windows 7 / Safari 537.36
10 March 2017 - 14:22 Brak informacji

Czy mógłbyś pokazać schemat połączenia wszystkich elementów lub większe/wyraźniejsze zdjęcie?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 52.0
11 March 2017 - 22:21 Bytom

Przecież jest schemat :)

Avatar 1
Adam Windows / Safari 537.36
23 March 2017 - 17:39 Brak informacji

A czy mógłbym wiedzieć gdzie kupiłeś taki wyświetlacz??

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 52.0
24 March 2017 - 15:31 Bytom
Avatar 1
Alferx Windows / Safari 537.36
25 March 2017 - 08:35 Warszawa

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.

Avatar 1
AlferX Windows / Safari 537.36
04 April 2017 - 14:44 Brak informacji

W kwestii uzupełnienia mojej wcześniejszej wypowiedzi ciekawy materiał o zakupionych MSGEQ7

Avatar 1
kris Windows 7 / Safari 537.36
11 November 2017 - 18:58 Brak informacji

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ę

Avatar 1
Rafał Windows / Mozilla Firefox 55.0
01 September 2017 - 21:53 Poznań

czy wyjscie radia https://www.sparkfun.com/products/12938
można podłączyć do takich 2-ch equalizerów (left and right) ?

Avatar 1
kris Linux x86_64 / Safari 537.36
14 November 2017 - 22:23 Brak informacji

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?

Avatar 1
Jakub Windows 7 / Safari 537.36
16 December 2017 - 16:25 Brak informacji

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?