Návrh a koncepcia MIDI zariadenia Wind Controller DIPLOMOVÁ PRÁCA JURAJ ILLA ŽILINSKÁ UNIVERZITA V ŽILINE Elektrotechnická fakulta Katedra telekomunikácií Študijný odbor: TELEKOMUNIKÁCIE Vedúci diplomovej práce: Ing. Michal Kuba, PhD. Stupeň kvalifikácie: inžinier (Ing.) Dátum odovzdania diplomovej práce: 18. 05. 2006 ŽILINA 2007 Abstrakt V diplomovej práci je prezentovaný koncept a následne i konkrétny kompletný návrh funkčného elektronického hudobného dychového nástroja Wind Controller‚ pracujúceho na základe štandardu MIDI a jeho prepojenie s PC. Tiež ponúka prehľad niekoľkých dostupných možností spolupráce MIDI ovládača s vybranými PC programami pracujúcimi s MIDI štandardom a jeho využitie v praxi. Práca sa môže stať dobrým pomocníkom pri realizácii podobného systému vďaka uvedeniu názorného a podrobného postupu riešenia uvedenej problematiky. ANOTAČNÝ ZÁZNAM Meno a priezvisko: Juraj Illa Názov diplomovej práce: Návrh a koncepcia MIDI zariadenia Wind Controller Rok: 2007 Názov školy: ŽILINSKÁ UNIVERZITA V ŽILINE Elektrotechnická fakulta Katedra telekomunikácií Počet strán: 51 Počet obrázkov: 26 Počet tabuliek: 6 Počet grafov: 0 Počet príloh: 7 Použitá literatúra: 17 Kľúčové slová: MIDI, nota, mikrokontrolér, ATMEL, ATMEGA16, C++, dychový nástroj, hmatová mapa, hmatový systém, UART, tlak, senzor, Freescale, MPXV, prevodník, Cubase, MIDI-OX. Anotácia: Táto diplomová práca sa zaoberá problematikou a praktickým návrhom MIDI zariadenia‚ MIDI Wind Controller. Práca tiež popisuje možnosti pripojenia s PC a jeho využitie v praxi. Summary: The purpose of this graduation thesis is the problem and practical suggestion of creating MIDI device MIDI Wind Controller. The thesis also describes the alternatives of connection with PC and using in practice. Vedúci diplomovej práce: Ing. Michal Kuba, PhD. Oponent: doc. Ing. Roman Jarina, PhD. Dátum odovzdania diplomovej práce: 18. mája 2007 Obsah 1 Úvod ....................................................................................................................1 2 Cieľ riešenia .......................................................................................................2 3 Krátky popis komunikačného rozhrania MIDI..............................................4 3.1 Princíp hudobných komunikačných rozhraní...............................................4 3.2 Vznik rozhrania MIDI ..................................................................................4 3.3 Technická špecifikácia rozhrania MIDI .......................................................5 3.3.1 Hardvér rozhrania ...................................................................................5 3.3.2 PC Game port a MIDI ............................................................................7 3.3.3 Štruktúra protokolu MIDI.......................................................................8 3.3.4 Running Status........................................................................................9 3.3.5 Interpretácia a priorita dát ......................................................................9 3.3.6 Kanálové MIDI dáta ...............................................................................9 3.3.7 MIDI správy Nota zapnutá a Nota vypnutá..........................................11 3.3.8 Zmena kontroléru .................................................................................13 4 Midi Wind Conroller .......................................................................................16 5 Popis technického riešenia Wind Controllera...............................................18 5.1 Hmatový snímací systém ...........................................................................18 5.1.1 Mikrospínačový systém - tlačidlový systém ........................................18 5.1.2 Systém dotykových snímačov ..............................................................20 5.2 Hmatová mapa a hmatový systém Wind Controllera.................................23 5.3 Dychový snímač – Breath controller..........................................................24 5.4 Riadiaca jednotka – mikropočítač ..............................................................26 5.4.1 Výber a popis ovládacej jednotky ........................................................26 5.4.2 Univerzálne vstupy a výstupy ..............................................................29 5.4.3 AD prevodník .......................................................................................30 5.4.4 UART - nastavenie a vysielanie ...........................................................32 5.4.5 SPI – Serial Peripheral Interface ..........................................................34 5.4.6 Prepojenie riadiaceho prvku s perifériami – Wind Controller .............35 5.5 Hardvérová konštrukcia MIDI rozhrania ...................................................35 6 7 5.6 Napájacie obvody.......................................................................................36 5.7 Komunikácia Wind Controller - PC...........................................................36 Popis programového vybavenia Wind Controllera ......................................38 6.1 Súhrn inicializácií a priradení ovládačov k vývodom mikroprocesora......40 6.2 Popis priebehu programu ...........................................................................41 6.3 Funkcia CITAJ_HMAT .............................................................................43 6.4 Funkcie Read_ADC a USART_Transmit a ich využitie............................44 Wind Controller a jeho praktické využitie....................................................45 Záver ........................................................................................................................48 Zoznam použitej literatúry ....................................................................................49 ČESTNÉ VYHLÁSENIE.......................................................................................50 POĎAKOVANIE....................................................................................................51 PRÍLOHOVÁ ČASŤ..............................................................................................52 A.1 Hmatová mapa Wind Controllera ................................................................54 A.2 Pomocná hmatová mapa v tabuľkovej forme..............................................55 A.3 Elektrická schéma Wind Controllera ...........................................................56 A.4 Zoznam a kusovník súčiastok Wind Controllera ........................................57 A.5 Plošný spoj prototypu Wind Controllera a jeho osadzovací plán..............58 A.6 Wind Controller – fotografie prototypu.......................................................59 A.7 Programové rozhranie Wind Controllera....................................................60 Zoznam obrázkov a tabuliek Obr. 3.1: Zadný panel elektronického syntetizátoru s trojicou konektorov MIDI [8]. ............. 5 Obr. 3.2: UART rámec a dátové MIDI slovo ........................................................................... 6 Obr. 3.3: Schéma rozhrania MIDI [8]....................................................................................... 6 Obr. 3.4: Zapojenie rozhrania MPU-401 resp. Canon 15 ......................................................... 7 Obr. 3.5: Štruktúra stavového a dátového bytu protokolu MIDI.............................................. 8 Tab. 3.1: Kanálová MIDI dáta ................................................................................................ 10 Obr. 3.6: Štruktúra MIDI správy Note On – Nota Zapnutá .................................................... 11 Tab. 3.2: MIDI čísla nôt.......................................................................................................... 11 Tab. 3.3: MIDI rýchlostné dáta............................................................................................... 12 Obr. 3.7: Štruktúra MIDI správy Note Off ............................................................................. 13 Obr. 3.8: Štruktúra MIDI správy Control Change .................................................................. 13 Tab. 3.4: Základné rozdelenie MIDI kontrolérov................................................................... 14 Tab. 3.5: Kompletný prehľadný zoznam definovaných MIDI kontrolérov............................ 14 Tab. 3.6: MIDI povely ............................................................................................................ 16 Obr. 4.1: Prototyp EVI a jeho vnútro, AKAI EWI/EVI 1000, analógový Lyricon 1 od fy.... Computone, AKAI EWI 3020, Yamaha WX5 [12], [13]. ....................................... 17 Obr. 5.1: Obecný spôsob riešenia zákmitov mikrospínača..................................................... 19 Obr. 5.2: Spôsob konštrukcie mikrospínačového klapkového systému ................................. 19 Obr. 5.3: Obecné zapojenie dotykového spínača [14]. ........................................................... 20 Obr. 5.4: Schéma zapojenia kapacitných dotykových snímačov na obvod QT 1081............. 22 Obr. 5.5: Časť hmatovej mapy Wind Controllera................................................................... 23 Obr. 5.6: Systém snímania tlaku – tlaková komora ................................................................ 25 Obr. 5.7: Závislosť Uvýstupné senzora na vstupnom tlaku……………………………………..26 Obr. 5.8: Spôsob eliminácie rušenia. ...................................................................................... 26 Obr. 5.9: ATMEGA 16-16AU ................................................................................................ 28 Obr. 5.10: Prehľad rozloženia riadiacich bitov registrov ADC a SREG ................................ 31 Obr. 5.11: Prehľad rozloženia riadiacich bitov registrov USART ......................................... 34 Obr. 5.12: Elektrická schéma Wind Controllera..................................................................... 35 Obr. 5.13: Rozhranie UARTF - USB s IO FT232 .................................................................. 37 Obr. 5.14: M-Audio USB MIDI UNO rozhranie.................................................................... 38 Obr. 6.1: Vývojový diagram programu Wind Controller ....................................................... 41 Obr. 7.1: Mapovanie vyslaných MIDI príkazov pomocou programu MIDI-OX ................... 46 Obr. 7.2: Pracovná plocha programu Cubase SX ................................................................... 47 Zoznam skratiek a symbolov ASIO – Audio Stream Input/Output – ovládač zvukových kariet v prog. Cubase USI – Universal Synthesizer Interface – Univerzálne rozhranie pre syntetizátory NAMM – National Association of Music Merchants – názov hudobnej výstavy v USA MIDI – Musical Instruments Digital Interface - hudobné digitálne rozhranie MMA – MIDI Manufacturers Association JMSC – Japan MIDI Standard Committee DCB – Digital Communication Bus – digitálne hudobné komunikačné rozhranie IO – integrovaný obvod IT – Informatics Technotogies – Informačné technológie ADC – Analog-to-Digital Converter – Analógov-Digitálny prevodník RISC – Reduced Instruction Set Computer - redukovaná sada počítač. inštrukcií DDRx – Data Direction Register – smerový register dát mikroprocesora PINx – Port Input Pins – dátový register vstupných UART – Universal Synchronous-Asynchronous Receiver Transmitter MSB – Most Significant Bit (or Byte) – Bit (Byte) s najvyššou hodnotou (poradím) LSB – Least Significant Bit (or Byte) – Bit (Byte) s najnižšou hodnotou (poradím) PSoC – Programable System on the Chip – Programovateľný systém priamo na čipe PDIP – plastikové dvojradové puzdro IO (z angl. Plastic Dual Inline Package) TQFP – Thin (1 mm) Plastic Gull Wing Quad Flat Package – typ zapúzdrenia IO QFN/MLF – Quad Flat No-Lead/Micro Lead Frame Package – typ zapuzdrenia IO TTL – Transistor-transistor logic – logika pri použití tranzistorov FLASH – označenie programovej prepisovateľnej pamäti SRAM – Static Random Access Memory – dočasná pamäť EEPROM – Electrically erasable programmable read-only memory polovodičová prepisovateľná pamäť MIPS – počet inštrukcií za sekundu (z angl. Million Instructions Per Second) USB – zbernica (z angličtiny Universal Serial Bus) HEX – hexadecimálny tvar čísla v šesťnástkovej sústave DEC – dekadický tvar čísla v desiatkovej sústave Slovník termínov EVENT – udalosť, ktorá sa vyvolá v programe ako reakcia na akciu BUFFER – rýchli zásobník pre ukladanie dát CV/Trig – Control Voltage/Trigger Voltage – Analóg. napäťovo riadené hudob né komunikačné rozhranie. CV -riadiace napätie, spúšťací signál Trig Voltage C++ – univerzálny programovací jazyk nízkej úrovne,využívajúci i objekty Nibble – prehľadný spôsob vyjadrenia osem bitového slova rozdelením na dve štvorbitové slová vyjadrené ciframi šestnásťkovej sústavy. Mikrokontrolér – tiež nazývaný jednočipový mikropočítač je špeciálny druh mikroprocesora pre zákaznícky špecifické koncové aplikácie. Assembler – nízko úrovňový programovací jazyk mikroprocesorov Kompilér – prekladač, ktorý preloží kód jazyka do strojového kódu Frame – rámec je presný formát vysielaných bitov, ktorých význam prijímate jednoznačne rozpozná I/O pins – Input/Output piny - vstupno/výstupné adresné vývody IO Kontrolér – Ovládač. V MIDI zariadenie, alebo aj typ správy určujúcej rôzne parametre MIDI nôt alebo príkazov PORTx – Výstupný Data Register univerzálnych portov mikroprocesora Komunikačné Rozhranie – súbor elektronických prvkov potrebných na pripojenie zariadenia k inému zariadeniu, príp. ku komunikačnej zbernici, za účelom prenosu údajov. Týmto pojmom sa označuje aj súbor noriem, predpisov a komunikačných protokolov určujúcich vlastnosti takéhoto pripojenia[10]. Notácia – Taktiež notový zápis, ľudovo noty - systém záznamu skladieb a hubdy pomocou grafických symbolov (nôt) a prípadne i skratiek slov. Nota – grafický symbol označujúci dĺžku tónu a výšku pomocou svojho umiestnenia v Notovej osnove. Notová osnova – systém, ktorý pomáha určiť výšku noty. Kľúč – určuje referenčnú notu, od ktorého sa počítajú všetky ostatné. Takt – označujúci pravidelné striedanie prízvučných a neprízvučných nôt, alebo aj slová resp. skratky označujúce tempo, v ktorom sa má skladba hrať, dynamiku skladby alebo silu jednotlivých tónov [10]. Hudobný nástroj – je zariadenie k vydávaniu tónov a zvukov používaných v hudbe. Takmer všetko, čo vydáva zvuk, môže byť použité ako hudobný nástroj. Delia sa podľa: princípu vytvárania zvuku, spôsobu hry materiálu, z ktorého sú vyrobené [10]. Dychové nástroje – skupina hudobných nástrojov. Zvuk vzniká rozochvievaním vzduchového stĺpca. Výška tónu závisí od parametrov stĺpca, ktoré sa menia, napríklad rôznym zakrývaním a odokrývaním dierok na nástroji [10]. Syntetizátor – elektronický hudobný nástroj, ktorý tvorí výsledný zvuk syntézou, tzn. generovaním jednotlivých zložiek zvuku a ich skladaním resp. kombináciou harmonických zložiek Môžu byť analógové alebo digitálne, podľa formy spracovávaných signálov alebo dát [10]. Embedded systém – vstavaný systém, zabudovaný systém. Jednoúčelový systém určený pre vopred definované činnosti, v ktorom je riadiaci počítač úplne zabudovaný do zariadenia, ktoré ovláda [10]. AD prevodník – Elektronické zariadenie na prevod analógového signálu na digitálny signál. MIDI Wind Controller – Elektronický hudobný dychový nástoj pracujúci na báze MIDI štandardu. Sampler – zariadenie na manipuláciu s krátkymi nahranými zvukovými sekvenciami (samplami), ktoré umožňuje rôzne kombinovať, opakovať, programovat, ako napr. aj spúšťať zo zvukovej karty pomocou MIDI príkazov. 1 1 Úvod „Hudba hýbe svetom.” Proti tomuto výroku by možno niekto namietal, že sú to hlavne peniaze a nie hudba, čo dokáže ovládať masy. Ale po hlbšom zamyslení zistíme, že to na čo peniaze musia použiť “tvrdú silu“, hudbe stačí rozoznieť pár jemných tónov alebo rytmicky vhodných zvukov. Hudba, ako jeden z najstarších umeleckých prejavov, má svoju históriu. Od antických čias, kedy bola považovaná za božskú výsadu a verilo sa v jej zázračnú moc, prešla rozmanitou cestou, na ktorej sa menila, zaznamenávala pulz doby, jej tempo, slovník, spôsob komunikácie, postoje, módu. Ako sa menila hudba, tak sa menili i spôsoby jej stvárňovania a reprodukcie, najmä pomocou hudobných nástrojov. Hudobné nástroje vznikali už v dávnom staroveku. Mnohé z nich sa vytvárali celé tisícročia a ešte stále vznikajú nové nástroje alebo ich vylepšenia. Príchodom informačných technológií sa naskytli nové možnosti ich využitia aj pri vzniku nových netradičných hudobných nástrojov. Rozhodujúcim krokom pri využití IT v hudobnom priemysle bolo vytvorenie a dňa 5. 8. 1983 oficiálne prijatie prvej verzie medzinárodného štandardu pre digitálne rozhranie elektronických hudobných nástrojov MIDI - Musical Instruments Digital Interface. Na základe tohto štandardu je možné, okrem veľkého množstva iných možností, ako je napr. možnosť riadenia osvetľovacej techniky rôznych zvukových a divadelných scén, vytvárať aj hudobné nástroje, komplexne nazývané MIDI Controllers, tzn. MIDI ovládače alebo MIDI kontroléry. Tieto elektronické hudobné nástroje sú tvarom i spôsobom hry veľmi podobné tým klasickým. Náznak prvého analógového elektronického Wind ovládača siaha už do 30. rokov 19. storočia. Prevratne obdobie pri rozvoji Wind kontrolérov nastalo v 70. rokoch, kedy sa začali produkovať analógové Wind ovládače založené najmä na napäťovom riadení CV/Trig syntézy. Prvé MIDI Wind ovládače sa začali vyrábať približne až 4 roky po oficiálnom prijatí MIDI štandardu. Od tej doby firmy ako Yamaha, Akai a iné skonštruovali niekoľko typov Wind Controllerov, ktoré sa na trhu uchytili, no ich cena sa konštantne drží na vysokej úrovni a „know-how” ich výroby je verejnosti nedostupné a držané v tajnosti. I z týchto dôvodov som si vybral návrh MIDI Wind Controllera ako tému mojej diplomovej práce. 2 2 Cieľ riešenia Cieľom tejto diplomovej práce je navrhnutie elektronického hudobného nástroja Wind Controller pracujúceho na základe štandardu MIDI, ako náhrady jednoduchého dychového nástroja. Keďže posledný z bodov zadania je overenie správnej funkčnosti tohto navrhnutého zariadenia, stáva sa hlavným a konečných cieľom tejto práce vytvorenie fyzického prototypu a ohodnotenie vhodnosti spôsobu riešenia. Obsahom výroby prototypu je riešenie najmä dvoch hlavných problémov, pomocou ktorých môžme celý projekt rozdeliť na riešenie čiastkových úloh. Prvá úloha spočíva v hardvérovom stvárnení a načrtnutí i iných možností technického vybavenia ovládača, ako aj vo vnútornom prepojení hlavných častí ovládača. Druhý, a asi aj najkomplexnejší problém, sa týka vytvorenia funkčného softvérového rozhrania, závislého nielen na štandarde MIDI, ale i na hardvérovom vyhotovení MIDI ovládača. Následne, pre úplnú funkčnosť návrhu, je potrebné navrhnúť nejaké spôsoby prepojenia a komunikácie tohto zariadenia s PC. Keďže riešenie tohto problému nie je vyžadované v zadaní, stáva sa okrajovým, i keď nemenej dôležitým. Preto som sa rozhodol venovať i tomuto problému určitú časť mojej práce. Jednu z posledných kapitol tejto práce by som chcel venovať praktickému využitiu tohto zariadenia v spolupráci s PC softvérom a ďalšie praktické využitie týchto prijatých signálov pomocou hudobného softvéru dostupného na trhu., pretože je to jeden z najdôležitejších prínosov tohto zariadenia. Návrh hardvérového ovládača spočíva v nasledovných bodoch a má spĺňať nasledovné parametre: • možnosť aspoň základnej hry na daný Wind ovládač i v prototypovom vyhotovení • návrh snímacieho hmatového systému – hmatová mapa Wind ovládača má minimálne 1,5 oktávový rozsah • vhodné snímacie senzory „klaviatúry“ a ovládačov. Treba sa zamerať najmä na výber senzora prietoku vzduchového stĺpca – výber „dychového kontroléra“, prípadne iného systému ovládania nástroja dychom a jeho základná technická špecifikácia 3 • návrh a priradenie jednotlivých funkcií a možností hardvérových ovládačov Wind Controllera, ako aj ich logických prepojení s hlavným dychovým kontrolérom. Zaručená je úplná voľnosť v počte funkcií ovládačov a aj ich prepojenia • výber riadiaceho prvku, tzn. mikroprocesoru vhodného na aplikáciu v zariadení. Úlohou mikroprocesora bude zhromažďovať a transformovať do digitálnej reprezentácie potrebné informácie zo vstupných periférií. Konkrétne najmä: o prevod analógového napätia z tlakového senzora o sledovanie logickej hodnoty vývodov, na ktorých sú zapojené obvody „klaviatúry“. Softvér prislúchajúci k ovládaču by, podľa môjho návrhu, mal spĺňať tieto požiadavky a plniť tieto funkcie: • programové rozhranie vytvorené pomocou prístupného vývojového prostredia • vyhľadanie stlačenej kombinácie hmatu a následné priradenie k príslušnej hodnote noty • určovať z výsledných hodnôt A/D prevodu hlasitosť a okamih vzopnutia MIDI noty • vytváranie MIDI slov z prijatých informácií potrebných na ich vytvorenie • zabezpečiť vysielanie riadiacich MIDI slov, resp. MIDI sekvencií na výstupné obvody • vysielanie pomocou UART sériovej komunikácie s prenosovou rýchlosťou určenou MIDI štandardom. Ako sme už spomenuli, navrhnutý Wind Controller má byť náhradou jednoduchého dychového nástroja. Preto som sa konkrétne rozhodol, že pôjde o náhradu sopránovej zobcovej flauty, z čoho nám vyplývajú hlavné parametre nášho MIDI nástroja. A to sú: • hmatový systém priamo súvisiaci s počtom hlavných ovládacích prvkov MIDI ovládača. Ako bude z hmatovej mapy alebo i konštrukcie ovládača vidieť, na ovládanie výšky tonu používame 11 spínačov, ktorých stav budeme v programe cyklicky mapovať. 4 • moment vzopnutia, spôsob nábehu, ako i priebehu (napr. hlasitosti) daného tónu resp. generovanej MIDI noty, je riadené iba momentom prekročenia prahovej hodnoty a silou (tlakom) fúknutia resp. fúkania do náustka nástroja. Z toho vyplýva použitie A/D prevodníka na zdigitalizovanie zosnímaného tlaku alebo prietoku vzduchu ako vstupnej analógovej veličiny. 3 Krátky popis komunikačného rozhrania MIDI Základom pri navrhovaní MIDI ovládača je aspoň čiastočné poznanie štandardu MIDI. V tejto kapitole bude popísaný komunikačný štandard MIDI v rozmedzí od jeho vzniku, až po získanie základného prehľadu tohto hudobného rozhrania, potrebného pri navrhovaní MIDI ovládača. 3.1 Princíp hudobných komunikačných rozhraní Podľa Schimmela [8], myšlienka umožniť komunikáciu medzi hudobnými nástrojmi vzájomne a počítačmi, bola motivovaná snahou znásobiť paralelným prepojením nástrojov množstvo zvukových farieb znejúcich súčasne a umožnenia ich pripojenia na počítač. Takéto prepojenie by umožnilo automatizovanú hru, zadávanie a editáciu hudobných dát mimo reálny čas, prevod na štandardnú notáciu atd. Dáta prenášané v hudobnom komunikačnom rozhraní nie sú audio - signálom, ako si mnohý myslia, ale sú to iba riadiace dáta zodpovedajúce udalostiam vzniknutým v priebehu hry na elektronický hudobný nástroj. Takouto udalosťou je napríklad stlačenie alebo uvoľnenie klávesy, zmena zvukového programu atď. 3.2 Vznik rozhrania MIDI Cesta ku najpoužívanejšiemu hudobnému komunikačnému rozhraniu nebola ľahká. Nekompatibilita používania predošlých rozhraní (napr. analógového napätím riadeného CVTrig alebo i digitálneho DCB) bola všeobecnou brzdou vo vývoji digitálnej hudby. Preto sa v roku 1981 na výstave NAMM (National Association of Music Merchants) v Anaheimu v USA stretli prezidenti firiem Sequential Circuits, Oberheim a Roland aby prerokovali predbežné návrhy na univerzálne rozhranie hudobných nástrojov. Vypracovali návrhy, ku 5 ktorým sa pripojili firmy Yamaha, Korg a Kawai. V októbri 1981 predviedli Dave Smith a Chet Wood na konferencii Audio Engineering Society v New Yorku prvý ucelený návrh hudobného rozhrania USI (Universal Synthesizer Interface). K projektu sa pridalo spolu 15 amerických a japonských firiem a firma Roland navrhla pre budúce rozhranie názov MIDI - Musical Instruments Digital Interface (digitálne rozhranie hudobných nástrojov). Už v januári 1983 boli predvedené prvé nástroje s MIDI rozhraním - SCI Prophet 600 a Roland Jupiter JP-6 [8]. Konečná verzia MIDI normy 1.0 (dokument o 15 stranách) bola ponúknutá 5. 8. 1983. Štandard bol v konkrétnych detailoch nejasný, a tým dochádzalo opäť k problémom s kompatibilitou. Preto boli v roku 1984 založené normatívne orgány zodpovedné za dodržiavanie normy MIDI a jej ďalší vývoj - MMA (MIDI Manufacturers Association) a JMSC (Japan MIDI Standard Committee). V septembri 1985 vyšla podrobná MIDI norma, ale ďalší vývoj MIDI si postupom času vynútil celú radu dodatkov a doplnkov - prvé sú už z januára 1986. I v dnešnej dobe je MIDI norma neustále vo vývoji, aj keď už vďaka svojmu zastaranému princípu prestáva spĺňať hlavné rýchlostné požiadavky na komunikačnom rozhraní, kladené modernou štúdiovou a hudobnou elektronikou. 3.3 Technická špecifikácia rozhrania MIDI 3.3.1 Hardvér rozhrania Rozhranie MIDI (obr. 3.1) je jednoduché. Skladá sa z troch 5-pinových konektorov DIN označených In, Out a Thru [4], [5]. Tieto porty sú väčšinou súčasťou každej kvalitnejšej zvukovej karty v počítači. Konektor In je vstupný a na konektor Out sú vysielané MIDI správy generované zariadením a na konektor Thru sú kopírované dáta prichádzajúce na vstup prístroja. Posledný menovaný konektor nemusí byť vždy použitý. Niektoré MIDI zariadenia používajú funkciu Soft Thru, ktorá zlučuje vstupné dáta s interne generovanými dátami a všetko posiela na konektor Out. Obr. 3.1: Zadný panel elektronického syntetizátoru s trojicou konektorov MIDI [8]. 6 MIDI zbernica je 5 mA prúdová slučka, logická nula odpovedá pretekajúcemu prúdu. Používa sériový asynchrónny dátový prenos s rýchlosťou 31,25 kBaudu s toleranciou ±1%. Rámec sa skladá z jedného štart bitu, ôsmich dátových bitov a jedného stopbitu. Paritný bit nie je použitý [2]. Názorná ukážka rámca obsahujúceho jedno MIDI slovo je na obr. 3.2 a schéma MIDI rozhrania je na obr. 3.3. Obr. 3.2: UART rámec a dátové MIDI slovo Aby sa zabránilo zemným slučkám medzi prístrojmi, zem na konektoroch nemá byť spájaná so zemou k prístroju a na MIDI IN vstupe nástroja má byť optoizolátor s časom reakcie menším než 2 ms (napr. Sharp PC-900) galvanicky oddeľujúci vstup od prístroja. Hardvér na obr. 3.3 je potom súčasťou MIDI káblu. Obr. 3.3: Schéma rozhrania MIDI [8]. 7 3.3.2 PC Game port a MIDI U starších počítačov a prídavných kariet pre joysticky, nie je ich súčasťou MIDI port. Štandardizovaným rozhraním MIDI pre PC je tzv. Game port reprezentovaný ako 15 pinový konektor Canon (Roland MPU-401 - samica). Obr. 3.4: Zapojenie rozhrania MPU-401 resp. Canon 15 Rozhranie má 2 režimy - inteligentný režim a režim UART [6]. V inteligentnom režime sa rozhranie MPU-401 stará o časovanie komunikácie a ukladanie MIDI správ do vyrovnávacej pamäte, takže uľahčuje CPU počítača. V režime UART sa MPU-401 chová ako normálny obojsmerný sériový port, ktorý odosiela dáta do MIDI ihneď po prijatí z počítača a prijaté MIDI dáta sú ihneď posunuté počítaču. V súčasnej dobe sa používa len režim UART, o časovanie komunikácie sa stará CPU, takže možno niekoľkokrát (obyčajne 4 - 16krát) zvýšiť časovanie MIDI rozhrania. CPU komunikuje s rozhraním MPU pomocou dvoch štandardných I/O portov na adresách $330 (Status / Command port) a $331 (Data port). Zápisom na adresu $330 dostáva MPU nový príkaz, čítaním tej istej adresy obdrží CPU stav rozhrania. Zápisom na adresu $331 sa vysielajú dáta, čítaním sa získavajú prijaté MIDI dáta. Ovládač MPU pracuje rovnako ako ovládače iných periférií. Buďto môže stále monitorovať stav prijatých dát (tzv. polling) alebo možno využiť prerušenie a naprogramovať jeho obsluhu. Interface MPU-401 mô- 8 že vyvolať hardwarové alebo softvérové prerušenie, v dnešnej dobe sa používa výhradne softvérové [6]. 3.3.3 Štruktúra protokolu MIDI Základný dátový blok, prenášajúci určitú informáciu, sa nazýva "MIDI správa - sek- vencia" (MIDI message). Tá sa skladá z jedného stavového a niekoľkých dátových MIDI bytov - slov. Týmto bytom sa tiež hovorí "MIDI udalosť" (MIDI event). V niektorých publikáciách je nesprávne takto označovaná i MIDI správa. MIDI Byte je osembitový dátový typ, kde najvýznamnejší bit určuje, či ide o byte stavový (MSB=1), dátový (MSB=0), obr. 3.4. MIDI správy sa delia na tzv. kanálové dáta a systémové dáta. Kanálové dáta prenášajú v stavovom „evente“ informáciu o virtuálnom dátovom kanále. V stavovom „evente“ sú pre identifikáciu MIDI kanálu vyhradené štyri bity (obr. 3.4), preto môžu byť po jednej fyzickej MIDI zbernici prenášané kanálové dáta až v 16 virtuálnych kanáloch. Systémové dáta informáciu o MIDI kanále neprenáša - sú spoločné pre všetky kanály. Dolné štyri bity stavového eventu slúžia na identifikáciu typu systémových dát. Systémové dáta sa delia na zvláštne systémové dáta, ktoré umožňujú prenos väčších dátových blokov, a na dáta reálneho času, ktoré slúžia na vzájomné časové synchronizácie niekoľkých zariadení [8]. Obr. 3.5: Štruktúra stavového a dátového bytu protokolu MIDI 9 Počet dátových bytov závisí na type MIDI správy, t.j. na stavovom byte. Napríklad správa "Nota zapnutá" prenáša číslo noty (tón) a silu stlačenia klávesy. Najvýznamnejší bit v dátovom bite je vyhradený pre identifikátor, preto môžu byť hodnoty prenášané pomocou dátových bitov v rozsahu 0 až 127. 3.3.4 Running Status Aby sa zväčšila priechodnosť MIDI zbernice, nie je nutné v prípade kanálových dát vždy vysielať úplné MIDI správy. Pokiaľ sa nemení typ informácie určený stavovým bytom, stačí vysielať len dátové byty. Za kompletnú správu je považovaný len zodpovedajúci počet dátových bytov. Tým sa ušetrí asi tretina kapacity MIDI zbernice. Tento stav sa nazýva Running Status (priebežný stav). Tento stav platí až do tej doby, než je prijatý odlišný stavový byte, alebo po pretečení v poradí 127 databytu. Toto obmedzenie má za úlohu ochrániť vstupný MIDI „buffer“ pred pretečením, v zariadeniach ktoré vyžadujú prijatie kompletnej správy pred tým, ako ju spracujú. 3.3.5 Interpretácia a priorita dát Nástroje musia ignorovať všetky nedefinované a neimplementované stavové byty a k nim prislúchajúce dátové byty. Tak isto musia ignorovať dátové byty bez príslušného stavového bytu, pokiaľ nie je zbernica v priebežnom stave. Dáta v MIDI systéme majú nasledujúce priority: • resetovanie systému • dáta reálneho času • zvláštne systémová dáta • spoločné systémové dáta • kanálové dáta Dáta reálneho času môžu byť vysielané, aj keď je MIDI zbernica v priebežnom stave, bez toho aby došlo k jeho zrušeniu. 3.3.6 Kanálové MIDI dáta Kanálové MIDI dáta sa vzťahujú k určitému MIDI kanálu, ktorého číslo je prenášané v dolnom nibble stavového bytu. Ako je vidieť z obr. 3.4, pre identifikátor kanálových dát sú 10 v stavovom byte vyhradené tri bity. K dispozícii je teda sedem identifikátorov, ôsmy je vyhradený pre systémové dáta. Tab. 3.1: Kanálová MIDI dáta počet MIDI správa Význam ID Note Off Nota vypnutá 0 2 Note On Nota zapnutá 1 2 Polyphonic Key Pressure Individuálna tlaková citlivosť 2 2 Control Change Zmena kontroleru 3 2 Program Change Voľba programu 4 1 Channel Pressure spoločná tlaková citlivosť 5 1 Pitch Bend Change ohýbanie tónu 6 2 databytov Prijímač MIDI môže pracovať v jednom zo štyroch režimov, ktoré určujú, akým spôsobom sú kanálové MIDI dáta spracované. Tieto režimy sú použité podľa nastavení OMNI ON/OFF a POLY/MONO a realizujú sa pomocou kontrolérov č. 124 – 127 (viď tab. 3.6). režim 1: Omni On, Poly režim 3: Omni Off, Poly režim 2: Omni On, Mono režim 4: Omni Off, Mono Režimy MONO a POLY určujú, ako sú priradené jednotlivé hlasy prijímača, pokiaľ je zároveň prijatých viac nôt. V režime MONO hrá každý hlas prijímača monofónne noty, prijaté na odpovedajúcom kanále. V režime POLY hrajú hlasy prijímača prijaté noty polyfónne. Pokiaľ je zapnutý režim OMNI, bude nástroj spracovávať prijaté dáta zo všetkých kanálov, pokiaľ je vypnutý, bude reagovať len na dáta na zvolenom MIDI kanále. Pokiaľ na nástroji nie je možné nastaviť prijímací kanál, mal by prijímať vždy na kanále 1. V režime 4 sú prehrávané noty prijaté na MIDI kanáloch N až N+M-1, kde N je základný kanál nastavený na prijímanie a M je počet MIDI kanálov špecifikovaný MIDI správou na prepnutie režimu MONO. Hodnota M=0 je špeciálny prípad, ktorý hovorí prijímaču, aby použil všetky dostupné hlasy pre hranie nôt prijatých na kanáloch N až 16 [8]. V prípade nášho Wind Controllera budeme používať režim 4: OMNI-OFF/MONO 11 Tretí byte „Mono kontroléra“ špecifikuje čísla kanálov v ktorých budú posielané MONO správy. 3.3.7 MIDI správy Nota zapnutá a Nota vypnutá MIDI správa Note On (Nota zapnutá) má identifikátor 1 a prenáša informácie o stla- čenej klávese, t.j. o zahranej note. Prvý dátový byt prenáša informácie o MIDI čísle noty a druhý dátový byt informácie o dynamike, s akou bola nota zahraná (viď obr. 3.6). Stavový byte 1. dátový byte 2. dátový byte 1001nnnn 0kkkkkkk 0vvvvvvv $9n číslo noty rýchlostné dáta Obr. 3.6: Štruktúra MIDI správy Note On – Nota Zapnutá (Pozn.: Označenia „n, k, v“ označujú premenné hodnoty bitov, nastavované podľa potreby) Tab. 3.2: MIDI čísla nôt Hud. označenie MIDI Oktáva C C# D D# E F F# G G# A A# H Sub-subkontra -2 0 1 2 3 4 5 6 7 8 9 10 11 subkontra -1 12 13 14 15 16 17 18 19 20 21 22 23 Kontra 0 24 25 26 27 28 29 30 31 32 33 34 35 veľká 1 36 37 38 39 40 41 42 43 44 45 46 47 malá 2 48 49 50 51 52 53 54 55 56 57 58 59 Jednočiarkovaná 3 60 61 62 63 64 65 66 67 68 69 70 71 Dvojčiarková 4 72 73 74 75 76 77 78 79 80 81 82 83 Trojčiarkovaná 5 84 85 86 87 88 89 90 91 92 93 94 95 Štvorčiarkovaná 6 96 97 98 99 100 101 102 103 104 105 106 107 Päťčiarkovaná 7 108 109 110 111 112 113 114 115 116 117 118 119 Šesťčiarkovaná 8 120 121 122 123 124 125 126 127 12 Pre čísla MIDI nôt je možné použiť sedem bitov, tj. hodnoty od 0 do 127. V MIDI sú noty očíslované od C-2 do G8 čo v podľa Europskej tónovej sústave rozsah od veľké C3 až malé g6 (viď tab. 3.2). Wind Controller využíva rozsah označený žlťou farbou. Druhý dátový byte správy Note On určuje dynamiku, s akou bola nota zahraná. Túto informáciu možno využiť pre nastavenie intenzity zahraného tónu alebo pre nastavenie iného parametra meniaceho farbu zvuku. Klaviatúrou sú teda snímané a v správe Note On prenesené rýchlostné dáta, tzv. Velocity. Vzťah rýchlostných dát a dynamiky tónu ukazuje tab. 3.3. Klaviatúry, ktoré nemajú rýchlostný snímač, by mali vysielať hodnotu Velocity = 64. Špeciálnym prípadom Velocity je hodnota 0, ktorá znamená "nota vypnutá". Vďaka tomu nie je nutné pri uvoľnení klávesy posielať správu "nota vypnutá" (Note Off, viď ďalej), ale správu "nota zapnutá s dynamikou 0". Po prijatí tejto správy MIDI prijímač prestane zodpovedajúci tón hrať. To umožňuje využiť priebežný stav pre zapínanie a vypínanie kláves. Tab. 3.3: MIDI rýchlostné dáta Velocity Dynamika Hudobné označenia 0 off Vypnuté 1 ppp pianissimo piano pp Pianissimo p Piano mp mezzo-piano mf mezzo-forte f Forte ff Fortissimo fff fortissimo forte 64 127 MIDI správa Note Off (nota vypnutá) má identifikátor 0 a prenáša informácie o uvoľnenej klávese. Prvý dátový byte prenáša informáciu o MIDI čísle noty a druhý dátový byte informáciu o rýchlosti, s akou bol kláves uvoľnený (viď obr. 3.7). To, že je prenášaná informácia o rýchlosti uvoľnenej klávesy, umožňuje napodobňovať niektoré techniky hrania napr. na strunné nástroje, v skutočnosti sa ale táto informácia väčšinou nepoužíva. 13 Stavový byte 1. dátový byte 2. dátový byte 1000nnnn 0kkkkkkk 0vvvvvvv $8n číslo noty rýchlostné dáta Obr. 3.7: Štruktúra MIDI správy Note Off 3.3.8 Zmena kontroléru MIDI správa Control Change (zmena kontroléru) má identifikátor 3 a prenáša infor- mácie o zmene hodnoty tzv. kontroléru - ovládacieho parametra MIDI nástroja, napr. hlasitosti, modulácie (viď tab. 3.5). Prvý dátový byte prenáša informáciu o čísle MIDI kontroléru a druhý dátový byte jeho novú hodnotu (viď obr. 3.8). Stavový byte 1. dátový byte 2. dátový byte 1011nnnn 0ccccccc 0vvvvvvv $Bn Číslo kontroleru hodnota kontroleru Obr. 3.8: Štruktúra MIDI správy Control Change Pre väčšinu MIDI zariadení používajúcich protokol MIDI pre nastavovanie rôznych parametrov je 128 hodnôt, aké môže MIDI kontrolér jedným dátovým bytom nadobúdať, málo. Preto sú pre niektoré MIDI kontroléry vyhradené 2 čísla. Teda okrem jednobitových kontrolérov je definovaných i 32 dvojíc kontrolérov, ktoré prenášajú zvlášť významnejší byte (Most Significant Byte MSB) a menej významný byte (Least Significant Byte LSB). Rozlíšenie je potom 14 bitov, t.j. celkový počet hodnôt, ktoré môže taký kontrolér nadobúdať, je 16384. MIDI kontroléry sa delia z niekoľkých hľadísk. Z hľadiska funkcie sa delia na: • priebežné (spojité) - môžu nadobúdať všetky hodnoty v rozsahu, minimálna hodnota je 0, maximálna 127. Výnimkou sú kontroléry č.8 Balance, č.10 Pan (panoráma) a č.11 Expression, ktoré majú ako východziu, strednú hodnotu, t.j. 64. Hodnota 0 znamená maximálnu hlasitosť v ľavom kanály a 127 v pravom. Controller Expression je určený pre pedál na relatívnu zmenu hlasitosti nástroja oproti nastavenej hlasitosti. 14 • Spínače - nadobúdajú iba stav „vypnuté" (hodnoty 0 až 63) a "zapnuté" (64 až 127). • Inkrementačné / dekrementačné - na prenášanej hodnote nezáleží, pretože funkcia je jasne daná jednoduchým prijatím čísla kontroléru - pripočítaním alebo odpočítaním 1 od hodnoty parametru. Druhý dátový byte je väčšinou rovný 127. • Povely - na prenášanej hodnote nezáleží, funkcia je opäť daná jednoduchým prijatím čísla kontroléru. Výnimkou je kontrolér č.122 Local Control, u ktorého hodnota 0 znamená vypnuté a 127 zapnuté. Všetky ostatné povely majú v druhom stavovom byte vždy nulu. Tab. 3.4: Základné rozdelenie MIDI kontrolérov 0 - 31 MSB dát priebežných (spojitých) kontrolerov 32 - 63 LSB kontroleru 0 až 31 64 - 96 Ďalšie jednobitové kontrolery 96 - 101 inkrementácia/dekrementácia a čísla parametrov 102 - 119 nedefinované jednobitové kontrolery 120 - 127 Povely Tab. 3.5: Kompletný prehľadný zoznam definovaných MIDI kontrolérov Názov Význam 0 Bank Select voľba banky 1 Modulation wheel modulačné koliesko 2 Breath Controller dychový ovládač 3 Undefined nedefinovaný 4 Foot controller nožný ovládač 5 Portamento time čas Portamenta 6 Data entry MSB dáta (MSB) 7 Channel Volume kanálová hlasitosť Číslo 15 8 Balance Vyváženie 9 Undefined nedefinovaný l0 Pan panoráma 11 Expression Controller ovládač Expression 12 Effect Control 1 riadenie efektu 1 13 Effect Control 2 riadenie efektu 2 14-15 Undefined nedefinovaný 16 -19 General Purpose Controllers ovládače pre obecné použitie 20 – 31 Undefined nedefinovaný 32-63 LSB for values 0-31 LSB pre kontroléry 0-31 64 Damper pedal (sustain) Damper pedál (podržanie tónov) 65 Portamento On/Off zapnutie/vypnutie portamenta 66 Sostenuto Sostenuto 67 Soft pedal Soft pedál 68 Legato Footswitch nožný spínač Legato 69 Hold 2 druhý spínač Hold 70-79 Sound Controller 1 zvukový ovládač 1-10 80 – 83 General Purpose Controllers ovládače pre obecné použitia 84 Portamento Control riadenie portamenta 85-90 Undefined nedefinovaný 91-95 Effects 1-5 Depth hĺbka efektu 1-5 96 Data increment zvýšenie hodnoty o 1 97 Data decrement zníženie hodnoty 0 1 98 Non-Registered Parameter N. LSB LSB neregistrovaného čísla parametra 99 Non-Registered Parameter N. MSB MSB neregistrovaného čísla parametra 100 Registered Parameter Number LSB LSB registrovaného čísla parametra 101 Registered Parameter Number MSB MSB registrovaného čísla parametra 102-119 Undefined nedefinovaný 120-127 Reserved for Channel Mode Messages rezervované - povely kanálového režimu 16 Priradenie jednotlivých čísel kontrolérov konkrétnym parametrom MIDI prijímača je viac-menej na výrobcovi daného zariadenia. Povely (viď tab. 3.6) sú však v MIDI norme definované striktne. Tab. 3.6: MIDI povely MIDI povel číslo kontroleru Význam All Sound Off 120 všetky zvuky vypnuté Reset All Controllers 121 reset všetkých kontrolerov Local Kontrol 122 Lokálne riadenie zapnuté ($7F) / vypnute ($00) All Notes Off 123 všetky noty vypnuté Omni Off 124 režim Omni zapnutý Omni On 125 režim Omni vypnutý Mono On 126 režim Mono zapnutý (Poly vypnutý) Poly On 127 režim Poly zapnutý (Mono vypnutý) 4 Midi Wind Conroller MIDI kontrolér – všetky zariadenia, ktoré môžu, ale nemusia, pripomínať tradičný hudobný nástroj, určené na externé ovládanie elektronických hudobných nástrojov alebo programov v PC pomocou MIDI príkazov resp. sekvencií. Mnohé z nich pracujú na rovnakých princípoch ovládania hry ako tradičné hudobné nástroje, ale zopár i na úplne iných. Jedno majú ale spoločné – záleží hlavne na akcii hudobníka, jeho fyzických schopnostiach a talente, akú hudbu spod rúk, prstov alebo celého tela vyčaruje [2]. Midi Wind Controller - ide v podstate o MIDI kontrolér (dychový nástroj) tvarom zvyčajne pripomínajúci flautu, klarinet alebo saxofón, riadený špecifickými spôsobmi ovládania a určitými možnosťami, ktorými sa nevyznačujú iné MIDI kontroléry. Veľkou výhodou týchto nástrojov, je možnosť využiť pestrú paletu iných zvukov, a tým integrovať do jedného systému veľké množstvo farieb zvukov, ktorými sa vyznačujú rôzne klasické hudobné nástroje. Ďalšou výhodou, ktorá je pre mnohých užívateľov MIDI nástrojov, tou najdôležitejšou, je cena. Náklady na zaobstaranie si takého súboru hudobných 17 nástrojov, aký môžme obsiahnuť v jednom MIDI systéme, by presiahli aj cenu špičkového MIDI nástroja, špecializovaného na určitý typ hudobných nástrojov (napr. dychové nástroje). Za „otca Wind Controllerov“ sa pokladá hudobník Nyle Steiner z Los Angeles so svojím prototypom Wind kontroléru s názvom EVI – Electronic Valve Instrument z roku 1974 zobrazený na (obr. 4.1) spolu s inými typmi Wind Controllerov dostupných na trhu. Obr. 4.1: Prototyp EVI a jeho vnútro, AKAI EWI/EVI 1000, analógový Lyricon 1 od fy. Computone, AKAI EWI 3020, Yamaha WX5 [12], [13]. 18 5 Popis technického riešenia Wind Controllera Dychový MIDI kontrolér, ktorého návrh tu bude popísaný, má byť náhradou jednoduchej zobcovej flauty s určitými vylepšeniami a zmenami. Ide o predbežný a prvý návrh zariadenia, ktorého účelom je hlavne praktická skúsenosť s využitím základných funkcií MIDI štandardu, a tak kontrolér nebude veľmi komplikovaný. Jednou z podstatných vlastností tohto zariadenia je kompatibilita so všetkými existujúcimi systémami schopnými prijímať MIDI dáta. Pri návrhu bude poukázané na iné možné technické riešenia rôznych častí ovládača, od riadiaceho procesora, až po snímanie hmatov, a ich výhody. V zásade sa každý dychový MIDI kontrolér skladá z týchto hlavných častí: • Riadiaca jednotka – Mikrokontrolér • Dychový snímač • Analógovo-digitálny prevodník • Snímače prstokladu (hmatu) • Výstupné a napájacie obvody Tieto jednotlivé časti spolu úzko súvisia a ich parametre pri výbere, a teda aj opise, sa v mnohom prelínajú. Preto začneme opisom toho jednoduchšieho a to hmatovým snímacím systémom. 5.1 Hmatový snímací systém Pomocou hmatového systému získavame informácie na určenie výšky hraného tónu, resp. zmenu medzi tónmi. Snímanie hmatu patrí síce medzi technicky najjednoduchšie operácie, ktoré sa dejú na ovládači, ale presnosť a bezchybnosť určenia hmatu, ako aj jeho rýchlosť odozvy na zmenu držaného hmatu je nemenej dôležitá, ako všetky ostatné funkcie ovládača. Informáciu z hmatového systému spracováva riadiaci prvok, ktorého popis a spôsob zapojenia na použitú senzoriku, nájdeme v kapitole 5.4. 5.1.1 Mikrospínačový systém - tlačidlový systém Z hľadiska technickej implementácie medzi najjednoduchšie, ale aj najprimitívnejšie spôsoby, patrí použitie klasických tlačidlových spínačov resp. mikrospínačov. Výhoda ta- 19 kýchto tlačidiel je práve ich jednoduchosť a istota bezproblémového a rýchleho spínania. Kvôli týmto výhodám som použil pri výrobe hmatového systému prototypu dva typy mikrospínačov - klasické tlačidlové a ako klapky mikrospínače s dlhou páčkou. I keď použitie takéhoto spôsobu nie je vhodné na komfortný a profesionálny spôsob hry, veľa amatérskych konštrukcií ho používa aj vo finálnej verzii. Nevýhodou takýchto spínačov, ale možnou nevýhodou aj iných spôsobov spínania, je prechodový jav a z tohto titulu vznik zákmitov pri zmene stavu spínača. Na odstránenie tohto nedostatku môžeme použiť rôzne spôsoby, ako napr. vložiť do spínaného obvodu kapacitu vhodnej hodnoty zapojenú sériovo ku spínaču. Ďalšou možnosťou ošetrenia týchto zákmitov je softvérové. A to priradením načítavania skutočného stavu spínača do krátkej slučky, ktorá zmení konečný stav, až po viacnásobnom načítaní toho istého stavu. Obr. 5.1: Obecný spôsob riešenia zákmitov mikrospínača Obr. 5.2: Spôsob konštrukcie mikrospínačového klapkového systému 20 5.1.2 Systém dotykových snímačov Vzhľadom na obtiažnosť obsluhy nástroja je pri hre najvhodnejším, a zároveň i profesionálne používaným systémom snímania, spôsob dotykových senzorov. Tento spôsob je pri návrhu a pri výrobe finančne a najmä technicky náročnejší. Existuje viacero spôsobov výroby takýchto senzorov. Najľahším variantom je dotykový spínač, ktorý spočíva vo využívaní ľudského tela ako antény zachytávajúcej elektromagnetické žiarenie z okolia. Výhodou je, že ku spínaču vedie iba jeden vodič. Drobná nevýhoda spočíva v nutnosti mať prístroj umiestnený v elektromagneticky aktívnom prostredí (v okolí elektrických spotrebičov), z čoho vyplýva jeho nefunkčnosť v prírodnom prostredí. Na generovanie informácie o vzopnutí a vypnutí spínača je použitý dvojkový čítač, v našom prípade sa jedná o 74HC393, pripojený cez invertor 74HC14. Na bázu tranzistoru BC547C je pripojená elektróda. Na odskúšanie funkčnosti je možno použiť napr. i klinec. Ak sa elektródy dotkneme, tranzistor sa pootvorí a privedieme prúd na taktovací vstup čítača. Na čítači sa pripočíta logická 1 a na výstupe je striedavo 1 a 0. Tranzistor je vhodné vybaviť „zotrvačníkovým“ kondenzátorom, pretože pri dotyku elektródy telo produkuje nestály prúd. Pôsobením okolitých spotrebičov je tento signál o frekvencii zásuvkového napätia - 50Hz. Kondenzátor sa pri dotyku nabije a po pustením elektródy sa vybíja a privádza na čítač stály neprerušený signál. Nižšie uvedená schéma je iba obecná - bez riešenia napájania logických obvodov. Obvod teda musíme vždy prispôsobiť na konkrétnu aplikáciu, a to najmä na použité napájacie napätie a k nemu vhodnej hodnoty kondenzátora C1 tak, aby produkoval napätie potrebnú dobu. Pri napätí 6V sa napríklad používa kondenzátor 6n8. Obr. 5.3: Obecné zapojenie dotykového spínača [14]. 21 Ďalšou z metód vytvorenia dotykového hmatového systému Wind Controllera je využitie integrovaného obvodu QT 1081 alebo QT1101. Tento spôsob je omnoho náročnejší ako ten predchádzajúci, a preto v tejto práci neuvediem jeho celé praktické využitie, ale ho iba teoreticky načrtnem. Jeho výhodou oproti už spomenutému spôsobu je, že nepracuje na princípe elektromagnetickej indukcie, a teda je možné ho využiť i v elektromagneticky neaktívnom prostredí, napr. v prírode. Tieto obvody umožňujú vytvárať dotykové snímače s možnosťou ich umiestnenia pod panel vyrobeného skoro z akéhokoľvek dielektrického materiálu. Táto vlastnosť poskytuje široký priestor pre rôzne dizajnové riešenia. Z technického hľadiska ide o kapacitný dotykový senzor pracujúci na báze ovplyvňovania prenosu náboja medzi okolitou rozliatou zemou a kovovou plôškou - elektródou, ktorá toto pulzujúce elektrické pole emituje. Toto pole je ovplyvňované prstom. Priblíženie prstu k prednému panelu, pod ktorým sa nachádza táto aktívna elektróda zapríčiní, že kapacita medzi zemou a kovovou plôškou vzrastie približne o 0,5 – 5 pF. Toto zvýšenie kapacity obvod QT vyhodnotí. Spôsoby odozvy obvodu QT na zosnímané akcie sa dajú určiť pomocou módov uvedených v katalógu. Tieto módy sa nastavujú pomocou signálov Vss a Vdd privedených na piny AKS_1, AKS_0, MOD_1, MOD_0, OUT_D, POL, SL_1, SL_0 a pomocou externých nastavovacích rezistorov, ktorých rozloženie môžeme vidieť na obr. 5.4. 22 Obr. 5.4: Schéma zapojenia kapacitných dotykových snímačov na obvod QT 1081 Obrázok je prevzatý z technickej dokumentácie obvodu QT 1081 [7]. Pretože na popis a nastavovania týchto módov by bolo potrebné vyčleniť samostatnú kapitolu, na ktorú v tejto práci nie je dostatok priestoru, v našom prípade sa uspokojíme i s použitím módu nazvaného ako „Simplified Mode“, ktorý má minimum nastavení a je prednastavený výrobcom tak, aby vyhovoval vo väčšine klasicky požívaných aplikácií. Ďalším zaujímavým spôsobom vytvorenia dotykového hmatového systému je použitie mikropočítača, resp. mikrokontroléra, s takou funkciou. Mikrokontroléry, s takýmito možnosťami vyrába firma Cypress. Ide o PSoC procesory s rekonfigurovateľnými analógovými a číslicovými (mixed signal array) blokmi. Pre našu aplikáciu môže byť vhodný napríklad obvod CY8C21534. Funkcia dotykových snímačov je tu pomenovaná „Cap Sense“. Síce je táto funkcia priamo implementovaná do mikrokontroléra, čím sa môže ušetriť veľa námahy s nastavovaním rôznych parametrov režimov podobných módom v obvodoch QT, narážame na jeden problém. Tým je malá praktická skúsenosť s týmito typmi obvodov v amatér- 23 skych radoch, a teda i nutnosť samostatne sa prebíjať všetkými prekážkami nového, resp. menej známeho systému. 5.2 Hmatová mapa a hmatový systém Wind Controllera Ku snímaciemu systému dychového hudobného nástroja patrí i mapa hmatov, ktorá je odvodená od určitého typu hmatového systému. Hmatový systém je ustálený typ konštrukcie dierok a klapiek určujúci techniku hry. Obyčajne prislúcha k špecifickému typu nástroja, ako napr. Böhmov flautový hmatový systém, ale pre niektoré nástroje vzhľadom na lokalitu a oblasť použitia existujú i rôzne typy systémov, ako napr. Böhmov (francúzsky) klarinetový systém, alebo Öhlerov (nemecký) klarinetový systém. Rôzne typy hmatových systémov sa odlišujú inou sústavu klapiek a dierok, ale napríklad v niektorých prípadoch aj inými rozmermi nástroja. Hmatová mapa špecifikuje spôsoby, akými je možné zahrať konkrétnu notu, resp. tón určitej výšky. Na nasledujúcom obrázku (obr. 5.5) je uvedená iba názorná ukážka časti hmatovej mapy nášho Wind Controllera i s popisom jednotlivých ovládacích prvkov, ktoré nahradzujú dierky skutočnej flauty a prídavné klapky. Celú hmatovú mapu Wind Controllera je možno nájsť v prílohovej časti tejto práce - príloha A1. Obr. 5.5: Časť hmatovej mapy Wind Controllera Hmatový systém nášho Wind Controllera je zvláštny tým, že je v podstate akýmsi hybridným systémom Böhmovho flautového a Böhmovho klarinetového hmatového C- 24 systému. Toto riešenie bolo použité z dôvodu použitia mikrospínačového snímania hmatu, ktoré nedovoľuje funkčne napodobiť posledné dve dierky klasickej flauty (dierky označené na obr. 5.5 ako K6 a K7), ktoré sú skonštruované ako „dvojdierky“. Pomocou nich je možné hrať poltóny cis a dis pomocou odkrytia jednej dierky, pričom pravá ostáva zatvorená. Ako z hmatovej mapy uvedenej vidieť, dvoj dierky boli nahradené dvoma samostatnými spínačmi, pričom uvedené poltóny sa vygenerujú v prípade stlačenia bočnej klapky ovládanej malíčkom príslušnej ruky. Z toho titulu pri konštrukcii prototypu Wind Controllera používame 11 ovládacích mikrospínačov. V prípade použitia dotykového snímacieho systému toto riešenie nebude treba. Stačí vytvoriť dva dotykové senzory, ktoré budú dostatočne malé a tiež umiestnené blízko seba tak, aby sa dali oba ovládať jedným prstom. A to konkrétne malíčkom pravej ruky v prípade tónu cis a prstenníkom v prípade tónu dis. Ako bolo požadované v zadaní diplomovej práce, rozsah Wind Controllera má byť minimálne 1,5 oktávy. Z hmatovej mapy vyplýva, že rozsah nášho zariadenia je taký istý ako je rozsah sopránovej zobcovej flauty od noty c označovanej Európskou tónovou sústavou ako malé alebo stredné c, resp. c1 až po takzvané dvojčiarkované d resp. d3, čo sú celkovo 2 oktávy plus dva tóny. Rozsah nášho Wind Controllera zvýraznený žltou farbou kvôli prehľadu je v tab. 3.2. znázorňujúcich notový rozsah MIDI normy – obsahuje všetky tóny resp. čísla nôt ktoré je možné generovať pomocou normy (rozhrania)MIDI. 5.3 Dychový snímač – Breath controller Z principiálneho hľadiska najdôležitejšou častou Wind Controllera môžeme nazvať Breath controller. Už samotný názov nám hovorí o tom, že Wind Controller je ovládaný nie len hmatmi, ale hlavne prietokom vzduchu, resp. dychom. V reálnych dychových nástrojoch je dychom ovládaná intenzita vydávaného zvuku, ako aj rôzne druhy skreslenia a dokonca aj zmena výšky tónov. V našom prípade dychom ovládame len intenzitu vydávaného tónu. Intenzita vydaného tonu je priamo úmerná rýchlosti prietoku vzduchu cez senzor tlaku. Pri hre na dychové hudobne nástroje hudobník nefúka do uzavretého priestoru a vzduch v nástroje sa nezhromažďuje, ale preteká nim. Preto, pre čo najlepšiu simuláciu hry na ozajstnom nástroji, musíme u Wind Controlleru brať do úvahy aj tento fakt. Na obrázku (obr. 5.6) môžeme vidieť tlakovú komoru použitú v konštrukcii Wind Controllera. Otvor „Prítok vzduchu“ je otvorom, do ktorého hudobník fúka. Otvor číslo „Výtok vzduchu“ je 25 otvor, ktorým uniká vzduch. Tento otvor je však menší ako otvor, do ktorého fúka hráč a to umožňuje hudobníkovi svojim dychom meniť tlak v komore. Pri hre sa môžu niekedy vyskytnúť i tóny prerušované veľmi rýchlymi pohybmi jazyka, preto je potrebné zvoliť vhodný tvar náustku. Pri použití obyčajnej bužírky s malou dierkou určenou na odtok vzduchu, ako tomu je v našom prototype, boli zmeny tlaku priveľmi rýchle na to, aby ich senzor správne zdetegoval. Preto je vhodnejšie pri finálnom výrobku použiť „pomalší“ náustok s väčším vnútorným objemom. Obr. 5.6: Systém snímania tlaku – tlaková komora Na snímanie tlaku v komore sme pri vyhotovení prototypu Wind Controllera použili tlakový senzor MPX5010 od firmy Motorola/FreeScale. Je dôležité, aby tlakový senzor bol diferenčný, to znamená, že musí merať rozdiel dvoch tlakov a nie absolútny tlak. Je to preto, aby zmeny okolitého atmosférického tlaku neovplyvňovali intenzitu tónov počas hry na nástroji. Snímač MPX5010 je tlakový snímač s konštrukciou na báze piezo-krištáľu. Vyhotovenie snímača je prispôsobené konštrukciám s TTL logikou a tak napájacie napätie je 5 V. Tento snímač je určený na meranie nominálneho tlaku v rozsahu od 0 až 10 kPa, pričom maximálny snímaný tlak bez poškodenia senzora je 75 kPa. Výstup snímača je priamoúmerný tlaku v rozsahu od 0,2 do 4.7 V. Závislosť výstupného napätia na vstupnom tlaku je uvedená na grafe. (obr. 5.7) uvedená v katalógu výrobcu [7]. Výstupný signál zo snímača je priamo zapojený do A/D prevodníka mikrokontroléra. V prípade veľkej hodnoty rušenia okolia ošetríme výstup podľa obr. (obr. 5.8). 26 Obr. 5.7: Závislosť Uvýstupné senzora na vstupnom tlaku Obr. 5.8: Spôsob eliminácie rušenia Obrázky sú prevzaté z technickej dokumentácie obvodu MPX5010DP [7]. Prax ukázala, že snímač MPX5010 nie je najvhodnejší pre komfortný spôsob hry na Wind Controller. Je to spôsobené rozsahom tlaku, aký môžu vyvinúť ľudské ústa, bez vedľajších účinkov fúkania, ako môže byť napr. zaliehanie v ušiach alebo dokonca bolesť. Informatívnym meraním sme zistili, že maximálny tlak vyvíjaný ústami v krátkom časovom intervale je okolo 20 maximálne 25 kPa a počas dlhšieho časového intervalu iba niečo okolo 15 kPa. Tlak v rozsahu 0 až 10 kPa pôsobiaci na ústa počas desiatok minút, poprípade hodiny hrania, spôsobuje štípanie líc. Preto pre využitie v podobných konštrukciách sa odporúčam použiť skôr snímač, u ktorého horná hranica meraného tlaku nie je vyššia ako 4-6 kPa, teda snímače MPXV5004GVP a MPXV4006DP. Majme na zreteli, že tlak v komore môžeme vždy znížiť cestou zväčšenia výfukového otvoru, a preto použitie citlivejšieho snímača z nižším menším snímacím rozsahom je vždy správnejšou voľbou, ako použitie snímača, ktorého rozsah tlakom z úst neobsiahneme. 5.4 Riadiaca jednotka – mikropočítač 5.4.1 Výber a popis ovládacej jednotky Keďže Wind Controller svojou konštrukciou plne vyhovuje definícií zariadení, ktoré sa spoločne nazývajú „Embedded systems“ (vstavané alebo zabudované systémy), jeho podstatnou častou, a dalo by sa povedať, že i srdcom zariadenia, je riadiaci prvok. Výber tohto riadiaceho prvku závisí na systémových požiadavkách, a taktiež na úrovni vyžadovanej 27 optimalizácie, ktorá zahŕňa možnosti použitej riadiacej jednotky, jej a percento využitia v aplikácii, jej cenu a ďalšie iné aspekty. Riadiacim jadrom nášho Wind Controllera je 8 bitový mikrokontrolér AT MEGA1616AU od firmy ATMEL. Dôvodom voľby tohto mikropočítača je jeho výkon, ktorý dosahuje 16 MIPS pri takte 16 MHz. Jeho cena je výhodnejšia oproti známym mikropočítačom PIC od firmy Microchip, avšak oproti mikrokontrolérom s jadrom 8051 je o dosť vyššia, ale vynahradzujú to jeho dobré vlastnosti. Cenovo i vlastnosťami porovnateľné sú mikrokontroléry od firmy NEC. Tu, ale opäť v prospech firmy ATMEL, hovorí možnosť využitia viacerých ľahko dostupných resp. i voľno šíriteľných vývojových prostredí bez obmedzenia veľkosti kódu, ako je napríklad AvrStudio. Mikropočítače ATMEGA16 sa vyrábajú v puzdrách PDIP, TQFP a QFN/MLF. Použitý mikropočítač v puzdre TQFP (veľkosť SMD) disponuje štyrmi I/O portami, kde každý z nich sa skladá z ôsmych 3 – stavových vstupno-výstupných pinov. Tieto mikrokontroléry majú výhodu v tom, že sa dajú ľahko programovať v jazyku C++, ktorého niektoré procedúry sú priamo hardvérovo podporované procesorom. Programovanie v jazyku C++ veľmi uľahčuje prácu programátora v porovnaní s programovaním v jazyku assembler (ASM), pomocou množstva procedúr, ktoré zjednodušujú programovanie . Hlavne je to práca s pamäťou, deklarácia premenných a práca s nimi. Matematické funkcie s číslami s plávajúcou desatinou čiarkou sú napríklad v ASM len ťažko realizovateľné. ATMEGA 16 obsahuje veľkú programovú FLASH pamäť o veľkosti 16kB, ktorá úplne postačuje pre uloženie aj väčších programov kompilovaných z jazyka C++. Dátová pamäť je typu SRAM a EEPROM. EEPROM a FLASH je možné programovať pomocou rozhrania SPI priamo v aplikácií kompilátora. Viac o tomto mikrokontroléry je na [3]. Popis použitého mikroprocesora AT MEGA16-16AU: • 8-bitový mikrokontrolér • Rozšírená RISC architektúra • 131 inštrukcií • 32x8 pracovných registrov • výkon 16 MIPS pri 16 MHz • násobička časovača priamo na čipe • 16K Byte vnútorná FLASH pamäť 28 • 512 Byte EEPROM (s možnosťou 100 000 cyklov zmazanie/zápis) • 1K vnútorná SRAM • Programovateľné zámky pre bezpečnosť programového vybavenia Vybavenie perifériami: • univerzálne vstupy a výstupy - piny • 8-bitové čítače/časovače • Jeden 16-bitový čítače/časovač • štyri PWM kanály • 8 kanálový, 10-bitový AD prevodník • Programovateľný sériový USART • Master/Slave SPI sériové rozhranie • Analógový komparátor Obr. 5.9: ATMEGA 16-16AU Obrázok je prevzatý z technickej dokumentácie obvodu [3]. Z možností mikrokontroléra ATMEGA16 a jeho zabudovaných periférnych obvodov sme pri ovládaní prototypu Wind Controllera využili iba niektoré časti, ktorých funkciu a nastavenie popíšeme v nasledujúcich kapitolách. Podotknem, že i keď percento efektívneho 29 využitia dostupných funkcií v prototype je asi iba 60%, je mnoho funkcií ktoré ešte naše zariadenie nemá zabudovaných. Keďže Wind Controller bude v budúcnosti často využívaný, postupné dolaďovanie a dopĺňanie ďalších funkcií a ovládačov sa stane nevyhnutnosťou a tým sa zvýši i využiteľnosť daného procesora. 5.4.2 Univerzálne vstupy a výstupy Ako sme už pri výbere riadiaceho procesoru spomenuli, AMEGA 16 disponuje až štyrmi 8 bitovými, 3-stavovými, obojsmernými portami, PORT A, PORT B, PORT C a PORT D. To znamená, že každý z týchto obojsmerných portov, resp. V/V (vstupno – výstupných) brán sa skladá z ôsmych trojstavových vstupno-výstupných vývodov resp. I/O pinov. Tieto brány sú mapované, každá pomocou troch osem bitových adries: • DDRx, DDRxn - smerový register dát • PINx, PINxn - adresa vstupných vývodov • PORTx, PORTxn - výstupný dátový register, kde „x“ reprezentuje písmeno prislúchajúce danému PORTu a „n“ jednoznačne identifikuje číslo (0 - 8) príslušného vývodu PORTu. Základná funkcia týchto troch adries (registrov) je rovnaká pre všetky porty. Register DDRx určuje smer toku dát na portoch resp. vývodoch integrovaného obvodu (IO). Ak napr. nastavíme DDRx na hodnotu log0 daný port je definovaný ako vstupný, v opačnom prípade ako výstupný. Adresa PINx je určená iba na čítanie a odpovedá aktuálnej hodnote na pinoch daného portu, tzn. umožňuje prístup ku fyzickej hodnote na vývodoch daného IO. Zápisom dát na adresu výstupného registra PORTx, PORTxn, nastavíme hodnotu zodpovedajúcu výstupnej logickej úrovni portu resp. daného vývodu IO. Nastavením log1 pomocou PORTxn na adresu niektorého z vývodov definovaného ako vstupný, aktivujeme záťažový odpor nazývaný aj ako „pull-up rezistor“. Týmto umožníme vstupu správať sa ako zdroj prúdu, pretože vstupný pin je interným „pull-upom“ pripojený k napájaciemu napätiu Vcc. Tento stav využívame v našom Wind Controllery pri snímaní vzopnutia spínača, alebo senzora. Vstupný vývod IO sa uzemní, obvodom začne pretekať prúd čím klesne napäťová úroveň vývodu z nastavenej log1 na log0 – mikroprocesor zdeteguje zmenu stavu. V našej aplikácií môžeme nastaviť celé porty zapojené na hmatový snímací systém do tohto režimu. Konkrétne ide o PORTC, a týka sa to i portu PORTD, na ktorom sa síce nachá- 30 dza vývod TXD, čo je sériový vysielací pin USARTu. No preto, že sa pri aktivovaní vysielania normálna funkcia pinu PD1 zruší a vývod TXD je až do nastavenia príznaku ukončenia vysielania vyhradený pre funkciu USART, nastavenie PORTD1=1 nemá vplyv. 5.4.3 AD prevodník Alternatívnou funkciou každého z ôsmych vývodov (kanálov) brány PORTA proce- soru ATMEGA 16 je analógovo–digitálny prevodník (ADC). Preto prevod výstupného signálu z tlakového senzora nemusí byť v našom prípade realizovaný samostatným obvodom A/D prevodníka, ale využijeme ADC obsiahnutý v riadiacom prvku. Nie sú potrebné žiadne vonkajšie obvody, signál sa priamo privádza na vstup ADC1. Výsledkom ADC prevodu je údaj o momente vyslania noty (t.j. o dostatočnom tlaku na prekročenie prahovej hodnoty vstupného tlaku) a zmenách jej hlasitosti (t.j. o zmenách tlaku). ADC podporuje 8bitové alebo 10bitové rozlíšenie a výsledky prevodu sú zaznamenané v spoločnom dvojbytovom registri ADCW pre všetky kanály. V programe používame pomocnú premennú ADCW1=ADCW. Pred použitím ADC prevodníka je potrebné ho v programe inicializovať - nastaviť parametre prevodu a ADC, a to sú: • aktivovanie samotného ADC (nie prevodu!) nastavením bitu ADEN, tzn. priradením log1 bitu ADEN v registri ADCSRA • stanovenie čísla vstupného kanálu ADC. Použijeme iba jeden kanál – ADC0 a to vynulovaním bitov MUX4-MUX0 v registri ADMUX • určenie referenčného napätia VREF = VCC = 5V, pomocou hodnôt REFS1=0, REFS0=1 v registri ADMUX. Pri tomto nastavení je AREF je vnútorne prepojený s VCC =AVCC pre určenie maximálnej hodnoty signálu pre prevod. Pre šumovú imunitu je medzi vstupy AREF a GND potrebné pripojiť kondenzátor (100-220) nF. • ADLAR=0 v registri ADMUX zarovná 10bitový výsledok ADC v 16bitovom priestore registra ADCW doprava • frekvencia vzorkovania pre ADC sa volí pomocou preddeličky taktu procesorových hodín danou nastavením bitov ADPS0-ADPS2 v registri ADCSRA. Prevodník potrebuje k správnej funkcii pri 10bitovom rozlíšení vstupnú taktovaciu frekvenciu v rozsahu 50 kHz až 200 kHz. Táto frekvencia je závislá od času trvania prevodu. 31 Keďže taktovacím oscilátorom Wind Controlleru je krištáľ o frekvencii 8MHz, nastavením preddeličky môžeme v požadovanom rozsahu dosiahnúť hodnoty 62,5 kHz pri delení fOSC/128 a 125kHz pri delení fOSC/64. Výhodné je využiť vyššiu hodnotu fvz=125kHz, ktorú dostaneme pri dosadení ADPS2= ADPS1=1 a ADPS0=0. Pri každom požadovanom ADC prevode sa nastaví bit ADSC v registri ADCSRA a čaká sa na dokončenie prevodu oznámeného zmenou stavu ADSC alebo i ADIF, ktorý sa nastaví na „log1“ až v prípade obnovenia dátového registru ADCW, tzn. „vynulovaním“ po prečítaní hodnoty ADCH. Obr. 5.10: Prehľad rozloženia riadiacich bitov registrov ADC a SREG Pretože MIDI norma definuje iba 127 úrovní hlasitosti, musíme toto zohľadniť aj pri zápise výsledku ADC prevodu do premennej, ktorá ovláda hlasitosť v programe. Pri použití 10bitového prevodu, ktorého výsledok predstavuje 1024 úrovní, toto dosiahneme bitovým posunom výsledku ADC o 3 bity vpravo, použitím príkazu ADCW1 = ADCW1 >> 3; . Ďalším problémom pri správnom nastavení ADC výsledku môže byť skutočnosť, že i pri nulovej hodnote diferenciálneho tlaku na vstupoch tlakového senzora, je na jeho výstupnom pine nenulová hodnota napätia. V katalógu výrobcu sa uvádzajú tri typy hodnôt: minimálna (0V), 32 typická (0,2V) a maximálna (0,425V). Pre istotu nastavenia nulovej hodnoty pri vstupnom diferenciálnom tlaku rovnom 0kPa, budeme rátať s najnepriaznivejším variantom, keď Usenzor_OUT = V adc_IN = 0,425V. Pre určenie hodnoty výsledku ADC podľa vzájomnej závislosti s Vadc_IN platí: ADC = Vadc _ IN .1024 VREF = 0,425.1024 = 87 . 5 Túto hodnotu odpočítame od ADCW1 ešte pred spomínaným bitovým posunom o 3 bity. Premenná ADCW1, určená na uchovanie tejto informácie, je typu „unsigned int“, tzn. nemôže nadobúdať záporné hodnoty, pretože je v podstate informáciou o hlasitosti, ktorá taktiež nesmie byť zápornou. Určená hodnota ADC je najväčšia, aká môže na výstupe senzora pri nulovom tlaku byť, a preto v praxi môže nastať situácia, keď je táto hodnota menšia a pri odčítaním čísla 87 od nej, dostaneme číslo záporné. Nastane chybové pretečenie tejto premennej a nastaví sa príznak pretečenia označený ako C – „Carry flag“ - bit prenosu v registri SREG (obr. 5.11). Ak toto nastane, programovo nastavíme hodnotu ADCW1 na nulu. 5.4.4 UART - nastavenie a vysielanie MIDI, ako komunikačný systém, je používaný pre sériový asynchrónny – UART pre- nos informácií z jedného zariadenia kompatibilného s MIDI do druhého. Medzi tieto zariadenia patria hudobné nástroje, samplery, syntetizátory, zvukové moduly, bicie a počítače. V našom prípade komunikujeme s PC. V prípade MIDI ovládačov je táto komunikácia iba jednosmerná – smerom „von“. Preto pri komunikácií mikroprocesora s PC, využívame na vysielanie MIDI príkazov obvod UART, konkrétne vývod TXD nachádzajúci sa na vývode PD1 portu D. USART je obvod schopný obojsmernej komunikácie, ako synchrónnej (USART), tak aj asynchrónnej (UART), s možnou voľby vysokej prenosovej rýchlosti, podporujúci 5-9 dátových bitov, 1-2 stopbitov, výberom medzi použitím parity, množstvom prerušení vzhľadom na odoslaný byte a možnosť multiprocesorovej komunikácie. Na nastavenie sériového prenosu slúžia u procesora ATMEGA16 celkom 4 registre (UCSRA, UCSRB, UCSRC, UBRR). Inicializovaním týchto registrov stanovíme parametre UART vysielania podľa MIDI normy takto: • nastavením bitu TXEN v registri UCSRB – povolenie USART vysielania 33 • dôležité je správne priradenie bitu URSEL registra UCSRC, ktorý určuje, do ktorého registra sa v tom okamžiku hodnota zapisuje, pretože registre UBRRH (MSB dvojbytového registra UBRR) a UCSRC zdieľajú ten istý adresný priestor. Preto na úplnom začiatku hlavého programu musí iba raz prebehnúť procedúra nastavenia prenosovej rýchlosti (URSEL = 0). Následne sa zmenou URSEL na hodnotu log1 zamedzí prístup do registra UBRRH a povolí sa zapisovanie do UCSRC • pomocou bitu UMSEL v registri UCSRC vyberieme režim UART vysielania asynchrónny spôsob vysielania (UMSEL = 0) • zvolíme počet dátových bitov UART slova na 8, vynulovaním bitu UCSZ2 v registri UCSRB a zároveň priradením úrovne log1 bitom UCSZ1 a UCSZ0 z registra UCSRC • vynulovaním bitov UPM1 a UPM0 v UCSRC je vysielaný UART rámec paritne nezabezpečený – vysielaný „bez parity“ • počet stopbitov závisí od bitu USBS (v UCSRC). USBS = 0 – jeden stopbit • nastavíme MIDI prenosovú rýchlosť rovnú 31250 Baudov. Tá je závislá od frekvencie externého riadiaceho krištáľu a hodnoty registra UBRR. Hodnota UBRR by mala byť celočíselná, inak bude prenosová rýchlosť nastavená s určitou percentuálnou odchýlkou. Preto sa našou úlohou stáva nájdenie vhodnej hodnoty frekvencie krištáľu použitím nasledovných názorných výpočtov: f OSC 1MHz −1 = −1 = 1 16.BAUD 16.31250 f OSC 8MHz UBRR = −1 = − 1 = 15 16.BAUD 16.31250 UBRR = V týchto výpočtoch sú znázornené prvé dve vhodné možnosti krištáľov. V našom prípade sme použili oscilátor o frekvencii 8 MHz, pretože výroba krištáľového oscilátoru kmitajúceho na takej „nízkej“ frekvencií ako je 1 MHz, je technicky náročná, z čoho vyplýva i jeho vysoká cena. 34 Vysielanie dát je u procesoru ATMEGA 16, ako aj u celej rodiny AVR procesorov, veľmi jednoduchou záležitosťou. Stačí iba do dátového registru UDR zapísať dáta, ktoré chceme odoslať. Kontrolovaním príznaku UDRE (USART Data Register Empty) získavame informáciu o stave vysielania zapísaných dát. Pokiaľ UDRE = 0, ešte nie sú cez sériový port TXD vyslané všetky dáta, do vysielacieho registra UDR nesmieme ešte zapisovať nové informácie, aby sme neprepísal neodvysielaný obsah registra. Obr. 5.11: Prehľad rozloženia riadiacich bitov registrov USART 5.4.5 SPI – Serial Peripheral Interface Súčasťou mikroprocesora ATMEGA 16 sú aj obvody SPI na sériovú komunikáciu. Ide o synchrónnu, plne duplexnú komunikáciu typu Master-Slave. Pre SPI sa používajú 4 vodiče: MOSI (Master Out – Slave In) a MISO (Master In – Slave Out) pre oba smery komunikácie, SCK pre synchronizačné impulzy a #SS (Slave Select) - výberový signál. SPI sa môže využiť na programovanie Flash alebo EEPROM pamäte. Programovanie vnútornej pamäti Flash je pre mikroprocesor ATMEGA16 v našom prípade riešené prostredníctvom ISP, použitím rozhrania SPI. Presný postup programovania 35 je popísaný v [15]. My použijeme riešenie podľa [16]. Programátor bude s mikroprocesorom komunikovať cez rozhranie SPI a s nadradeným počítačom cez rozhranie RS-232. Pre prevod signálov z TTL na RS-232 je možné použiť obvod MAX232. 5.4.6 Prepojenie riadiaceho prvku s perifériami – Wind Controller Informácie získané v predchádzajúcich kapitolách, využijeme na vytvorenie celkovej schémy elektrických prepojení jednotlivých častí Wind Contolera (obr. 5.12). Obr. 5.12: Elektrická schéma Wind Controllera 5.5 Hardvérová konštrukcia MIDI rozhrania Ako sme už v kapitole 3.3.1 – obr. 3.3 videli, rozhranie je a jeho zapojenie je dané vlastnou MIDI normou. Keďže sme náš Wind Controller využili iba na vysielanie dát do po- čítača, použili sme zapojenie popisujúce iba MIDI OUT spôsob zapojenia a integrovali sme ho priamo do prototypu ovládača. Tým sme si zároveň zjednodušili aj vyhotovenie MIDI 36 káblu a taktiež sme sa vyhli použitiu optočlena, slúžiaceho na elektrické oddelenie MIDI ovládača a MIDI IN signálov prichádzajúcich napríklad z PC. Invertor IC1 môže byť realizovaný pomocou vhodného integrovaného logického obvodu, alebo aj pomocou tranzistoru v spínacom režime, ktorý ale musíme nastaviť do vhodného pracovného bodu. V našom zapojení sme kvôli jednoduchosti použili IO 74ALS05N (logický invertor, výstup s otvoreným kolektorom). Hodnoty ďalších prvkov MIDI rozhrania sme zvolili nasledovne: R1 = 220 Ω, R2 =220 Ω, R3 = 220 Ω, C3 = 100nF a použili sme päť vývodový konektor DIN – samica (DIN Female - MAB5SH). 5.6 Napájacie obvody Wind Controller je napájaný nesymetrickým napätím +5 V voči GND, kde GND predstavuje nulový potenciál. Keďže prúdový odber nášho prototypu – približne 100 mA, nepresahuje povolené prúdové zaťaženie jedného USB portu – 500 mA, je Wind Controler primárne napájaný z USB portu počítača. V prípade akéhokoľvek napájania je potrebné na „DIN Female“ konektor, ktorý slúži na prepojenie ovládača s počítačom cez MIDI-USB rozhranie (MIDI-USB Interface), tak aj na napájanie celého Wind Controlleru, pripojiť +5 V a to konkrétne na vývod číslo 4. Toto napätie je možné získať i klasickým spôsobom usmernenia a v tomto prípade zvlášť potrebného stabilizovania napätia, vystupujúceho z transformátora resp. usmerňovača, pomocou obvodu 7805. 5.7 Komunikácia Wind Controller - PC Komunikáciu medzi Wind Controlerom a počítacom zabezpečujú výstupné obvody. Najjednoduchšie, ale finančné náročnejšie prepojenie MIDI ovládača so zvukovou kartou počítača, je použiť zvukovú kartu vybavenú vstupom MIDI IN. Ďalším jednoduchým a lacným riešením prepojenia Wind Controllera s PC je použitie Game portu, ktorý bol priamou náhradou MIDI (DIN) portov na starých typoch počítačov, napr. ATARI. Pri tomto spôsobe stačí vytvoriť špeciálny kábel: MIDI – Gameport, resp. DIN – Canon15 vychádzajúci z rozloženia vývodov Game portu (obr. 3.4) v kapitole 3.3.2. Pretože hore uvedené metódy sú zvyčajne pre bežného užívateľa drahé, alebo v dnešnej dobe už menej dostupné, využijeme na pripojenie už bežné USB rozhranie. Pri tomto spôsobe treba hlavne zabezpečiť úpravu napäťových úrovní dvoch rozdielnych sériových 37 komunikačných liniek, UART verzus USB, FireWire resp. Game port (PC port s komunikačným rozhraním RS232). Toto dosiahneme použitím prevodníka MAX232 resp. ST232, ak ide o pripojenie na COM port počítača, alebo FT232 ak ide o napojenie na USB port . Keďže vyhotovenie takéhoto rozhrania nebolo cieľom tejto práce, iba načrtneme spôsob jeho obvodového riešenia (viď. Obr. 5.13). Obr. 5.13: Rozhranie UARTF - USB s IO FT232 Obrázok je prevzatý z http://www.olimex.com/dev/images/avr-p40-usb-sch.gif. V aplikácií použijeme rozhranie určené priamo pre komunikáciu medzi MIDI zariadeniami a USB portom počítača, pretože v dnešnej dobe už väčšina počítačov na sériovú komunikáciu používa výhradne USB alebo Fire Wire porty. Použitý port je na trhu dostupný pod názvom MIDI prevodník USB Uno, alebo M-AUDIO USB MIDI Uno Interface od firmy M-AUDIO (obr. 5.14). K rozhraniu USB Uno patria i ovládače, ktoré sú voľne dostupné na stránke výrobcu. 38 Obr. 5.14: M-Audio USB MIDI UNO rozhranie Obrázok je prevzatý z domovskej stránky fy. M-Audio [12]. 6 Popis programového vybavenia Wind Controllera Ako bolo požadované v zadaní práce, softvérové rozhranie bolo tvorené a nakoniec aj krokovaním odskúšané vo voľne prístupnom vývojovom prostredí. Keďže moje znalosti z hardvérového programovania boli pred začatím tejto práce úbohé, odskúšal som viacero vývojových prostriedkov. Ako napríklad ATmanAVR v.5.8 s obmedzenou dĺžkou používania (30dní) a kapacitou vytvoreného kódu na 2kB. Neoceniteľnú pomoc som našiel v internetovom seriály o programovaní AVR procesorov [11], kde sa pracovalo s programom Code Vision - iba s kapacitným obmedzením kódu (2kB). Konečné verzie programu „Wind Controller“ som programoval pre začiatočníka vo veľmi dobrom a známom prostredí „AVR Studio“, s použitím prídavnej aplikácie WinAVR. V spolupráci s ňou dokáže AVR Studio používať kompilátor GCC a pomocou neho program aj krokovať. Ako vyplýva zo schémy Wind Controllera (obr. 5.13), mikroprocesor som programoval pomocou SPI – Serial Peripheral Interface cez vývody SCK (PB7), MISO (PB6), MOSI (PB5) portu B a pomocou vývodu RST – reset. Program som koncipoval podľa predstavy kompatibility Wind Controllera so všetkými MIDI zariadeniami. Preto som zvolil systém ovládania hry bez pomoci používania MIDI kontrolérov, tzn. že na zachytenie a vysielanie všetkých parametrov nábehu, priebehu 39 i dobehu tónu, som použil iba správy ALL NOTES OFF, NOTA ZAPNUTÁ a NOTA VYPNUTÁ resp. NOTA ZAPNUTÁ s nulovým byte3. Pre zopakovanie si pripomenieme, že NOTE ON (OFF) správy sa skladajú z troch základných bytov. Prvý je STAVOVÝ (STATUS) BYTE určujúci typ celej MIDI správy (byte1= 0x90 - Nota zapnutá). Druhý byte stanovuje výšku MIDI noty vzhľadom na hmat. Tretí byte, byte3, predstavuje dynamiku zahraného tónu, a preto ho môžeme použiť pri dychových nástrojoch na nastavenie intenzity tónu resp. jeho hlasitosti. K rozhodnutiu používať iba tieto MIDI správy ma viedla aj skutočnosť, že v časoch, keď sa ešte štandard MIDI stále vyvíjal a dal sa voľne vysvetliť, vznikli vďaka nezodpovednému prístupu firiem rôzne varianty použitia niektorých kontrolérov, a ešte dnes môžeme ľahko nájsť MIDI nástroje, „ktoré si nerozumejú“. Všetky MIDI zariadenia, ktoré som dosial vyskúšal, používali na zmenu parametrov tónu MIDI ovládače. Preto použiť takýto systém bol vlastne pokusom, ale keďže tento MIDI nástroj hrá MONOFÓNNE, dajú sa riešiť mnohé problémy aj bez vysielania často používaných kontrolérov. Napríklad pri hre za sebou idúcich nôt, netreba použiť MIDI kontrolér č.68 - „LEGATO“, pretože pri prijatí novej noty bez vypnutia predchádzajúcej, sa táto predchádzajúca automaticky vypína. Počas popisu nastavovania vstupno-výstupných periférií procesoru ATMEGA 16 vzhľadom na aplikáciu Wind Controller, sme sa nemohli vyhnúť niektorým nastaveniam použitým v programe. Program uvedený v prílohe (A.7) má tiež množstvo uvedených poznámok, a preto v nasledujúcom texte už tieto nastavenia a poznámky iba doplníme poprípade spojíme do jedného celku – funkčného programu. Program sa skladá zo „Startup sekvencie“, inicializácie periférií procesora a poľa často používaných funkcií a hlavného programu. „Startup sekvencia“ je nízkoúrovňová inicializácia, ktorá nastaví hlavné periférie procesora, pomocou ktorých sa ďalej aktivujú ostatné periférie a funkcie. Je to tá časť kde sa nastavujú globálne konštanty, ako napr. frekvencia oscilátora – príkazy „ #define FOSC 8000000 “ a pod. Inicializácie periférií procesora Inicializácia, tzn. nastavenie parametrov vstupno-výstupných periférií, ako USART, ADC, už bola podrobne vysvetlená pri popise v kapitolách od 5.4.2. V programe sa tieto inicializácie označujú vždy na ich začiatku príslušným názvom + slovom Init, napr. ADConverter Init. 40 Inicializácie často Používaných funkcií Celý program je v podstate nekonečná slučka, v ktorej sa vzhľadom na veľkosti zosnímaného tlaku buď vysielajú, alebo nevysielajú MIDI správy – stavový byt a k nemu prislúchajúce dáta byty. Z toho vyplýva, že sa počas trvania jednej slučky použije najmenej dvakrát. napr. funkcia UART vysielania – v programe známa ako UART_Transmit. Medzi často volané funkcie patrí aj funkcia ADC prevodu (Read_ADC) a funkcia CITAJ_HMAT, ktorá má za úlohu načítanie kombinácie stlačených a pustených mikrospínačov (pomocou porovnávacích funkcií if a else) a ku nej prislúchajúcej hexa hodnoty výšky MIDI noty. Hlavný program Ako sme už spomenuli, program beží v nekonečnom cykle, počas ktorého sa vykonávajú rôzne operácie, ktoré nám bližšie uprení vývojový diagram (obr. 6.1) behu celého programu. 6.1 Súhrn inicializácií a priradení ovládačov k vývodom mikroprocesora Využitie univerzálnych vstupno - výstupných portov: PORTA : PIN 0 – ADC0 – vstupný signál analógo/digitálneho prevodníka PORTC : PIN 0 – vstup, spínač S8 (hmatová mapa K0) – s pull-up rezistorom PIN 1 – vstup, spínač S7 (hmatová mapa K7) – s pull-up rezistorom PIN 2 – vstup, spínač S6 (hmatová mapa K6) – s pull-up rezistorom PIN 3 – vstup, spínač S5 (hmatová mapa K5) – s pull-up rezistorom PIN 4 – vstup, spínač S4 (hmatová mapa K4) – s pull-up rezistorom PIN 5 – vstup, spínač S3 (hmatová mapa K3) – s pull-up rezistorom PIN 6 – vstup, spínač S2 (hmatová mapa K2) – s pull-up rezistorom PIN 7 – vstup, spínač S1 (hmatová mapa K1) – s pull-up rezistorom PORTD : PIN 1 – výstup UART TxD, signál do MIDI rozhrania PIN 5 – vstup, klapka S11 (hmatová mapa OK – Oktáv K.)-s pull-up rez. PIN 6 – vstup, klapka S10 (hmatová mapa K7p) – s pull-up rezistorom PIN 7 – vstup, klapka S9 (hmatová mapa K6p) – s pull-up rezistorom 41 Z toho vyplýva: PORTC=0xFF, DDRC =0x00, PORTD=0xE0, DDRD =0x00. ADC Inicializácia: ADMUX = 0x40, ADCSRA= 0x86. UART Inicializácia: UBRR=0x0F, UCSRB=0x08, UCSRC=0x86. 6.2 Popis priebehu programu Najnázornejší a najprehľadnejší priebeh celého programu nám poskytne načrtnutý vývojový diagram znázornený na obr. 6.1. Obr. 6.1: Vývojový diagram programu Wind Controller Po vykonaní inicializácií univerzálnych vstupov a výstupov - I/O Init, portu sériového vysielania - UART Init a ADC prevodníka ADC Init, sa vykoná inicializácia premenných 42 používaných v celej hlavnej slučke a zároveň sa nastavia počiatočné hodnoty kontrolných premenných a konštánt. Kontrolné premenné a konštanty používame na riadenie toku programu a sú to tieto: • LOW ADCV – stanovuje minimálnu úroveň výstupného napätia z tlakového senzoru. Konštantne sme ju nastavili na úroveň 0x0A = 10 úrovní zo 127. • byte1–Konštanta (0x90) nahradzujúca stavový byte MIDI príkazu NOTE ON. • NOTA1 – predstavuje premennú, v ktorej sa nachádza hodnota poslednej hranej noty. Na začiatok ju nastavíme na hodnotu 0x00, z čoho vyplýva podmienka, že funkcia CITAJ_HMAT nikdy nemôže vrátiť hodnotu 0x00. • ADCV1 – podobne v predchádzajúcom prípade, je na začiatku rovná 0x00 a ukladá hodnotu poslednej nastavenej intenzity hraného tónu. ADCV symbolizuje „ADC Voltage“ – napätie na vstupe AD prevodníka. • TONY_OFF – táto premenná definuje stav vysielaných tónov resp. nôt. Slúži na prerušenie vysielania vypnutia všetkých tónov - resp. posledného tónu po skončení fúkania do MIDI ovládača. Keďže na začiatku sú všetky tóny vypnuté – žiadny ešte nebol vyslaný, TONY_OFF je rovná 0x00. • AKTIVNE – premenná slúži pri rozhodovacom algoritme „AKTIVNE = =1?“ vo vetve, ktorá ZAČÍNA TÓN. Toto rozhodovanie nie je pre nedostatok miesta v diagrame znázornené. Na počiatku je táto hodnota taktiež rovná „0“. Po prvom vyslaní tónu, kde treba vyslať i stavový byte1=0x90, sa nastaví AKTIVNE=1 a v nasledujúcom cykle sa už využíva FREE RUNNING mód. Po nastavení týchto parametrov, prejde program do jeho najpodstatnejšej časti - hlavného cyklu. Na jeho začiatku je vždy AD prevodníkom digitalizované zosnímané napätie tlakového senzora – ADCW, resp. jeho upravenej, 8bitovej reprezentácií - ADCV. Podľa tohto najdôležitejšieho parametru je riadený celý tok programu, pretože tu nasleduje hlavná podmienka: Vzopnúť notu alebo nevzopnúť?! Pokiaľ je tlak na výstupe diferenciálneho senzora tlaku menší, než aby sa v premennej ADCV nachádzala hodnota väčšia než 0x0A a premenná TONY_OFF je rovná 0x01, program sa vracia prázdnou „siedmou“ vetvou diagramu zľava, na začiatok, tzn. na funkciu ADC prevodu - Read_ADC. Ak takáto situácia nastala po predchádzajúcom hraní - tzn. TONY OFF=0, prebehne sekvencia príkazov vetvy 43 šesť - vypnutie tohto tónu, a to nastavením jeho intenzity (byte3) na nulu a vyslaním dvoch databytov (byte2, byte3) von zo zariadenia, pomocou funkcie USART_Transmit tu parafrázovanej ako UART SEND. V prípade, že hodnota ADCV, závislá na tlaku, je väčšia ako 0x0A, prejde program do svojej „aktívnejšej“ časti. Nasleduje prestavenie pomocnej premennej TONY OFF=0 a volanie funkcie CITAJ_HMAT, ktorý navracia premennú NOTA obsahujúcu hexa číslo výšky MIDI noty. Ak táto hodnota nie je rovnaká ako hodnota predchádzajúcej hranej noty, resp. ako NOTA1, program pokračuje rozhodovacím algoritmom „ADCV = ADCV1?“. Ak ADCV1, resp. intenzita predchádzajúcej noty, bola iná než je momentálna hodnota výsledku prevodu ADC, tak program vbieha do ďalšieho rozhodovacieho bodu: „AKTIVNE = 1?“. Keďže táto vetva (smer) programu slúži aj na aktivovanie prvého tónu (po nejakej prestávke v hre), sú v prípade AKTIVNE = 0 vyslané len byte1, byte2 a byte3 s príslušnými hodnotami NOTA a ADCV1 a následne sa priradí AKTIVNE=1. V inom prípade pred vyslaním novej noty, tú predchádzajúcu vypneme - byte3 = 0x00. Pretože vývojový diagram je dostatočne názorný a myslím, že i ľahko pochopiteľný, uvediem už len, že pomocou rozhodovania „ADCV = ADCV1?“ sa v programe mení hlasitosť resp. intenzita tónu. Ak výsledok rozhodovania je „NO“, musí sa následné hodnota ADCV1 obnoviť, tzn. ADCV1=ADCV. 6.3 Funkcia CITAJ_HMAT Pri vykonávaní funkcie čítania hmatov, sme použili spôsob kontrolovania hodnôt nastavených na vstupných pinoch portov C a D v prípade stlačenia daného hmatu. Tieto hodnoty sa porovnávajú s už vopred prednastavenými hodnotami globálnych konštánt, z ktorých každá obsahuje hexa číslo, ktoré bude nastavené na danom porte v prípade držania prislúchajúceho hmatu. Uvedieme si to na príklade: ... #define NOTA_PINC_B1 0x5E // definovanie hodnoty na porte C v prípade hmatu B1 #define NOTA_PIND_B1 0xE0 // definovanie hodnoty na porte D v prípade hmatu B1 #define NOTA_PINC_B1_2 0x4E // definovanie hodnoty na porte C v prípade alternatívneho hmatu B1. Hodnota portu D ostáva nezmenená #define NOTA_B1 0x46 // definovanie hodnoty výšky MIDI noty B1 => byte2 =0x46 44 ... // hlavička funkcie CITAJ_HMAT unsigned char CITAJ_HMAT(void) { if ((pinc == NOTA_PINC_B1) && (pind == NOTA_PIND_B1)) return NOTA_B1; else if ((pinc == NOTA_PINC_B1_2) && (pind == NOTA_PIND_B1)) return NOTA_B1; else return 0xEF; } Ak nastane situácia, že ani jedna z definovaných konštánt nie je zhodná s aktuálnym hmatom, funkcia vráti hodnotu 0xEF a nasledovne sa pomocou vyslania príkazu NOTA ZAPNUTÁ s nulovou dynamikou v tretom byte, vypne posledná znejúca nota, ktorej hodnotu vyčítame z pravidelne sa aktualizovanej premennej NOTA1. Spôsob použitia hmatových konštánt je vhodný kvôli svojej rýchlosti. Pre prípad neočakávaného „zaseknutia“ tónu sa v prípade stlačenia klapiek K6p a K7p vyšle bezpečnostný povel ALL NOTES OFF. Úplne na začiatku funkcie CITAJ_HMAT, definujeme lokálne premenné funkcie typu uint8_t – 8 bitový „unsigned integer“. Pri premennej „pind“ treba pre istotu odstrániť resp. vymaskovať vplyv hodnoty pinov PD0-PD4, a to takto: register uint8_t pind = PIND & 0xE0;. 6.4 Funkcie Read_ADC a USART_Transmit a ich využitie Funkcia Read_ADC sa spustí v každom cykle raz a jej úlohou je spustenie jednorazového AD prevodu, nastavením bitu ADSC (ADC Start Conversion) v registri ADCSRA. Pod- ľa výrobcu, pri 10bitovom prevode, má prevod trvať 25 strojových cyklov. Po dokončení prevodu sa nastaví príznak ADIF registra a výsledok prevodu je dostupný v registri ADCW, kde W znamená, že premenné s názvom ADCW a pod. sú typu „Word“ – teda môžu nadobúdať nezáporné 16bitové hodnoty. Ako sme už naznačili, výsledok z ADC je použitý na ovládanie hlasitosti – byte3. Preto, aby sme ju mohli takto použiť, ju po už raz spomínanom 3 bitovom posunutí doprava, potrebujeme pretypovať z typu premennej Word na „osembitový nezáporný unsigned char“, a to takto: ADCV=(unsigned char)ADCW1; . Nová premenná ADCV je už nami chcená hodnota, používaná na ovládanie intenzity hraných tónov. Pri fúkaní do tlakového senzora, sa tlak veľmi rýchlo a jemne mení. A tak 45 preto, aby sme zbytočne nezahlcovali MIDI kanál správami o nepočuteľných zmenách intenzity toho istého tónu, v programe sme ďalej stanovili, že ak ROZDIEL tlaku nebude viac ako 5 z možných 127 úrovni hlasitosti, tak intenzita hraného tónu ostane nezmenená. Na tento účel používame „dočasnú“ premennú ADCVTMP a príznak pretečenia SREG a ROZDIEL. Funkcia USART_Transmit slúži na vysielanie dát z UDR priradených z premenných byte1, byte2 a byte3 cez USART pin TXD. Vyslanie hodnôt všetkých týchto troch premenných, alebo v režime „Free Runing“ aspoň byte2 a byte3, znamená úplnú a použiteľnú MIDI správu. Synchronizácia a bezpečnosť správneho vysielania viacerých bytov po sebe je zabezpečená mapovaním príznaku UDRE registra UCSRA. 7 Wind Controller a jeho praktické využitie Po úspešnom zvládnutí návrhu Wind Controllera, nám ostáva už len naznačiť jeho možnosti v rámci praktického využitia. Týchto možností je veľké množstvo. Od použitia tohto nástroja v spoločnom prepojení s iným MIDI nástrojom, ktorý má port MIDI IN, alebo s akýmkoľvek MIDI zariadením schopným prijímať MIDI dáta a následne i generovať na ich základe tóny, až po spoluprácu s PC. Moje možnosti sú momentálne obmedzené na využitie Wind Controllera na komunikáciu s PC. Využívam komunikáciu so zvukovou kartou cez rôzne hudobné programy spolupracujúce s MIDI. Pomocou týchto programov je možné nielen generovať rôzne zvuky závislé od typu spúšťaných „samplov“ alebo nastavenia sekvenceru s rôznymi farbami zvukov (možnosť výberu zvukovej obálky), ale i „Real Time“ notovať prijímané dáta. Táto téma je veľmi obšírna, a preto iba krátko uvediem 2 spôsoby pripojenia a spolupráce s PC softvérom. Prvá najzákladnejšia, najjednoduchšia forma „softvérovej komunikácie“ PC s Wind Controllerom je cez program MIDI-OX. Tento program som využil len ako „MIDI mapper“ pri ladení programu, ako napríklad pri redukovaní počtu vyslaných MIDI príkazov pri neprimeranej citlivosti programu na veľmi malé zmeny hlasitosti. Program je voľno šíriteľný a dostupný na adrese www.midiox.com a dokáže zo zvukovej karty počítača aj vygenerovať zvuk. Žiaľ iba s pevným „presetom“ – pravdepodobne Piano. Po jeho inštalácií a spustení, program netreba nijak špeciálne nastavovať. Pri použití M-Audio MIDI USB Uno rozhrania resp. prevodníka, program sám zmapoval dostupné komunikačné porty počítača a po nájdení 46 MIDI zariadenia – v našom prípade USB Uno rozhrania, otvoril MIDI OUT aj MIDI IN kanál ako je názorne vidieť na obr. 7.1. Obr. 7.1: Mapovanie vyslaných MIDI príkazov pomocou programu MIDI-OX Veľmi vhodnou a potenciálnou možnosťou využitia Wind Controllera, je spolupráca s profesionálnym, a teda i menej prístupným, programom Cubase SX. Pri inštalácií programu je potrebne doinštalovať, a v programe prestaviť, použitie klasického ovládača zvukovej karty na ovládač ASIO. Program totiž nekomunikuje zo zvukovou kartou priamo, z čoho vyplývajú oneskorené reakcie na prijaté MIDI dáta. V našom prípade sme použitím ASIO ovládača zmenšili latenciu z prvotnej hodnoty asi 530 ms na približne 7 ms. Pri použití USB Uno prevodníka sme nastavili prijímanie MIDI správ z Wind Controllera nasledovným spôsobom: • Spustíme program • otvoríme menu pre vytváranie nového projektu - klávesová skratka CTRL + N • otvorenie prázdneho projektu výberom možnosti „Empty“ • nastavíme pracovný adresár • kliknutím pravého tlačidla myši, približne v druhej pätine pracovnej plochy zľava (viď obr. 7.2), zvolíme položku „Add MIDI Track“ 47 • v položke „in :“ označenej bielou šípkou na obr. 7.2 zvolíme možnosť „All MIDI Inputs“. Obr. 7.2: Pracovná plocha programu Cubase SX Po tomto nastavení, by už mal Cubase reagovať na prijímané MIDI správy vysielané Wind Controllerom. Možnosť zmeny zvukovej obálky (voľba efektov) je už aj v tomto okne pri otvorení záložky Inserts. Keďže Wind Controller je naprogramovaný primárne ako náhrada dychového nástroja, je potrebne vybrať a nastaviť parametre nejakého dychového nástroja. Toto môžeme urobiť nasledovným spôsobom. Stlačíme klávesu F11, alebo použijeme cestu cez hlavné menu Devices – VST Instruments. Po otvorení okna kliknutím na položku „No Instruments“ a následným výberom môžeme použiť akékoľvek nainštalované virtuálne efekty. Pre začiatok odporúčam vybrať voľbu „Synths“ a následne efekty ponúkané vo virtuálnych bankách „Embracer“ alebo „Monologue“, ktoré sú dostupné priamo vo verzii Cubase SX. 48 Záver Pri návrhu bol kladený dôraz na čo najväčšiu vernosť spôsobu ovládania, v porovnaní so sopránovou zobcovou flautou a najmä na kompatibilitu Wind Controllera s MIDI zariadeniami od rôznych výrobcov. V rámci časových možností sa mi podarilo vytvoriť program, ktorý komunikuje pomocou nekontroverzných MIDI príkazov. Týmto je zabezpečená totálna kompatibilita so všetkými typmi MIDI zariadení, čo je popri originálne navrhnutom hmatovom systéme, asi najväčším prínosom tejto práce. Pri použití dotykových senzorov, bude vernosť ovládania väčšia a lepšia. Samotný návrh nie je veľmi náročný a vôbec nevyužíva všetky možnosti MIDI rozhrania. Keďže jeho súčasťou bola i praktická časť, úplne zodpovedá rozsahu diplomovej práce. Samozrejme ako pri každej práci, je ju možné neustále zdokonaľovať, takže dospieť ku konečnému riešeniu je najmä časovo náročné. Elektronické súčasti prototypu, ako aj iných ponúkaných koncepcií, boli navrhované v zmysle minimálnych nákladov, flexibility a dostatočnej jednoduchosti ovládania. Najnákladnejším prvkom v celom zariadení je tlakový senzor, ktorý sa dá nahradiť buď vlastným systémom snímania zmien tlaku, alebo senzormi od iných výrobcov, čím klesne cena celého systému približne až o pätinu. Cena tohto prototypu je pri porovnaní s komerčnými zariadeniami takéhoto typu veľmi malá - asi dvadsatina. Komerčné zariadenia síce poskytujú omnoho viac funkcií ovládania, no tieto sú založené a závislé najmä na programovom vybavení, ktoré v mojom prípade zabralo asi 15% z celkového času venovaného tomuto projektu. Zostrojiť Wind Controller schopný konkurovať komerčným typom dostupných na trhu, je pre jedného človeka zložitá úloha. Pretože nie je jednoduché vedieť nielen navrhnúť ale aj prakticky skonštruovať mechaniku alebo elektroniku snímania hmatu, senzoriku snímania dychu s vytvorením vhodného tvaru a objemu náustku a zároveň zostaviť riadiaci algoritmus a napísať software pre použitý mikroprocesor. Podobné úlohy riešili celé tímy vývojových pracovníkov firiem AKAI, YAMAHA a pod. 49 Zoznam použitej literatúry [1] The Complete MIDI 1.0 Detailed Specification, document version 96.1, MIDI Manufac turers Association, Japan MIDI Standard Committee, 1997. [2] FORRÓ, D. Svet MIDI, vydání 1. Grada Publishing s.r.o., Praha 1997. [3] Domovská stránka firmy Atmel. URL: www.atmel.com/products/avr (16.2.2007). [4] SNOREK, M. Standardní rozhraní PC. Grada a.s, Praha 1992. [5] MINASI, M. PC - Velký pruvodce hardwarem, 8. vydání. Grada a.s. 2000. [6] Internetový článok o konektoroch a.i. URL: http://www.tydyt.cz/kabely/ (16.2.2007). [7] On-line katalógy elektrických súčiastok :http://www..alldatasheet.com(11.4.2007) http://www..alldatasheet.com/datasheet-pdf/pdf/78532/ATMEL/ATmega16.html http://www..alldatasheet.com/datasheet-pdf/pdf/5183/MOTOROLA/MPX5010.html http://www.alldatasheet.com/datasheet-pdf/pdf/179390/QUANTUM/QT1081.html [8] SCHIMMEL, J. Komunikační protokol MIDI. Elektrorevue - Internetový časopis (http://www.elektrorevue.cz), ISSN 1213-1539, 2002, roč. 2002, č. 69, s. 1 10.Dostupné online http://147.229.144.23/clanky/02069/.iso-8859-1 (16.2.2007) [9] SCHIMMEL, J. Metody synchronizace audio a video zařízení. Elektrorevue – Interne tový časopis (http://www.elektrorevue.cz), ISSN 1213-1539, 2002, roč. 2002, č.51. Dostupné online http://147.229.144.23/clanky/02051/ (16.2.2007) [10] Internetová encyklopédia. URL: http://sk.wikipedia.org (11.4.2007) [11] Stránka venujúca sa elektronike a IT - Seriál o programovaní procesorov AVR URL: http://programujte.sk/search.php?rstext=all-phpRS-all&rstema=179 (11.4.2007) [12] Domovská stránka fy. M-Audio. http://www.m-audio.com URL: http://www.m-audio.com/products/en_us/Uno-main.html [13] Stránka zameraná na Wind Controllery. URL: http://patchmanmusic.com/ [14] http://www.pcforum.sk/schema-dotykovy-spinac-vt10600.html [15] MATOUŠEK, David: Práce s mikrokontroléry atmel AVR. Praha: BEN, 2006. 376 s. ISBN 80-7300-209-4 [16] 8051.COM: ISP Serial programmer for AVR and AT89S. http://www.8052.com/users/battika/, (10. 11. 2006). [17] URL: www.midiox.com 50 ČESTNÉ VYHLÁSENIE Vyhlasujem, že som zadanú diplomovú prácu vypracoval samostatne, pod odborným vedením vedúceho diplomovej práce Ing. Michala Kubu, PhD. a používal som len literatúru uvedenú v práci. Súhlasím so zapožičiavaním diplomovej práce. V Žiline dňa 18.mája 2007 Juraj Illa 51 POĎAKOVANIE Touto cestou by som chcel poďakovať Bohu a všetkým, ktorý mi pri tvorbe diplomovej práce pomohli. Ďakujem vedúcemu svojej diplomovej práce Ing. Michalovi Kubovi, PhD. za odporné vedenie a poskytnutú pomoc, pripomienky a rady. Veľká vďaka patrí aj mojim rodičom za všetky povzbudenia, trpezlivosť ich veľkú podporu pri štúdiu. Taktiež nesmiem zabudnúť na priateľov a spolužiakov, ktorí mi pomohli s viacerými technickými problémami. Najmä ďakujem Ing. Mizovovi Maximovi za konzultácie pri vytváraní návrhu a za pomoc pri výbere vhodných riešení. Ďalej by som chcel poďakovať Jánovi Hutárovi za poskytnutie programátora a pomoc pri dolaďovaní softvérového rozhrania. V Žiline 18.mája 2007 Juraj Illa 52 ŽILINSKÁ UNIVERZITA V ŽILINE Elektrotechnická fakulta Katedra telekomunikácií Návrh a koncepcia MIDI zariadenia Wind Controller DIPLOMOVÁ PRÁCA PRÍLOHOVÁ ČASŤ JURAJ ILLA ŽILINA 2007 53 Obsah príloh A.1 Hmatová mapa Wind Controllera ................................................................54 A.2 Pomocná hmatová mapa v tabuľkovej forme..............................................55 A.3 Elektrická schéma Wind Controllera ...........................................................56 A.4 Zoznam a kusovník súčiastok Wind Controllera ........................................57 A.5 Plošný spoj prototypu Wind Controllera a jeho osadzovací plán..............58 A.6 Wind Controller – fotografie prototypu.......................................................59 A.7 Programové rozhranie Wind Controllera....................................................60 54 A.1 Hmatová mapa Wind Controllera Obr.1: Rozsah nôt c1 až dis1 Obr.2: Rozsah nôt d1 až g1 Obr.3: Rozsah nôt gis1 až h1 Obr.4: Rozsah nôt c2 až dis2 Obr.5: Rozsah nôt e2 až g2 Obr.6: Rozsah nôt gis2 až h2 Obr.7: Noty c3, d3 a legenda k prstokladom 55 A.2 Pomocná hmatová mapa v tabuľkovej forme Tab. A.2.1: Hmatová mapa Wind Controllera vzhľadom na hodnoty portov ATMEGA 16 PORT C PORT D NOTA PORT HEX 7 6 5 4 3 2 1 0 7 6 5 označenie MidiHEX PINC PIND 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 C1 Cis1 D1 Dis1 E1 F1 Fis G Gis A B1 B1 altern. H1 C2 Cis2 D2 D2 altern. D2 altern. D2 altern. Dis2 Dis2 alter. Dis2 alter. E2 E2 altern. E2 altern. E2 altern. Fis2 Fis2 altern. G2 G2 altern. Gis2 Gis2 alter. A2 A2 altern. B2 B2 altern. H2 H2 altern. C3 C3 altern. D3 D3 altern. 3C 3D 3E 3F 40 41 42 43 44 45 46 46 47 48 49 4A 4A 4A 4A 4B 4B 4B 4C 4C 4D 4D 4E 4E 4F 4F 50 50 51 51 52 52 53 53 54 54 56 56 0x00 0x00 0x02 0x02 0x06 0x0A 0x12 0x1E 0x26 0x3E 0x5E 0x4E 0x7E 0xBE 0x3F 0xFF 0xBF 0x02 0x03 0x02 0x03 0x03 0x06 0x07 0x0A 0x0B 0x16 0x17 0x1E 0x1F 0x2E 0x2F 0x3E 0x3F 0x22 0x23 0x26 0x27 0x66 0x67 0x4A 0x4B 0xE0 0xA0 0xE0 0x60 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xE0 0xC0 0xC0 0x40 0x40 0xE0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 0xC0 56 A.3 Elektrická schéma Wind Controllera Obr.A.3.1: Elektrická schéma Wind Controllera 57 A.4 Zoznam a kusovník súčiastok Wind Controllera Tab. A.4.1: Zoznam súčiastok Názov IC1 IC2 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 R1 R2 R3 C1 C2 C3 C4 X1 ST1 Q1 U$1 Typové označenie 74ALS05N ATMEGA16AU 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. 40-SMD mikrosp. P-B 175 G – dlhá páčka P-B 175 G – dlhá páčka P-B 175 G – dlhá páčka 220R 220R 220R C22pF C22pF C100nF C100nF MAB5SH MSFW6 KRYSTAL 8MHz U49 MPX5010 Hodnota 220Ω 220Ω 220Ω 22pF 22pF 100nF 100nF samica 6 pin. 8MHz 10kPa Tab. A.4.2: Kusovník súčiastok Typové označenie 74ALS05N ATMEGA16AU 40-SMD mikrosp. Tlačidl. P-B 175 G - dlhá páčka 220R C22pF C100nF MAB5SH MSFW6 KRYSTAL 8MHz U49 MPX5010 Hodnota 220Ω 22pF 100nF samica 6 vývodov 8MHz 10kPa Kusov 1 1 8 3 3 2 2 1 1 1 1 58 A.5 Plošný spoj prototypu Wind Controllera a jeho osadzovací plán Plošný spoj Wind Controllera Obr. A.5.1: Horná strana plošného spoja Obr. A.5.2: Spodná strana plošného spoja Osadzovací plán plošného spoja Obr. A.5.3: Rozloženie súčiastok hornej strany plošného spoja Obr. A.5.4: Rozloženie súčiastok spodnej strany plošného spoja 59 A.6 Wind Controller – fotografie prototypu Obr. A.6.1: Fotografia hornej strany prototypu Obr. A.6.2: Fotografia spodnej strany prototypu Obr. A.6.3: Fotografia prototypu z boku Obr. A.6.4: Detailný pohľad na riadiaci mikroprocesor ATMEGA16 a programovací konektor (vľavo) a na zapojenie MIDI rozhrania (vpravo) 60 A.7 Programové rozhranie Wind Controllera (program s kompletnými vysvetlivkami je na priloženom CD ) /* Name : WC v.1.1 Product : MIDI Wind Controller Producer: JURAJ ILLA Date : 1.4.2007 */ #include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <inttypes.h> #define FOSC 8000000 #define MIDI_BAUD_RATE 31250 #define MYUBRR FOSC/16/MIDI_BAUD_RATE-1 /* ****************************************************************** * I/O port Init * ****************************************************************** */ void IO_Init ( void ) { PORTC=0xFF; /* aktivuje Pull-upy na celom Porte C */ DDRC =0x00; /* PORT C - vsetky piny ako vstupy */ PORTD= 0xE0; /* aktivuje Pull-upy v pinoch PD 5,6,7 */ DDRD = DDRD & ((0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD1)); } /* ****************************************************************** * USART Init * ****************************************************************** */ void USART_Init (unsigned int ubrr) 61 { UBRRH = (unsigned char)(ubrr>>8); /* Set baud rate */ UBRRL = (unsigned char)ubrr; /* Nastavenie UBRRH a L*/ /* Enable transmitter */ UCSRB = (0<<TXCIE) | (0<<UDRIE) | (1<<TXEN); /* Set frame & transmit format */ UCSRC = (1<<URSEL) | (0<<UMSEL) | (0<<USBS) | (3<<UCSZ0); } /* ****************************************************************** * ADConverter Init * ****************************************************************** */ void ADC_Init(void) { ADMUX=0x40; ADCSRA= 0x86; } /* ****************************************************************** * UART Transmit * ****************************************************************** */ void USART_Transmit( unsigned char data ) { while ( !( UCSRA & (1<<UDRE)) ); /* kontrola prazdneho UDR */ UDR = data; /* Vloz data do bufferu => posli data */ } /* ****************************************************************** * Read ADConverter * ****************************************************************** */ unsigned int Read_ADC(void) { 62 ADCSRA |= 0x40; // Start AD prevodu while ((ADCSRA & (1<<ADIF)) != (1<<ADIF)); //cakanie na jeho dokonc. return ADCW; //postupne naplnanie ADCW vysledkami AD prevodu } /* ****************************************************************** * CITAJ HMAT * ****************************************************************** */ //definovanie hmatov pomocou „predikovanych hodnot“ na portoch C a D #define NOTA_PINC_C1 0x00 #define NOTA_PIND_C1 0xE0 #define NOTA_C1 0x3C // NOTA_C1 #define NOTA_PINC_CIS1 0x00 #define NOTA_PIND_CIS1 0xA0 #define NOTA_CIS1 0x3D // #define NOTA_PINC_D1 0x02 #define NOTA_PIND_D1 0xE0 #define NOTA_D1 0x3E // #define NOTA_PINC_DIS1 0x02 #define NOTA_PIND_DIS1 0x60 #define NOTA_DIS1 0x3F // #define NOTA_PINC_E1 0x06 #define NOTA_PIND_E1 0xE0 #define NOTA_E1 0x40 // #define NOTA_PINC_F1 0x0A #define NOTA_PIND_F1 0xE0 #define NOTA_F1 0x41 // #define NOTA_PINC_FIS1 0x12 #define NOTA_PIND_FIS1 0xE0 #define NOTA_FIS1 0x42 // NOTA_FIS1 #define NOTA_PINC_G1 0x1E #define NOTA_PIND_G1 0xE0 #define NOTA_G1 0x43 #define NOTA_PINC_GIS1 0x26 // 63 #define NOTA_PIND_GIS1 0xE0 #define NOTA_GIS1 0x44 // #define NOTA_PINC_A1 0x3E #define NOTA_PIND_A1 0xE0 #define NOTA_A1 0x45 // #define NOTA_PINC_B1 0x5E #define NOTA_PIND_B1 0xE0 #define NOTA_B1 0x46 // #define NOTA_PINC_B1_2 0x4E #define NOTA_PINC_H1 0x7E #define NOTA_PIND_H1 0xE0 #define NOTA_H1 0x47 // #define NOTA_PINC_C2 0xBE #define NOTA_PIND_C2 0xE0 #define NOTA_C2 0x48 // #define NOTA_PINC_CIS2 0x3F #define NOTA_PIND_CIS2 0xE0 #define NOTA_CIS2 0x49 // #define NOTA_PINC_D2 0xFF #define NOTA_PIND_D2 0xE0 #define NOTA_D2 0x4A // NOTA_D2 + jej 3 alternativy #define NOTA_PINC_D2_2 0xBF #define NOTA_PINC_D2_3 0x02 #define NOTA_PIND_D2_3 0xC0 #define NOTA_PINC_D2_4 0x03 #define NOTA_PINC_DIS2 0x02 #define NOTA_PIND_DIS2 0x40 #define NOTA_DIS2 0x4B // #define NOTA_PINC_DIS2_2 0x03 #define NOTA_PIND_DIS2_3 0xE0 #define NOTA_PINC_E2 0x06 #define NOTA_PIND_E2 0xC0 #define NOTA_E2 0x4C #define NOTA_PINC_E2_2 0x07 #define NOTA_PINC_F2 0x0A // 64 #define NOTA_PIND_F2 0xC0 #define NOTA_F2 0x4D // #define NOTA_PINC_F2_2 0x0B #define NOTA_PINC_FIS2 0x16 #define NOTA_PIND_FIS2 0xC0 #define NOTA_FIS2 0x4E // #define NOTA_PINC_FIS2_2 0x17 #define NOTA_PINC_G2 0x1E #define NOTA_PIND_G2 0xC0 #define NOTA_G2 0x4F // #define NOTA_PINC_G2_2 0x1F #define NOTA_PINC_GIS2 0x2E #define NOTA_PIND_GIS2 0xC0 #define NOTA_GIS2 0x50 // #define NOTA_PINC_GIS2_2 0x2F #define NOTA_PINC_A2 0x3E #define NOTA_PIND_A2 0xC0 #define NOTA_A2 0x51 // #define NOTA_PINC_A2_2 0x3F #define NOTA_PINC_B2 0x22 #define NOTA_PIND_B2 0xC0 #define NOTA_B2 0x52 // NOTA_B2 #define NOTA_PINC_B2_2 0x23 #define NOTA_PINC_H2 0x26 #define NOTA_PIND_H2 0xC0 #define NOTA_H2 0x53 // #define NOTA_PINC_H2_2 0x27 #define NOTA_PINC_C3 0x66 #define NOTA_PIND_C3 0xC0 #define NOTA_C3 0x54 // #define NOTA_PINC_C3_2 0x67 #define NOTA_PINC_D3 0x4A #define NOTA_PIND_D3 0xC0 #define NOTA_D3 0x56 #define NOTA_PINC_D3_2 0x4B // 65 #define ALL_OFF 0x7B // ALL NOTES OFF #define ALL_OFF_PINC 0xFF #define ALL_OFF_PIND 0x20 // SAMOTNA FUNKCIA CITAJ_HMAT unsigned char CITAJ_HMAT(void) { register uint8_t pinc = PINC; register uint8_t pind = PIND & 0xE0; // vymaskovanie portu D if ((pinc == ALL_OFF_PINC) && (pind == ALL_OFF_PIND)) return ALL_OFF; if ((pinc == NOTA_PINC_C1) && (pind == NOTA_PIND_C1)) return NOTA_C1; else if ((pinc == NOTA_PINC_CIS1) && (pind == NOTA_PIND_CIS1)) return NOTA_CIS1; else if ((pinc == NOTA_PINC_D1) && (pind == NOTA_PIND_D1)) return NOTA_D1; else if ((pinc == NOTA_PINC_DIS1) && (pind == NOTA_PIND_DIS1)) return NOTA_DIS1; else if ((pinc == NOTA_PINC_E1) && (pind == NOTA_PIND_E1)) return NOTA_E1; else if ((pinc == NOTA_PINC_F1) && (pind == NOTA_PIND_F1)) return NOTA_F1; else if ((pinc == NOTA_PINC_FIS1) && (pind == NOTA_PIND_FIS1)) return NOTA_FIS1; else if ((pinc == NOTA_PINC_G1) && (pind == NOTA_PIND_G1)) return NOTA_G1; else if ((pinc == NOTA_PINC_GIS1) && (pind == NOTA_PIND_GIS1)) return NOTA_GIS1; else if ((pinc == NOTA_PINC_A1) && (pind == NOTA_PIND_A1)) return NOTA_A1; else if ((pinc == NOTA_PINC_B1) && (pind == NOTA_PIND_B1)) return NOTA_B1; else if ((pinc == NOTA_PINC_B1_2) && (pind == NOTA_PIND_B1)) 66 return NOTA_B1; else if ((pinc == NOTA_PINC_H1) && (pind == NOTA_PIND_H1)) return NOTA_H1; else if ((pinc == NOTA_PINC_C2) && (pind == NOTA_PIND_C2)) return NOTA_C2; else if ((pinc == NOTA_PINC_CIS2) && (pind == NOTA_PIND_CIS2)) return NOTA_CIS2; else if ((pinc == NOTA_PINC_D2) && (pind == NOTA_PIND_D2)) return NOTA_D2; else if ((pinc == NOTA_PINC_D2_2) && (pind == NOTA_PIND_D2)) return NOTA_D2; else if ((pinc == NOTA_PINC_D2_3) && (pind == NOTA_PIND_D2_3)) return NOTA_D2; else if ((pinc == NOTA_PINC_D2_4) && (pind == NOTA_PIND_D2_3)) return NOTA_D2; else if ((pinc == NOTA_PINC_DIS2) && (pind == NOTA_PIND_DIS2)) return NOTA_DIS2; else if ((pinc == NOTA_PINC_DIS2_2) && (pind==NOTA_PIND_DIS2)) return NOTA_DIS2; else if ((pinc == NOTA_PINC_DIS2_2)&&(pind==NOTA_PIND_DIS2_3)) return NOTA_DIS2; else if ((pinc == NOTA_PINC_E2) && (pind == NOTA_PIND_E2)) return NOTA_E2; else if ((pinc == NOTA_PINC_E2_2) && (pind == NOTA_PIND_E2)) return NOTA_E2; else if ((pinc == NOTA_PINC_F2) && (pind == NOTA_PIND_F2)) return NOTA_F2; else if ((pinc == NOTA_PINC_F2_2) && (pind == NOTA_PIND_F2)) return NOTA_F2; else if ((pinc == NOTA_PINC_FIS2) && (pind == NOTA_PIND_FIS2)) return NOTA_FIS2; else if ((pinc==NOTA_PINC_FIS2_2) && (pind == NOTA_PIND_FIS2)) return NOTA_FIS2; else if ((pinc == NOTA_PINC_G2) && (pind == NOTA_PIND_G2)) return NOTA_G2; 67 else if ((pinc == NOTA_PINC_G2_2) && (pind == NOTA_PIND_G2)) return NOTA_G2; else if ((pinc == NOTA_PINC_GIS2) && (pind == NOTA_PIND_GIS2)) return NOTA_GIS2; else if ((pinc==NOTA_PINC_GIS2_2) && (pind == NOTA_PIND_GIS2)) return NOTA_GIS2; else if ((pinc == NOTA_PINC_A2) && (pind == NOTA_PIND_A2)) return NOTA_A2; else if ((pinc == NOTA_PINC_A2_2) && (pind == NOTA_PIND_A2)) return NOTA_A2; else if ((pinc == NOTA_PINC_B2) && (pind == NOTA_PIND_B2)) return NOTA_B2; else if ((pinc == NOTA_PINC_B2_2) && (pind == NOTA_PIND_B2)) return NOTA_B2; else if ((pinc == NOTA_PINC_H2) && (pind == NOTA_PIND_H2)) return NOTA_H2; else if ((pinc == NOTA_PINC_H2_2) && (pind == NOTA_PIND_H2)) return NOTA_H2; else if ((pinc == NOTA_PINC_C3) && (pind == NOTA_PIND_C3)) return NOTA_C3; else if ((pinc == NOTA_PINC_C3_2) && (pind == NOTA_PIND_C3)) return NOTA_C3; else if ((pinc == NOTA_PINC_D3) && (pind == NOTA_PIND_D3)) return NOTA_D3; else if ((pinc == NOTA_PINC_D3_2) && (pind == NOTA_PIND_D3)) return NOTA_D3; else return 0xEF; } /* ***************************************************************** * Hlavny program * ***************************************************************** */ #define byte1 0x90 // notu zapnut 68 #define LOW_ADCV 0x0A // minimalny tlak na aktivovanie noty #define ROZDIEL // minimalna hodnota pre zmenu hlasitosti 0x05 void main( void ) { IO_Init (); ADC_Init(); // inicializacie periferii USART_Init (MYUBRR); // inicializacie premennych pre hlavny cyklus unsigned char byte2, byte3, NOTA, NOTA1, ADCV, ADCV1, TONY_OFF, AKTIVNE; unsigned int ADCW1; uint8_t ADCVTMP; // pociatocne podmienky TONY_OFF=0x00; AKTIVNE =0x00; NOTA1 =0x00; ADCV1 =0x00; /**************************Hlavny cyklus***************************/ while(1) { ADCW1 = Read_ADC(); ADCW1 -= 87; //87 -> 0 hodnota pri nulovom diferencialnom tlak if ((SREG & 0x01) == 0x01) //zabezpecenie proti preteceniu { ADCW1 = 0x0000; ADCW1 = ADCW1 >> 3; } //bitovy posun- redukcia 1024->127 ADCV=(unsigned char)ADCW1; // pretipovavanie if (ADCV > LOW_ADCV) { //ADCV += 5; //manualne nastavovanie hlasitosti v pripade potreby TONY_OFF=0x00; NOTA=CITAJ_HMAT(); // stanovenie absolutnej hodnoty zmeny ADCV = hlasitosti ADCVTMP = ADCV1 - ADCV; if ((SREG & 0x01) == 0x01) { ADCVTMP = ADCV - ADCV1; } 69 if (ADCVTMP > ROZDIEL) { if (NOTA!=0xEF) { if (NOTA==NOTA1) { NOTA1=NOTA; if (ADCV!=ADCV1) { byte2=NOTA1; byte3=ADCV; USART_Transmit(byte2); USART_Transmit(byte3); ADCV1=ADCV; } // tu cyklus konci bez ELSE ! ( => konci prva vetva, druha zacina) } else { if (ADCV==ADCV1) { byte2=NOTA1; byte3=0x00; USART_Transmit(byte2); USART_Transmit(byte3); byte2=NOTA; byte3=ADCV1; USART_Transmit(byte1); USART_Transmit(byte2); USART_Transmit(byte3); NOTA1=NOTA; } else { if (AKTIVNE==1){ byte2=NOTA1; byte3=0x00; USART_Transmit(byte2); USART_Transmit(byte3); byte2=NOTA; byte3=ADCV1; 70 USART_Transmit(byte1); USART_Transmit(byte2); USART_Transmit(byte3); NOTA1=NOTA; } else { byte2=NOTA; byte3=ADCV1; USART_Transmit(byte1); USART_Transmit(byte2); USART_Transmit(byte3); NOTA1=NOTA; AKTIVNE=0x01; } ADCV1=ADCV; } // tu cyklus konci ! ( => konci druha vetva, tretia zacina) } // nasleduje tretia ( posledna vacsia vetva , v ktorej kedze sa do cidla nefuka dostatocnym tlakom , ton(y) sa vypinaju (ukoncuju) } } } else { if (TONY_OFF==0x00) { byte2=NOTA1; byte3=0x00; USART_Transmit(byte2); USART_Transmit(byte3); TONY_OFF=1; AKTIVNE=0x00; } } // KONIEC KONTROLY MINIMALNEHO TLAKU // } // KONIEC HLAVNEHO CYKLU // } // KONIEC HLAVNEHO PROGRAMU //