logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Czy przesyłanie dźwięku przez RS232 z Atmega644 będzie słyszalne?

mateuszrjzr 18 Lip 2013 23:25 6069 35
  • #1 12537422
    mateuszrjzr
    Poziom 17  
    Witam
    Chodzi mi po głowie taki czysto edukacyjny projekt przesyłania dźwięku przez rs na razie przewodowo, tj: najpierw ADC w atmedze644 samplowanie z częstotliwością 28,8 kbajtów/s, wysyłanie przez rs z częstotliwością 230,4 kb/s, i przetwornik DAC na mostku rezystorowym.
    Moje zasadnicze pytanie brzmi, czy to co usłyszę na wyjściu będzie przypominać dźwięk czy szum. Nie chodzi mi tu o żadną jakość dźwięku, tylko o to, czy coś będzie słychać, bo jak tak, to się za to biorę.
  • #2 12537508
    dondu
    Moderator na urlopie...
    Witaj.

    Nie bardzo rozumiem o co Ci chodzi. Wszystko zależy od DAC na drabince rezystorowej jak rozumiem, ale nie piszesz żadnych szczegółów.

    Weź pierwszy z brzegu program do konwersji np, WavePad Sound Editor i przekonwertuj dźwięk do formatu wav z odpowiednimi parametrami i zobaczysz co osiągniesz. W załączniku przykład dla 22kHz mono 8bit.

    Tutaj więcej informacji i próbek: http://en.wikipedia.org/wiki/WAV
    i tutaj także: http://mikrokontrolery.blogspot.com/2011/04/ciekawe-projekty-dzwiek.html
    Załączniki:
  • #3 12537914
    BlueDraco
    Specjalista - Mikrokontrolery
    Zacznij od liczenia:
    28.8 kB/s przy transmisji UART to 288 kbit/s, a nie 230.

    żeby obsłużyć taki strumień danych trzeba oprogramować przerwanie timera, w którym odbieramy daną z ADC, wrzucamy ją do UART i startujemy następną konwersję. Po drodze mamy jakieś rozejście warunkowe - przy przemyślanym prograowaniu w C można się wyrobić, ale trzeba wiedzieć, co się robi.

    Pomyśl też o częstotliwości kwarcu odpowiedniej do tej szybkości transmisji i o wynikającej z niej wydajności procesora.
  • #4 12543610
    grabie2
    Poziom 11  
    BlueDraco napisał:
    Zacznij od liczenia:
    28.8 kB/s przy transmisji UART to 288 kbit/s, a nie 230.


    28.8 kB(kilo bajtów) to dokładnie 230.4 kbit(kilo bitów), kolega chyba zapomniał, że jeden bajt ma 8 bitów, nie 10 ;)

    Co do DAC na mostku rezystorowym:
    Na pewno coś usłyszysz, to jak bardzo będzie to przypominać zapisany dźwięk to już zależy głównie od rozdzielczości twojego DAC, ale również od jakości wykonania części analogowej urządzenia - wzmocnienie dla głośnika/słuchawek(chyba, że chcesz użyć zewnętrznego wzmacniacza - wtedy musisz dostosować impedancje wyjścia do parametrów wyjścia liniowego i odseparować układy np. tranzystorem na wyjściu z wzmocnieniem równym, lub bliskim 1 - brak wzmocnienia)
  • #5 12543627
    mateuszrjzr
    Poziom 17  
    Ma rację. Jeszcze dochodzi bit stopu i startu
  • #6 12543690
    grabie2
    Poziom 11  
    Ano fakt, mój błąd. Po ostatnim projekcie cały czas żyję w idealnym świecie SPI.

    Jeśli chodzi o DAC, to microchip ma bardzo fajne układy, nie mam teraz w głowie symboli, ale bez problemu można odnaleźć je na ich stronach. Sample zawsze terminowo po 2 tygodniach dochodzą.

    A odchodzi ból budowania przynajmniej 5 bitowego przetwornika(Przy mniejszej rozdzielczości wątpię by to co wyjdzie było rozpoznawalne).
  • #7 12546042
    mateuszrjzr
    Poziom 17  
    Właśniena rynku jest tyle DAC, że nie wiem, który wybrać. Może jakaś mała podpowiedź który wybrać?
  • #9 12549222
    mateuszrjzr
    Poziom 17  
    Wiecie co panowie, chyba najpierw jednak popisze jakieś prostsze programy, a potem będę się brał za takie delikatne sprawy. Niemniej dzięki wielkie za cierpliwość.
  • #10 12549503
    tmf
    VIP Zasłużony dla elektroda
    Akurat twój pomysł nie jest jakoś szczególnie trudny w realizacji. Jeśli użyjesz USART, to oczywiście problemu nie ma, tyle, że z drugiej strony powinien być procek, który zamieni dane z USART na sygnał analogowy - coś z DAC lub po prostu timerem, przy pomocy PWM odtworzysz sygnał analogowy. Z drugiej strony, można zamiast USART nadawać przebieg PWM, na drugim końcu wstawić bufor i filtr, który z tego PWM odtworzy przebieg analogowy. Z pewnością warto się pobawić, może być ciekawie.
    Tej drabinki rezystorowej bym nie demonizował, kiedyś PCy miały tzw. Covox, czyli właśnie drabinkę podłączoną do LPT, i dźwięki jakie wydawały istotnie przypominały dźwięki piekielne, ale nie było tak źle.
    Pytanie oczywiście o odległość?
  • #11 12550087
    mateuszrjzr
    Poziom 17  
    Wybrałem uart bo właśnie się nim bawiłem, a myślałem o bezprzewodowych głośnikach bo te w benq to pożal się boże... Jeśli będę to odtwarzał(chodzi o ten pierwszy pomysł, nie o przesyłanie) przy pomocy pwm, to chyba będą straszne zakłócenia, nie? Jeśli chodzi o DAC, to patrzyłem na taki konkretny, zaraz znajdę jego symbol, w każdym razie nie miał on vref i to mnie zdziwiło, ale jeszcze o tym poczytam.
  • #12 12550162
    grabie2
    Poziom 11  
    Hmmm, co do transmisji bzzzprzewodowej(ach te reklamy) to polecam układy z serii RFM12, obsługiwane po SPI. SPI od strony AVR obsługujesz prawie tak samo jak UART. Do ich obsługi producent dostarcza gotową bibliotekę.

    Co do DAC, to najprostszym rozwiązaniem jest PWM z mikrokontrolera i rezystor + kondensator. Pamiętam dobry artykuł o generowaniu sygnałów analogowych z AVR. Chyba autorstwa Dondu, ale nie mam teraz w głowie adresu tego bloga - jak znajdę to wyślę, pewnie za kilkanaście minut.

    Co do rozwiązań w postaci ukłądów scalonych to są dwa rozwiązania(znane mi):
    - potencjometry cyfrowe - możesz użyć takiego do wysterowania tranzystora bipolarnego, dalej dajesz wzmacniacz operacyjny, chyba, że chcesz zrobić wyjście liniowe(do podłączenia głośników komputerowych[mają wbudowany wzmacniacz], NIE słuchawek). Możesz porównać to do drabinki rezystorowej.
    - układy DAC, przeważnie wolniejsze od potencjometrów cyfrowych, na wyjściu masz od razu napięcie - mniej elementów zewnętrznych, ale zwykle mają znacznie mniejsze prądy niż rozwiązanie powyżej, przy czym zwykle masz większą precyzję.

    Do nauki polecam potencjometry cyfrowe np. microchipa, gdyż więcej nauczysz się jeśli chodzi o elektronikę analogową.

    //Edit: Oto ten artykuł: http://mikrokontrolery.blogspot.com/2011/03/avr-fast-pwm-sposob-na-dac.html Sam używałem podobnego rozwiązania w barierach, które były montowane bardzo blisko siebie i w dużej ilości - zakłócały się, żeby wyeliminować zakłócenia ;).
  • #13 12550282
    mateuszrjzr
    Poziom 17  
    Dokładnie o tym układzie myślałem, bo zostały mi po bracie, który robił to na studia (oczywiście nic już nie pamięta na ten temat). Jeśli będę wysyłał 8 bitowy bajt przez SPI to chyba nie będę musiał tworzyć bufora cyklicznego? Dużo z tym roboty i wiele wysiłku by to zaoszczędziło, bo ostatnio go używałem i... nie lubię go. Szkoda, że te potecjometry nie mają interfejsu równoległego, ale jak na razie wydaje mi sie, że to dobry pomysł. Popatrzę za nimi.
  • #14 12550308
    grabie2
    Poziom 11  
    Te układy wymagają trochę więcej obsługi niż wysłąnie bajtu, ale całą tą obsługę załatwia za ciebie biblioteka, w tym bufor cykliczny(jeśli dobrze pamiętam).

    Ale większość tych układów jest na 3.3V

    Na pączątek, spróbowałbym wypuścić sinusa z głośnika
  • #16 12550463
    dziechu
    Poziom 27  
    Kup płytkę STM32F4Discovery - masz tam super szybki 32 bitowy procesor taktowany 168MHz z profesjonalnym DAC CS43L22 i innymi peryferiami w tym szybkimi 12bit ADC i DAC, za 70 zł. (poszukaj na Alledrogo;). Do tego sciągasz darmowe kompletne środowisko programowania Coocox CoIDE. Jeżeli umiesz programować w C, to zrobisz z tego super cudo z najwyższą jakością dźwięku. Do płytki można sciągnąć ze strony producenta sporo przykładowych programów. Ja przeszedłem na ARM z 8śmio bitowców rok temu i nigdy do nich nie wrócę, bo ARMy są sporo szybsze, mają lepsze peryferia a kosztują tyle co procesory 8bit.
  • #17 12550993
    grabie2
    Poziom 11  
    Nie mogę się z kolegą nie zgodzić, ARMy są znacznie szybsze i lepiej wyposażone. Jednak uważam, że każdy "mikrokontrolerowiec" powinien mieć doświadczenia z bardziej ograniczonymi platformami 8-bit(chociaż 4 bitowy intel też był ciekawy :) )

    Z moich doświadczeń z różnymi "inżynierami" oprogramowania, czy elektroniki, ci którzy nie tworzyli pod "małe" platformy nie doceniali możliwości procesora, który dostają. A jak już brakuje im jakiś peryferiów(które bez problemu można zastąpić programowym rozwiązaniem) to słyszy się "panie to się nie da, trzeba większy procesor wrzucić".
    To tyle z mojego narzekania.

    Wracając do tematu...
    Sądzę, że w tym wypadku spokojnie AVR, w sumie wystarczył by jakiś attiny45, ale coby tak ciasno nie było(i sprzętowe SPI) to proponowana przez autora tematu atmega644 będzie aż za dobra.

    Co do DAC to zastosowałbym układ pokroju MCP4922(zewnętrzny Vref) lub MCP4822(Wewnętrzny Vref), są 12 bitowe, mają 2 przetworniki na pokładzie i wbudowany wzmacniacz na wyjściu każdego kanału, obsługiwane po SPI. Jeśli dobrze pamiętam(nie mam teraz datasheeta przed oczyma) to czas ustawienia napięcia wyjściowego wynosi maksymalnie koło 5 us.

    Pamiętaj też, że AVRy mają bardzo wolne przetworniki, zachowując rozdzielczość 10-bit możesz wyciągnąć(again, jeśli dobrze pamiętam) koło 9 ksampli/s, ale nie wiem czy nie głoszę herezji teraz, jak coś jest źle to pewnie ktoś mnie poprawi, ja wrócę dopiero na wieczór.

    Ale oczywiście rozwiązanie z ARM jest genialne, poza takim dorobnym szczegółem - to gigantyczny overkill

    Na początek zbudowałbym część końcową - DAC + część analogowa, w ten sposób już coś usłyszysz ;)
  • #18 12551089
    tmf
    VIP Zasłużony dla elektroda
    Zwykłe AVRy dla 10-bitowej rozdzielczośći mają ok. 15 ksps. Z drugiej strony zamiast iść w koszty i dodatkowe układy, jeśli przesyłanie PWM i prosty filtr nie pasują, to lepiej zastosować procek, który ma DAC. Może być to wspomniany ARM, może też być z AVRów, np. XMEGA, któa ma 12-bitowy ADC z 2 Msps, lub 1,4 Msps dla wersji C. Mają też dwa 2-kanałowe DAC. Do przesyłania radiowo RFM12 się nie nadaje - już w pierwszych postach kolega BlueDraco policzył jaką szybkość transmisji trzeba uzyskać - jest to zdecydowanie poza możliwościami RFM12. Z drugiej strony to stary układ, pierwszy z tej rodziny modułów, mający wiele niedociągnięć, poza sentymentem nie ma sensu już go stosować.
    Dla wymaganego pasma albo wchodzi w grę np. podwójny RFM22/63 lub coś na pasmo 2,4 GHz - np. RFM73, który o ile dobrze pamiętam ma max. szybkość wysyłania danych 2 Mb/s.
    Ale ponieważ autor dopiero startuje z MCU, więc zamiast komplikować warto zacząć od czegoś prostszego - odtworzenia pliku wav, czy nagraniu i odtworzeniu czegoś z ADC. Dopiero potem rozważałbym sposoby przesyłania tego na odległość.
  • #19 12551207
    dziechu
    Poziom 27  
    Cały problem w tym, że nadmiar mocy procesora nie jest problemem, można do zapalenia kilku LEDów użyć super szybkiego i nowoczesnego procesora, choć może to wydawać się zwykłym marnotrawstwem. Gorzej w drugą stronę - kiedy potrzeba dużej wydajności a jej nie mamy w danym procesorze - wtedy po prostu nic nie da się zrobić. Można oczywiście małe projekty robić na AVRach, duże na ARMach, ale ma to jedną zasadniczą wadę - wymaga instalacji i opanowania dwóch środowisk do programowania, posiadania dwóch typów programatorów itd... W firmach zajmujących się takimi sprawami to nie jest problem, ale dla amatorskich zastosowań to już niepotrzebne komplikacje. Przechodząc na ARM można nadal robić małe projekty, choćby na STM32F100C4 za 7 zł. ale i całkiem spore na STM32F103xx lub wspomniane STM32F407VG za 70 zł. Robiłem ostatnio projekt prostego wyświetlacza z 4 cyframi LED i dwoma przyciskami + i - z komunikacją I2C - taki moduł do panelu sterowniczego gdzie potrzeba takich modułów 12 do ustawienia 12 parametrów. Przedtem robiłem dla nich inne projekty na STM32F100RB i STM32F103ZE. Zaproponowałem im dla tego modułu procesor, jakiś ATTINY lub - z wielkim zapasem, ale tani i powszechny ATMEGA8, a oni na to - ale po co? mamy zapas STM32F100RB, poza tym cena jak ATTINY czy MEGA8, a będziemy używać jednego programatora do wszystkiego... no i mają rację, moduł będzie na STM32F100RB z wykorzystaniem 0,1% jego możliwości:)
  • #20 12551681
    mateuszrjzr
    Poziom 17  
    Ale trochę się tutaj rozchodzimy z moimi założeniami. Może nie dopiero co zaczynam z prockami, ale jakimś tam prosem nie jestem. Mam kupiony niedawno zestaw Atnela z megą 644. Owszem chciałbym go obsługiwać przez SPI, ale jeśli mówimy o 10 bitach to chyba tylko programowe, bo sprzętowe jest 8mio. Mogę się mylić, ale jak nie, to wolałbym coś 8mio.

    Dzięki za zainteresowanie, pewnie w przyszłości będę bardziej dbał o jakość dźwięku i wgl, ale to zostawie na kiedy indziej.
  • #21 12551741
    dziechu
    Poziom 27  
    To że procesor jest 8śmio bitowy, nie znaczy że nie posiada rejestrów 16 bitowych lub par H i L. Posiada np. liczniki/timery 16 bit, ADC 10 (ale może być i 12 lub 16bit) itd. Przetwornik ADC jest 10 bitowy sprzętowo (nie wiem jak miałby być programowo:). Procesory 8 bit mają najczęściej większość rejestrów 8 bit, wykonują większość operacji na 8 bitach (ale niektóre mogą na 16), mają porty IO 8 bit.

    Dodano po 11 [minuty]:

    A co do procesorów ARM - jeżeli piszesz w C, to różnica jest niewielka, nie są wcale trudniejsze w oprogramowaniu (a czasem łatwiejsze). Masz porty 16bit co często ułatwia pewne sprawy, bo w przy 8 czasem musisz programowo łączyć dwa w pary. Ogólnie peryferia są podobne jak w AVRach, wszystko jest w dokumentacji i jednych i drugich. Kup sobie płytkę np. STM32F100VLDiscovery (jest tania). Na płytce masz procesor STM32F100RB z podstawowymi peryferiami(kwarce, LEDy, przyciski) oraz drugi procesorek będący programatorem. Podłączasz tylko kabelkiem USB i już - mając odpowiednie oprogramowanie - piszesz i programujesz procesorek. Instalując tego Coocox CoIDE (darmowy) - Coocox sam Ci wygeneruje po wybraniu typu procesora plik startowy konfigurujący podstawowe rzeczy jak zegar, stos itp. Możesz zacząć od najprostszych rzeczy jak skonfigurowanie portu IO i zamiganie LEDem:) Wygląda to całkiem podobnie jak w AVR. Piszesz pod Coocoxem i od razu z niego programujesz i uruchamiasz płytkę. Ze sprzętu potrzebujesz jedynie tą płytkę i kabelek USB. Jak zaczynasz to od razu od ARM32 bit, szkoda czasu na 8 bit, bo wcześniej czy później i tak przejdziesz a przyzwyczajenia z 8bit będą Ci tylko przeszkadzały.

    Dodano po 11 [minuty]:

    Na allegro nie ma, ale są w Elfie, choć po 40 zł. Na allegro były po 35.
  • #22 12551952
    tmf
    VIP Zasłużony dla elektroda
    dziechu: to jeszcze wyjaśnij w jaki sposób twoje dwa ostatnie posty przybliżyły autora do rozwiązania problemu. Gość ma podstawowe problemy, jak napisać prosty program, a ty mu proponuijhesz inwestycje w kolejne płytki, przy czym problem podstawowy zostaje ten sam.

    mateuszrjzr: sprecyzuj o co ci chodzi. Bo tego już chyba nikt nie wie. Jak pisałem, odpal ADC, coś zsampluj i tyle. Albo przerów wava na PCM, spróbuj to odtworzyć przy pomocy PWM, będziesz wiedział, czy jakość jest akceptowalna i przede wszystkim coś posuniesz w temacie. Mamy już 22 posty, masz kilka rozwiązań, więc albo bierz się do roboty i ich sprawdzania, albo napisz konkretnie o co ci chodzi i przede wszystkim w czym masz problem.
  • #23 12552283
    dziechu
    Poziom 27  
    To tak ogólnie:) Aby rozwiązać ten i podobne inne problemy w przyszłości. Rozważane tu były zbyt wolne transmisje, zbyt wolne lub brak DAC itp. Z 12to bitowym DAC w proponowanym układzie zrobi to lepiej niż jakimiś drabinkami rezystorowymi itp. A nawet PWM znacznie szybszy też sobie z tym poradzi.

    Dodano po 3 [minuty]:

    P.S. Mnie też tu kiedyś długo przekonywali, teraz tylko żałuję że nie zrobiłem tego znacznie wcześniej:)
  • #24 12552742
    mateuszrjzr
    Poziom 17  
    Wiem, że mega 644 jest 8mio bitowa, takim tłokiem nie jestem żeby tego nie wiedzieć :P. Chodzi mi o to, że sprzętowe SPI atmegi jest 8mio bitowe. Już wstępnie wiem jak co robić, tylko przydałby się jakiś 8mio bitowy potencjometr cyfrowy. Podesłałem jeden i wydaje mi się, że jest ok, tylko właśnie jeszcze czekam na jego akceptacje. http://www.tme.eu/pl/details/mcp41010-i_p/potencjometry-cyfrowe/microchip-technology/#



    Czyli po kolei:
    1. 8mio bitowy adc z megi (odcinam 2 najmniej znaczące bity)
    2. Wysyłanie przez SPI do innej megi (albo od razu do potencjometru)
    3. odtwarzanie przez potencjometr sygnału (utworzenie dzielnika napięcia)
    4. wzmacniacz operacyjny (na razie jakiś lm358)
    5. słuchawki

    mam nadzieję że coś usłyszę...
  • #25 12552758
    BlueDraco
    Specjalista - Mikrokontrolery
    Potencjometr się nie przyda, przyda się przetwornik cyfrowo-analogowy.

    Taki przetwornik znajdziesz np. w mikrokontrolerze umieszczonym na płytce STM32F0DISCOVERY, że do znudzenia powtórzę... Timer i UART zresztą też, w dodatku jak się uprzesz, to bez żadnych dodatkowych układów możesz ten UART przypiąć do RS232 w komputerze, tylko jeden rezystor będzie Ci potrzebny.
  • #26 12552789
    tmf
    VIP Zasłużony dla elektroda
    Z potencjopmetrem cyfrowym będzie trudno. On rozpoczyna przetwarzanie w momencie otrzymania danych. A to znaczy, że dane muszą trafić do niego w ściśle określonym momencie, a odstęp pomiędzy tymi momentami tez musi być ściśle określony (twój samplerate). Ponieważ transmisja SPI jest wyzwalana w chwili wpisania danej do rejestru danych SPI, ciężko o synchronizację. A każdy błąd będzie słychać. Moim zdaniem to zła droga. Na początek spróbuj timera w trybie PWM + filtr i z tego generuj przebieg. Ten potencjometr ma zaledwie 8-bitową rozdzielczość, PWM możesz użyć np. 10-bitowy. Jeśli cię PWM nie usatysfakcjonuje to kup procka z DACem, albo DAC zewnętrzny.
  • #27 12615075
    mateuszrjzr
    Poziom 17  
    witam
    Zacząłem rozglądać się za transciverem do mojego projektu, i uznałem, że dobrym pomysłem będzie tutaj rfm22. Niby wszystko ok, z wysyłaniem danych nie powinienem mieć problemu, ale inicjalizacja tego modułu mnie przeraża. Mnóstwo obliczeń, nieznanych pojęć i wgl... Szukałem więc gotowych bibliotek i znalazłem tą: https://github.com/hberg539/rfm23-lib . Przyglądnąłem się jej i nie ma tam nigdzie ustawiania rejestrów w tym module. Czy to już jest zrobione fabrycznie? Od razu mówię, że przejrzałem datasheeta jak najlepiej umiałem.
  • #28 12615166
    tmf
    VIP Zasłużony dla elektroda
    Zmartwię cię na początek - musisz poszukać innego modułu. RFM22/23 nie ma wystarczająco dużej szybkości transferu danych do twoich celów. Rozglądnij się raczej za RFM73.
  • #29 12615273
    Pawel2420
    Poziom 31  
    Do bezprzewodowego przesyłania dźwięku bardzo często stosuje się moduły Bluetooth. Te do zastosowań multimedialnych mają wbudowany ADC i DAC. Można też kupić gotowe głośniki i słuchawki Bluetooth.
  • #30 12615413
    mateuszrjzr
    Poziom 17  
    "Można też kupić gotowe głośniki i słuchawki Bluetooth."- to raczej taka średnia porada :D. Co do rfm22- ma on do 256kb/s, to chyba powinno wystarczyć, nie?
REKLAMA