Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Analizator widma audio na Arduino

ghost666 07 Paź 2019 09:34 2874 19
  • Analizator widma audio na Arduino
    Ten mały i prosty do wykonania projekt opiera się na prostym pomyśle - reprezentowania danych spektralnych sygnału audio na 32-pasmowym analizatorze widma audio. Aby uprościć konstrukcję układu do prezentacji tego widma, zamiast stosowanych zazwyczaj słupków diod LED autor proponuje zastosowanie wyświetlacza LCD. W swoim projekcie używa on wyświetlacza 2 x 40 znaków (dwa rzędy po 40 znaków - kolumn). Pozwoli to znacznie uprościć całą konstrukcję, gdyż taki układ nie potrzebuje niemalże żadnych elementów dodatkowych. Wystarczy moduł Arduino Nano z dołączonym wyświetlaczem LCD. Na ilustracji poniżej widzimy dokładny schemat połączeń obud modułów i garstki potrzebnych elementów dyskretnych.


    Analizator widma audio na Arduino


    Do zestawienia projektu, prócz modułu Arduino Nano R3 oraz modułu wyświetlacza alfanumerycznego (2x40 lub 2x16 w wersji mini) porzebujemy następujących elementów:

    * Oporniki 100 kΩ - 4 sztuki
    * Opornik 22 kΩ - 1 sztuka
    * Oporniki 1 kΩ - 2 sztuki
    * Potencjometr 10 kΩ - 1 sztuka
    * Kondensatory 100 nF - 2 sztuki

    Oporniki służą w układzie do wygenerowania odpowiedniego poziomu napięcia odniesienia dla wbudowanego w układ konwertera analogowo-cyfrowego (ADC) i podniesienie sygnału wejściowego o odpowiedni offset, aby ADC w mikrokontrolerze mógł bez problemu digitalizować obie połówki sygnału. Sygnał filtrowany jest przez kondensatory 100 nF, aby usunąć z sygnału wejściowego ewentualną składową stałą (DC).

    Dodatkowy opornik i potencjometr służą do konfiguracji LCD - rezystor może być potrzebny do ustawienia prądu podświetlenia (sprawdź to w karcie katalogowej LCD!), a potencjometr służy do regulacji kontrastu wyświetlacza.

    Sygnał analogowy, po przefiltrowaniu i przesunięciu przez obwód wejściowy, podawany jest na piny 0 oraz 1.

    Kod programu, napisany w środowisku Arduino, prezentuje się w następujący sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po podłączeniu elementów do modułu Arduino zgodnie z schematem i wgraniu powyższego szkicu układu powinien od razu działać be potrzeby kalibracji czy uruchamiania układu.

    Źródło: https://create.arduino.cc/projecthub/178587/2-x-16-band-audio-spectrum-analyzer-with-lcd-f0a832?ref=platform&ref_id=424_trending___&offset=13

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    ghost666
    Tłumacz Redaktor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 napisał 9415 postów o ocenie 7062, pomógł 157 razy. Mieszka w mieście Warszawa. Jest z nami od 2003 roku.
  • PCBway
  • #2
    ArturAVS
    Moderator - Na Wesoło HydePark
    ghost666 napisał:
    autor proponuje zastosowanie wyświetlacza LED

    A gdzie tam LED? Toż to zwykły LCD HD44780.
  • #3
    ghost666
    Tłumacz Redaktor
    ArturAVS napisał:
    ghost666 napisał:
    autor proponuje zastosowanie wyświetlacza LED

    A gdzie tam LED? Toż to zwykły LCD HD44780.


    To akurat zwykła literówka, bo pół zdania wcześniej było, że nie LEDy właśnie tylko LCD. Poprawiłem, dzięki za uwagę.
  • #4
    ArturAVS
    Moderator - Na Wesoło HydePark
    O wiele lepiej OLED by się w takim analizatorze spisywał. Kiedyś chorowałem na VFD w analizatorze, LEDy nie bardzo mi się podobały. W końcu "zdobyłem" fabryczny EQ z analizatorem na VFD.
  • #5
    fotomh-s
    Poziom 21  
    OLED faktycznie bardziej by pasował. Do tego najlepiej graficzny (np. pod SPI).
    Ewentualnie można matrycę LED wsadzić.

    Ciekawie by było rozwinąć projekt. Dodać wskazania poziomu sygnału w formie peak oraz RMS, do tego można dodać wskaźnik dynamiki oraz panoramy stereo.
  • PCBway
  • #6
    szymon122
    Poziom 38  
    Skoro jest jeden kanał to nie rozumiem dlaczego są dwa wiersze.
    Poza tym użył wyświetlacz LCD 2x40 a używa tylko połowy.
    Projekt ciekawy, ponieważ jest prosty. Lecz takie arduino poza tym wyświetlaniem widma do niczego więcej się chyba nie nada, cała "moc" idzie na analizę dźwięku.
  • #7
    Tremolo
    Poziom 43  
    Najlepiej po jednym Arduino na jedno pasmo i żeby to jeden nadzorujący zbierał. Może nie pełne Arduino, a jakieś prostsze micro Arduino.
  • #8
    Piottr242
    Poziom 20  
    A mnie zastanawia, jak w tym projekcie jest realizowana w praktyce transformata Fouriera. Z tego co widzę, to jest wykorzystywana gotowa biblioteka.
  • #9
    khoam
    Poziom 34  
    Piottr242 napisał:
    Z tego co widzę, to jest wykorzystywana gotowa biblioteka

    Tak, stąd: https://github.com/kosme/arduinoFFT
    Zabawne jest to, że do obliczeń zmiennoprzecinkowych używany jest typ double, którego faktycznie nie ma w Uno czy Nano.

    Dodano po 15 [minuty]:

    Jeżeli już ktoś się upiera do wykonywania tego rodzaju obliczeń na poczciwym Uno czy Nano, z jeszcze bardziej poczciwym atmega328 to powinien raczej użyć biblioteki stałoprzecinkowej (np. FixedPointsArduino). Wtedy te obliczenia będą się szybciej wykonywały. Wydajność operacji na zmiennych float w arv-libc to masakra.
  • #10
    Janusz_kk
    Poziom 23  
    Akurat to jest jeden z tych przykładów gdzie 8 bitów to mało i aż się prosi o jakiegoś arm-a.
  • #11
    fotomh-s
    Poziom 21  
    khoam napisał:
    Zabawne jest to, że do obliczeń zmiennoprzecinkowych używany jest typ double, którego faktycznie nie ma w Uno czy Nano.

    A to nie jest tak że ta biblioteka jest uniwersalna, tzn. jak ktoś tam wsadzi ARMa to będzie wykorzystywał 64 floating point?
    Nie każdy kto programuje w Arduino IDE jest "krótkowidzem" i korzysta tylko z 8 bitowych AVRów...

    Swoją drogą to ARM by się przydał, większy "kop" to jedno, lepszy ADC to drugie.

    Cytat:
    Poza tym użył wyświetlacz LCD 2x40 a używa tylko połowy.

    Pewnie, jak to zwykle w amatorskiej elektronice bywa, zwyczajnie taki LCD miał pod ręką. Zmiana typu wyświetlacza to nie problem.
    A używa tylko połowy bo to zapewne albo ograniczenie biblioteki albo samego słabego AVRa.
  • #12
    khoam
    Poziom 34  
    fotomh-s napisał:
    A to nie jest tak że ta biblioteka jest uniwersalna

    Biblioteka może i jest "uniwersalna", ale z jej kodu źródłowego to nie wynika, a przynajmniej nie z pliku defs.h:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Poza tym odnosiłem się do projektu w poście #1, jako całości.

    Dodano po 2 [minuty]:

    fotomh-s napisał:
    Swoją drogą to ARM by się przydał, większy "kop" to jedno, lepszy ADC to drugie.

    Wystarczyłby ESP8266 ;) W końcu to nie jest tak naprawdę analizator widma, ale prosta wizualizacja.
  • #13
    Korteks
    Poziom 9  
    ghost666 napisał:
    reprezentowania danych spektralnych sygnału audio na 32-pasmowym analizatorze widma audio.

    32 pasma i dwa kanały z ADC 10kHz? To jaką max częstotliwość pokazuje ten analizator? 2,5kHz?

    Dodano po 8 [minuty]:

    W kodzie znalazłem
    Kod: c
    Zaloguj się, aby zobaczyć kod

    co oznacza taktowanie adc 250kHz. Z tego wynika samplowanie 20kHz oczywiście tylko jedno wejście jest używane.
  • #14
    RaStro
    Poziom 13  
    fotomh-s napisał:
    khoam napisał:
    Zabawne jest to, że do obliczeń zmiennoprzecinkowych używany jest typ double, którego faktycznie nie ma w Uno czy Nano.

    A to nie jest tak że ta biblioteka jest uniwersalna, tzn. jak ktoś tam wsadzi ARMa to będzie wykorzystywał 64 floating point?
    Nie każdy kto programuje w Arduino IDE jest "krótkowidzem" i korzysta tylko z 8 bitowych AVRów...


    Już kolega khoam napisał, ale biblioteka wygląda na projektowaną dla AVRa. Druga sprawa, to natywna obsługa double (64-bit) przez FPU jest w ARMach CORTEX-M7, CORTEX-M4 natywnie obsługuje tylko float (32-bit).
  • #15
    khoam
    Poziom 34  
    RaStro napisał:
    Druga sprawa, to natywna obsługa double (64-bit) przez FPU jest w ARMach CORTEX-M7, CORTEX-M4 natywnie obsługuje tylko float (32-bit).

    W ESP32 jest również natywny 64-bitowy typ double.
  • #17
    khoam
    Poziom 34  
    dktr napisał:
    jakiś czas temu poskładałem sobie taki analizator spektrum na Mega328

    A co tam jest po prawej od atmegi? Jakiś ADC może?
  • #18
    dktr
    Poziom 20  
    khoam napisał:
    dktr napisał:
    jakiś czas temu poskładałem sobie taki analizator spektrum na Mega328

    A co tam jest po prawej od atmegi? Jakiś ADC może?


    Nie, to tylko TL072 ;)
  • #19
    Korteks
    Poziom 9  
    Nie mogę wywnioskować jakie częstotliwości pokazują poszczególne słupki.
    Zastanawia mnie też to, ze kilka razy w kodzie widzę
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a zakres nie przekracza bajtu. Dlaczego użyty jest typ int zamiast uint8_t ? W ARM może to mieć sens bo int = int32_t i wykona się szybciej niż uint8_t ale w AVR?
  • #20
    khoam
    Poziom 34  
    Korteks napisał:
    Dlaczego użyty jest typ int zamiast uint8_t ?

    Tak pewnie nauczają w książkach do nauki C, tych dla początkujących, ale to i tak lepiej niż nagminne stosowanie specyfikatora auto.

    Gdyby ten program był pisany przez programistę C++, to zamiast:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    byłoby np. napisane:
    Kod: c
    Zaloguj się, aby zobaczyć kod