vyzváňacie tóny Atmega8. Jednoduché zvukové sirény na MK AVR. Pomocou zvukového modulu

Článok popisuje princípy syntézy hudby na AVR. Dodávaný softvér vám umožňuje previesť akýkoľvek midi súbor do zdroj v jazyku C pre mikrokontroléry AVR na pridanie prehrávania hudobných fragmentov do pripravených vývojov. Uvažuje sa o príklade použitia softvéru v hudobnom boxe.

Najprv krátke video, ako to celé funguje:

Čo softvér umožňuje

PC softvér vám umožňuje získať C zdroj pre CodeVision AVR, ktorý prehráva vybraný midi súbor:

1. Pripojte common\hxMidiPlayer.h, common\hxMidiPlayer.c k svojmu projektu. Skopírujte šablóny ATMega8Example\melody.h, ATMega8Example\melody.c, ATMega8Example\hxMidiPlayer_config.ha pripojte sa.
2. Spustite MidiToC.exe
3. Načítajte súbor Midi.
4. Nastavte prehrávač: vzorkovaciu frekvenciu, počet kanálov, priebeh atď. Softvér prehrá melódiu rovnakým spôsobom, ako bude hrať AVR.
5. Kliknite na “Create player config” a vložte zdroj do hxMidiPlayer_config.h.
6. Kliknite na „Vytvoriť kód melódie“ a vložte zdroj do melody.c
7. V našom projekte implementujeme metódu Player_Output() na výstup zvuku cez PWM alebo externý DAC.
8. Nastavte časovač na vzorkovaciu frekvenciu a zavolajte Player_TimerFunc() z prerušenia.
9. Zavolajte Player_StartMelody(&s_melody, 0).

Melódia sa prehráva od prerušenia časovačom. To znamená, že počas prehrávania môže mikrokontrolér vykonávať užitočnú prácu.

Ako to funguje

Vo zvyšku článku sa pokúsim stručne vysvetliť, ako sa to všetko realizuje. Žiaľ, nebude to veľmi krátke – materiálu je veľa. Ak nemáte záujem, môžete okamžite prejsť do sekcií „Popis softvéru“ a „Rozhranie API prehrávača“.

Čo je to hudba

Hudba je sekvencia zvukov rôznej frekvencie a trvania. Frekvencia základnej harmonickej zvuku musí zodpovedať frekvencii určitej noty. Ak sa frekvencia vibrácií zvukov líši od frekvencií nôt, zdá sa nám, že hudobník je „rozladený“.

Tabuľka. Zaznamenajte frekvencie, Hz.

Všetky noty sú rozdelené do oktáv, 7 nôt v každej + 5 poltónov (čierne klávesy na klavíri). Frekvencie nôt v susedných oktávach sa líšia presne 2 krát.

Najjednoduchší hudobný prehrávač obsahuje tabuľku s postupnosťou nôt (nota + trvanie) melódie a tabuľku s frekvenciami nôt. Na syntetizovanie zvuku sa používa jeden z kanálov časovača, ktorý tvorí meander:

Žiaľ, takýto primitívny prehrávač má pevnú vlnu (štvorcovú vlnu), ktorá nie je veľmi podobná skutočným hudobným nástrojom a môže hrať vždy len jednu notu.

Skutočná melódia obsahuje najmenej dve časti (sólo + bas) a keď sa hrá na klavíri, predchádzajúca nota stále znie, keď začne ďalšia. To je ľahké pochopiť, keď si zapamätáte štruktúru klavíra - každá nota zodpovedá samostatnej strune. Prechádzaním rúk po klávesoch môžeme rozozvučať niekoľko strún súčasne.

Niektoré mikrokontroléry majú viacero kanálov časovača, ktoré možno použiť na prehrávanie viacerých nôt súčasne. Zvyčajne sú však tieto kanály cenným zdrojom a neodporúča sa používať ich všetky. Ak, samozrejme, práve nevyrábame hraciu skrinku.
Celkovo na získanie polyfónie a rôznych zvukov hudobných nástrojov musíte použiť syntézu zvuku.

Zvuková syntéza na AVR

hxMidiPlayer využíva zvukovú syntézu a dokáže prehrávať polyfóniu s rôznymi priebehmi. Prehrávač vypočíta amplitúdu výstupného signálu v obsluhe prerušení časovača s frekvenciou 8-22 kHz (koľko výkonu procesora stačí, závisí aj od tvaru vlny a počtu kanálov).

Princíp syntézy zvuku možno vysvetliť na príklade syntézy sínusoidov.

Zoberme si tabuľku veľkosti 64, v ktorej sú hodnoty sínusovej amplitúdy zapísané v bodoch index * 2 * PI / 64 (jedna perióda):

Static const flash uint8_t s_sineTable[ 64 ] = ( 0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x953, 0x953, 0x953, 0 x95, 0x95, 0x95, 0x94 , 0x93, 0x93, 0x91, 0x90, 0x8F, 0x8D, 0x8C, 0x8A, 0x88, 0x86, 0x84, 0x82, 0x80, 0x7E, 0x7C, 0x8, 0x7, 0x7, 0x7, 0x7,6, 0x7,6 0x71, 0x70, 0x6F, 0x6D, A

128 (0x80) zodpovedá nule, 255 (0xff) najväčšiemu kladnému bodu, 0 najväčšiemu zápornému bodu.

Teraz povedzme, že vydáme hodnoty z tabuľky do externého DAC v prerušení časovača s frekvenciou 1000 Hz:

Statický uint8_t s_index = 0; // Porovnanie výstupu Timer1 Rutina prerušenia prerušenie void timer1_compa_isr(void) ( SetDac(s_sineTable[ s_index]); if (s_index == 63) ( s_index = 0; ) else ( s_index++; ) )

Čo získame ako výsledok? Dostaneme sínusové kmity s frekvenciou 1000/64 Hz.

Teraz zväčšíme index v prerušení nie o 1, ale o dva.
Je zrejmé, že výstupná frekvencia oscilácií už bude 1000/64 * 2 Hz.

Vo všeobecnosti, aby ste získali frekvenciu F, musíte zvýšiť index v tabuľke o:
pridať = F / 1 000 * 64

Toto číslo môže byť zlomkové, ale na dosiahnutie vysokej rýchlosti sa používa aritmetika s pevným bodom.

Počet záznamov v tabuľke a frekvencia časovača ovplyvňujú kvalitu syntetizovaného zvuku. V našom prípade stačí 64 záznamov v tabuľke za obdobie a frekvencia časovača je 12 kHz. Minimálna prijateľná frekvencia časovača je 8 kHz, ideálna je 44 kHz.

Je zrejmé, že s frekvenciou časovača 12 kHz môžeme generovať maximálne 6 kHz štvorcové vlny, pretože musíme vykonať aspoň dva prepínače za periódu. Vyššie frekvencie však budú stále rozpoznateľné, ak je stav výstupu správne vypočítaný pri každom tiknutí časovača.

Do tabuľky môžete zadať hodnoty pre periódu nesínusových oscilácií a získať iný zvuk.

Útlm

Ak je hudobný nástroj založený na strunách (napríklad klavír), potom po stlačení klávesu zvuk plynule stíchne. Ak chcete získať prirodzenejší zvuk syntetizátora, musíte po začiatku tónu plynulo znížiť amplitúdu vibrácií („zabaliť“ vibrácie do zoslabenej formy – „obálky“).

Prehrávač obsahuje tabuľku rozpadu, ktorú používa na zníženie amplitúdy sínusu (alebo iného tvaru vlny) od momentu, keď začne tón.
„Sínus“ „zabalený“ do takejto škrupiny pripomína zvuk mechanickej hudobnej skrinky.

Meandrová syntéza

Špeciálny tvar meandrovej vlny umožňuje výrazne zjednodušiť syntézu. Tabuľky sa v tomto prípade nepoužívajú. Stačí si vypočítať, aký stav (1 alebo 0) by mal mať výstup pri danej frekvencii pri aktuálnom tiknutí časovača. Robí sa to pomocou celočíselnej aritmetiky a funguje veľmi rýchlo, čo vysvetľuje popularitu používania štvorcovej vlny na prehrávanie melódií v 8-bitových set-top boxoch.

Príklad: deklarovanie počítadla:

Statické uint16_t s_counter = 0;

ktorú zvýšime o 0x8000 pri každom prerušení časovača a najvýznamnejší bit počítadla bude odoslaný na port:

// Porovnanie výstupu Timer1 Rutina prerušenia prerušenie void timer1_compa_isr(void) ( PORTA.0 = (s_counter >> 15) & 1; s_counter += 0x8000; )

Keďže 0x8000 + 0x8000 = 0x10000, premenná s_counter pretečie, 17. bit sa zahodí a do premennej sa zapíše 0x0000.
Pri frekvencii časovača 8 kHz bude teda výstupom štvorcová vlna 4 kHz.
Ak zvýšite počítadlo o 0x4000, získate štvorcovú vlnu 2 kHz.

Vo všeobecnosti môžete získať frekvenciu F pridaním:
pridať = F / 8000 * 0x10000

Napríklad, ak chcete získať štvorcovú vlnu s frekvenciou 1234 Hz, musíte pridať 0x277C. Skutočná frekvencia sa bude mierne líšiť od uvedenej, pretože výraz zaokrúhľujeme na celé číslo. V syntetizátore je to prijateľné.

Syntéza zvukov skutočných nástrojov

Môžete digitalizovať zvuk noty pred klavírom (pomocou ADC na ukladanie hodnôt amplitúdy zvuku do pamäte v pravidelných intervaloch):
a potom prehrajte zvuk (pomocou DAC na výstup zaznamenaných hodnôt v pravidelných intervaloch).

Vo všeobecnosti, aby ste syntetizovali bicie, musíte nahrať zvuky bicích a prehrať ich v správnom momente. V 8-bitových konzolách sa namiesto zvukov bicích používa „biely šum“. Hodnoty amplitúdy pre „biely šum“ sa získavajú pomocou generátora náhodné čísla. Náklady na pamäť sú minimálne.
hxMidiPlayer používa na syntézu bicích „biely šum“.

Miešanie kanálov

Amplitúda zvuku pri danom ticki časovača sa vypočítava pre každý kanál samostatne. Ak chcete získať konečnú hodnotu amplitúdy, musíte pridať hodnoty všetkých kanálov. Správne je potrebné upraviť súčet, keďže vnímaná hlasitosť sa riadi logaritmickou závislosťou, no v takomto jednoduchom syntetizátore si budete musieť vystačiť s jednoduchým sčítaním. Preto je maximálna amplitúda každého kanála 255/N.

Výstup zvuku z AVR

Po vykonaní všetkých potrebných výpočtov dostane prehrávač úroveň signálu, ktorý je potrebné previesť na analógový. Na tieto účely môžete použiť externý DAC alebo PWM.
Tu si treba uvedomiť, že v oboch prípadoch je vhodné prijímaný signál filtrovať – odstrániť vysokofrekvenčný šum, ktorý vzniká nízkou frekvenciou syntézy a zaokrúhľovania.

Výstup na externý paralelný DAC

Keďže nemá zmysel používať presné DAC čipy, takéto projekty si zvyčajne vystačia s maticou R2R:

S touto schémou jednoducho vydáme vypočítanú amplitúdu na port:

PORTB = vzorka;

nedostatky:
1) výstup matice R2R je tiež slabý signál, použitie analógového zosilňovača je povinné;
2) je potrebné použiť aspoň 5 kolíkov (najlepšie 8);
Táto metóda je opodstatnená iba vtedy, keď nie sú k dispozícii žiadne voľné kanály PWM.

(na uloženie pinov môžete použiť externý ADC s rozhraním SPI).

PWM

Ak existuje bezplatný kanál PWM, najjednoduchším spôsobom je použiť túto metódu.

Inicializácia PWM (ATMega8):

// Inicializácia časovača/počítadla 2 // Zdroj hodín: Systémové hodiny // Hodnota hodín: 20000,000 kHz // Režim: Rýchle PWM top=0xFF // Výstup OC2: Neinvertovaný PWM ASSR=0x00; TCCR2=0x69; TCNT2=0x00; OCR2=0x00; A výstup vzorky: void Player_Output(uint8_t sample) (OC2 = vzorka.)

Bežná prax používania PWM zahŕňa vyhladenie výstupného signálu pomocou RC filtra:

Žiaľ, po odfiltrovaní je signál príliš oslabený, takže na pripojenie reproduktora je potrebné vyrobiť analógový zosilňovač.

Pre zjednodušenie obvodu je lepšie zostať „digitálny“ až do samotného reproduktora. Keďže lacný reproduktor stále nedokáže reprodukovať frekvencie nad 30 kHz, nie je potrebné ich filtrovať. Samotný difúzor „odfiltruje“ vysoké frekvencie PWM.

Ak potrebujete získať väčší prúd, môžete použiť tranzistorový zosilňovač. R1 je zvolený tak, aby poskytoval reproduktoru požadovaný prúd.

Takto môžete pripojiť malé reproduktory z hračiek:

Pre väčšie reproduktory je lepšie zostaviť jednotku pomocou 2 tranzistorov a nainštalovať LC filter na odstránenie šumu:

Kondenzátor C1 slúži na obmedzenie prúdu cez reproduktor, keď PWM nefunguje. Tiež vďaka zahrnutiu sériového kondenzátora sa k reproduktoru dostane signál, ktorý je symetrický okolo nuly. Kužeľ reproduktora sa teda bude pohybovať vzhľadom na centrálnu „uvoľnenú“ polohu, čo má pozitívny vplyv na kvalitu zvuku.
V tomto prípade tranzistory pracujú v spínacom režime, takže nie je potrebné kompenzovať základný offset.

PWM, dvojkolíkové pripojenie

Nevýhodou prvých dvoch obvodov je, že reproduktor je napájaný prúdom v jednom smere. Ak zmeníme smer prúdu, hlasitosť sa môže zvýšiť 2 krát bez prekročenia prípustného výkonu. K tomu je reproduktor pripojený k dvom kolíkom mikrokontroléra - neinvertovanému a invertovanému, napríklad OC1A a /OC1A. Ak nie je k dispozícii žiadny neinvertovaný výstup, môžete použiť druhý kanál v invertovanom režime (OC1B):

// Inicializácia časovača/počítadla 1 // Zdroj hodín: System Clock // Hodnota hodín: 24500 000 kHz // Režim: Fast PWM top=0x00FF // Výstup OC1A: Non-Inv. // Výstup OC1B: Invertovaný // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Porovnanie A prerušenia zhody: Off // Porovnanie B prerušenia zhody: Off TCCR1A =0xB1; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; void Player_Output(uint8_t vzorka) ( OCR1A = vzorka; OCR1B = vzorka; )

PWM, dva kolíky, zosilňovač triedy D

Nevýhodou navrhovaných obvodov je odber prúdu počas ticha.
„Ticho“ pre nás zodpovedá úrovni signálu 128, teda PWM s 50% naplnením - cez reproduktor vždy preteká prúd!

Miernou zmenou softvéru môžete získať pomerne výkonný softvérový a hardvérový zosilňovač triedy D:

Void Player_Output(uint8_t sample) ( if (vzorka >= 128) ( TCCR2=0x21; //normálne, jasné pri porovnávacej zhode TCCR2=0x21 | 0x80; //CLEAR OC2 PORTC.0 = 0; TCCR2=0x69; //nie -invertovanie PWM OCR2 = (ukážka-128) * 2; ) else // if (ukážka< 128) { TCCR2=0x31; //normal, set on compare match TCCR2=0x31 | 0x80; //SET OC2 PORTC.0 = 1; TCCR2=0x79; //inverting PWM OCR2 = (128-sample) *2; } }

V tomto prípade je jeden pár tranzistorov pripojený k výstupu PWM, druhý - k bežnému digitálnemu výstupu.

Ako môžete vidieť z kódu, signál nad 128 považujeme za prúd smerovaný jedným smerom a signál pod 128 za prúd smerovaný druhým smerom. Na 128 sú oba kolíky reproduktora pripojené k rovnakému kolíku napájania a nie je tam žiadny prúd. Pri odchýlke od úrovne 128 sa zvyšuje PWM plnenie a cez reproduktor preteká prúd zodpovedajúcej polarity.

Dôležitým bodom pri realizácii je nútené prepnutie PWM výstupu do požadovaného stavu v momente prepnutia druhého (bežného digitálneho) pinu (PORTC.0). Zápis do registra OCR2 je uložený do vyrovnávacej pamäte, aby sa eliminovali chyby PWM. Musíme okamžite prepnúť výstup PWM bez čakania na koniec obdobia.

Posledný obvod je IMHO najlepšou voľbou z hľadiska jednoduchosti, úspory energie a výkonu.

Zvukový výstup s priebehom SquareWave

Pri syntéze meandru sa používajú zjednodušené algoritmy.

Každý kanál (vrátane bicích) má na výstupe buď 0 alebo 1. Teda 3-kanálový gramofón vydáva hodnoty v rozsahu 0..3. Preto pri použití PWM postup výstupu vyzerá takto:

Void Player_Output (ukážka uint8_t) ( OCR2 = ukážka * (255 / HXMIDIPLAYER_CHANNELS_COUNT); )

Ak nepoužívate PWM, tak na výstup 3-kanálovej melódie stačia dva bežné digitálne výstupy a 2-bitová matica R2R.

MIDI formát

Ak sa pozriete na výsledný kód melódie, ľahko zistíte, že pole používa opakujúce sa čísla z malého rozsahu. Je to pochopiteľné: melódia používa obmedzený počet nôt v rozmedzí 1-2 oktáv, tempo melódie je pevné - rovnaké oneskorenia, počet kanálov je v rozsahu 0..15.
To všetko znamená, že výsledné pole možno výrazne zredukovať použitím nejakého kompresného algoritmu.
Algoritmy ako ZIP poskytujú dobrú kompresiu, ale vyžadujú aj veľa pamäte na prevádzku (slovník ZIP - 64 kB). Môžeme použiť veľmi jednoduchú metódu kompresie, ktorá nevyžaduje prakticky žiadnu pamäť, ktorej podstata je nasledovná.

V jednom byte sú všetky čísla rovnomerne rozložené v rozsahu 0...255 a každé číslo je reprezentované 8 bitmi. V našom prípade sú niektoré čísla oveľa bežnejšie ako iné. Ak zakódujete často sa vyskytujúce čísla s menším počtom bitov a menej často sa vyskytujúce čísla s väčším počtom bitov, môžete získať pamäť.

Zvolíme pevný spôsob kódovania: kombinácie bitov 000,001 a 010 (dĺžka - 3 bity) budú predstavovať 3 najčastejšie sa vyskytujúce čísla. Bitové kombinácie 0110, 0111 (dĺžka – 4 bity) – ďalšie 2 najčastejšie čísla atď.:

//000..010 - 0..2 //011 x 3..4 //100 xx 5..8 //101 xxx 9..16 //110 xxx 17..24 //111 okamžite

Kombinácia začínajúca 111 (dĺžka – 11 bitov) zakóduje všetky ostatné čísla.
Spôsob bitového kódovania môže byť odlišný. Vyskúšal som niekoľko metód a vybral som si túto, ktorá dáva najlepšie výsledky na takýchto údajoch.

Postup kompresie vyzerá takto:
1. Vypočítajte celkové číslo X v prúde pre X = .
2. Zoraďte podľa klesajúcej frekvencie výskytu v streame.
3. Vezmite prvých 25 čísel. Budú kódované v menšom počte bitov.
4. Zakódujte vstupný tok.

Výstupom je pole 25 najčastejšie sa vyskytujúcich čísel a bitový tok.
Táto kompresia umožňuje dosiahnuť 50% kompresiu s minimálnymi nákladmi na pamäť a výkon. Bohužiaľ sa tým zvyšuje kód prehrávača, takže kompresia sa neodporúča pre krátke melódie.

Ukladanie frekvencií nôt

Ukladať frekvencie všetkých nôt do tabuľky z pamäte je dosť drahé. V skutočnosti existuje vzorec na určenie frekvencie noty podľa jej midi čísla:

F = 2^((N-69)/12)* 440, Hz

Ale vypočítať zlomkovú silu je dosť ťažké. Namiesto toho prehrávač ukladá 12 notových frekvencií do hornej oktávy. Frekvencie nôt v nižších oktávach sú určené znížením frekvencie o 2^Y viackrát, kde Y je počet oktáv nadol.

Ďalší vývoj kompresie

Melódia často obsahuje opakujúce sa fragmenty („zbory“, „verše“). Nájdením opakujúcich sa fragmentov a prezentovaním melódie vo forme fragmentov môžete znížiť melódiu o ďalších 50 %, pričom nestrávite takmer žiadny čas RAM a produktivitu. Neimplementoval som takýto algoritmus, aby som projekt nekomplikoval.

Popis softvéru

Hlavné okno programu prevodníka:

Tlačidlo Load Midi umožňuje načítať midi súbor. Program okamžite začne prehrávať súbor s aktuálne zvolenými parametrami, simulujúc zvuk, ktorý bude v hardvéri.

V informačnom okne (4) sa zobrazí:
– Length – dĺžka vybraného fragmentu melódie v ms;
– Max Active syntezátorové kanály – maximálny počet súčasne aktívnych syntetizátorových kanálov;
– Maximálny počet aktívnych kanálov bicích – maximálny počet súčasne aktívnych kanálov syntetizátora, ktoré reprodukujú „bicie“;
– Max active stereo notes – maximálny počet kanálov reprodukujúcich rovnakú notu (pozri nižšie);
– Odhadovaná veľkosť, bajty – veľkosť melódie v bajtoch. V režime „Custom Sample“ sa veľkosť zobrazí ako A+B, kde A je veľkosť melódie, B je veľkosť vzorky. Veľkosť kódu prehrávača tu nie je uvedená.

Okno priebehu zobrazuje aktuálnu pozíciu prehrávania.
Kliknutím na lištu priebehu môžete spustiť prehrávanie od určeného bodu.
Vstupné polia na ľavej a pravej strane vám umožňujú určiť začiatok a koniec fragmentu melódie v ms.

Červený štítok „Nedostatok kanálov na prehrávanie melódie“ označuje, že nie je dostatok kanálov syntetizátora na prehrávanie melódie s aktuálnymi nastaveniami. Ak prehrávač nenájde voľný kanál, vypne najstaršiu notu. V mnohých prípadoch to bude fungovať dobre. Zvýšiť počet kanálov má zmysel len vtedy, keď melódia znie uchu nesprávne.

Nastavenia možno rozdeliť na nastavenia prehrávača a nastavenia spracovania midi súborov. Prehrávač bude môcť prehrať výsledný kód melódie, ak boli konfigurácia prehrávača a kód melódie vytvorené s rovnakými nastaveniami prehrávača. Okrem toho bude prehrávač schopný prehrať melódiu, ktorej kód bol vytvorený pre prehrávač s menším (ale nie väčším) počtom kanálov.

Nastavenia hardvéru prehrávača zahŕňajú:

– Vzorkovacia frekvencia – frekvencia syntézy. Maximálna frekvencia fúzie sa určí experimentálne. Na základe Atmega 16 MHz, môžete začať na 12 000 Hz pre prehrávač so 6 kanálmi a zvyšovať ju podľa potreby, kým sa skreslenie melódie nerozpozná sluchom v hardvérovom prehrávači. Maximálna frekvencia závisí od počtu kanálov, tvaru vlny a zložitosti samotnej melódie.

– priebeh – priebeh:
– Štvorcová vlna – meander;
– Sínus – sínus;
– Sínus + Obálka – sínus s útlmom;
– Waveform * + Envelope – rôzne možnosti pre nesínusové vlny s a bez útlmu;
– Custom Sample – použite vzorku nástroja.

Tlačidlo „Load Sample“ vám umožňuje načítať vzorku zo súboru WAV. Súbor WAV musí byť vo formáte PCM 8-bit mono, 4173 Hz, C-5. Tip: Môžete zvýšiť frekvenciu a znížiť tón, ale zmeňte výšku tónu v nastaveniach prehrávača. Neexistujú žiadne kontroly formátu - ak je formát iný, zvuk sa neprehrá správne.
Pitch – umožňuje zmeniť výšku zvuku. Napríklad, ak chcete hrať o 1 oktávu vyššie, musíte nastaviť výšku tónu +12.

Použiť kompresiu – použite kompresiu melódie.
Povoliť syntetizátor bicích – povoľte syntetizátor bicích.

Kanály prehrávača: Počet kanálov syntetizátora (maximálny počet nôt, ktoré budú znieť súčasne).

Nastavenia spracovania midi súborov zahŕňajú:

Takéto jemné ladenie sa zvyčajne nevyžaduje. Tieto nastavenia možno ponechať ako predvolené.

Player API

Implementácia prehrávača sa nachádza v súboroch Common\hxMidiPlayer.c a Common\hxMidiPlayer.h. Tieto súbory musia byť súčasťou projektu. Taktiež je potrebné vytvoriť súbor hxMidiPlayer_config.h, do ktorého je potrebné umiestniť konfiguráciu.
Prehrávač je napísaný v jazyku C bez montážnych vložiek, čo uľahčuje jeho prenos na iné mikrokontroléry.

Exter void Player_StartMelody(const flash TMelody* _pMelody, uint16_t _delay);

Začnite hrať melódiu. _delay nastavuje počiatočné oneskorenie pred prehrávaním, 255 jednotiek = 1 sekunda.

Void Player_Stop();

Prestaňte hrať melódiu.

Externý bool Player_IsPlaying();

Vráti hodnotu false, ak sa melódia dohrala.

Exter void Player_WaitFinish();

Počkajte, kým sa melódia neprehrá.

Exter void Player_TimerFunc();

Táto funkcia sa musí volať pri prerušení časovača pri vzorkovacej frekvencii špecifikovanej v konfigurácii. Keď sa melódia prehrá, nemusíte volať.

Extern void Player_Output(uint8_t sample);

Musí byť implementované používateľom. Volá prehrávač, keď je potrebné vydať ďalšiu vzorku.

Exter void Player_Started();

Musí byť implementované používateľom. Volá sa, keď prehrávač začne hrať melódiu. Môže sa použiť na konfiguráciu prerušení časovača.

Externý void Player_Finished();

Musí byť implementované používateľom. Volá sa, keď hráč dokončí prehrávanie melódie. Dá sa použiť na deaktiváciu prerušení časovača alebo na spustenie prehrávania inej melódie.

//#define NOTES_TO_EEPROM //#define SINETABLE_TO_EEPROM //#define ENVELOPE_TO_EEPROM

Tieto riadky je potrebné odkomentovať v súbore hxMidiPlayer_config.h, ak sa v eeprom musí nachádzať tabuľka not, sínusová tabuľka a tabuľka útlmu.

Príklady projektov

ATMega644Example – projekt pre ATMega644, 25MHz, PWM výstup na PB3.

Požiadavky na pamäť

Tabuľka. Veľkosť prehrávača a melódie vo flashi.

*pri pridávaní hráča do existujúceho neprázdneho projektu bude veľkosť kódu menšia

**Nie je dostatok kanálov na normálne prehrávanie melódie

Melódia 1: bach_menuet_in_g.mid, 35 sek
Melódia 2: yiruma-river_flows_in_you.mid, 165 sekúnd
Melódia 3: Franz Schubert – Serenáda.stred, 217 sek

Ako vidíte z tabuľky, v minimálnej konfigurácii aj do ATTiny2313 vtlačíte poriadne dlhú melódiu. Kompresia môže znížiť melódiu viac ako dvakrát, ale veľkosť kódu prehrávača sa zvýši o ~ 600 bajtov.

Tabuľky sínusových a poklesových poznámok je možné umiestniť do EEPROM, čím sa ušetrí približne 16, 50 a 100 bajtov flash.

Keď používate vzorku zo súboru wav, musíte k veľkosti kódu prehrávača pridať veľkosť vzorky v bajtoch.

Príklad použitia

Ako príklad použitia prehrávača uvažujme proces vytvárania hudobnej skrinky.

Berieme hotovú MDF škatuľu:

Ako mikrokontrolér berieme ATTiny85 v balení SO-8 ako najlacnejší s dostatočne veľkou pamäťou. Pretaktujeme ho na 27 MHz, aby sme získali frekvenciu syntézy 18 kHz so 4 sínusovými + obálkovými kanálmi.

Zosilňovač bude triedy D so 4 tranzistormi pre úsporu batérií.

Tranzistory pracujú v spínacom režime a môžu byť akéhokoľvek typu. Induktor L1 a kondenzátor C6 sú vybrané podľa chuti, aby sa získal zvuk bez vysokofrekvenčného šumu. R1 a R2 je možné zvýšiť až na 2K, aby sa znížila hlasitosť a obmedzili odrazy reproduktorov.

Koncový spínač z diskovej jednotky sa perfektne hodí, ako keby bol vytvorený špeciálne pre krabicu (funguje pri otváraní - keď otvoríte veko, doska sa napája):

Zdroje firmvéru sa nachádzajú v adresári ATTiny85MusicBox.

8Kb sa zmestí:
1) prehrávač: 18000 Hz, 4 kanály, sínus + obálka, výška + 12, kompresia, prehráva melódie jednu po druhej (posledná je uložená v EEPROM)
2) Yiruma – rieka tečie v tebe
3) Franz Schubert – Serenáda
4) P.I. Čajkovskij "október"

Výsledok na videu:

Ďalší vývoj

V princípe je možné prehrávač ďalej rozvíjať, čím sa dostane na plnohodnotného Midi alebo MOD prehrávača. Osobne si myslím, že na získanie kvalitnej melódie by bolo jednoduchšie pripojiť SD kartu a prehrávať z nej akékoľvek WAV súbory s oveľa viac najlepšia kvalita než je vo všeobecnosti možné získať softvérovou syntézou. A takýto prehrávač je softvérovo aj hardvérovo oveľa jednoduchší. Výklenok hxMidiPlayer dodáva pripraveným projektom dobrý zvuk, keď v blesku zostáva pár nôh a trochu miesta. Túto úlohu zvláda „výborne“ už vo svojej doterajšej podobe.

Myslím, že to môže uzavrieť problém vytvárania všetkých druhov hudobných boxov/zvončekov na AVR :)

Pokračovanie lekcie trvalo dlho, čo je pochopiteľné, musel som zvládnuť prácu s pamäťovými kartami a kartotékou FAT systém. Ale napriek tomu sa to stalo, lekcia je pripravená - v skutočnosti novoročný zázrak.

Aby som článok nezahltil informáciami, nebudem popisovať štruktúru formátu wav, informácií je vo vyhľadávačoch viac než dosť. Stačí povedať, že ak otvoríte súbor pomocou nejakého Hex editora, tak prvých 44 bajtov obsahuje všetky informácie o type súboru, vzorkovacej frekvencii, počte kanálov atď. Ak potrebujete súbor analyzovať, prečítajte si toto hlavičku a budete spokojní.

Dáta užitočného zaťaženia začínajú na 44 bajtoch, ktoré v podstate obsahujú úrovne napätia, ktoré tvoria zvuk. O napäťových úrovniach sme už hovorili v poslednej časti lekcie. Všetko je teda jednoduché, tieto kroky musíte odoslať do reproduktora pri vzorkovacej frekvencii súboru.

Ako fyzicky prinútiť reproduktor triasť sa? Tieto úrovne napätia musíte vydávať pomocou PWM alebo použiť R2R. V každom prípade je použitie veľmi jednoduché, prečítajte si číslo, vložte ho do OCR alebo PORTx. Potom som po určitom čase dosadil ďalšiu hodnotu a tak ďalej až do konca súboru.

Príklad, určitý wav súbor, dáta pochádzajú z bajtov 44=0x2C, je tam zapísané číslo 0x80, zvuk reprodukujeme napríklad PWM prvého časovača, zapíšeme OCR1A=0x80; Povedzme, že vzorkovacia frekvencia vzorky je 8 kHz, takže prerušenie by malo byť nastavené na rovnakú frekvenciu. V prerušení nahraďte nasledujúcu hodnotu 0x85 za 1/8000 = 125 µs.

Ako nastaviť prerušenie na 8 kHz? Pripomeňme si, že ak časovač pracuje na frekvencii 250 kHz, potom je potrebné nahradiť porovnávací register prerušení (250/8)-1=31-1 alebo 0x1E. S PWM je tiež všetko jednoduché, čím vyššia frekvencia pracuje, tým lepšie.

Aby firmvér fungoval, dohodneme sa, že flash disk je naformátovaný na FAT32 pomocou PetitFat lib z lekcie 23.2. Súbor je vo formáte wav, buď 8 kHz alebo 22,050 kHz, mono. Názov súboru 1.wav. Poďme analyzovať firmvér.

#include #include "diskio.h" #include "pff.h" unsigned char buffer[ 512 ] ; /* vyrovnávacia pamäť, do ktorej sa skopírujú informácie z flash disku */ volatile unsigned int count; //počítadlo skopírovaných údajov prerušenie [TIM2_COMP] void timer2_comp_isr(void) //prerušenie, v ktorom sú nahradené hodnoty( OCR1A = vyrovnávacia pamäť[ počet] ; // výstup zvuku do reproduktora if (++ počet >= 512) //zvýšiť počítadlo počet = 0; //ak sa resetuje 512) void main(void) ( unsigned int br; /* čítač čítania/zápisu súboru */ unsigned char buf = 0 ; //premenná definujúca, ktorá časť vyrovnávacej pamäte sa číta FATFS fs; /* Pracovný priestor (objekt systému súborov) pre logické jednotky */ PORTB= 0x00 ; DDRB= 0x02; //vyskočiť podložku ocr1a // Inicializácia časovača/počítadla 1// Zdroj hodín: Systémové hodiny // Hodnota hodín: 8000 000 kHz // Režim: Fast PWM top=0x00FF // Výstup OC1A: Non-Inv. TCCR1A= 0x81; TCCR1B= 0x09; TCNT1= 0x00 ; OCR1A= 0x00; // Inicializácia časovača/počítadla 2// Zdroj hodín: Systémové hodiny // Hodnota hodín: 250 000 kHz // Režim: CTC top=OCR2 TCCR2= 0x0B ; TCNT2= 0x00 ; //OCR2=0x1E; //nastavenie porovnávacieho registra pre 8kHz OCR2= 0xA; //pre 22 kHz #asm("sei") // Časovač(y)/Počítadlo(a) Inicializácia prerušenia(í). if (disk_initialize() == 0 ) //inicializujte flash disk( pf_mount(&fs) ; //mount systém súborov pf_open("1.wav" ); //otvorte vlákno pf_lseek(44) ; //presuňte ukazovateľ na 44 pf_read(buffer, 512 ,& br) ; //prvýkrát zhltneme naraz 512 bajtov TIMSK= 0x80 ; //zapnite hudbu pri (1) ( if (! buf && count> 255 ) //ak sa reprodukuje viac ako 255 bajtov,( pf_read(& buffer[ 0 ], 256,& br) ; //potom načítame informácie z flash disku do prvej polovice vyrovnávacej pamäte buf= 1; ak (br< 256 ) //ak buffer neobsahuje 256 hodnôt, znamená to koniec súboru prestávka ; ) if (buf && počítať< 256 ) { pf_read(& buffer[ 256 ] , 256 ,& br) ; // načítanie do druhej časti vyrovnávacej pamäte z flash disku buf = 0; ak (br< 256 ) break ; } } TIMSK = 0x00 ; //глушим все pf_mount(0x00 ) ; //rozobrať závoj) zatiaľ čo (1) ( ) )

#include #include "diskio.h" #include "pff.h" unsigned char buffer; /* vyrovnávacia pamäť, do ktorej sa skopírujú informácie z flash disku */ volatile unsigned int count; //počítadlo prerušenia skopírovaných údajov void timer2_comp_isr(void) //prerušenie, v ktorom sú nahradené hodnoty ( OCR1A = vyrovnávacia pamäť; //výstup zvuku do reproduktora, ak (++count >= 512) //zvýšenie počtu počítadiel = 0; //ak 512 reset ) void main(void) ( unsigned int br; /* čítač čítania/zápisu súboru */ unsigned char buf = 0; //premenná definujúca, ktorá časť vyrovnávacej pamäte sa číta FATFS fs; /* Funguje oblasť (objekt systému súborov) pre logické jednotky */ PORTB=0x00; DDRB=0x02; //preskočenie podložky ocr1a // Inicializácia časovača/počítadla 1 // Zdroj hodín: Systémové hodiny // Hodnota hodín: 8000 000 kHz // Režim: Rýchle PWM hore=0x00FF // Výstup OC1A: Neinv. TCCR1A=0x81; TCCR1B=0x09; TCNT1=0x00; OCR1A=0x00; // Inicializácia časovača/počítadla 2 // Zdroj hodín: Systémové hodiny // Hodnota hodín : 250 000 kHz // Režim: CTC top= OCR2 TCCR2=0x0B; TCNT2=0x00; //OCR2=0x1E; //nastavenie porovnávacieho registra pre 8kHz OCR2=0xA; //pre 22kHz #asm("sei") // Inicializácia časovača(ov)/počítadla(ov) prerušení if(disk_initialize()==0) //inicializácia flash disku ( pf_mount(&fs); //pripojenie súborového systému pf_open("1.wav"); //otvorte vetvu pf_lseek(44); //presunie ukazovateľa na 44 pf_read(buffer, 512,&br); //prvý krát zhltneme naraz 512 bajtov TIMSK=0x80; //zapni hudbu while(1) ( if(!buf && count>255) //ak sa prehralo viac ako 255 bajtov, ( pf_read(&buffer, 256,&br);//potom si prečítaj informácie z flashu vjazd do prvej polovice vyrovnávacej pamäte buf=1 ; ak (br< 256) //если буфер не содержит 256 значений значит конец файла break; } if(buf && count<256) { pf_read(&buffer, 256,&br); // читаем во вторую часть буфера с флешки buf = 0; if (br < 256) break; } } TIMSK = 0x00; //глушим все pf_mount(0x00); //демонтируем фат } while (1) { } }

Pre kontrolu pripojíme reproduktor ku kolíku OCR1A cez kondenzátor 100uF, „+“ ku kolíku mikrokontroléra, „-“ k reproduktoru. „-“ reproduktor k zemi, „+“ ku kondenzátoru.

Na výstupe nečakajte hlasný signál, na hlasný zvuk potrebujete zosilňovač. Na videu je to jasne vidieť. Na test som kohúta zaťažil 8 kHz a dráhu 22 kHz.

Tí, ktorí chcú, môžu bezpečne zvýšiť frekvenciu časovača2, aby mohli prehrávať 44 kHz súbory; experimenty ukazujú, že je možné dosiahnuť celkom dobrú kvalitu zvuku. Vo videu je zvuk slabý a kvalita slabá, ale v skutočnosti je to spôsobené tým, že som to natáčal kamerou.

Zverejňujem tiež materiály, ktoré láskavo poskytol Apparatchik - zdrojový kód pre GCC, z ktorého bol napísaný firmvér pre CAVR.

A video s prehrávaním 44 kHz.

Využívam túto príležitosť, aby som všetkým zablahoželal k novému roku, želám si, aby vám všetok firmvér a zariadenia fungovali :)

Projekt prehrávača wav na Atmega8

Napísal som softvérový modul, ktorý umožňuje pridať funkciu prehrávania melódií alebo zvukových sekvencií do takmer akéhokoľvek projektu na mikrokontroléri AVR.

Vlastnosti modulu:

Jednoduchá integrácia s hotovým projektom

Používa sa iba 8-bitový časovač t2, pričom je možné ho použiť aj na dotazovanie alebo vytváranie časových intervalov

Modul je nastaviteľný na takmer akúkoľvek frekvenciu generátora hodín

Výška tónov je špecifikovaná ako symbolické konštanty (C0, A2, atď.) alebo v Hertzoch

Trvanie sa uvádza v štandardnej forme (štvrtiny, osminy atď.) alebo v milisekundách

Je možné nastaviť tempo prehrávania melódie a počet jej opakovaní

Počas prehrávania je možné melódiu pozastaviť


Pripojenie zvukového modulu

1. Skopírujte všetky súbory modulu (tone.h, sound.h, sound.c) do priečinka projektu.

2. Pripojte súbor sound.c k projektu.

Pre IAR `a – kliknite pravým tlačidlom myši v okne pracovného priestoru a vyberte Pridať > Pridať súbory…

Pre WINAVR je to približne rovnaké, do súboru makefile je potrebné pridať iba sound.c:

SRC = $(TARGET).c zvuk.c

3. Zahrňte hlavičkový súbor sound.h do príslušného modulu. Napríklad v main.c

#include "sound.h"

4. Nastavte nastavenia modulu v súbore sound.h

//ak vyjadríte komentár, trvanie poznámok bude

//vypočítané z BPM špecifikovaného v melódii

//ak vľavo, potom z hodnoty uvedenej nižšie

//#define SOUND_BPM 24

//frekvencia hodín μ

#define SOUND_F_CPU 16U

//výstup mikrokontroléra, na ktorom sa bude generovať zvuk

#define PORT_SOUND PORTB

#define PINX_SOUND 0

//počet zadaných melódií.

#define SOUND_AMOUNT_MELODY 4

5. Pridajte svoje melódie do sound.c a napíšte názvy melódií do poľa melódií.

Pridávanie zvonení

Melódia je pole 16-bitových čísel a má nasledujúcu štruktúru

BPM (štvrťové noty za minútu) je konštanta používaná na výpočet trvania nôt a určuje rýchlosť, akou sa melódia hrá.

BPM sa môže pohybovať od 1 do 24, čo zodpovedá 10 a 240 štvrťročným notám za minútu.

Ak je trvanie nôt/zvukov špecifikované v milisekundách, potom BPM zapísaný v poli by sa mal rovnať 1.

Ak je konštanta SOUND_BPM zakomentovaná v hlavičkovom súbore sound.h, potom sa trvanie nôt vypočíta počas vykonávania programu podľa BPM špecifikovaného v poli. Ak SOUND_BPM nie je zakomentovaný, trvanie nôt sa vypočíta vo fáze kompilácie na základe hodnoty tejto konštanty a všetky melódie sa budú hrať v rovnakom tempe. To obmedzuje funkčnosť, ale šetrí niekoľko bajtov kódu.

Počet opakovaní. Môže nadobúdať hodnoty 1 ... 254 a LOOP (255). LOOP - znamená, že melódia sa bude opakovať donekonečna, kým nezadáte príkaz SOUND_STOP alebo SOUND_PAUSE.

Trvanie poznámky– čas, počas ktorého sa generuje daný zvukový tón alebo je udržiavaná pauza. Dá sa zadať v ms pomocou makra ms(x) alebo ako štandardné hodnoty noty - osminové noty, šestnáste noty atď. Nižšie je uvedený zoznam podporovaných trvania. Ak sú potrebné nejaké exotické dĺžky trvania, vždy ich môžete pridať do súboru tone.h

n1 - celá poznámka

n2 - polovičná poznámka

n4 - štvrťrok

n8 - ôsmy

n3 - ôsmy triplet

n16 - šestnásty

n6 - sextóla

n32 - tridsať sekúnd

Výška tónu sa špecifikuje pomocou symbolických konštánt popísaných v súbore tone.h, napríklad C2, A1 atď. Výška tónov môže byť tiež špecifikovaná v Hertzoch pomocou makra f(x).

Program má obmedzenia na minimálnu a maximálnu frekvenciu zvuku!

Značka konca melódie. Hodnota posledného prvku poľa musí byť nula.

Pomocou zvukového modulu

Na začiatku main musíte zavolať funkciu SOUND_Init(). Táto funkcia nastavuje výstupný kolík mikrokontroléra, konfiguruje časovač T2 a inicializuje premenné modulu.

Potom je potrebné nastaviť príznak povolenia prerušenia - __enable_interrupt(), pretože modul používa pretečenie časovača T2 a koincidencia prerušenia.

Potom môžete začať hrať melódie.

Napríklad takto:

SOUND_SetSong(2);

SOUND_Com(SOUND_PLAY); //prehrať melódiu

//nastavíme ukazovateľ na 2. melódiu

//a spustite prehrávanie

SOUND_PlaySong(2);

Prehrávanie melódie je možné kedykoľvek zastaviť príkazom SOUND_STOP.
Melódiu môžete pozastaviť aj pomocou príkazu SOUND_PAUSE. Následné zadanie príkazu SOUND_PLAY obnoví prehrávanie melódie od bodu, kde bolo zastavené.

V zásade táto funkcionalita nie je zvlášť potrebná (práve som si ju vymyslel) a pri práci s modulom stačí funkcia SOUND_PlaySong(unsigned char numSong);

Súbory

Príklady použitia zvukového modulu si môžete stiahnuť z nižšie uvedených odkazov. Nenakreslil som schému, pretože tam je všetko jednoduché. pripojený na pin PB0, tlačidlo spustenia melódií je pripojené na pin PD3. V projektoch sú definované 4 melódie. Stlačením tlačidla sa zakaždým spustí nová melódia. Použitý je mikrokontrolér atmega8535. Pôvodne som sa chcel trápiť projektom so štyrmi tlačidlami – PLAY, STOP, PAUSE a NEXT, ale potom som si povedal, že je to zbytočné.

PS: Modul neprešiel rozsiahlym testovaním a poskytuje sa „tak ako je“. Ak sú nejaké racionálne návrhy, dotvorme to.

V tomto článku sa pozrieme na to, ako hrať tóny a naučíme sa hrať monofónnu melódiu.

Príprava na prácu

Program deklaruje dve polia. Pole s poznámkami poznámky obsahuje jednoduchý zoznam poznámok. Tieto noty sa zhodujú s trvaním zvuku v poli bije. Trvanie v hudbe je určené deliteľom noty vo vzťahu k celej note. Hodnota braná ako celá poznámka je 255 . Polovice, štvrtiny, osminy sa získajú delením tohto čísla.
Upozorňujeme, že trvanie prvej noty sa nezíska vydelením 255 mocninou dvoch. Tu budete musieť prejsť na hudobnú teóriu. Je možné zobraziť tóny pôvodnej melódie. Tieto noty sú spojené do trojíc. Keď sa takto spoja, tri osminové tóny znejú rovnako ako jedna štvrťová. Preto je ich relatívne trvanie 21.
Používateľ musí tiež explicitne špecifikovať počet poznámok v poradí podľa smernice:

# definujte SEQU_SIZE 19

V hlavnom programe sa najskôr prepočítajú frekvenčné polia a trvanie na periódy signálov a trvanie nôt.
S periódami signálu (pole signál_perióda) všetko je jednoduché. Ak chcete získať trvanie periódy v mikrosekundách, jednoducho vydeľte 1 000 000 frekvenciou signálu.
Na výpočet absolútneho trvania nôt je potrebné špecifikovať tempo hudobného diela. Toto sa vykonáva direktívou

# definujte TEMPO 108

Tempo v hudbe je počet štvrťových nôt za minútu. V rade

# define WHOLE_NOTE_DUR 240000 / TEMPO

Vypočíta sa trvanie celej poznámky v milisekundách. Teraz stačí prepočítať relatívne hodnoty z poľa pomocou vzorca bije do absolútneho poľa not_duration.
V hlavnej slučke premenná uplynutý čas sa zvyšuje po každej perióde hraného signálu o trvanie tejto periódy, kým nepresiahne trvanie noty. Stojí za to venovať pozornosť tomuto záznamu:

while(elapsed_time< 1000 * ((uint32_t) note_duration[ i] ) )

Variabilné uplynutý čas 32-bit a prvky poľa notes_duration 16-bitový. Ak sa 16-bitové číslo vynásobí 1000, potom je zaručené pretečenie a premenná uplynutý čas budú prirovnané k odpadu. Modifikátor (uint32_t) konvertuje prvok poľa notes_duration[i] v 32-bitovom čísle nedochádza k pretečeniu.
Ďalšiu funkciu môžete vidieť v audio slučke. Funkciu nebude možné použiť _delay_us(), pretože jeho argument nemôže byť premenná.
Na vytvorenie takýchto oneskorení použite funkciu VarDelay_us(). V ňom sa slučka s oneskorením 1 μs roluje stanovený počet krát.

void VarDelay_us(uint32_t takt) ( while (takt- - ) ( _delay_us(1) ; ) )

Pri prehrávaní melódie sa používajú ďalšie dve oneskorenia. Ak sa noty hrajú bez prestávok, spoja sa do jednej. Na tento účel sa medzi ne vloží oneskorenie 1 ms, špecifikované smernicou:

#definujte NOTES_PAUSE 1

Po každom úplnom cykle prehrávania melódie sa program na 1 sekundu pozastaví a začne hrať znova.
Vďaka tomu sme dostali kód, v ktorom je možné jednoducho zmeniť tempo, upraviť trvanie alebo úplne prepísať melódiu. K tomu bude stačiť transformovať iba časť programu s direktívami a deklaráciami premenných.

Jednotlivé úlohy

  1. V navrhovanej melódii skúste zmeniť tempo a medzi opakovaniami pauzu 5 sekúnd.
  2. Prvky poľa bije akceptujte iba hodnoty od 0 do 255. Zmeňte bitovú šírku prvkov poľa a pozrite sa na výstup kompilátora, aby ste videli, ako to ovplyvňuje množstvo pamäte obsadenej programom.
  3. Teraz skúste zmeniť melódiu sami. Tu je napríklad „Imperial March“ z toho istého filmu: int notes = ( A4, R, A4, R, A4, R, F4, R, C5, R, A4, R, F4, R, C5, R, A4, R, E5, R, E5, R, E5, R, F5, R, C5, R, G5, R, F5, R, C5, R, A4, R); int úderov = ( 50 , 20 , 50 , 20 , 50 , 20 , 40 , 5 , 20 , 5 , 60 , 10 , 40 , 5 , 20 , 5 , 60 , 80 , 0 50 , 0 , 2 , 05 0 , 0 20, 40, 5, 20

    Ak vaše auto nemá nainštalovanú zvukovú sirénu a stále sa neviete rozhodnúť, ktorú si kúpiť a nainštalovať, potom je tento článok určený práve vám. Prečo kupovať drahé alarmy, ak si to všetko dokážete zložiť sami a to celkom jednoduchým spôsobom?

    Predstavujem dve z nich jednoduché obvody na mikrokontroléroch AVR ATmega8 a Attiny2313, alebo skôr ten istý obvod je jednoducho implementovaný tak, aby fungoval na týchto dvoch mikrokontroléroch. Mimochodom, v archíve nájdete dve verzie firmvéru pre mikrokontrolér Atmega8, z ktorých prvá reprodukuje zvuk podobný autoalarm, a druhý zvuk je podobný alarmu zabezpečenia budovy (rýchly a ostrý signál).

    Všetok firmware si môžete stiahnuť nižšie v archíve (všetky sú podpísané), v archíve nájdete aj simuláciu obvodov v Proteuse, čo znamená, že po vypočutí všetkých melódií si môžete vybrať zo zoznamu to, čo sa vám páči najviac .

    Nižšie je uvedený signálny diagram pre Atmega8

    Zoznam rádiových komponentov použitých v obvode Atmega8

    U1- Mikrokontrolér AVR 8-bit ATmega8-16PU, mn. 1,
    R1- Rezistor s nominálnou hodnotou 47 Ohm, č. 1,
    R2, R3 - Rezistor s nominálnou hodnotou 270 Ohmov, č. 2,
    D2,D3-LED, č. 2,
    LS1-reproduktor, č. 1,
    S1-senzor.

    A v signalizačnom obvode na Attiny2313 sa zmenil iba MK.
    U1- Mikrokontrolér AVR 8-bit ATtiny2313-20PU, č. 1.

    Vytlačená obvodová doska pre Atmega8 vyzerá takto:

    Ako vidíte, obvod je veľmi jednoduchý, je tu len jeden mikrokontrolér, 3 odpory, 2 LED diódy a ešte jeden reproduktor. Namiesto tlačidla môžete použiť jazýčkový spínač alebo iný kontakt.

    Princíp fungovania je nasledovný. Hneď ako pripojíme napájanie, LED (v obvode D3) sa okamžite rozsvieti alebo začne blikať (v závislosti od firmvéru) a ak sa senzora nedotkneme, alarm stíchne. Teraz, ak sa spustí senzor, bude fungovať aj siréna, LED bude tiež blikať, ale D2.

    Ak chcete, aby svetlomety auta blikali, keď alarm funguje, musíte na to pripojiť kolík mikrokontroléra 24 PC1 k relé cez tranzistor a samotné relé k svetlometom. Na vypnutie sirény je potrebné zariadenie vypnúť a znova zapnúť, alebo jednoducho stlačiť tlačidlo. Na ovládanie mikrokontroléra potrebujete interný 8 MHz oscilátor,

    Ak chcete zvuk alarmu nejako vylepšiť, môžete zostaviť zosilňovač s tranzistormi a pripojiť ho k obvodu. Presne to som urobil, ale v tomto diagrame som to neznázornil.

    Prejdime k obvodu na Attiny 2313, ako som už povedal, má všetky rovnaké detaily a rovnaký princíp činnosti, len MK bol zmenený a v dôsledku toho aj pripojené kolíky. Tento mikrokontrolér pracuje z interný 4 MHz oscilátor, hoci môže blikať na 1 MHz.

    Nižšie je schéma pripojenia už na Attiny2313

    Pre tento MK som napísal iba jednu verziu firmvéru, zostavil som všetko na doske plošných spojov, skontroloval, všetko funguje dobre.
    A poistky je potrebné nastaviť tak, ako je uvedené nižšie:





Hore