Uploaded by panak4

dipl praca

advertisement
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 //
Download