VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV RADIOELEKTRONIKY FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF RADIO ELECTRONICS
BICÍ AUTOMAT PRO HUDEBNÍKY
DIPLOMOVÁ PRÁCE MASTER'S THESIS
AUTOR PRÁCE AUTHOR
BRNO 2014
Bc. TOMÁŠ SPÁČIL
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ ÚSTAV RADIOELEKTRONIKY FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF RADIO ELECTRONICS
BICÍ AUTOMAT PRO HUDEBNÍKY DRUM MACHINE FOR MUSICIANS
DIPLOMOVÁ PRÁCE MASTER'S THESIS
AUTOR PRÁCE
Bc. TOMÁŠ SPÁČIL
AUTHOR
VEDOUCÍ PRÁCE SUPERVISOR
BRNO 2014
Ing. ALEŠ POVALAČ, Ph.D.
VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Fakulta elektrotechniky a komunikačních technologií Ústav radioelektroniky
Diplomová práce magisterský navazující studijní obor Elektronika a sdělovací technika Student: Ročník:
Bc. Tomáš Spáčil 2
ID: 125639 Akademický rok: 2013/2014
NÁZEV TÉMATU:
Bicí automat pro hudebníky POKYNY PRO VYPRACOVÁNÍ: Prostudujte způsoby generování zvuku s vyšší kvalitou a jejich syntézu pomocí mikrokontroléru. Zaměřte se zejména na neharmonické signály. Na základě rešerše vyberte vhodný mikrokontrolér, navrhněte blokově jednotlivé části bicího automatu a následně jeho celkové schéma. Navrhněte základní algoritmy jednotlivých funkcí. Vytvořte firmware pro mikrokontrolér, zahrnující všechny požadované funkce bicího automatu, zejm. funkce s volbou změny rychlosti přehrávání uložených sekvencí a přidávání nových z dostupných zvuků v paměti formou skladatele v reálném čase. Zhodnoťte možnosti rozlišení akcentu a délky zvuku při stisku. Navrhněte celkový vzhled zařízení a vše realizujte jako funkční prototyp. DOPORUČENÁ LITERATURA: [1] RUSS, M. Sound Synthesis and Sampling. Oxford: Focal Press, 2009. [2] MATOUŠEK, D. Práce s mikrokontroléry ATMEL AVR. Praha: BEN - technická literatura, 2006. Termín zadání:
10.2.2014
Termín odevzdání:
23.5.2014
Vedoucí práce: Ing. Aleš Povalač, Ph.D. Konzultanti diplomové práce:
doc. Ing. Tomáš Kratochvíl, Ph.D. Předseda oborové rady UPOZORNĚNÍ: Autor diplomové práce nesmí při vytváření diplomové práce porušit autorská práva třetích osob, zejména nesmí zasahovat nedovoleným způsobem do cizích autorských práv osobnostních a musí si být plně vědom následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb., včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č.40/2009 Sb.
ABSTRAKT Cílem této práce je vytvoření funkčního prototypu bicího automatu s generováním zvuku pomocí mikrokontroléru. Úvod práce je věnován obecnému bicímu automatu a rozborem jeho jednotlivých částí, samotného principu a základních pracovních režimů. Následující kapitola se zabývá principem zpracování digitálního signálu a generováním zvuku pomocí mikrokontroléru. Část této kapitoly se zaměřuje také na mixování s využitím kompresních metod. Jádrem práce je návrh vlastní blokové struktury a celkového schématu bicího automatu s popisem jednotlivých částí. Následuje jeho rozbor a realizace, jak po stránce teoretické tak praktické. Jedná se převážně o prezentace a popis důležitých částí kódu firmwaru, návrh DPS a dalších technických dokumentací potřebných pro výrobu finálního prototypu. Závěr obsahuje shrnutí dosažených výsledků, jejich prezentaci a diskuzi.
KLÍČOVÁ SLOVA Bicí automat, mikrokontrolér, pulzně kódová modulace, číslicové zpracování signálu, číslicově analogový převod, delta-sigma modulace, kompresní metody, ARM, STM, C++, SD karta, LCD.
ABSTRACT The aim of this work is to create a functional prototype of a drum machine with sound generating using a microcontroller. Introduction is devoted to general drum machine and an analysis of its parts, principle and basic modes of operation. The following chapter deals with the principle of digital signal processing and sound generation using a microcontroller. Part of this chapter is focused on mixing using compression methods. The core of this work is to design my own block structure and overall scheme of the drum machine with a description of the parts. Followed by analysis and implementation with theoretical and practical point of view. It is mainly about presentation and description of important parts of firmware codes, DPS design and another technical documentation useful for final prototype production. The conclusion contains a summary of the results with prezentation and discussion.
KEYWORDS Drum machine, microcontroller, pulse code modulation, digital signal processing, digital analog conversion, delta-sigma modulation, compression methods, ARM, STM, C++, SD card, LCD.
SPÁČIL, T. Bicí automat pro hudebníky: diplomová práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav radioelektroniky, 2014. 65 s. Vedoucí práce byl Ing. Aleš Povalač, Ph.D..
PROHLÁŠENÍ Prohlašuji, že svou diplomovou práci na téma „Bicí automat pro hudebníky“ jsem vypracoval samostatně pod vedením vedoucího diplomové práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor uvedené diplomové práce dále prohlašuji, že v souvislosti s vytvořením této diplomové práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl nedovoleným způsobem do cizích autorských práv osobnostních a/nebo majetkových a jsem si plně vědom následků porušení ustanovení S 11 a následujících autorského zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), ve znění pozdějších předpisů, včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č. 40/2009 Sb.
Brno
...............
.................................. (podpis autora)
Faculty of Electrical Engineering and Communication Brno University of Technology Purkynova 118, CZ-61200 Brno, Czechia http://www.six.feec.vutbr.cz
Výzkum popsaný v této diplomové práci byl realizován v laboratořích podpořených z projektu SIX; registrační číslo CZ.1.05/2.1.00/03.0072, operační program Výzkum a vývoj pro inovace.
PODĚKOVÁNÍ Rád bych poděkoval vedoucímu diplomové práce panu Ing. Aleši Povalačovi, Ph.D. za účinnou metodickou, pedagogickou a odbornou pomoc a další cenné rady při zpracování mé diplomové práce. Dále bych chtěl poděkovat společnosti Texas Instruments za posílání vzorků.
Brno
...............
.................................. (podpis autora)
OBSAH Úvod
11
1 Bicí automat 12 1.1 Jednotlivé části a princip . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.2 Pracovní režimy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2 Zpracování digitálního signálu 2.1 Číslicově analogový převod . . . . . . . . . . . 2.2 Zpracování zvuku pomocí mikrokontroléru . . 2.3 Mixování PCM signálu . . . . . . . . . . . . . 2.3.1 Normalizace pomocí metody clipping . 2.3.2 Normalizace pomocí lineárního útlumu 2.3.3 Lineární dynamická komprese . . . . . 2.3.4 Logaritmická dynamická komprese . .
. . . . . . .
. . . . . . .
3 Vlastní návrh bicího automatu 3.1 Blokové schéma a návrh hardware . . . . . . . . . 3.1.1 Výběr mikrokontroléru . . . . . . . . . . . 3.1.2 SD karta . . . . . . . . . . . . . . . . . . . 3.1.3 D/A převodník se zesilovačem ve třídě D . 3.1.4 Mix se zesilovačem ve třídě AB . . . . . . 3.1.5 LCD . . . . . . . . . . . . . . . . . . . . . 3.1.6 Uživatelské rozhraní . . . . . . . . . . . . 3.2 Softwarové řešení a návrh firmware . . . . . . . . 3.2.1 Knihovna pro SD kartu a FAT systém . . 3.2.2 Knihovna pro obvod CS43L22 . . . . . . . 3.2.3 Knihovna pro LCD a touchpad . . . . . . 3.2.4 Software pro uživatelské rozhraní . . . . . 3.2.5 Software pro režimy bicího automatu . . . 3.2.6 Princip rozlišení akcentu a délky zvuku při 3.2.7 Vývoj Softwaru celkové aplikace . . . . . . 3.3 Realizace bicího automatu . . . . . . . . . . . . . 3.3.1 Vývoj a návrh DPS . . . . . . . . . . . . . 3.3.2 Návrh zařízení a jeho finální podoby . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . stisku . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . .
16 16 16 18 19 20 20 21
. . . . . . . . . . . . . . . . . .
23 23 24 25 27 28 30 31 32 33 35 36 40 43 46 47 47 48 49
4 Závěr
50
Literatura
51
Seznam symbolů, veličin a zkratek
54
Seznam příloh
56
A Schémata zapojení
57
B Vývojové diagramy
58
C Návrhy desek plošných spojů
60
D Výkresy
63
E Fotodokumentace
64
SEZNAM OBRÁZKŮ 1.1 1.2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 A.1 B.1 B.2 C.1 C.2 C.3 C.4 C.5 D.1 D.2 E.1 E.2
Bloková struktura bicího automatu. . . . . . . . . . . . . . . . . . . Vývojový diagram pro režim skladatele. . . . . . . . . . . . . . . . . Číslicově analogový převod. . . . . . . . . . . . . . . . . . . . . . . Princip PWM signálu. . . . . . . . . . . . . . . . . . . . . . . . . . Korektní interpretace vzorků v neznaménkovém formátu. . . . . . . Interference dvou signálů při mixování. . . . . . . . . . . . . . . . . Normalizace metodou clipping. . . . . . . . . . . . . . . . . . . . . Normalizace metodou lineárního útlumu. . . . . . . . . . . . . . . . Lineární dynamická komprese. . . . . . . . . . . . . . . . . . . . . . Logaritmická dynamická komprese. . . . . . . . . . . . . . . . . . . Logaritmická dynamická komprese celého rozsahu. . . . . . . . . . . Bloková schéma bicího automatu. . . . . . . . . . . . . . . . . . . . Zapojení socketu pro micro SD kartu. . . . . . . . . . . . . . . . . . Princip delta-sigma D/A převodníku (převzato z [14]). . . . . . . . Schéma zapojení mixu se zesilovačem ve třídě AB. . . . . . . . . . . Schéma zapojení tlačítek do klávesnice. . . . . . . . . . . . . . . . . Průběhy enkodéru generované při rotaci. . . . . . . . . . . . . . . . Schéma zapojení rotačního enkodéru. . . . . . . . . . . . . . . . . . Struktura volání vrstev při komunikaci s SD kartou. . . . . . . . . . Vzhled menu bicího automatu. . . . . . . . . . . . . . . . . . . . . . Vývojový diagram vykreslení obrázku s SD karty na LCD. . . . . . Vývojový diagram principu stisku tlačítka s ošetřením. . . . . . . . Princip nastavování offsetu při mixování. . . . . . . . . . . . . . . . Využité piny MCU v simulaci programu STM32CubeMX. . . . . . . Stabilizátory pro napájení na kitu Discovery. . . . . . . . . . . . . . Celkové schéma základní desky bicího automatu. . . . . . . . . . . . Vývojový diagram hlavního programu bicího automatu. . . . . . . . Vývojový diagram režimu přehrávání zvuku bicích stiskem tlačítka. DPS základní desky bicího automatu - top. . . . . . . . . . . . . . . DPS základní desky bicího automatu - bottom. . . . . . . . . . . . DPS klávesnice - top. . . . . . . . . . . . . . . . . . . . . . . . . . . DPS klávesnice - bottom. . . . . . . . . . . . . . . . . . . . . . . . . DPS enkodéru. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrtný plán pro horní kryt přístrojové krabice (měřítko 3:4). . . . . . Návrh popisků přístrojové krabice. . . . . . . . . . . . . . . . . . . Spojení samostatných DPS. . . . . . . . . . . . . . . . . . . . . . . Umístění výrobku do krabičky. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13 14 16 17 18 19 19 20 21 22 22 23 26 27 29 31 32 32 33 38 39 41 44 48 49 57 58 59 60 61 62 62 62 63 63 64 64
E.3 Pohled na zádní panel. . . . . . . . . . . . . . . . . . . . . . . . . . . 65 E.4 Realizovaný prototyp v činnosti. . . . . . . . . . . . . . . . . . . . . . 65
SEZNAM TABULEK 3.1 3.2 3.3
Přehled zvažovaných mikrokontrolérů z rodiny STM. . . . . . . . . . 25 Význam pinů micro SD karty pro komunikační módy. . . . . . . . . . 26 Parametry obvodu TPA233. . . . . . . . . . . . . . . . . . . . . . . . 30
ÚVOD Motiv výběru tohoto tématu jako diplomové práce byl podmíněn myšlenkou vytvořit plnohodnotnou náhradu bicí soupravy s absencí fyzického bubeníka. Hlavní důvod vzniku této myšlenky tkví v možnosti podpory a doprovodu hry na hudební nástroj při domácím cvičení. V dnešní době již existuje řada softwarových programů, které umožňují generovat jednotlivé zvuky bicích poměrně věrohodně. Tyto softwary většinou pracují s formátem MIDI, který v podstatě představuje něco jako notový zápis jednotlivých úderů. Program pak pomocí MIDI formátu nahradí všechny zapsané údery svými vlastními samply, kterými disponuje. Zmíněné programy dnes nacházejí své uplatnění hlavně v nahrávacích studiích. Nahrazují tak poměrně zdlouhavou práci fyzického bubeníka s výsledkem nepříliš odlišným od reálného hraní. Nevýhoda, která plyne ze své podstaty, je neustálá nutnost práce s PC. Flexibilita a přenosnost zařízení podporující hru během cvičení na hudební nástroj může však v některých případech hrát svoji roli. Proto fyzické zařízení, které již v sobě obsahuje všechny potřebné funkce, se v tomto případě uplatní více. Samotná myšlenka však není inovativní, poněvadž takováto zařízení již existují a jsou k prodeji ve většině obchodů s hudebninami. Nicméně většina bicích automatů nesplňuje určité parametry, pokud se jedná o cenově levnější zařízení, nebo naopak disponují s přebytečným množstvím někdy až nepotřebných funkcí, čemuž odpovídá pak i cena. Shrnutí výše zmíněných důvodů tak dalo za vznik zadání, pro návrh bicího automatu pro hudebníky přesně na míru mým vlastním potřebám.
11
1 1.1
BICÍ AUTOMAT Jednotlivé části a princip
Bicí automat je elektronické hudební zařízení, které umožňuje imitovat bicí soupravu. Jádrem každého bicího automatu je generátor zvuků. Princip jakým je u bicích automatů obvykle řešen generátor zvuků můžeme rozdělit na dva pohledy. První z principů vychází z původních bicích automatů s analogovým zpracováním zvuku na základě zvukové syntézy. Nejčastěji jde o generátory bílého šumu v kombinaci s generátory harmonických signálů, které na základě jim dodaných parametrů vytvářejí přibližnou podobu námi požadovaných zvuků. [1] Druhou možností je za pomocí digitálního vzorkování. Zde se využívá paměti, ve které jsou zvuky uloženy v digitální podobě jako jednotlivé vzorky. Ke vzorkům se přistupuje jako k datům, nad nimiž se provádí různé matematické operace potřebné pro korektní zpracování výsledného signálu. Podrobnému principu zpracování je věnována samostatná kapitola dále. Vzorky jsou pak v taktu vzorkovací frekvence posílány do číslicově analogového převodníku. Dalo by se tedy konstatovat, že na rozdíl od první zmíněné metody se zvuky přímo nevytváří, ale pouze přehrávají. [1] Další důležitou částí bicího automatu je sekvencer. Jeho účelem je, jak plyne z názvu, vytvářet z jednotlivých zvuků zvukové sekvence. Princip jak je toho docíleno ukazuje následující obrázek 1.1, který vystihuje mimo jiné základní strukturu bicího automatu. Pomocí hodinového signálu, který určuje tempo, je řízena cyklická smyčka. Její délka reprezentuje např. jeden takt. V tomto případě má každý takt šestnáct tonů. Čili nejkratší možný tón během nastaveného tempa odpovídá právě jedné šestnáctinové době. Obsah pattern bufferu odpovídá aktuálnímu nastavení požadovaných tónů, které se mají přehrát v jednom taktu. V rytmu hodinového signálu se tyto informace o každé šestnáctinové době posílají jako parametry pro generátor zvuků. Tímto způsobem je zajištěno generování melodie, neboli patternu, který se v rámci jednoho taktu neustále opakuje. Časovou změnou obsahu pattern bufferu, odvozenou od hodinového signálu, je pak možno tvořit celé skladby. Jednotlivá nastavení pro patterny jsou uloženy v paměti stejně tak jako nastavení pro jejich volání tvořící celistvé skladby. Princip a popis částí vychází z literatury [2].
12
Clock
Counter (playback loop)
Song memory
LCD display
Pattern buffer (one tact)
Pattern memory
MIDI IN
MIDI mapping
MIDI OUT
Drum sound generator
Clock (sample rate)
Sound memory
Snare
Mixer
Kick
...
DAC
Analog OUT
Tom
User keypad
Obr. 1.1: Bloková struktura bicího automatu. Blok MIDI mapování nemusí být nutně součástí každého bicího automatu. Mapováním jednotlivých parametrů zvuků do MIDI formátu je zajištěna určitá kompatibilita s ostatními elektronickými hudebními zařízeními. To umožňuje například prostřednictvím elektronických kláves připojených do MIDI vstupu bicího automatu využít přímo jeho zvukový generátor. Samozřejmě lze aplikovat i reverzní postup.
1.2
Pracovní režimy
Bicí automaty většinou pracují v několika režimech. Základní a nejjednodušší režim je prosté přehrání vybraného zvuku pomocí stisku odpovídajícího tlačítka na uživatelském rozhraní. V tomto případě se využívá pouze přímého přístupu k samotnému generátoru bicího automatu. Čili s absencí sekvenceru. Dalším režimem je přehrávání jednotlivých patternů nebo celistvých skladeb uložených v paměti. Tento princip byl v podstatě již popsán výše. Posledním ze základních režimů je skladatel. Pracovní režimy jsou popsány v knize [2].
13
V režimu skladatele jde v podstatě o vytvoření nového patternu či skladby uložením uživatelem zvolených parametrů pro sekvencer do paměti formou notového zápisu. Existují např. tyto dvě možnosti, jak zajistit přehrání individuálního nastavení uživatele. Jednodušší ze způsobů je přimý zápis parametrů do paměti bez závislosti na čase. Nastavení těchto parametrů může být realizováno prostřednictvím uživatelského rozhraní se zobrazením jednotlivých dob a taktů na LCD. Nová skladba se pak může přehrát až po jejím uložení do paměti. Složitějším způsobem je skládání v reálném čase. Jedna z možností jak toho dosáhnout je kombinace zmíněných postupů. Čili například při stisku tlačítka pro kopák se jeho zvuk přehraje jako při prvním zmíněném režimu a součastně se zaznamená jako parametr do nového patternu. K dispozici je pokaždé nový buffer pro pattern po jeho naplnění v rámci časového běhu. To znamená, že se počítá i s pauzami, kdy uživatel nestiskl žádné tlačítko. Situace se neustále opakuje, přičemž pořadí patternů se ukládá do paměti skladeb. Pro snadnější pochopení principu je k dispozici vývojový diagram.
Start
Èekání na hranu hodin
NE
Je stisknuto tlaèítko?
ANO
ANO
Inkrementace ukazatele
Záznam parametru do bufferu na pozici kde ukazuje ukazatel
Ukazuje ukazatel na konec?
ANO
Zaokrouhlení pozice
Pøehraj zvuk
ANO Ulo buffer do pamìti a vytvoø nový
Obr. 1.2: Vývojový diagram pro režim skladatele. Přestože pro usnadnění skládání v reálném čase bývá většinou k dispozici zvuková signalizace ve formě tempomatu, nastává zde určitý problém. Protože během stisku není uživatel schopen se vždy úplně přesně trefit do časového intervalu jedné šestnáctiny doby, musí zde být programově zajištěno ještě určité zaokrouhlování zvolené 14
pozice. Jako nejjednodušší řešení se nabízí pouštět klik metronomu s mírným předstihem před samotnou pozicí v taktu pro uložení. Uživatel totiž fyzicky zareaguje vždy pouze po zaznění zvuku kliku a ne před ním ani součastně přesně s ním. Ostatní volby se již mohou klasifikovat jako uživatelem nepřesné vnímání tempa, což je již programově přijatelné. V takovém případě se ve vývojovém diagramu může blok pro zaokrouhlení zvolené pozice úplně vynechat.
15
2 2.1
ZPRACOVÁNÍ DIGITÁLNÍHO SIGNÁLU Číslicově analogový převod
Účelem číslicově analogového převodu je zpětná rekonstrukce jednotlivých vzorků signálu získaných digitalizací pomocí PCM na původní analogový signál. Obvod, který tuhle funkci realizuje, se nazývá číslicově analogový převodník. Obecný D/A převodník v základním principu nejprve převede každý vzorek podle jeho číselné reprezentace na napěťovou úroveň. Získané napěťové úrovně se poté vyhladí pomocí filtru dolní propusti na spojitý analogový signál. Tento postup vystihuje následující obrázek.
Pamì
D/A
DP
Clk
Obr. 2.1: Číslicově analogový převod.
Aby byl signál korektně rekonstruován, musí být jednotlivé vzorky převáděny v přesném časovém sledu podle vzorkovacího kmitočtu. Ten je určen během digitalizace podle Nyquistova (Shannon-Kotělnikova) vzorkovacího teorému. Pokud by vzorky byly převáděny s jinou frekvencí, bude tato změna mít negativní dopad i na výsledný rekonstruovaný signál změnou jeho frekvence od původního signálu.
2.2
Zpracování zvuku pomocí mikrokontroléru
Nejjednodušším způsobem jak pomocí mikrokontroléru generovat zvuk je využitím pulzně šířkové modulace PWM. Obdobně jako jiné modulace byla původně navržena pro přenos informací pomocí vysokofrekvenčních signálů. Pulzně šířková modulace využívá pro vyjádření několika úrovní v rámci dvoustavové logiky proměnnou střídu. Na obrázku 2.2, inspirovaného zdrojem [3], je znázorněn samotný princip. Po odfiltrování PWM signálu dolní propustí obdržíme signál měnící se v čase v rytmu
16
šířky pulzu PWM. Tímto způsobem jsme schopni jednoduše vytvořit sinusový průběh. Pomocí PWM však nedosáhneme příliš jakostní reprodukce, proto se pro audio aplikace spíše používá D/A převodník, jehož princip byl již uveden výše. u [V]
u [V]
uH
uH uAVG
uL
uL t [s]
t [s]
Obr. 2.2: Princip PWM signálu. V našem případě si nevystačíme pouze s harmonickými signály, protože údery bicích nástrojů jsou zásadně signály neharmonické. Tyto signály nelze jednoduše matematicky popsat, takže jejich interpretace v tomto duchu by byla velice složitá a nepřesná. Situaci si však můžeme značně usnadnit, pokud již budeme vycházet s hotového záznamu zvuku ve formě PCM vzorků. Jeden z nejrozšířenějších formátů pro ukládání audio bitového toku na PC vytvořený firmou IBM a Microsoft je WAV. Jedná se o speciální variantu obecnějšího formátu RIFF sloužícího pro ukládání bitového toku do tzv. „chunks“. Formát RIFF představuje kontejner pro různé audio kompresní metody, přičemž nejpoužívanější je právě zmíněná nekomprimovaná pulzně kódová modulace PCM. Klasické CD využívají PCM stereo se vzorkovací frekvencí 44,100 kHz a 16-ti bitovým rozlišením. [4]. Postup jak z WAV souboru získat PCM vzorky je velice snadný. Jeden z postupů je uveden např. v [5]. Existuje celá řada programů, které umožňují přímo „nahlédnout“ k jednotlivým vzorkům zobrazením v textové podobě. Jeden z takových programů, který je volně ke stažení, je např. Hex Editor Neo. Získané vzorky můžeme poté přímo zapisovat do komparačního registru v případě zpracování pomocí PWM nebo do registru pro D/A převodník pro dosažení více jakostní reprodukce. Jednotlivé vzorky jsou zapsány po bytech, přičemž počet bytů na jeden vzorek koresponduje s požitým bitovým rozlišením. Čili např. pro 16-ti bitové rozlišení je jeden vzorek zastoupen dvěma byty neboli 16-ti bity. Před samotným zápisem vzorků do registru je důležité si uvědomit jejich správnou číselnou interpretaci, aby byl zaznamenaný zvuk zpracován korektně. Zejména se jedná o znaménkový (signed) a neznaménkový (unsigned) formát. Pokud budeme pracovat se vzorky v neznaménkovém formátu, je nutné přičíst ke každému vzorku offset o hodnotě odpovídající polovině bitového rozlišení. Důvod proč takto učinit je vystižen na obrázku 2.3. 17
bit [-] 255
0 t [s]
Obr. 2.3: Korektní interpretace vzorků v neznaménkovém formátu.
Průběh plnou čarou odpovídá reprezentaci vzorků neznaménkového formátu. Přerušovaný průběh obdržíme po přičtení offsetu. Dojde tak evidentně ke korektnímu složení signálu. Z obrázku je dále zřejmé, že klidovou úroveň na výstupu D/A převodníku neobdržíme zápisem nulové hodnoty do registru, nýbrž zápisem hodnoty odpovídající polovině rozsahu.
2.3
Mixování PCM signálu
Procesem mixování dvou obecných signálů se rozumí jejich vzájemná interference. Interference vln nám popisuje, jak se vlny vzájemně ovlivňují. Výsledná vlna během interference vznikne superpozicí dílčích vln, přičemž závisí na jejich vzájemné okamžité fázi, amplitudě, frekvenci a v neposlední řadě také na směru šíření. Interference může být konstruktivní, kdy se dílčí vlny sčítají ve fázi a dochází tak ke vzrůstu amplitudy. Reverzně pak destruktivní, kdy mají vlny navzájem fázi opačnou. [6] Jak plyne z teorie interference, mixování PCM signálů můžeme realizovat pouhým sečtením jednotlivých vzorků dílčích signálů. Problémem však je, že hodnoty vzorků výsledného signálu přesáhnou rozsah původního rozlišení. V případě sečtení dvou stejných signálů bude rozsah až dvojnásobný. Aplikací tohoto postupu by pro některé hodnoty docházelo k přetečení, čímž by se celý proces stal nekorektním. Musíme tedy zajistit, aby po sečtení byly všechny hodnoty stále uvnitř požadovaného rozsahu. V zásadě existují dva přístupy jak toho docílit, a to buď pomocí normalizace nebo dynamické komprese rozsahu. Následující uvedená teorie vychází ze zdroje [7]. Obrázek 2.4 vystihuje situaci během interference dvou signálů. Zelený a červený průběh jsou dílčí signály a modrý je signál výsledný získaný mixováním. Na tento průběh budeme nyní aplikovat různé metody normalizace a dynamické komprese pro názorné vystižení principu. 18
y [-]
1
0
−1 0
0.1
0.2
0.3
0.4
0.5 0.6 t [s]
0.7
0.8
0.9
1
−2
·10
Obr. 2.4: Interference dvou signálů při mixování.
2.3.1
Normalizace pomocí metody clipping
Metoda spočívá v ořezání, anglicky clipping, kdy se hodnoty vzorků spadající mimo rozsah nahradí maximální nebo minimální hodnotou rozsahu. První z průběhů na obrázku 2.5 představuje přenosovou charakteristiku zvolené metody. Čili osa x nám reprezentuje vstup a osa y výstup. Z výsledného průběhu je patrné, že se v podstatě jedná o limitaci, čímž dochází ke zkreslení signálu. Proces mixu bude v takovém případě vytvářet nepřirozené artefakty ve formě lupání a praskání. 1 y [-]
y [-]
1
0
−1 −2
0
−1 −1
0
1
2
x [-]
0
0.2
0.4 0.6 t [s]
Obr. 2.5: Normalizace metodou clipping.
19
0.8
1 −2
·10
2.3.2
Normalizace pomocí lineárního útlumu
Jednoduchý způsob jak zajistit, aby hodnoty jednotlivých vzorků po mixování nikdy nepřekročily rozlišovací rozsah je vydělení hodnot dvěma. Vydělením dvěma si však úmyslně snižujeme rozlišení. Přirozeně také dochází ke snížení hlasitosti. Nejvíce vnímatelný pokles hlasitosti nastane během situace, kdy jeden ze signálů bude mít okamžitou hodnotu v amplitudě nulovou. Na výsledku se tak bude podílet pouze jeden ze signálů, jehož poloviční amplituda se odrazí poklesem celkové hlasitosti o 6 dB. 1 y [-]
y [-]
1
0
−1 −2
0
−1 −1
0
1
2
0
x [-]
0.2
0.4 0.6 t [s]
0.8
1
·10−2
Obr. 2.6: Normalizace metodou lineárního útlumu.
2.3.3
Lineární dynamická komprese
Dynamická komprese rozsahu na rozdíl od normalizace má snahu po mixování věrohodně zachovat hlasitosti amplitud u nízkých a středních hladin. Ty se totiž ponechávají beze změny. Ke snižování hlasitosti dochází až po překročení určitého prahu formou komprimace do menšího prostoru. V závislosti na zvoleném prahu se dosáhne toho, že většina součtových kombinací si zachová svoji původní hodnotu a ke změnám dochází pouze u hlasitých hodnot. Princip totiž vychází z předpokladu, že člověk vnímá změnu úrovně na vyšších hlasitostech výrazně méně než na nižších. Úmyslně zavedená odchylka se tak příliš neprojeví. Prvním typem dynamické komprese je komprese lineární. Amplitudy jednotlivých vzorků vyskytujících se nad prahem jsou lineárně komprimovány podle kompresního faktoru. Ten je stanoven v závislosti na zvoleném prahu takovém, při němž se budou všechny součtové kombinace nacházet v požadovaném rozsahu. Následující vztahy popisují princip matematicky.
20
𝑓 (𝑥; 𝑡) =
⎧ ⎨ ⎩ 𝑥
|𝑥|
(︁
· 𝑡+
1−𝑡 2−𝑡
𝑥, |𝑥| ≤ 𝑡 · (|𝑥| − 𝑡) , |𝑥| > 𝑡
(2.1)
)︁
Zápis 2.1 nám říká, že pokud je vstupní hodnota x menší nebo rovna hodnotě prahu t, tak se zpracovává beze změny. V opačném případě se aplikuje funkce. 1 y [-]
y [-]
1
0
−1 −2
0
−1 0
−1
1
2
0
0.2
x [-]
0.4 0.6 t [s]
0.8
1
·10−2
Obr. 2.7: Lineární dynamická komprese. Z obrázku 2.7 je patrné, že výsledný signál je zpracován poněkud lépe, než v předchozích případech. Nedokonalostí zde však zůstává ostrý přechod nad hranicí prahu, což se může projevit jako neočekávaně náhlý pokles hlasitosti.
2.3.4
Logaritmická dynamická komprese
Účinnou možností jak obejít ostrý přechod za hranicí prahu je pomocí logaritmické komprese. Ta mimo jiné využívá toho, že člověk vnímá pokles nebo vzrůst hlasitosti nelineárně. Princip je tedy stejný jako v předcházejícím případě, avšak amplitudy jednotlivých vzorků nad prahem jsou komprimovány s rostoucím faktorem. 𝑓 (𝑥; 𝑡) =
⎧ ⎪ ⎨ 𝑥 ⎪ ⎩ |𝑥|
𝑥, |𝑥| ≤ 𝑡 (︂
· 𝑡 + (1 − 𝑡) ·
𝑙𝑛( 𝑙𝑛(1+𝛼)
|𝑥|−𝑡 1+𝛼· 2−𝑡
)
)︂
, |𝑥| > 𝑡
(2.2)
Pro logaritmickou dynamickou kompresy je zápis mírně složitější. Obsahuje proměnnou 𝛼, která je závislá na nastaveném prahu t. √ 𝛼
1−𝑡
1 + 𝛼 = 𝑒 2−𝑡 21
(2.3)
Rovnici 2.3 získáme první derivací funkce f (x; t) a následnou úpravou. Je zřejmé, že koeficient 𝛼 nezískáme přímo, ale pomocí iteračního postupu. Pro t=0.5 odpovídá přibližně 𝛼=5.71144. 1 y [-]
y [-]
1
0
−1 −2
0
−1 −1
0
1
2
0
0.2
x [-]
0.4 0.6 t [s]
0.8
1 −2
·10
Obr. 2.8: Logaritmická dynamická komprese. Aplikací logaritmické komprese je výsledek téměř ideální. Odchylky vzniklé tímto zpracováním jsou málo zaznamenatelné. Drobností je však fakt, že nižší hladiny disponují vyšším rozlišením než vyšší hladiny, což se vizuálně projevuje jejich zakulacením. Tento efekt můžeme odstranit zvolením menšího prahu. Na obrázku 2.9 je situace s nulovým prahem, tedy kompresí celého rozsahu. Tento krajní případ, ale začíná mírně linearizovat přenosovou char. Jde tedy o otázku určitého kompromisu. 1 y [-]
y [-]
1
0
−1 −2
0
−1 −1
0
1
2
x [-]
0
0.2
0.4 0.6 t [s]
0.8
Obr. 2.9: Logaritmická dynamická komprese celého rozsahu.
22
1 −2
·10
3
VLASTNÍ NÁVRH BICÍHO AUTOMATU
3.1
Blokové schéma a návrh hardware
Blokové schéma bylo navrženo s ohledem na požadované funkce s vhodným výběrem komponentů na základě teorie a problematiky uvedené v předcházejících kapitolách. Některé části však byly upraveny dodatečně až po praktickém ladění testovací verze. STM32F4 DISCOVERY KIT 3V3
2V5
3V3
LCD s dotykovou fólií
SPI
I2C
MCU
FSMC
I2S
SWCLK I/O
Uivatelské rozhraní
3V3
SPI
D/A se zesilovaèem ve tøídì D
CH1
CH2 5V
SWDIO
SD karta
SWD
Mix
repro sluchátka
Obr. 3.1: Bloková schéma bicího automatu. • MCU: Jádrem koncepce je mikrokontrolér, který se stará o chod celého programového vybavení. Prostřednictvím uvedených rozhraní řídí komunikaci a přenos dat mezi jednotlivými bloky. Plní mimo jiné funkci sekvenceru, mixu a tempomatu neboli časovače. • SWD: Je dvou-pinovou alternativou rozhraní JTAG, kde SWCLK je pro hodinový signál a SWDIO pro data. Slouží pro programování a debug. • SD karta: Plní funkci externího paměťového zdroje dat. V první řadě se jedná o data reprezentující vzorky jednotlivých zvuků. Dále jsou zde uloženy data určující nastavení parametrů pro přehrávání sekvencí formou podobnou notovému zápisu. Poslední soubory s daty představují RGB vzorky obrázků umožňující jejich vykreslení na LCD. Karta komunikuje po rozhraní SPI. • D/A převodník se zesilovačem ve třídě D: Představuje samostatný blok, který plní obě funkce. Data pro převod jsou posílána po audio rozhraní I2S. Veškerá nastavení parametrů obvodu, např. regulace hlasitosti, jsou realizována pomocí I2C. Převodník je stereofonní, čehož bylo v naší aplikaci využito. 23
Jeden kanál je použit pro klik metronomu a druhý pro hlavní zvuky bicího automatu. Napájení je 3V3 pro zesilovač v D a logiku a 2V5 pro analogovou část a sluchátkový zesilovač. • Mix: Slučuje oba nezávislé kanály do jednoho monofonního signálu, který je poté veden do výstupu na reproduktor nebo na sluchátka. Obsahuje integrovaný zesilovač ve třídě AB. • LCD: Umožňuje uživateli vizuální správu se zařízením. Zejména se jedná o zobrazení všech různých nastavení a zvolených režimů v grafické interpretaci. Rozhraní FSMC umožňuje přístup k paměti RAM LCD. Rozhraní SPI je využito pro komunikaci s dotykovou fólií LCD, která slouží pro samotnou obsluhu a pohyb ve virtuálním prostředí firmwaru. • Uživatelské rozhraní: Skládá se z jednotlivých tlačítek reprezentujích části bicí soupravy. Symbolizace stisku je doprovázena svitem LED. Součástí rozhraní je dále rotační enkodér se spínačem pro nezávislou regulaci tempa a hlasitosti. Nyní budou jednotlivé bloky popsány podrobněji v samostatných podkapitolách včetně dílčích schémat zapojení. Celkové navržené schéma bicího automatu je pak uvedeno v příloze A.1.
3.1.1
Výběr mikrokontroléru
Práce byla podmíněna výběrem mikrokontroléru typu ARM s doporučením na některé z řad od firmy STM. Důvod tohoto doporučení tkví v poměrně široké dostupnosti vývojových kitů s těmito mikrokontroléry. Vybraný mikrokontrolér musí disponovat adekvátním množstvím rozhraní potřebných pro náš návrh. Také dostatečný počet vstupně výstupních pinů je žádoucí. V neposlední řadě také cena. Proto si zde uvedeme přehledné srovnání některých vhodných typů z hlediska důležitých funkcí a vlastností. Čerpáno bylo přímo ze stránek výrobce [8], případně z příslušných katalogových listů. První dva uvedené typy jsou osazeny na kitech Discovery. Původně byl zvažován první z uvedených, ale jak je z tabulky patrné, chybí zde rozhraní I2S. Nepodporuje tedy připojení audio D/A převodníku. Dále také chybí rozhraní FSMC, které je nutné pro komunikaci s pamětí RAM LCD typu TFT. Více v části LCD. Tento modul však existuje i jako externí obvod, ale taková varianta se již finančně nevyplatí. Jak modul připojit je popsáno např. zde [9]. Následující typy již obsahují veškeré potřebné funkce. Velikost paměti FLASH koresponduje s posledním písmenem v označení typu. Tento parametr tedy není zásadní. Vybrané typy se již moc neliší. Počet použitých časovačů bude záležet až
24
Tab. 3.1: Přehled zvažovaných mikrokontrolérů z rodiny STM. Typ
Sériová rozhraní
STM32F100RB
2xSPI;2xI2C;CEC;3xUSART
STM32F407VG
3xSPI;2xI2S;2xI2C;4xUSART;2xUART;2xUSB;2xCAN;SDIO;FSMC
STM32F103RC
3xSPI;2xI2S;2xI2C;3xUSART;2xUART;USB;SDIO;CAN;FSMC
STM32F205RE
3xSPI;2xI2S;3xI2C;4xUSART;2xUART;2xUSB;2xCAN;SDIO;FSMC
STM32L151RD
3xSPI;2xI2S;2xI2C;5xUSART;USB;SDIO;FSMC
Typ
I/O
Pouzdro
f𝑜𝑝. [MHz]
16-bit čas.
32-bit čas.
FLASH [kB]
STM32F100RB
51
LQFP64
24
7x16-bit
-
128
STM32F407VG
82
LQFP100
168
12x16-bit
2x32-bit
1042
STM32F103RC
51
LQFP64
72
8x16-bit
-
256
STM32F205RE
51
LQFP64
120
12x16-bit
2x32-bit
512
STM32L151RD
50
LQFP64
32
8x16-bit
1x32-bit
384
na samotném programu, ale i tak je u všech jejich počet dostatečný. Rozhodující může být například operační frekvence. Z tohohle hlediska se jeví nejpřijatelněji typ F205RE. Přestože typ F407VG má největší pouzdro a nadbytek funkcí, které v naší aplikaci ani nevyužijeme, je hodně rozšířený a proto vychází cenově nejlépe. Jeví se tedy jako nejpřijatelnější volba pro náš návrh. Poslední uvedený je novinkou. Označení L znamená ultra low power. Jedná se tedy o typy s nízkou spotřebou.
3.1.2
SD karta
Pro náš návrh byla vybrána SD karta typu micro. Ta má oproti klasické SD kartě s devíti piny o jeden pin méně. Komunikace SD karet je definována třemi komunikačními protokoly. Dva z těchto protokolů, jednobitový a čtyřbitový, se využívají v režimu SD módu. Třetí je pro SPI mód. Rozdílnost protokolů v SD módu je v množství využitých vodičů pro datový přenos, jak již napovídá jejich název. Přenos dat pro čtyřbitový protokol tedy probíhá paralelně oproti jednobitovému. Dosahuje se tak větších přenosových rychlostí. Komunikace pracuje na principu Master/Slave. SD karta jako podřízený obvod přijímá příkazy od Mastera (např. MCU), který řídí komunikaci, ve formě příkazových rámců. Formou odpovědí od SD karty je pak realizován datový přenos. Synchronizace je zajištěna pomocí hodinového signálu [10]. Vybraný procesor z řady STM plně podporuje zmíněný SD mód prostřednictvím rozhraní SDIO. Třetí z protokolů určený pro SPI mód využívá pro komunikaci tohoto rozhraní. Výhodou je jeho široká podpora u většiny mikrokontrolérů. Na rozdíl od čtyřbitového
25
SD režimu vyžaduje pro komunikaci pouze čtyři vodiče. Na druhou stranu to má dopad na přenosovou rychlost, která je v případě paralelní komunikace přirozeně větší. Na následující stránce jsou přehledně uvedeny názvy a významy jednotlivých pinů micro SD karty pro oba režimy. Tabulka pochází ze zdroje [10] s úpravou pro micro SD podle [11]. Tab. 3.2: Význam pinů micro SD karty pro komunikační módy. Pin
Název
Význam v SD módu
Význam v SPI módu
1
DAT2
Data Line 2
x
2
DAT3/CS
Data Line 3
Chip Select/Slave Select
3
CMD/DI
Command Line
Data In/MOSI
4
VDD
Supply Voltage
Supply Voltage
5
CLK/SCLK
Clock
Clock/SCLK
6
VSS
GND
GND
7
DAT0/DO
Data Line 0
Data Out/MISO
8
DAT1
Data Line 1
x
Pro návrh zapojení micro SD karty jsme vyšli ze zapojení modulu pro SD kartu uvedeném v jeho manuálu [12]. 7x 47k pull-up
R1
3V3
R8
R7
R6
R5
R4
R3
Card detect LED1 3,5 mm RED
R2
220
C1
C2
100n
10u
SD card GND SC1 4 7 8 1 2 5 3 6
SD_CD SPI2 SD_MISO SD_CS SD_SCLK SD_MOSI
GND1 GND2 SW1 SW2
VDD DAT0/DO DAT1 DAT2 DAT3/CS CLK CMD/DI GND GND1 GND2 SW1 SW2
GND
Obr. 3.2: Zapojení socketu pro micro SD kartu. Jak je ze schématu patrné, je zde o čtyři vývody více, než uvádí tabulka. Vývody s označení SW představují přepínač pro detekci SD karty ve slotu. Vývody jsou fyzicky spojeny, proto nám stačí vyvést pouze jeden. Detekce je signalizována LED a dále je
26
přivedena na I/O pin MCU. Zbylé dva vývody představují uzemnění pouzdra slotu. Je obecně doporučeno zapojit datové vodiče přes pull-up rezistory a to i v případě jejich nevyužití (SPI mód), jak uvadí např. zdroj [10]. V našem případě budeme využívat mód SPI, ale pro jistotu budou osazeny všechny uvedené rezistory.
3.1.3
D/A převodník se zesilovačem ve třídě D
Nejprve bylo pro realizaci D/A převodu počítáno s vnitřním D/A převodníkem vybraného MCU, jehož rozlišovací schopnost 12-ti bitů se zdála být pro náš návrh dostačující. V teorii o mixování PCM signálu jsme počítali pouze s mixováním dvou signálů. Pokud však vyjdeme z předpokladu, že během klasického provozu bicího automatu se bude ve zpracování vyskytovat více zvuků najednou, tak samotná logaritmická komprese začne do zpracování již zavádět chybu. Převážně bude chybět přirozené zvyšování hlasitosti během přibývajícího znění jednotlivých zvuků důsledkem komprese do stále stejného prostoru. To znamená, že vždy se bude přehrávat stejně nahlas bez ohledu nato, zdali hraje jeden nebo více zvuků současně. Přirozeně tedy musíme všechny vzorky zeslabit formou lineárního útlumu. Samotnou kompresi pak budeme provádět až pro více zvuků, kde již zmíněný efekt nebude tak znatelný. Důsledkem dělení ztrácíme rozlišení, a proto pro zachování stále stejné kvality využijeme převodník s větším rozlišením. Externí převodník byl nakonec vybrán takový, který je součástí komplexnějšího modulu zesilovače ve třídě D. To v sobě nese hned několik výhod. Inspirace tohoto výběru byla nalezena přímo u jednoho z Discovery kitů, který takový obvod již obsahuje. Jedná se o typ z označením CS43L22. Tento obvod využívá D/A převodník typu delta-sigma. Jeho rozlišení je až 24 bitů s možností výběru nižšího rozlišení 16-ti bitů. V našem případě si vystačíme i s nižším delta-sigma převodníku je vystižen na obrázku933.3. 3.4rozlišením. Java Applet – Princip Oversampling and Quantization
'.8-0s
;!)50 /1%-*016
+",)#-!%./"01 7+
+",)#-!%./"01 &7+
&
2-%-0"# &$'()"**
21#0"(+-%," 3$45#"0$6
@-8-0 2 A
!"#$% &$'()"** 9:
'.8-ts
@.8-0 <=>?
Figure 3.49 Delta-sigma DA converter.
Obr. 3.3: Princip delta-sigma D/A převodníku (převzato z [14]). can be reduced by changing the oversampling factor. The graphical interface of this applet presents several quantization and oversampling values; these can be used to experiment the noise reduction level. An additional FFT spectral representation provides a visualization of this audio effect. 27
Na vstup převodníku jsou do registru přivedena data s rozlišením 𝑤-bitů v taktu vzorkovací frekvence 𝑓𝑆 . Následuje blok převzorkování a filtrace pomocí digitální dolní propusti. Důvodem převzorkování je potlačení vlivu kvantizačního šumu rovnoměrným rozložením do většího spektra. Důsledkem převzorkování dojde také ke zvětšení rozestupů mezi spektrem a jeho obrazem, což nám umožní jednoduší filtraci. Samotná sigma-delta modulace vytváří v každém kroku rozdílovou hodnotu ve zpětnovazební smyčce, kterou je řízen výstupní jednobitový D/A převodník (v podstatě se jedná o komparátor). Výstup je pak vyhlazen dolní propustí [14]. Velkou předností vybraného obvodu CS43L22 pro naši aplikaci je blok digitálního zpracování signálu. Ten v sobě obsahuje mimo jiné funkci limiteru s programovatelným peak detektorem. Pomocí něj můžeme tedy přímo realizovat dříve zmíněnou kompresi. Další výhodou je již integrovaná část zesilovače pro sluchátka a pro reproduktor na jednom čipu s možností programovatelného nastavení hlasitostí pro každou část samostatně. [13]. Důležitým parametrem před volbou tohoto obvodu byl jeho maximální výkon v závislosti na napájecím napětí, které je poměrně malé a dále hlavně velikost zkreslení. V zapojení pro mono plného můstku (mono parallel full-bridge) při napájení 5 V je koncový stupeň schopen dodat 1,5 W𝑅𝑀 𝑆 do zátěže 4 Ω při zkreslení THD+N < 1 %. To je pro naši aplikaci více než dostačující. Pokud budeme chtít dosáhnout větších výkonů, je zde již počítáno s vyvedením linkového výstupu na externí zesilovač nebo mix.
3.1.4
Mix se zesilovačem ve třídě AB
V návrhu počítáme s využitím obou kanálů stereo D/A převodníku, jak již bylo uvedeno v popisu u blokového schématu. Důvodem separace zvuku bicích a zvuku kliku metronomu do samostatných kanálů, bylo zajištění možnosti nezávislé regulace hlasitosti bez zásahu na úrovni PCM vzorků. Využijeme tak šikovně pouze digitální ovládání hlasitosti prostřednictvím rozhraní I2C vybraného převodníku. Protože však budeme dále využívat pouze monofonní signál, a to i v případě sluchátek, potřebujeme nezávislé kanály mixovat do jednoho. K tomuto účelu byl vybrán integrovaný obvod od společnosti Texas Instruments s označením TPA0233. Tento 2 W zesilovač je primárně určen pro spotřební elektroniku, jako jsou notebooky, PDA a jiná malá přenosná audio zařízení. Jeho primární účel je oddělit a úrovňově přizpůsobit nezávislé cesty výstupu na reproduktor a sluchátka. Obvod pracuje ve dvou režimech podle přivedené logické úrovně na pin ST/MN. Vysoká úroveň zajistí stereofonní výstup pro doporučené připojení sluchátek. Nízká pak naopak výstup monofonní pro reproduktor, čehož je dosaženo součtem obou vstupů. [15].
28
1u
22k +
R10 C6
C7
10u
100n
IN - Two channels
C4
R9
5V
5 4 3 2 1
C5 1u
22k
X1
OUT - Headphones PG203J
GND
GND GND 1 2 3 4 5
FILT_CAP LO/MOSHUTDOWN LIN VDD GND BYPASS ST/MN RIN RO/MO+
10 9 8 7 6
C8
C9
1u
1u Channels mix & class AB amp
GND GND
5 4 3 2 1
C10
IC1
+
1500u
R11 100k
X2
PG203J GND OUT - Speaker SV2
SP1
1 2
GND
Obr. 3.4: Schéma zapojení mixu se zesilovačem ve třídě AB.
Jak je z uvedeného schématu patrné, využíváme zmíněný obvod pouze v monofonním režimu, tedy v režimu mixu. Aby napěťová úroveň pro reproduktor a sluchátka byla adekvátní, a ne daná pouze impedancí zátěže, je reproduktor připojen mezi oba výstupy do můstku. Sluchátka jsou pak připojena pouze na jeden výstup. Při zapojení sluchátek do zařízení je reproduktor odpojen. To zajišťuje jeho připojení přes spínač konektoru pro sluchátka. Ostatní části schématu jsou navrženy podle doporučení katalogu obvodu [15]. Ten mimo jiné doporučuje některé kondenzátory volit s nízkou impedancí jako low ESR. Pro takto nízké hodnoty bylo však problematické kondenzátory tohoto typu sehnat. Připojen byl tedy pouze 10 𝜇F kondenzátor v napájení. Zbytek byl volen SMD keramického provedení. Kondenzátor na výstupu nebyl v doporučení low ESR uveden, proto byl volen jako klasický elektrolytický. Jeho hodnota souvisí s frekvencí horní propusti výstupního signálu. Zvolená hodnota 1500 𝜇F odpovídá přibližně 27 Hz pro 4 Ω reproduktor. Při volbě kondenzátoru s malou hodnotou napětí např. 6,3 V je ještě přijatelná velikost pouzdra. Vstupní filtr určuje opět jednak minimální přenosovou frekvenci, tak celkové zesílení. Hodnota kondenzátoru není příliš kritická jako v případě výstupního filtru. Hodnota vstupního odporu zesilovače se totiž pohybuje v řádech kΩ, což umožňuje zvolit kondenzátor výrazně menší. V rozmezí podle doporučení katalogu [15] od 0,47 𝜇F až 1 𝜇F. Zesílení je určeno vztahem 3.1 pro konfiguraci v mono režimu, 𝐴𝑉 =
−125𝑘Ω 𝑅𝐼
(3.1)
kde hodnota odporu 125 kΩ je dána zpětnovazebním odporem uvnitř obvodu a 𝑅𝐼 je zjišťovaný vstupní odpor. Hodnota tohoto rezistoru byla vypočtena pouze orientačně s uvážením ztráty při mixování 6 dB (1/2). Poté byl odpor dostaven při
29
testování na nepájivém poli pomocí trimru na hodnotu 22 kΩ, při níž bylo zesílení již dostačující. Následující tabulka z katalogového listu [15] uvádí ještě důležité pracovní parametry obvodu. Měřeno při 𝑉𝐷𝐷 = 5 V, 𝑇𝐴 = 25°C, 𝑅𝐿 = 4 Ω. Tab. 3.3: Parametry obvodu TPA233.
3.1.5
Měřený parametr
Testovací podmínka
Hodnota
Jednotka
Výstupní výkon
THD = 1 %, BTL mód
2
W
THD + N
P = 1 W, f = 20 Hz až 20 kHz
0,2
%
Šířka pásma
Zisk = 2,5, THD = 2 %
20
kHz
LCD
Pro snadné a vkusné vykreslení uživatelského menu na displeji bylo počítáno s grafickým LCD. Barevné grafické displeje jsou v dnešní době již cenově velmi přijatelné. Zvláště jedná-li se o varianty, které je možno objednat přes eBay s Číny. Cena se pohybuje okolo 350,- podle velikosti rozlišení. Vybrán byl typ HY32D s rozlišením 320x240 pixelů s dotykovou fólií a variantou bez SD karty (tu již v našem návrhu máme). Displej je řízen řadičem SSD1289 s pamětí RAM pro zápis barev. Katalog řadiče je dostupný zde [16]. Přenos dat pro zobrazení barev je realizován paralelní 16-ti bitovou komunikací. Zápis a čtení z paměti RAM je řízeno pomocí pinů RW a RD. Procesor STM32F407VG podporuje tuto komunikaci pomocí rozhraní FSMC. Display má dále vyveden pin pro přivedení PWM na regulaci podsvícení displeje. Dotyková fólie displeje komunikuje s MCU pomocí rozhraní SPI. Obvod řídící dotykovou fólii nese označení XPT2046 a jeho katalog je dostupný zde [17]. Pro nás důležitý parametr z hlediska komunikace přes SPI je maximální vzorkovací frekvence, která činí 125 kHz. Dotyková fólie byla připojena k MCU k rozhraní SPI1. Připojení pinů k MCU z hlediska FSMC komunikace lze dohledat např. zde [18]. Podsvícení displeje bylo připojeno na výstup časovače 10. Konkrétní schéma zapojení je uvedeno v příloze v celkovém schématu zapojení bicího automatu A.1.
30
3.1.6
Uživatelské rozhraní
Tlačítka pro spouštění jednotlivých zvuků bicí soupravy byly pro ušetření pinů MCU zapojeny maticově. Použito bylo 12 tlačítek, což tvoří matici 4x3. Byly vybrány tlačítka, které mají zabudovanou LED pro efekt barevné hudby. Zapojení maticové klávesnice je doplněno o diody 1N4148 v každém sloupci. Diody zde zabraňují výskyt vzniku zkratu během stisku dvou tlačítek z různého sloupce součastně. To vychází z principu multiplexace řízení tlačítek, který bude popsán záhy až při bližším popisu programu. Ke každé LED je připojen ochranný odpor 220 Ω a každý řádek je pro zajištění klidové úrovně doplněn pull-up rezistorem o hodnotě 47 kΩ. R9
S9
1 2 A
LED9
3 4 C
S5
1 2 A
R5
3 4 C
47k
R13
LED5
3 4 C
S1
+3V3 LED1 1 LED2 2 LED3 3 LED4 4 LED5 5 LED6 6 LED7 7 LED8 8 LED9 9 LED10 10 LED11 11 LED12 12
R1
1 2 A
LED1
Resistors value: R1 - R12: 220R
ROW1 R10 LED10 1 2 A
S10
3 4 C
S6
1 2 A
R6
3 4 C
47k
R14
LED6
3 4 C
S2
+3V3
SV1
R2
1 2 A
LED2
ROW2 LED11
R11
S11
1 2 A
S7
3 4 C
47k
R15
R7
3 4 C
S3
+3V3
LED7
1 2 A
R3
3 4 C
LED3
1 2 A
COL1 1 COL2 2 COL3 3 ROW1 4 ROW2 5 ROW3 6 ROW4 7 +3V3 8 GND 9 GND 10 GND 11 GND 12
ROW3 R12 LED12 1 2 A
S12
3 4 C
S8
1 2 A
R8
3 4 C
47k
LED8
1 2 A
S4
+3V3 R16
SV2
R4
3 4 C
LED4
ROW4 COL1
D1
COL2
D2
1N4148
COL3
D3
1N4148 1N4148
Obr. 3.5: Schéma zapojení tlačítek do klávesnice. Další částí uživatelského rozhraní je rotační enkodér pro regulaci tempa a hlasitosti. Ten má oproti klasickému potenciometru hned několik výhod. Asi největší výhodou pro embedded systémy je, že v podstatě přímo vytváří digitální signál. Není zde tedy potřeba žádného A/D převodníku. Během otáčení se vytvářejí dva obdélníkové impulzy fázově posunuté o 90°. Na náběžnou nebo sestupnou hranu jsme pak
31
schopni podle úrovně určit směr otáčení, jak je vystiženo na obrázku. Enkodér také nemá koncové polohy, což je jeho další výhoda [19]. Rotace vpravo - inkrementace
Rotace vlevo - dekrementace
A
B
A
L
L
L
B
H
H
H
Obr. 3.6: Průběhy enkodéru generované při rotaci. Keramické kondenzátory zapojené ve schématu enkodéru slouží pro odstranění zákmitů vznikajícím během mechanického otáčení. Jejich hodnoty byly zvoleny podle doporučení na stránkách zde [19].Pull-up rezistory na vývodech A a B nejsou osazeny, protože jsou zapojeny vnitřní pull-up rezistory MCU. Enkodér má také spínač, kterým můžeme měnit parametr pro regulaci např. formou stavového automatu. Viz dále v softwarovém řešení práce. SV1
SV2 3 2 1
3 2 1
+3V3 GND SW
+3V3
EC12E_SW SW1
R1 47k
A GND B
+3V3 +3V3 R2
R3 Not fitted
SW1
47k
SW EC12E_SW
C1
C2
47n
47n
47k
B A
GND GND
Obr. 3.7: Schéma zapojení rotačního enkodéru.
3.2
Softwarové řešení a návrh firmware
Firmware byl programován v prostředí Keil uVision v jazyce C++. Pro snadnější práci s periferiemi MCU, bez nutnosti přístupu k jednotlivým registrům, byly používány pro tento účel knihovny, které je možno stáhnout přímo na stránkách výrobce STM. Pro úplný začátek, jako je připojení kitu k PC, vytvoření nového projektu v 32
prostředí Keil a správné nastavení všech potřebných nástrojů pro zvolený procesor jako je debugger, linker apod. je možné inspirovat se např. zde [20]. Asi nejdůležitější částí kódu v našem projektu je práce s SD kartou, proto začneme jejím popisem.
3.2.1
Knihovna pro SD kartu a FAT systém
Pro značné usnadnění práce byla pro komunikaci s SD kartou použita knihovna k volnému stažení od japonského autora, který vystupuje na internetu pod přezdívkou ChaN [21]. Tato knihovna využívá obecného souborového systému FAT s úpravou pro embedded systémy pod názvem FatFs. Celá knihovna je napsána v jazyce C, je nezávislá na architektuře a je plně kompatibilní se souborovým systémem FAT ve Windows. Uživateli tedy stačí rozšířit vrstvu pro komunikaci mezi FatFs modulem a SD kartou podle zvoleného MCU, kterou autor knihovny označuje jako Low level disk I/O layer. Může se jednat, buď o komunikaci SPI nebo komunikaci pomocí SDIO. Na stránkách jsou také k dispozici již hotové vzorové aplikace pro různé typy architektur. V našem případě byla zmíněná vrstva rozšířena o funkce pro přenos na úrovni jednotlivých bytů po SPI a funkce, která zajišťuje správné časovaní operací z jejím voláním v přerušení. Inspirace pro tvorbu těchto funkcí a celkové úpravy byla nalezena zde [22]. Autor zde přímo prezentuje postup jak knihovnu krok po kroku upravit pro architekturu STM32. Jedinou rozdílnou úpravou byla inicializace vybraného SPI a příslušných pinů pro přesný typ MCU. Následující obrázek vystihuje přesněji strukturu volání jednotlivých vrstev při komunikaci s SD kartou. SD_card_open_file_beats()
f_open()
disk_read()
xmit_mmc() SPI
main.c
sd_driver.c
sd_driver.h
ffconf.h
ff.c
ff.h
diskio.c
diskio.h
spi_driver.c
spi_driver.h
integer.h
Obr. 3.8: Struktura volání vrstev při komunikaci s SD kartou.
33
Soubory ve struktuře vyznačeny plnou čarou představují původní soubory knihovny, do kterých není nutno zasahovat. Červená barva reprezentuje nejvyšší vrstvu, vrstvu aplikační. Modrou barvou je vyznačena vrstva Fatfs modulu. Zelenou pak nejnižší vrstva, kterou je potřeba modifikovat. Konkrétně se jedná o soubor z názvem diskio.c. Ten obsahuje původní funkce pro práci se sektory. Tyto funkce využívají při své práci právě funkce pro přenos bytů po SPI. Soubor spi_driver.c pak již obsahuje samotnou inicializaci SPI. Oproti zmíněnému postupu výše jsou zde ještě navíc soubory s názvem sd_driver.c respektive sd_driver.h. Ty v podstatě zajišťují ještě pohodlnější přístup k funkcím z Fatfs modulu z hlediska celkové aplikace bicího automatu. Soubor z názvem ff.c obsahuje přímo uživatelské funkce pro práci se soubory na SD kartě. Tyto funkce jsou velice přehledně popsány na stránkách autora [21] včetně jejich příkladu použití. Není tedy třeba je zde podrobně rozebírat. Funkce pro čtení a zápis bytů po SPI s využitím knihoven pro periferie MCU může vypadat následovně: int SPI_read_write (SPI_TypeDef* SPIx, uint8_t *rbuf, const uint8_t *tbuf, uint32_t cnt) { uint32_t i; // Počet bytů pro přenos for (i = 0; i < cnt; i++) // Opakování v počtu bytů { /* Vysílání */ if (tbuf) { SPI_I2S_SendData(SPIx, *tbuf++); // Vyslání dat } else { SPI_I2S_SendData(SPIx, 0xff); // Vyslání dummy } /* Příjem */ while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET); // Čekání na uvolnění if (rbuf) { *rbuf++ = SPI_I2S_ReceiveData(SPIx); // Zápis přijatých dat } else { SPI_I2S_ReceiveData(SPIx); // Příjem bez zápisu } } return i; // Vrátí počet bytů }
První vstupní parametr funkce určuje typ SPI. Další představují ukazatele na pole, do kterého se má zapisovat respektive číst. Zápisem nuly selektivně vybíráme pouze jednu operaci. Poslední udává počet bytů. Funkce je součástí souboru spi_driver.c a je volána ve dvouch režimech (zápis nebo čtení) podle zmíněné úpravy v souboru diskio.c.
34
Pro inicializaci některé z periferií u STM procesoru je potřeba dodržet několik základních kroků. Jako příklad si pouze v bodech ukážeme inicializaci SPI2 pro SD kartu: • povolení hodin pro využité piny na portu B • povolení hodin pro SPI2 • nakonfigurování pinů na portu B v alternativním módu - MISO, MOSI, SCK • připojení pinů k SPI2 • konfigurace a nastavení parametrů pro SPI - např. režim duplexního přenosu, 8-bit šířka slova, vysílání MSB jako prvního v pořadí apd. • povolení SPI2
3.2.2
Knihovna pro obvod CS43L22
Pro konfiguraci D/A převodníku byla zapotřebí nejprve inicializace dvou periferií. Konkrétně periferie I2C pro možnost přístupu k jednotlivým registrům obvodu a I2S pro samotný přenos vzorků PCM dat. Během inicializace periferií byl opět dodržen stejný postup, který již byl uveden v bodech u inicializace SPI pro SD kartu. Sběrnice I2S má na rozdíl od sběrnice SPI ještě svoji vlastní smyčku fázového závěsu PLL, která zajišťuje dodržení přesných audio frekvencí a časování. Tu jsme schopni povolit příkazem: RCC_PLLI2SCmd(ENABLE);
Dále bylo zapotřebí nezávisle konfigurovat reset pin obvodu jako výstupní s připojením vnitřního ochranného rezistoru. Pomocí něj pak můžeme softwarově řídit reset obvodu. Z hlediska nastavení parametrů pro I2C a I2S byla inspirace nalezena u již hotové knihovny pro tento obvod na internetu [23]. Autor zde také prezentuje podrobný postup konfigurace. Z této knihovny byla dále využita funkce pro čtení a zápis do registrů obvodu po I2C. Na základě těchto funkcí byla poté vytvořena inicializační sekvence, kterou je během konfigurace nutné dodržet, jak uvádí katalog obvodu [13]. Při nastavování parametrů obvodu po I2C, např. hlasitosti, korekce nebo prahu pro peak detektor je zapotřebí znát hodnotu a adresu příslušného registru, do kterého se má zapisovat. Tyto vlastnosti najdeme opět v katalogovém listu. Každý parametr má obvykle svůj vlastní registr, který je určen adresou a hodnota, která se do něj zapíše, mění hodnotu daného parametru podle tabulky uvedené v katalogu. Jako příklad práce s parametry si zde uvedeme funkci pro regulaci hlasitosti, která je pak volána funkcí pro rotační enkodér.
35
void CS43L22_master_volume_A (uint32_t Volume) { uint8_t MasterVolume = 0x00, CommandBuffer[2]; // Proměnná pro hlasitost, příkazové pole /* Korekce rozsahu hodnot pro hlasitost */ if (Volume >= VOLUME_INIT) MasterVolume = Volume - VOLUME_INIT; else MasterVolume = Volume + 180; /* Nastavení hlasitosti */ CommandBuffer[0] = MASTER_A_VOL; // Zápis adresy registru CommandBuffer[1] = MasterVolume; // Nastavení hlasitosti Send_codec_ctl(CommandBuffer, 2); // Zaslání dvou bytů požadovaného nastavení }
Vstupní parametr funkce představuje hodnotu hlasitosti, která se má nastavit. Korekce rozsahu hodnot zajišťuje regulaci hlasitosti v cyklu. To znamená, že při dosažení jedné krajní hodnoty při rotaci enkodéru se následně pokračuje ve stejném směru rotace od druhé krajní hodnoty. Také zajišťuje určité mapování. Na LCD se pak mohou zobrazovat hodnoty pro uživatele v pochopitelném rozsahu od 0 do 100 % hlasitosti, kdežto do samotného registru se zapisují hodnoty adekvátní. Samotné nastavení hlasitosti je pak realizováno nejprve zápisem adresy na nultou pozici příkazového pole, která je určená makrem MASTER_A_VOL s definicí v hlavičkovém souboru. Následuje uložení hodnoty hlasitosti na první pozici pole. Ukazatel na pole je pak vstupním parametrem funkce Send_codec_ctl(), která tímto způsobem zajistí přenos dvou bytů po I2C.
3.2.3
Knihovna pro LCD a touchpad
Během programování LCD jsme opět vyšli z hotové knihovny. Ta je prezentována na již zmíněných stránkách [18], kde se autor tímto displejem dopodrobna zabývá včetně jeho správného připojení k MCU a konfigurací potřebných periferií. Z knihovny byly vyňaty jen nejdůležitější části a pouze některé funkce z hlediska výpisu bodů, různých tvarů a fondu písma, které jsme posléze využily. Asi nejdůležitější částí knihovny byl způsob zápisu do samotné paměti RAM pro vykreslení jednotlivých barev na LCD. Zápis do paměti je realizován následujícím způsobem: #define LCD_REG #define LCD_RAM
(*((volatile unsigned short *) 0x60000000)) (*((volatile unsigned short *) 0x60020000))
void SSD1289_write_reg (uint32_t Register, uint32_t RegisterValue) { LCD_REG = Register; // Výběr registru (adresa) LCD_RAM = RegisterValue; // Nastavení hodnoty registru }
36
Jak již bylo zmíněno v návrhu hardwaru k LCD pro komunikaci s pamětí RAM bylo využito rozhraní FSMC. Uvedené makro zde právě souvisí s tímto rozhraním. Přesněji přímo s adresním prostorem paměťové banky 1. Ta právě začíná adresou korespondující s prvním makrem. Paměťová banka je rozdělena na čtyři NOR/PSRAM sekce. Každá sekce má svoji adresovou, příkazovou a datovou část. Více včetně přesných adresním pozic lze dohledat např. v referenčním manuálu MCU. Zápis do externí paměti RAM pak v podstatě probíhá na podobném principu, jak již bylo uvedeno u D/A převodníku. Rozdílem je pouze typ komunikačního rozhraní. Opět je zapotřebí znát adresu daného registru a jeho hodnotu pro vykreslení požadované barvy. Adresy registrů a odpovídající hodnoty pro změnu nastavení parametru, který zastupuje, získáme z katalogu řadiče SSD1289 [16]. Zápisem adresy registru a jeho hodnoty do funkce SSD1289_write_reg() se v důsledku makra vytvoří offset pro paměťovou banku 1. Rozhraní FSMC pak již zajistí přenos prostřednictvím datových vodičů 16-ti bitové komunikace do externí paměti RAM. Během inicializace LCD bylo zapotřebí nakonfigurovat jednotlivý piny, které využívá FSMC rozhraní. Dále inicializovat a nastavit parametry pro samotné rozhraní FSMC a povolit paměťovou banku 1 NOR/PSRAM 1. Stejně jako u D/A převodníku i zde podle doporučení katalogu bylo nutné provést inicializační sekvenci nastavením některých registrů. Kreslení na LCD je poměrně snadné. Vždy se jedná pouze o zápis hodnot do příslušných registrů. Jako příklad si zde uvedeme dvě funkce: void LCD_set_cursor (uint32_t Xpos, uint32_t Ypos) { uint32_t Temp = Xpos; /* Transpozice souřadnic pro horizontální zobrazení */ Xpos = Ypos; Ypos = (320 - 1) - Temp; /* Nasteveni kurzoru podle souřadnic */ SSD1289_write_reg(0x004e, Xpos); SSD1289_write_reg(0x004f, Ypos); } void LCD_set_pixel_color (uint32_t Xpos, uint32_t Ypos, uint32_t Color) { /* Prevence proti nastavení souřadnic mimo rozsah */ if (( Xpos > 319 )||( Ypos > 239 )) return; LCD_set_cursor(Xpos, Ypos); // Nastavení kurzoru podle souřadnic SSD1289_write_reg(0x0022, Color); // Nastavení barvy pixelu }
37
První funkce umožňuje nastavení souřadnic kurzoru LCD. K tomu složí dva registry pro X a Y osu. Druhá funkce umožňuje vykreslení barvy pixelu. Je zřejmé, že vhodným voláním této funkce jsme prakticky schopni vykreslit na LCD libovolný obrazec včetně fotky. K tomu je potřeba znát pouze RGB data všech barev na obrázku. Vzhledem k tomu, že pro vykreslení fotky o rozlišení 320 x 240 pixelů je zapotřebí celkem 153600 bytů RGB barev, je určitě vhodné umístit tyto data na externí médium. Způsob jakým získat RGB data z fotky nebo obrázku byl inspirován u jednoho z MMIA projektů zveřejněného na internetu, jehož autorem je Martin Šerík. K tomuto účelu autor vytvořil skript v Matlabu, který přímo vytvoří hlavičkový soubor, kde jsou jednotlivá data umístěna v poli. Tento skript byl mírně upraven tak, abychom pouze získali surová data. Poté stejným principem uvedeným v kapitole zpracování digitálního signálu byl pomocí programu Hex Editor Neo vytvořen soubor bez přípony a umístěn na SD kartu. Vzhled menu a firmwarového prostředí byl vytvořen pomocí programu Photoshop. Jedná se o fotografie pro pozadí plochy stažené na internetu a zmenšené na rozlišení 320 x 240 pixelů, ke kterým byly přidány obrázky tlačítek a popisky.
Dr um mac hi nef ormus i c i ans2014 Dr ums
Set t i ngs
Sequenc er Compos er
Obr. 3.9: Vzhled menu bicího automatu. Princip vykreslení obrázku na LCD z SD karty vystihuje lépe vývojový diagram na obrázku 3.10. Jak je z vývojového diagramu patrné, je vykreslení zajištěno zřetězením cyklu souřadnic pro X a Y osu. Možná drobnou nevýhodou algoritmu je, že k vykreslení dochází po dávkách. Tento fakt způsobuje postupné vizuální vykreslení na LCD. Zlepšení by se docílilo, pokud bychom zajistili součastného čtení a zápisu do bufferu. V takovém případě by bylo nutné použít buffer kruhový nebo dva buffery. Tento princip je kvůli správnému časování vyžadován nutně až při přehrávání zvuků, viz dále.
38
Ulo dva byty do promìnné RGBSample
Start Typ obrázku
Vykresli pixel podle RGBSample Otevøení obrázku Inkrementace indexu bufferu
Uloení poètu pøenesených bytù
Je pøeneseno vše?
Ukazuje index na konec?
Naètení jedné dávky dat do bufferu -
Uloení poètu pøenesených bytù
+ + Zavøi soubor Vynuluj index Naètení další dávky dat do bufferu
y = Ypos; y < (Ypos + H); y++
x = Xpos; x < (Xpos + W); x++
Obr. 3.10: Vývojový diagram vykreslení obrázku s SD karty na LCD. Výpis písma je zajištěn vykreslováním jednotlivých znaků opět zřetězeným voláním funkce pro vykreslení bodu. Znaky jsou vytvořeny jako datová pole v samostatném souboru tvořící fondy písma, který je součástí knihovny. Po vypsání textu na LCD a jeho následné změně je nutné vzít v úvahu, že dochází pouze k jeho přepisování. Pro korekci byla vytvořena funkce, která během změny výpisu textu vykreslí plný obdélník v barvě pozadí, na které je text sázen. Rozměr obdélníku přitom odpovídá velikosti fondu a délky textu. Knihovna pro dotykovou fólii byla stažena ze stejného zdroje jako knihovna pro LCD. Konkrétně se jednalo o projekt, který umožňoval kreslení na LCD dotykem na fólii. Z knihovny byla využita funkce s názvem Convert_Pos(). Tato funkce obsahuje funkci pro určení souřadnic dotyku na fólii prostřednictvím komunikace SPI. Bylo tedy nutné opět inicializovat tuto sběrnici. Dotyk na fólii je signalizován změnou úrovně na pinu TP_IRQ. Během dotyku se na pinu vyskytuje nízká úroveň. Z principu se přímo nabízí volat funkci pro určení souřadnic na základě externího přerušení tohoto pinu. Externí přerušení však způsobovalo nepříjemné lupání na výstupu D/A převodníku. Katalog obvodu doporučuje před odpojováním převodníku dodržet deinicializační sekvenci, která zabrání lupání. Zápis do registrů po I2C je však poměrně pomalý. Hodí se tak např. pouze při fyzickém připojení či odpojení zátěže. Z tohoto 39
důvodu byla funkce volána jako součást úlohy v hlavní smyčce. Výpočet souřadnic byl pak podmíněn pouze výskytem úrovně na pinu, tak aby nedocházelo k výkonu funkce zbytečně. Pro určení stisku virtuálních tlačítek na LCD byly vytvořeny makra, které představují jejich přesné souřadnice. Během testování stisku pak již stačí porovnávat tyto souřadnice se souřadnicemi vypočtenými následujícím způsobem: #define BTN_PLAY_COORDINATE ((Pen_Point.X0 > 92) & (Pen_Point.X0 < 131) & (Pen_Point.Y0 > 191) & (Pen_Point.Y0 < 230)) if (BTN_PLAY_COORDINATE & Releaseflag) { Patterns_read_flag(SET_FLAG); // Nastavení vlajky pro čtení patternů s SD karty SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); // Povolení interraptu pro přehrávání zvuků TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); // Povolení interraptu pro tempo ReleaseFlag = RESET; // Resetování vlajky }
V proměnných Pen_Point.X0 a Pen_Point.Y0 jsou uloženy aktuální souřadnice dotyku. Vlajka ReleaseFlag zabraňuje vícenásobnému vykonávání obsahu při držení tlačítka. Vlajka je pak opět povolena, až po uvolnění, respektive výskytu vysoké úrovně na pinu TP_IRQ.
3.2.4
Software pro uživatelské rozhraní
Program pro obsluhu maticové klávesnice vychází z principu multiplexace jak už bylo uvedeno dříve. Určení stisku klávesnice je realizováno cyklickým zjišťováním logické úrovně na jednotlivých řádcích. Řádky jsou tedy konfigurovány jako vstupní piny. Pomocí změny úrovně na sloupcích pak vybíráme konkrétní tlačítko na klávesnici. Při stisku klávesy totiž dojde k fyzickému spojení příslušného řádku a sloupce. V našem případě je v klidovém stavu na řádcích logická 1, což zajišťují pull-up rezistory. Přivedením logické 0 do sloupce dojde k jeho výběru. Multiplexace pak zajistí, že v jednom okamžiku je vyhodnocen stisk pouze jednoho tlačítka. Stisk dvou tlačítek součastně je tedy realizován sekvenčně, přičemž rychlost multiplexace vytvoří efekt součastného stisku. Pro tento účel byla vytvořena funkce s názvem Keypad_scan(), která je součástí vytvořené knihovny pro tlačítka. Tato funkce vrací hodnotu stisknuté klávesy. Podle klávesy se pak vykoná určitá část programu, kterou tato klávesa zastupuje. Aby však nedocházelo k jeho vícenásobnému vykonávání, byla vytvořena funkce z názvem Keypad_check(). Tato funkce je volána během zjišťování logické úrovně v řádcích. Funkce pracuje ve dvou krocích. V první se zjistí, zdali je tlačítko stisknuto, včetně časového zpoždění pro ošetření zákmitů. Pokud ano funkce vrátí logickou 1. V druhém kroku, při novém volání funkce se opět zjišťuje stav stisku. Pokud se
40
nevyhodnotí změna, to znamená, že uživatel drží tlačítko, bude funkce pro tuto klávesu neustále vracet logickou 0. Problém přehledněji vystihuje vývojový diagram na obrázku 3.11. Start Typ klávesy
Uplynulo zpodìní?
Ulo stav úrovnì
+ +
Je úroveò na pinu log. 1?
Inkrementace pro zpodìní
+
Zjisti hodnotu na pinu
Bylo ji tlaèítko zmáèknuto?
-
Je úroveò na pinu log. 0?
-
-
-
+ Uplynulo zpodìní? +
Nuluj èasovaní, a nastav pøíznak zmáèknutí tlaèítka
Nuluj èasovaní, a resetuj pøiznak zmáèknutí tlaèítka
Vra log. 1
Vra log. 0
-
Obr. 3.11: Vývojový diagram principu stisku tlačítka s ošetřením. Pro práci rotačního enkodéru bylo využito časovače, který počítá jeho impulzy při rotaci. Je důležité zvolit časovač takový, který má alespoň dva kanály. Každý časovač má tyto kanály vyvedené na konkrétní piny. K těmto pinům je třeba připojit signálové vývody enkodéru A a B. Piny pak musí být konfigurovány v režimu alternativního módu a mapovány na časovač. Inicializace časovače pak může vypadat velice jednoduše. Inspirace pro inicializaci byla nalezena zde [24]. void Encoder_Timer3_init (void) { /* Povolení hodin pro časovač */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Nastavení časovače v režimu pro enkodér */ TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); /* Povolení časovače */ TIM_Cmd(TIM3, ENABLE); }
Samotná funkce pro určení změny parametru, např. tempa obsahuje proměnnou třídy static. Tato proměnná slouží ve funkci jako paměť pro uložení nastavené hodnoty tempa. Součástí funkce je výpočet tempa, jehož výsledek je závislý na aktuální 41
hodnotě v časovači pro enkodér. Hodnota tempa je pak vstupním parametrem pro změnu časovače určeného pro přehrávání sekvencí. Tímto způsobem je pak realizována skutečná změna tempa. uint32_t Calculate_tempo (EncoderStatus Request) { static uint32_t TempoStore = TEMPO_INIT; uint64_t TimRegValue = 0; uint32_t Tempo = 0; switch (Request) { /* Vrátí pouze uloženou hodnotu tempa */ case RETURN_TEMPO: return (TempoStore); /* Zjišťuje změny enkodéru */ case SCAN: Tempo = ((Encoder_return_value()/2) + TEMPO_MIN); /* Nastavení časovače pro sekvencer pouze během změn */ if(Tempo != TempoStore) { TimRegValue = (2999880 / Tempo); // Výpočet hodnoty pro časovač podle tempa TIM_SetAutoreload(TIM7, ((uint32_t)TimRegValue)); // Nastavení časovače TempoStore = Tempo; // Uložení nového tempa return(1); // Nastala změna tempa } break; } return(0); // Změna tempa nenastala }
Funkce pracuje ve dvou režimech, jak je z kódu patrné. Výběr módu je zajištěn vstupním parametrem Request. Pro tento parametr byl definován samostatný datový typ EncoderStatus se dvěma stavy pro lepší srozumitelnost. Voláním funkce s parametrem RETURN_TEMPO získáme pouze přímý přístup k hodnotě uloženého tempa, což je také důvod tohoto rozdělení. Výpočet tempa se provádí vždy pouze během změn rotace enkodéru, čili jen v potřebných případech. Signalizace změn je předána formou návratové hodnoty. Tímto způsobem jsme schopni vhodně vypisovat aktuální změny tempa na LCD. Na první pohled může číslo vyskytující se v řádku kódu funkce Calculate_tempo() pro výpočet tempa vypadat jako magická konstanta. Ta je ale výsledkem trojčlenky s nepřímou úměrou. Pro vysvětlení si uvedeme příklad výpočtu s nastavením časovače na požadované tempo. Dejme tomu, že budeme potřebovat nastavit tempo 120 BPM. Toto tempo odpovídá frekvenci 2 Hz celých dob. Pro čtvrťové doby dostaneme 8 Hz. Frekvence časovače TIM7 odpovídá 84 MHz. Hodnota předděličky a časovače je svázaná následujícím vztahem, který byl uveden ve zdroji [25]. 𝑈 𝑝𝑑𝑎𝑡𝑒𝐸𝑣𝑒𝑛𝑡(𝐻𝑧) =
𝑇 𝑖𝑚𝑒𝑟_𝐶𝑙𝑘 (𝑇 𝐼𝑀 _𝑃 𝑆𝐶 + 1) · (𝑇 𝐼𝑀 _𝐴𝑅𝑅 + 1) 42
(3.2)
Pro frekvenci 8 Hz a zvolenou hodnotu časovače 24 999 odpovídá předdělička hodnotě 419. Nyní již může být patrné, že pokud vydělíme zmíněnou konstantu hodnotou tempa 120 BPM, obdržíme přímo hodnotu časovače, která zajistí generování odpovídající frekvence. Výpočet tempa bude tím přesnější, čím bude rozsah časovače větší. Proto jsme zvolili vysokou hodnotu. Enkodér využíváme také pro regulaci hlasitosti. Jiný parametr pro regulaci je vybrán stiskem tlačítka na enkodéru. Řešení programu je formou stavového automatu. Před přechodem do nového stavu je zapotřebí udělat několik kroků. Nejprve je potřeba uložit nastavenou hodnotu parametru z předchozího stavu. Poté změnit rozsah a počáteční hodnotu časovače pro enkodér, tak aby byl jeho rozsah adekvátní regulaci novému parametru. K tomuto účelu slouží funkce Encoder_Timer3_setup(). void Encoder_Timer3_setup (uint32_t CntTop, uint32_t CntStart) { /* Nastavení rozsahu časovače */ TIM_SetAutoreload(TIM3, CntTop); /* Nastavení počáteční hodnoty */ TIM_SetCounter(TIM3, CntStart); }
3.2.5
Software pro režimy bicího automatu
Náš bicí automat obsahuje tři základní režimy provozu. Pro lepší přehlednost a práci v kódu byly funkce potřebné pro jednotlivé režimy rozděleny do samostatných souborů. První režim bicího automatu se stará o přehrávání zvuků uložených na SD kartě. Volání zvuků je podmíněno stiskem odpovídajícího tlačítka uživatelské klávesnice. Pokud dojde ke stisku tlačítka, nastaví se příznak pro jeho volání v poli SoundType[]. Délka pole odpovídá počtu zvuků. Pole je součástí funkce Sound_type(), tak aby bylo možné přistupovat k poli i z jiných částí kódu prostřednictvím vstupních parametrů funkce. FlagStatus Sound_type (uint8_t *Position, FlagOperation Operation) { static FlagStatus SoundType[NUM_OF_SOUNDS]; FlagStatus *PtrSoundType = &SoundType[*Position]; // Ukazatel na pole if(Operation == SET_FLAG) SoundType[*Position] = SET; // Nastavení příznaku else if(Operation == RESET_FLAG) SoundType[*Position] = RESET; // Nulování příznaku return (*PtrSoundType); // Vrátí ukazatel na pole }
43
Soubor obsahující funkce pro tento režim nese název drum_beats.c. Z hlediska principu obsahuje dvě základní funkce. První funkce z názvem Beats_reading() se stará o čtení jednotlivých vzorků zvuku s SD karty a provádí jejich zápis do bufferu. Druhá funkce s názvem Play_sound() provádí mix vzorků z bufferu a jejich odeslání do externího D/A převodníku. Tato funkce se volá v přerušení I2S, které zajišťuje přesné časování z hlediska vzorkovací frekvence. Protože funkce pro práci s SD kartou nesmí být volány v přerušení, bylo nutné funkci Beats_reading() volat v hlavní smyčce. Správné časování čtení z SD karty a zápisu do bufferu pak bylo podmíněno vlajkou BeatsReadFlag[]. Vlajka je pak nastavována v přerušení I2S. Opět se jedná o pole z délkou odpovídající počtu zvuků. Aby bylo možné zajistit současné čtení vzorků zvuku s SD karty a jejich odesílání do externího D/A převodníku v jednom čase, používají se k tomuto účelu dva buffery. Během zápisu vzorků do jednoho dochází k součastnému čtení z bufferu druhého. Jejich funkce se po naplnění mění. Přesněji se jedná o třírozměrné pole s názvem MemoryBuffer. Prví rozměr zastupuje dva buffery. Druhý rozměr odpovídá počtu zvuků tak, aby bylo možné provádět mixování. Poslední rozměr koresponduje se samotnou délkou bufferu. Mixování je realizováno sčítáním vzorků jednotlivých zvuků získaných z odpovídajících pozic bufferu MemoryBuffer. Samotné sčítání však nestačí. Před odesláním mixovaného vzorku do D/A převodníku se ještě přičte offset. Velikost offsetu je závislá na počtu mixovaných zvuků. Počet zvuků lze jednoduše zjistit součtem nastavených příznaků pole SoundType[]. Důvod přičtení offsetu je patrný z následujícího obrázku. Offset zajistí posunutí průběhu do středu rozsahu D/A převodníku. Při nárůstu počtu zvuků se průběh posunuje v rozsahu nahoru od středu vlivem nábit [-]
t [s]
0
Obr. 3.12: Princip nastavování offsetu při mixování.
44
sobení, což způsobuje prudké skoky v navazování. Tyto skoky se negativně projeví lupáním. Z tohoto důvodu je nutné offset snižovat v závislosti na počtu zvuků tak, aby byl průběh stále uprostřed rozsahu převodníku. Pro ukázku činnosti programu tohoto režimu je v příloze B.2 uveden jeho vývojový diagram. Některé části byly pro větší přehlednost záměrně zjednodušeny. Druhým režimem je sekvencer. V principu využívá všech potřebných funkcí pro přehrávání zvuků z předešlého režimu. Jediným rozdílem je, že k povolování příznaků v poli SoundType[] pro přehrávání nedochází stiskem tlačítka uživatelské klávesnice, ale na základě notového zápisu uloženého na SD kartě. Tento notový zápis je složen ze dvou symbolů. Symbolu pro tón (1 až 4 dle akcentu viz dále) a symbolu pro pauzu (0). Příznak je nastaven pouze symbolem tónu. Pauza se ignoruje. Symbolem tónu dojde součastně ke skoku ukazatele otevřeného souboru na začátek. Tím zajistíme opakování zvuku. Čtení notového zápisu se provádí po šestnáctinových dobách. Tento úsek obsahuje 12 po sobě jdoucích symbolů, každá pozice pro jiný zvuk. Změnou rychlosti nastavování příznaků pak měníme tempo přehrávání takto vzniklých sekvencí. Režim sekvenceru využívá tři základní funkce, které jsou součástí souboru drum_patterns.c. Funkce Set_beats_in_tact() pracuje ve dvou režimech podle vstupního parametru. Se vstupním parametrem READ_BEATS je funkce volána v přerušení pro tempo a realizuje nastavování příznaků. Pro parametr REPEAT_BEATS je funkce volána v hlavní smyčce a zajišťuje opakování zvuků. Důvodem rozdělení je opět práce s funkcemi SD karty, které nesmí být volány během přerušení. Stejně tak funkce Patterns_reading(), která čte symboly po úsecích z notového zápisu uloženého na SD kartě a zapisuje je do bufferu TactBuffer. Funkce je volána v hlavní smyčce a časování je zajištěno pomocí vlajky PatternsReadFlag nastavované v přerušení pro tempo. Poslední důležitá funkce Pattern_change() zprostředkuje změnu patternu. To znamená, že zavře aktuálně otevřený soubor s notovým zápisem jedné sekvence a otevře novou. Soubory obsahující notový zápis jsou určeny svým názvem respektive cestou. Názvy těchto souborů mohou být libovolné, protože jsou nezávislé na programu. Během zapnutí bicího automatu totiž dojde ke zjištění cest pomocí funkce Scan_files_names(), která uloží názvy do seznamu. Tato funkce je součástí knihovny pro SD kartu. Posledním režimem bicího automatu je skladatel. Tento režim je z hlediska funkce plně adekvátní s prvním režimem včetně přehrávání zvuků stiskem tlačítek. Liší se pouze tím, že vytváří nové soubory notového zápisu pro sekvencer. Skladatel pracuje v reálném čase. Uživatel jej spustí tlačítkem nahrávání. Start skládání je signalizován automatickým spuštěním kliku metronomu. Během skládání se zapisují nové symboly pro tón či pauzu do bufferu podle stisku tlačítek. Rozhodnutí o zápisu symbolu pro tón musí být provedeno nezávislým příznakem ButtonFlag[] tak, aby 45
bylo možné ho po každém zápisu opět resetovat. To v případě příznaku pro zvuk si nemůžeme dovolit, protože bychom nedosáhli součastného přehrávání zvuku. Uložení proběhne až po zastavení skládání tlačítkem stop. Obsah bufferu se pak překopíruje do nového souboru, který se vytvoří na SD kartě. Délka doby skládání je dána délkou bufferu. Pokud se během skládání dosáhne jeho konce, dojde k uložení automaticky a vypne se metronom. Klik metronomu je přehrávám v samostatném kanále a to formou multitaskingu s kanálem pro zvuky bicích. Princip multitaskingu umožňuje sběrnice I2S automaticky pro stereo. Kód pro skladatele je napsán v soboru drum_composer.c. Ten obsahuje dvě základní funkce. O zápis symbolů do bufferu se stará funkce Write_beats_in_tact(). Přehrávání metronomu zajišťuje funkce Metronome(). Obě funkce jsou volány v přerušení, jehož frekvence je dvojnásobná oproti frekvenci přerušení pro tempo. Funkce jsou totiž vykonávány střídavě, přičemž první v pořadí je funkce pro metronom. Klik metronomu tak zazní vždy v předstihu, než se uskuteční samotný zápis. Uživatel je pak schopný včas zareagovat a proces skladatele tak proběhne korektně. Za zmínku stojí ještě funkce Save_composite_data(), která po dokončení skládání překopíruje obsah bufferu do nového souboru na SD kartu, čímž je vytvořen nový pattern.
3.2.6
Princip rozlišení akcentu a délky zvuku při stisku
Každý zvuk reprezentující určitou část bicí soupravy má celkem čtyři varianty akcentu. Rozlišení akcentu zvuku při stisku je realizováno změnou cesty k souboru na SD kartě. Při změně akcentu je tedy spuštěn vždy úplně nový soubor. Je tedy nutné zajistit korektní zavírání otevřených souborů, aby nedošlo k zahlcení. Toto ošetření zajišťuje funkce Accent_decision(). Pokud během opakovaného stisku nedojde ke změně akcentu, zůstane otevřen původní soubor se zvukem a dojde pouze ke skoku ukazatele na jeho začátek. V opačném případě se soubor zavře a otevře se soubor nový adekvátní vybranému akcentu. V režimu přehrávání zvuku bicích a režimu skladatele může uživatel měnit akcent změnou úrovně virtuálního sloupcového grafu dotykem touchpadu. V notovém zápisu je pak akcent rozlišen číselně symboly pro tón od 1 do 4. Změnu akcentu zajišťuje funkce Accent_bar_graph(), která se stará i o vykreslení příslušné barvy ve sloupcovém grafu. Délka tónu zvuku je určena opakováním úderu stejně tak, jak jsme toho schopni docílit u skutečných bicích. U činelů bylo navíc simulováno jejich chycení. Stiskem virtuálního tlačítka cymbal grap dojde k useknutí přehrávaného zvuku činelu a zavření souboru. Toto tlačítko však reaguje pouze na činely a projeví se vždy jen u posledního přehrávaného zvuku. Úloha zajišťující výběr zvuku při stisku task_SOUND_SELECT() vrací typ posledního stisknutého tlačítka činelu. Funkce Cymbal_truncate() pak již podle této návratové hodnoty zajistí oseknutí znění zvuku
46
adekvátního činelu. K tomuto účely byl vytvořen nový datový typ Cymbal, který nabývá hodnot názvů činelů.
3.2.7
Vývoj Softwaru celkové aplikace
Celková aplikace je psána formou stavových super smyček. Funkce, které jsou volány hlavním programem v nekonečné smyčce, představují jednotlivé úlohy. Priorita jejich vykonávání je pak rozlišena porovnáváním uplynulého času s aktuální hodnotou systémového času uloženého v proměnné SystemTimeCnt. Příklad volání takové úlohy je vystižen následujícím kódem. void task_ENCODER (DrumModes Mode) { /* Nastavení časování výkonu funkce */ if ((System_time() - TaskTimer) > 10) { /* Funkce vrací hodnotu aktuálního sytémového času */ TaskTimer = System_time(); /* Jádro funkce */ . . . } }
Inkrementace proměnné SystemTimeCnt se provádí v přerušení SysTick_Handler(). Přerušení nastává právě v taktu systémového času. Hodiny systémového času jsou dány architekturou nastavení předděliček v souboru system_stm32f4xx.c. Na stránkách výrobce STM je možné volně stáhnout software s názvem STM32CubeMX, který umožňuje nastavení předděliček grafickou formou. Aplikace pak z nastavení vygeneruje přímo kód pro soubor system_stm32f4xx.c. Vývojový diagram výkonu hlavního programu bicího automatu je uveden v příloze B.1.
3.3
Realizace bicího automatu
Z hlediska návrhu zařízení bylo zpočátku počítáno, že bude navržena jedna univerzální deska plošného spoje. Z časových a finančních důvodů bylo nakonec rozhodnuto využít při návrhu desky vývojového kitu Discovery s procesorem STM32F4. Ten již obsahuje velkou část obvodů potřebných pro naši aplikaci.
47
3.3.1
Vývoj a návrh DPS
Prvním krokem vývoje byl návrh výběru adekvátních pinů MCU tak, aby nedocházelo ke konfliktu mezi periferiemi. Je zřejmé, že obvody na kitu jsou již připojeny k pinům pevně. Není tedy možná jejich změna, jako v případě individuálního návrhu DPS. S tím je tedy potřeba během návrhu počítat. Pro usnadnění práce byl využit opět software STM32CubeMX od firmy STM. Tento software umožňuje simulovat využité piny pro používané periferie a zobrazit jejich případné konflikty.
Obr. 3.13: Využité piny MCU v simulaci programu STM32CubeMX. Simulace ukázala pouze jeden konflikt a to mezi rozhraním FSMC a pinem PD4 připojeným k resetovacímu vstupu D/A převodníku. Pro resetovací vývod obvodu by bylo možné zvolit jakýkoliv jiný volný pin. D/A převodník je však na kitu připojen na pevno. Naštěstí pin PD4 není v rámci rozhraní FSMC v našem případě využit. Slouží pro čtení z LCD, které nebude potřeba. Během návrhu bylo důležité promyslet způsob napájení celkového zařízení. Kit STM32F4 Discovery je napájen 5 V přes datový vstup USB. Zamýšleno však bylo napájet celkové zařízení z 5 V adaptéru. Z tohoto důvodu je provedena na kitu drobná úprava. Konkrétně je odpájena dioda D1 na vstupu napájení zajišťující ochranu před přepólováním. Tím je dosaženo odpojení kitu od napájení z datové cesty. Na napájecí vstup kitu pak již je přivedeno napájení z externího adaptéru, přičemž odpojená ochranná dioda je v cestě opět využita. Tím jsme dosáhli stavu, ve kterém může být bez konfliktu součastně připojen datový vstup pro programování a napájení z
48
externího zdroje. Napájení na kitu je tvořeno dvěma stabilizátory. Jeden vytváří napětí 3V3 pro logiku a druhý 2V5 pro analogovou část D/A převodníku. Napětí pro logiku je vyvedeno z kitu do ostatních částí DPS. Úroveň zdroje externího adaptéru je využita pouze v napájení obvodu TPA0233 pro mix kanálů. 3V3
5V
IC1 MC33269D-3.3 3
VO ADJ
2
1
C2
C3
10u
1u
3
100n
GND
VIN INH GND 2
1
C1
VI
2V5
IC2 LD3985M25R VOUT
5
BYPASS
C6
4
5V
C4
C5
100n
10n
1u
GND
Obr. 3.14: Stabilizátory pro napájení na kitu Discovery. Navržena tedy je základní deska s paticí pro připojení kitu. Dále jsou navrženy další dvě DPS. Jedna pro klávesnici a jedna pro enkodér. Důvodem výroby samostatných desek byla možnost snadného dostavení výšky pomocí kolíkových lišt z hlediska horního krytu přístrojové krabice. LCD a reproduktor jsou umístěny na distančních sloupcích a připojeny k základní desce přes kabely. Audio výstup z D/A převodníku na kitu je spojen se vstupem do mixu pomocí audio kabelu s konektorem jack 3,5 mm na obou stranách. SD karta, konektory a všechny komponenty, jsou navrženy tak, aby bylo možné k nim z venčí snadno přistupovat. Základní deska je navržená přesně na rozměr přístrojové krabice. Navržené DPS jsou uvedeny v příloze C.
3.3.2
Návrh zařízení a jeho finální podoby
Ve vybrané přístrojové krabici jsou ručně vytvořeny výřezy pro konektory a SD kartu vyměřením podle navržené DPS. Návrh výřezů horního víka pro LCD, reproduktor, tlačítka a enkodér jsou vytvořeny podle předlohy vrtného plánu, který je součástí přílohy D.1. Finální podobu zařízení dotváří popisky. Ty jsou navrženy jako jednotlivé nálepky, jejichž rozměr a umístění koresponduje s výřezy v krabici. Jejich návrh je opět uveden v příloze D.2. Popisky jsou vytištěny negativně s bílým písmem na průhledném podkladu.
49
4
ZÁVĚR
V první části práce byla podrobně prostudována problematika generování zvuku pomocí mikrokontroléru. Na základě této teorie bylo poté navrženo blokové schéma bicího automatu s vhodným výběrem komponentů. Principy zpracování zvuku a veškeré základní funkce byly prakticky testovány na nepájivém poli s vývojovým kitem Discovery. Na základě ladění a testování bylo poté navrženo finální schéma bicího automatu. Výstupem práce je tedy realizovaný funkční prototyp bicího automatu. Z hlediska firmware zahrnuje bicí automat tři režimy provozu. Režim přehrávání zvuků bicích stiskem tlačítek, režim sekvenceru s možností změny tempa a hlasitosti přehrávaných sekvencí z paměti a režimu skladatele, který umožňuje tvorbu nových sekvencí skládáním v reálném čase. Změna akcentu zvuku je umožněna posunováním úrovně virtuálního sloupcového grafu dotykem na fólii LCD. Délka zvuku je dána opakováním úderu tedy jeho znovuspuštěním. U činelů byla navíc vytvořena možnost změny délky jejich znění v podobě formy jejich chycení. Navíc byla programově doplněna funkce možnosti změny podsvícení LCD pomocí PWM v menu nastavení. Dále signalizace stisku a přehrávaného údery formou barevné hudby svitu LED. Po programové stránce se nabízí několik dalších vylepšení, které by našly své uplatnění. Skládání v reálném čase je uživatelsky poměrně složité. Z tohoto důvodu je zamýšleno vytvořit ještě druhý režim skladatele, který by umožňoval skládání např. formou zapisování not. Dále chybí v režimu skladatele možnost uložení vytvořené sekvence pod vlastní název nebo jejich mazání. Toho bychom dosáhly např. vytvořením vyskakujícího menu s písmennou klávesnicí. Pro režim sekvenceru by bylo vhodné upravit notové zápisy tak, aby se každá sekvence začala přehrávat v automatickém tempu. Bez této možnosti totiž uživatel musí nastavit každou sekvenci na adekvátní tempo ručně. Z hlediska většího uživatelského komfortu by bylo vhodné zajistit kompatibilitu obsahu SD karty s WAV soubory. Uživatel by si tak snadno mohl změnit zvuky bicích podle vlastní chuti. V takovém případě by bylo také vhodné vytvořit ošetření vytažení SD karty během provozu. Při návrhu hardwaru se s touto možností počítalo vyvedením card detectu na pin MCU. Poslední úpravy by mohly směřovat na lepší časování pro blikání LED. Během stisku většího počtu tlačítek totiž zůstávají některé LED svítit s delší prodlevou. Bylo by tedy vhodné časovat jejich blikání v přerušení.
50
LITERATURA [1] Drum machine. Wikipedia [online]. 2013-12-8 [cit. 2013-12-12]. Dostupné z:
. [2] RUSS MARTIN. Sound synthesis and sampling. 3. vyd. USA: Elsevier, 2009. Focal Press. ISBN 978-0-240-52105-3. [3] VÁŇA VLADIMÍR. Mikrokontroléry Atmel AVR: Programování v jazyce Bascom. 1. vyd. Praha: BEN-Technická literatura, 2004. ISBN 80-7300-115-2. [4] WAV. AUDACITY. Audacity team: Wiki [online]. 2013-9-29 [cit. 2013-12-11]. Dostupné z: . [5] HUSSAIN a HAQUE. AVR Microcontroller Implementation for Customized Sound Generation. Bangladesh: Insitute of Advanced Engineeering and Science, 2012, s. 112-119. ISBN 2088-8708. [6] Interference. Wikipidie [online]. 2013-5-6 [cit. 2013-12-12]. Dostupné z: . [7] Mixing two digital audio streams with on the fly Loudness Normalization by Logarithmic Dynamic Range Compression. VÖGLER PAUL. Voegler [online]. 2012-04-20 [cit. 2013-12-11]. Dostupné z: . [8] STMICROELECTRONICS. STMicroelectronics [online]. 2013 [cit. 2013-12-13]. Dostupné z: . [9] MARINONI ENRICO. Emcu [online]. 2013 [cit. 2013-12-13]. Dostupné z: . [10] FOUST F. Secure Digital Card Interface for the MSP430. Michigan State University, 2004. [11] Reading an SD card with an ATMEGA168. Elastic Sheep[online]. 201012-1 [cit. 2013-12-18]. Dostupné z: . [12] ETT. User Manual For ET-MINI SD/MMC. Dostupné z: . [13] CIRRUS LOGIC. CS43L22: Datasheet. 2010. Dostupné z: .
51
[14] ZÖLZER UDO. Digital Audio Signal Processing. 2. vyd. Hamburg: John Wiley and Sons, 2008. ISBN 978-0-470-99785-7. [15] TEXAS INSTRUMENTS. TPA0233: Datasheet. Dallas, 2002. Dostupné z: . [16] SOLOMON SYSTECH. SSD1289: Datasheet. 2005. Dostupné .
z:
[17] XPTEK. XPT2046: Datasheet. Shenzhen, 2007. Dostupné z: . [18] STM32F4 Discovery + HY32D TFT LCD. Element 14 community [online]. 2012-5-26 [cit. 2013-12-18]. Dostupné z: . [19] Rotační enkodér. HansInteractive [online]. [cit. 2014-05-15]. Dostupné z: . [20] Set up Keil for STM32-Discovery boards. ANGELETTI, Fabio. Fabio’s blog about electronics [online]. 2013 [cit. 2014-0516]. Dostupné z: . [21] FatFs. CHAN. Elm-chan [online]. 2008 [cit. 2014-05-16]. Dostupné z: . [22] BROWN, Geoffrey. Discovering the STM32 Microcontroller [online]. 2013 [cit. 2014-05-16]. Dostupné z: . [23] FINKELMEYER, Andreas. Configuring the STM32F4-Discovery for audio. Mind-dump [online]. 2012 [cit. 2014-05-17]. Dostupné z: . [24] 52-Encoder-Library (STM32F4). BECKER, Uwe. Mikrocontroller [online]. 2013 [cit. 2014-05-19]. Dostupné z: .
52
[25] STM32F4 Basics: Timers. FarrellF [online]. 2012 [cit. 2014-05-20]. Dostupné z: .
53
SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK MIDI hudební elektronický komunikační protokol – Musical Instrument Digital Interface DAC digitálně analogový převodník, někdy také jako D/A – Digital to Analog Converter LCD displej z tekutých krystalů – Liquid Crystal Display PCM pulzně kódová modulace – Pulse Code Modulation DP
Dolní Propust, někdy také jako LPF – Low Pass Filter
PWM pulzně šířková modulace – Pulse Width Modulation WAV zvukový formát – WAVeform audio file format RIFF formát pro zvuk a obraz – Resource Interchange File Format MCU mikrokontrolér – Mikrocontroller (Unit) SWD sériové rozhraní pro debug – Serial Wire Debug SPI
sériové sběrnice pro komunikaci mezi digitálními obvody – Serial Peripheral Interface
I2C
sériová sběrnice pro komunikaci mezi digitálními obvody – Inter Integrated Circuit
I2S
sériová sběrnice pro komunikaci mezi audio digitálními obvody – Integrated Interchip Sound
FSMC rozhraní pro přístup k synchronním a asynchronním pamětem – Flexible Static Memory Controller JTAG rozhraní pro programování a debug – Joint Test Action Group ARM architektura procesorů – Advanced RISC Machine USART synchronní / asynchronní sériové rozhraní – Universal Synchronous / Asynchronous Receiver and Transmitter UART asynchronní sériové rozhraní – Universal Asynchronous Receiver and Transmitter USB sériová sběrnice pro připojení periférií k PC – Universal Serial Bus 54
CAN sériová sběrnice pro senzory a funkčí jednotky v automobilech – Controller Area Network SDIO rozhraní pro připojení SD karet – Secure Digital Input Output TFT aktivní LCD – Thin Film Transistors BPM Počet úderů za minutu – Beats Per Minute
55
SEZNAM PŘÍLOH A Schémata zapojení
57
B Vývojové diagramy
58
C Návrhy desek plošných spojů
60
D Výkresy
63
E Fotodokumentace
64
56
GND_8 GND 5V_2 5V 3V_2 3V3 PH1 PC15 LED1 PC13 PE5 LED2 PE3 LED3 PE1 PB9 VDD_3 PB7 TP_CS PB5 TP_SI PB3 TP_SCK PD6 TP_IRQ PD4 PD2 RD PD0 D2 PC11 LED4 PA15 LED5 PA13 PA9 PC9 LED6 PC7 GND_10 GND
GND_7 5V_1 3V_1 PH0 LED12 PC14 PE6 LED11 PE4 LED10 PE2 PE0 BLCNT PB8 BOOT0 PB6 TP_SO PB4 PD7 CS PD5 WR PD3 PD1 D3 PC12 PC10 PA14 PA10 PA8 LED9 PC8 LED8 PC6 LED7 GND GND_9
GND 5V 3V3
GND_2 VDD_2 NRST PC0 PC2 PA0 ROW1 PA2 ROW3 PA4 PA6 A PC4 PB0 COL1 PB2 COL3 PE8 D5 PE10 D7 PE12 D9 PE14 D11 PB10 PB12 SD_CS PB14 SD_MISO PD8 D13 PD10 D15 PD12 PD14 D0 NC GND_6
LCD
100n
10u
22k
R10
C5
5 4 3 2 1
Obr. A.1: Celkové schéma základní desky bicího automatu. GND GND
100k
R11
1500u
+
C10
PG203J
X1
GND
1u Channels mix & class AB amp
10 9 8 7 6
GND
1u
1u
IN - Two channels
1u
LO/MOFILT_CAP LIN SHUTDOWN VDD GND BYPASS ST/MN RIN RO/MO+
IC1
22k
R9
C4
3V3
A GND_2 B
3V3 GND_1 SW
GND
GND1 GND2 SW1 SW2
VDD DAT0/DO DAT1 DAT2 DAT3/CS CLK CMD/DI GND
SC1
10u
100n
X2
1 2
SV2
SP1
PG203J GND OUT - Speaker
5 4 3 2 1
OUT - Headphones
GND
GND1 GND2 SW1 SW2
4 7 8 1 2 5 3 6
C2
C1
SD card
ENCODER
Rotary encoder
7x 47k pull-up
GND_4 GND_3 GND_2 GND_1 3V3 ROW4 ROW3 ROW2 ROW1 COL3 COL2 COL1
C9
1 2 3 4 5
470u
C3 BAT60J
D1
5V
R3
C8
GND GND
C7
GND
1 2
C6
5V
SV1
R2
SPI2 SD_MISO SD_CS SD_SCLK SD_MOSI
SD_CD
Card detect LED1 3,5 mm RED
KEYPAD
220
R1
LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8 LED9 LED10 LED11 LED12
R4
GND D1 D3 D5 D7 D9 D11 D13 D15 RS RD BLCNT TP_IRQ TE_1 TE_2 TE_3
Conector on panel
3V3 D0 D2 D4 D6 D8 D10 D12 D14 CS WR RESET TP_SO TP_SI TP_SCK TP_CS
R5
DISCOVERY_BOARD GND_1 VDD_1 GND_3 RESET PC1 SD_CD PC3 PA1 ROW2 PA3 ROW4 PA5 PA7 B PC5 SW PB1 COL2 GND_4 PE7 D4 PE9 D6 PE11 D8 PE13 D10 PE15 D12 PB11 SD_SCLK PB13 SD_MOSI PB15 PD9 D14 PD11 RS PD13 PD15 D1 GND_5
VIN
Keypad with LEDs
R6
LCD - TFT with touchpad
R7
STM32F4 Discovery board
+
57 +
R8
A SCHÉMATA ZAPOJENÍ
B
VÝVOJOVÉ DIAGRAMY Start Inicializace periferií a konfigurace pinù Ètení názvù souborù na SD kartì Vytvoøení seznamu jmen pro patterny Vykreslení obrázku hlavního menu
Stisk tlaèítka?
-
+ Drums
Sequencer
Composer
Settings
*
Vykreslení obrázku pro Drums
Vykreslení obrázku pro Sequencer
Vykreslení obrázku pro Composer
Vykreslení obrázku pro Settings
Stisk tlaèítka?
-
+ Proces programu pro Sequencer
Proces programu pro Drums
Proces programu pro Composer
Sni podsvícení
Stisk návratu?
+
-
Stisk návratu?
-
Stisk návratu?
+
+
+
Návrat Zvyš podsvícení
Návrat k * zjištìní stisku
Obr. B.1: Vývojový diagram hlavního programu bicího automatu.
58
Start
-
Ètení z SD povoleno?
+
Stisk tlaèítka klávesnice?
Stisk tlaèítka touchpadu?
+ ...
Kick
Snare
Ride
Povolení odpovídajícího pøíznaku pro pøehrání zvuku
Zmìna akcentu?
+ Povol otevøení souboru
Skoè na zaèátek souboru
Pøerušení pro pøehrání zvuku
+ Cymbal grap
Byl stisknut èinel?
Nastaven pøíznak?
Bar graph
-
Návrat
Zmìna akcentu?
+
+
Reset pøíznaku
Vykresli novou úroveò
Zavøi soubor
-
-
Zavøení souborù Návrat do hlavního menu Konec
Zavøení souborù
-
+ Výbìr bufferu pro ètení
Mix vzorkù Zjištìní poètu zvukù Nastavení offsetu
Skok na start Odeslání vzorku do DAC
Reset povolení ètení z SD
-
Je ukazatel na konci?
Nastaven pøíznak?
+ Výbìr bufferu pro zápis
Inkrementace indexu na buffer
-
+
+ Je soubor ji otevøen?
-
-
Resetuj pøíznak Otevøení souboru na SD dle akcentu
Zavøi soubor Povol otevøení souboru
Je ukazatel na konci?
+ Nulování indexu Povolení èetní z SD karty
Zápis burstu dat do bufferu
Pøehození èinnosti bufferù
Obr. B.2: Vývojový diagram režimu přehrávání zvuku bicích stiskem tlačítka.
59
C
NÁVRHY DESEK PLOŠNÝCH SPOJŮ
Obr. C.1: DPS základní desky bicího automatu - top.
60
Obr. C.2: DPS základní desky bicího automatu - bottom.
61
Obr. C.3: DPS klávesnice - top.
Obr. C.4: DPS klávesnice - bottom.
Obr. C.5: DPS enkodéru.
62
D
VÝKRESY
Obr. D.1: Vrtný plán pro horní kryt přístrojové krabice (měřítko 3:4).
Obr. D.2: Návrh popisků přístrojové krabice.
63
E
FOTODOKUMENTACE
Obr. E.1: Spojení samostatných DPS.
Obr. E.2: Umístění výrobku do krabičky.
64
Obr. E.3: Pohled na zádní panel.
Obr. E.4: Realizovaný prototyp v činnosti.
65