Tym razem chciałem zwrócić uwagę na prostą możliwość generowania sygnałów dźwiękowych przez µC. W dodatku bez udziału dodatkowej zaawansowanej elektroniki, w postaci specjalizowanych układów scalonych czy też modułów. Jedynie niezbędne będą µC oraz głośnik małej mocy, no i oczywiście kawałek kodu.
Możliwość taką zawdzięczamy Bascom-owi i poleceniu Sound. Opis ten będzie po części prezentacją artykułu przedstawionego na witrynie MCS – Digital Melody Player.
W ten prosty sposób można sygnalizować w swoim projekcie różnymi tonami czy „melodiami” uczynnienie odmiennych funkcjonalności, działanie przycisków, wystąpienie różnych zdarzeń itp itd. Więc do dzieła 🙂 niech Bascom sound wyda.
Na uwagę zasługuje też fakt, że nie trzeba wcześniej przygotowywać próbek dźwięku, które były by niezbędne do odtwarzania i trzeba by je przechowywać w pamięci µC lub zewnętrznej dołączonej do układu. Ale każda instrukcja Bascom Sound użyta w kodzie generuje 30 bajtów binarki dla Bascom AVR.
W opisie instrukcji wyczytać można dwie uwagi:
- dla rezonatorów taktujących zegar µC z wysoką częstotliwością liczby określające czas trwania impulsów (duration) i ich ilość (pulses) muszą mieć wysoką wartość,
- instrukcja Sound przeznaczona jest do narobienia ociupinki hałasu, 😆 nie nadaje się do generowania precyzyjnych przebiegów.
Sprzęt.
Aby wszystko zagrało jak trzeba nie można zapomnieć o prawidłowym podłączeniu głośniczka do wybranego pinu µC. I tutaj przypomnieć można, że schemat zamieszczony przy opisie funkcji Bascom Sound jest najprostszym możliwym rozwiązaniem, niekoniecznie najlepszym.
Aby mieć możliwość wpływu na głośność odtwarzanych tonów (i dla świętego spokoju) najlepiej zastosować tranzystorek separujący pin µC, w roli wzmacniacza. Wynika to z faktu, że głośnik o małej impedancji np 8Ω przekroczy wielkość dopuszczalnego obciążenia portu wyjściowego. Pamiętać też trzeba, że głośnik jest obciążeniem indukcyjnym i w takim wypadku dodajemy diodę, jak przy cewce przekaźnika.
Schemat z kawałkiem fotki przedstawia podpatrzony sposób zabezpieczenia układu, którego obciążeniem jest, a właściwie był głośniczek. Ponieważ układ jest dawcą organów, to w chwili obecnej dużo interesujących podzespołów już z niego znikło … Dodatkowo uwagę zwraca osobne zasilanie dla części wykonawczej i sterującej. To pierwsze, domyślam się, że było wyższe. Dla nas istotne są tranzystor Q1, dioda D6 i kondensator C27 ze schematu. Moim zdaniem jest to wzorowy przykład na sterowanie głośnikiem. Jakby nie było jest to rozwiązanie komercyjne 🙂
Oprogramowanie dźwięków.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
'******************************************************************************* '* Description : DIGITAL MELODY PLAYER * '* Revision : 1.0 * '* Controller : ATMEGA8 * '* Compiler : BASCOM-AVR 1.11.8.7 DEMO * '* Author : Rubashka Vasiliy , Ukraine , 2007 * '* Web : HTTP://WWW.LEDEFFECTS.NET * '******************************************************************************* ' _______________ |*\_/*|________ ' | ___________ | ||_/-\_|______ | ' | | | | | | | | ' | | 0 0 | | | | 0 0 | | ' | | - | | | | - | | ' | | \___/ | | | | \___/ | | ' | |___ ___| | | |___________| | ' |_____|\_/|_____| |_______________| ' _|__|/ \|_|_.............._|________|_ ' / ********** \ / ********** \ ' / ************ \ / ************ \ ' - - - - - - - - - - - - - - - - - - - - - ' _______________________________________________________________ ' | |C||D| | |F||G||A| | |C||D| | |F||G||A| | |C||D| | |F||G||A| | \ ' | |1||1| | |1||1||1| | |2||2| | |2||2||2| | |3||3| | |3||3||3| | | ' | |#||#| | |#||#||#| | |#||#| | |#||#||#| | |#||#| | |#||#||#| | | ' | | | | | | | | | | | | | | | | | | | | | | | ' |C1|D1|E1|F1|G1|A1|H1|C2|D2|E2|F2|G2|A2|H2|C3|D3|E3|F3|G3|A3|H3| | ' |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__| | ' \__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\__\| ' '******************************************************************************* ' Conditional marking a writing the tunes compatible with telephones "Siemens" '******************************************************************************* ' ' ***** NUTA ***** ' ' A - La ' Ais(#) - La diez ' B(H) - Si ' С - Do ' Сis(#) - Do diez ' D - Re ' Dis(#) - Re diez ' E - Mi ' F - Fa ' Fis(#) - Fa diez ' G - Sol ' Gis(#) - Sol diez ' ' ***** OKTAWA ***** ' ' 1 - 1 octave ' 2 - 2 octave ' 3 - 3 octave ' ' ***** CZAS TRWANIA PRZERWY ***** ' ' P(1/1) - 2 s - Wait 2 ' P(1/2) - 1 s - Wait 1 ' P(1/4) - 0,5 s - Waitms 500 ' P(1/8) - 0,25 s - Waitms 250 ' P(1/16) - 0,125 s - Waitms 125 ' P(1/32) - 0,0625 s - Waitms 63 ' ' ***** CZAS TRWANIA DŹWIĘKU ***** ' ' (1/1) - 2 s ' (1/2) - 1 s ' (1/4) - 0,5 s ' (1/8) - 0,25 s ' (1/16) - 0,125 s ' (1/32) - 0,0625 s ' ' ***** FORMAT FUNKCJI SOUND ***** ' ' Sound Speaker , Pulses , Periods ' Speaker - port na którym mają być generowane tony ' Periods - częstotliwość tonu (1-65535) ' Pulses - czas trwania dźwięku (1-65535) ' ' Periods = Abc[F_crystal / (k * F_nota)] ' Pulses = Abc[(T_period * F_crystal) / (k * Periods)] ' ' F_crystal - częstotliwość zegara µC, Hz ' F_nota - częśtotliwość dźwięku, Hz ' k = 12 - ilość taktów, potrzebnych do wygenerowania jednego okresu dźwięku ' T_period - czas brzmienia tonu, w sekundach ' Abc - funkcja wycinająca część całkowitą ' '=============================================================================== ' Table wyliczonych wartości Pulses, Periods dla 3 oktaw przy rezonatorze 8000000 Hz '=============================================================================== 'Nuta|Freqvency|Periods|Pulses 1/1|Pulses 1/2|Pulses 1/4|Pulses 1/8|Pulses 1/16| '=============================================================================== ' C1 | 261,63 | 2548 | 523 | 262 | 131 | 65 | 33 | 'Cis1| 277,18 | 2405 | 554 | 277 | 139 | 69 | 35 | ' D1 | 293,66 | 2270 | 587 | 294 | 147 | 73 | 37 | 'Dis1| 311,13 | 2143 | 622 | 311 | 156 | 78 | 39 | ' E1 | 329,63 | 2022 | 659 | 330 | 165 | 82 | 41 | ' F1 | 349,23 | 1909 | 698 | 349 | 175 | 87 | 44 | 'Fis1| 369,99 | 1802 | 740 | 370 | 185 | 92 | 46 | ' G1 | 392,00 | 1701 | 784 | 392 | 196 | 98 | 49 | 'Gis1| 415,30 | 1605 | 831 | 415 | 208 | 104 | 52 | ' A1 | 440,00 | 1515 | 880 | 440 | 220 | 110 | 55 | 'Ais1| 466,16 | 1430 | 932 | 466 | 233 | 117 | 58 | ' B1 | 493,88 | 1350 | 988 | 494 | 247 | 124 | 62 | '=============================================================================== ' C2 | 523,25 | 1274 | 1047 | 523 | 262 | 131 | 65 | 'Cis2| 554,36 | 1203 | 1109 | 554 | 277 | 139 | 69 | ' D2 | 587,32 | 1135 | 1175 | 587 | 294 | 147 | 73 | 'Dis2| 622,26 | 1071 | 1245 | 622 | 311 | 156 | 78 | ' E2 | 659,26 | 1011 | 1319 | 659 | 330 | 165 | 82 | ' F2 | 698,46 | 954 | 1397 | 698 | 349 | 175 | 87 | 'Fis2| 739,98 | 901 | 1480 | 740 | 370 | 185 | 92 | ' G2 | 784,00 | 850 | 1568 | 784 | 392 | 196 | 98 | 'Gis2| 830,60 | 803 | 1661 | 831 | 415 | 208 | 104 | ' A2 | 880,00 | 758 | 1720 | 880 | 440 | 220 | 110 | 'Ais2| 932,32 | 715 | 1865 | 932 | 466 | 233 | 117 | ' B2 | 987,75 | 675 | 1976 | 988 | 494 | 247 | 124 | '=============================================================================== ' C3 | 1046,50 | 637 | 2093 | 1047 | 523 | 262 | 131 | 'Cis3| 1108,70 | 601 | 2218 | 1109 | 554 | 277 | 139 | ' D3 | 1174,60 | 566 | 2350 | 1175 | 587 | 294 | 147 | 'Dis3| 1244,50 | 536 | 2490 | 1245 | 622 | 311 | 156 | ' E3 | 1318,50 | 483 | 2638 | 1319 | 659 | 330 | 165 | ' F3 | 1396,90 | 477 | 2794 | 1397 | 698 | 349 | 175 | 'Fis3| 1480,00 | 450 | 2960 | 1480 | 740 | 370 | 185 | ' G3 | 1568,00 | 425 | 3136 | 1568 | 784 | 392 | 196 | 'Gis3| 1661,20 | 401 | 3322 | 1661 | 831 | 415 | 208 | ' A3 | 1720,00 | 388 | 3440 | 1720 | 880 | 440 | 220 | 'Ais3| 1864,60 | 358 | 3730 | 1865 | 932 | 466 | 233 | ' B3 | 1975,50 | 337 | 3952 | 1976 | 988 | 494 | 247 | '=============================================================================== |
Powyżej gotowa recepta z opublikowanego przykładu, dla obliczenia parametrów instrukcji Sound (Bascom AVR), z tabelą wyliczonych wartości dla rezonatora 8MHz. W przykładowym pliku autor opracowania zamieścił rozpiskę dla sporej ilości ciekawych melodii. Uważny czytelnik wypatrzy też zaprezentowane wzory na obliczenie parametrów dla dowolnego dźwięku, określonego skalą muzyczną nazywaną gamą.
Podobną funkcjonalność mamy w Bascom 8051. Tutaj również do dyspozycji jest polecenie Sound. Ponieważ ta wersja instrukcji nie jest odporna na przerwania, dodany został opcjonalny parametr blokujący wystąpienie przerwań na czas generowania impulsów przez instrukcję. Składnia: SOUND pin, duration, frequency [,NOINT]. Opracowano również nowszą wersję instrukcji SoundExt. Ta procedura w odróżnieniu od poprzedniej, po zakończeniu działania ustawia pin wyjściowy w stan wysoki, a przebieg generowany jest z wypełnieniem 50%. Trzeba pamiętać, że częstotliwość wyjściowa zależna jest od częstotliwości rezonatora kwarcowego. Generalnie zalecane jest by używać nowszej wersji polecenia generującego dźwięk.
Odmienny sposób – już bardziej wymagający, na generowanie dźwięków został przedstawiony na witrynie EvertDekker.com. Wymaga przygotowania próbek, które muszą być zapisane w pamięci EEPROM samego µC lub dołączonej. Tym sposobem stosunkowo niewielkim nakładem można zbudować na przykład układ gadający – odtwarzający ludzką mowę.
O ile rozwiązanie sprzętowe jest nieskomplikowane, o tyle sam program i sposób przygotowania dźwięków wymaga już pewnych nakładów pracy i wiedzy.