Obsah:

Syntezátor laserové harfy na desce Zybo: 10 kroků (s obrázky)
Syntezátor laserové harfy na desce Zybo: 10 kroků (s obrázky)

Video: Syntezátor laserové harfy na desce Zybo: 10 kroků (s obrázky)

Video: Syntezátor laserové harfy na desce Zybo: 10 kroků (s obrázky)
Video: So Far Away (Remastered 1996) 2024, Červenec
Anonim
Laserový harfový syntezátor na desce Zybo
Laserový harfový syntezátor na desce Zybo

V tomto tutoriálu vytvoříme plně funkční laserovou harfu pomocí IR senzorů se sériovým rozhraním, které uživateli umožní změnit ladění a tón nástroje. Tato harfa bude remakem letitého nástroje 21. století. Systém byl vytvořen pomocí vývojové desky Xilinx Zybo společně s Vivado Design Suites. Co budete k dokončení projektu potřebovat:

  • 12 IR senzorů a emitorů (lze použít více či méně v závislosti na počtu řetězců)
  • Vývojová deska Zybo Zynq-7000
  • Zdarma RTOS
  • Vivado Design Suite
  • Vodič (pro připojení senzorů k desce)
  • 3 kusy PVC trubky ((2) 18 palců a (1) 8 palců)
  • 2 kolena z PVC

Krok 1: Získejte ukázku zvuku Zybo DMA společnosti Digilent

Strana FPGA tohoto projektu je z velké části založena na demo projektu, který se zde nachází. Využívá přímý přístup do paměti k odesílání dat přímo z paměti, do kterých může procesor zapisovat přes AXI Stream do zvukového bloku I2S. Následující kroky vám pomohou spustit a spustit zvukový demo projekt DMA:

  1. Může být nutná nová verze souboru desky pro desku Zybo. Chcete -li získat nové soubory desky pro Vivado, postupujte podle těchto pokynů.
  2. Otevřete demo projekt ve Vivadu podle kroků 1 a 2 v pokynech na této stránce. Použijte metodu Vivado, nikoli předávání hardwaru SDK.
  3. Může se zobrazit zpráva, že některé z vašich bloků IP by měly být aktualizovány. Pokud ano, vyberte „Zobrazit stav IP“a poté na kartě Stav IP vyberte všechny zastaralé IP a klikněte na „Upgradovat vybrané“. Když skončí, objeví se okno s dotazem, zda chcete generovat výstupní produkt, pokračujte a klikněte na „Generovat“. Pokud dostanete kritickou varovnou zprávu, ignorujte ji.
  4. Chcete -li zobrazit zdrojové soubory, přepněte z návrhu na kartu zdroje ve Vivado. Klikněte pravým tlačítkem na návrh bloku „design_1“a vyberte „Vytvořit obálku HDL“. Po zobrazení výzvy vyberte „kopírovat generovaný obal, aby bylo možné provádět úpravy uživatele“. Bude vytvořen obalový soubor pro projekt.
  5. Nyní, když jsou dokončeny kritické kroky, které byly v jiném kurzu nějak vynechány, můžete se vrátit k dříve propojenému kurzu a pokračovat od kroku 4 do konce a ujistit se, že demo projekt běží správně. Pokud nemáte způsob, jak vložit zvuk, který chcete nahrávat, stačí nahrávat se sluchátky a poslouchat 5–10 sekund fuzzy zvuk po stisknutí tlačítka přehrávání. Dokud po stisknutí tlačítka přehrávání něco vychází z konektoru pro sluchátka, pravděpodobně to funguje správně.

Krok 2: Proveďte ve Vivadu nějaké změny

Proveďte ve Vivadu nějaké změny
Proveďte ve Vivadu nějaké změny

Takže teď máte fungující zvukovou ukázku DMA od společnosti Digilent, ale to zde vůbec není konečný cíl. Musíme se tedy vrátit k Vivadu a provést nějaké změny, aby naše senzory mohly být zapojeny do hlaviček PMOD a mohli jsme jejich hodnotu použít na softwarové stránce.

  1. Otevřete blokový diagram ve Vivado
  2. Vytvořte blok GPIO kliknutím pravým tlačítkem na prázdné místo v blokovém schématu a výběrem „Přidat IP“z nabídky. Najděte a vyberte „AXI GPIO“.
  3. Poklepejte na nový blok IP a v okně Přizpůsobit IP přejděte na kartu Konfigurace IP. Vyberte všechny vstupy a nastavte šířku na dvanáct, protože na harfě budeme mít 12 „strun“, a proto potřebujeme 12 senzorů. Pokud chcete použít méně nebo více senzorů, upravte toto číslo odpovídajícím způsobem. Také nastavte povolení přerušení.
  4. Klikněte pravým tlačítkem na nový blok GPIO IP a vyberte „spustit automatizaci připojení“. Zaškrtněte políčko AXI a stiskněte OK. To by mělo automaticky připojit rozhraní AXI, ale výstupy bloku by neměly být připojeny.
  5. Abyste uvolnili místo pro další přerušení, dvakrát klikněte na blok IP xlconcat_0 a změňte počet portů ze 4 na 5. Poté můžete připojit pin ip2intc_irpt z nového bloku GPIO k novému nepoužívanému portu na bloku xlconcat.
  6. Klikněte pravým tlačítkem na výstup „GPIO“nového bloku IP GPIO a vyberte „vytvořit externí“. Najděte, kudy vede čára, klikněte na malý pětiúhelník a vlevo by se mělo otevřít okno, kde můžete změnit název. Změňte název na „SENZORY“. Pokud chcete, aby soubor omezení, který poskytujeme, fungoval, je důležité použít stejný název, jinak budete muset změnit název v souboru omezení.
  7. Zpět na kartě zdroje najděte soubor omezení a nahraďte ho tím, který poskytujeme. Můžete se rozhodnout soubor buď nahradit, nebo jen zkopírovat obsah našeho souboru omezení a vložit jej přes obsah starého. Jednou z důležitých věcí, které náš soubor omezení dělá, je povolení vytahovacích odporů na hlavičkách PMOD. To je nezbytné pro konkrétní senzory, které jsme použili, ale ne všechny senzory jsou stejné. Pokud vaše senzory vyžadují pulldown rezistory, můžete změnit každou instanci „set_property PULLUP true“pomocí „set_property PULLDOWN true“. Pokud vyžadují jinou hodnotu odporu, než je hodnota na desce, můžete tyto řádky odstranit a použít externí odpory. Názvy pinů jsou v komentářích v souboru omezení a odpovídají štítkům v prvním diagramu v Zybo Schematics stránku, kterou najdete zde. Pokud chcete použít jiné piny pmod, stačí přiřadit názvy v souboru omezení k popiskům ve schématu. Používáme záhlaví PMOD JE a JD a na každém používáme šest datových pinů, vynecháme piny 1 a 7. Tyto informace jsou důležité při zapojování senzorů. Jak je znázorněno na schématu, piny 6 a 12 na PMODS jsou VCC a piny 5 a 11 jsou uzemněny.
  8. Regenerujte obálku HDL jako dříve a zkopírujte a přepište starý. Až to bude hotové, vygenerujte bitstream a exportujte hardware jako dříve a SDK znovu spusťte. Pokud dostanete dotaz, zda chcete nahradit starý hardwarový soubor, odpověď zní ano. Při exportu hardwaru je pravděpodobně nejlepší mít zavřenou sadu SDK, aby byla správně vyměněna.
  9. Spusťte SDK.

Krok 3: Získejte běh FreeRTOS

Dalším krokem je spuštění FreeRTOS na desce Zybo.

  1. Pokud ještě nemáte kopii, stáhněte si FreeRTOS zde a rozbalte soubory.
  2. Importujte ukázku FreeRTOS Zynq umístěnou na FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Proces importu je téměř stejný jako u jiného demo projektu, ale protože demo FreeRTOS Zynq spoléhá na jiné soubory ve složce FreeRTOS, neměli byste soubory kopírovat do svého pracovního prostoru. Místo toho byste měli do složky projektu umístit celou složku FreeRTOS.
  3. Vytvořte nový balíček podpory pro desku tak, že přejdete na „soubor“-> „nový“-> „balíček podpory pro desku“. Ujistěte se, že je vybráno samostatné a klikněte na Dokončit. Po chvíli se objeví okno, zaškrtněte políčko vedle lwip141 (toto zabrání kompilaci jednoho z ukázek FreeRTOS) a stiskněte OK. Po dokončení klikněte pravým tlačítkem myši na projekt RTOSdemo a přejděte na „vlastnosti“, přejděte na kartu „reference projektu“a zaškrtněte políčko vedle nového bsp, který jste vytvořili. Naštěstí to bude rozpoznáno, ale někdy může být sada Xilinx SDK v této věci divná. Pokud se vám i po tomto kroku stále zobrazuje chyba, že xparameters.h chybí nebo něco podobného, zkuste tento krok zopakovat a možná ukončit a znovu spustit SDK.

Krok 4: Přidejte kód laserové harfy

Nyní, když je importován FreeRTOS, můžete přenést soubory z projektu laserové harfy do ukázky FreeRTOS

  1. Vytvořte novou složku ve složce src v ukázce FreeRTOS a zkopírujte a vložte všechny poskytnuté soubory c kromě main.c do této složky.
  2. Vyměňte RTOSDemo main.c za dodaný main.c.
  3. Pokud je vše provedeno správně, měli byste v tomto okamžiku spustit kód laserové harfy. Pro účely testování nyní tlačítkový vstup, který byl použit v demo projektu DMA, slouží k přehrávání zvuků bez připojených senzorů (bude fungovat jakékoli ze čtyř hlavních tlačítek). Přehraje řetězec pokaždé, když jej stisknete, a projdete všechny řetězce v systému vícekrát. Zapojte některá sluchátka nebo reproduktory do konektoru pro sluchátka na desce Zybo a zajistěte, abyste slyšeli zvuky strun procházejících po stisknutí tlačítka.

Krok 5: O kódu

Mnoho z vás, kteří čtou tento návod, se zde pravděpodobně dozví, jak nastavit zvuk nebo použít DMA k něčemu jinému nebo k vytvoření jiného hudebního nástroje. Z tohoto důvodu se několik dalších částí věnuje popisu toho, jak poskytovaný kód funguje ve spojení s dříve popsaným hardwarem pro získání funkčního zvukového výstupu pomocí DMA. Pokud chápete, proč jsou tam ty kousky kódu, pak byste měli být schopni je upravit pro cokoli, co chcete vytvořit.

Přerušení

Nejprve zmíním, jak jsou v tomto projektu vytvářena přerušení. Udělali jsme to tak, že jsme nejprve vytvořili strukturu vektorové tabulky přerušení, která pro každé přerušení sleduje ID, obslužnou rutinu přerušení a odkaz na zařízení. ID přerušení pocházejí z xparameters.h. Obsluha přerušení je funkce, kterou jsme napsali pro DMA a GPIO, a přerušení I2C pochází z ovladače Xlic I2C. Odkaz na zařízení ukazuje na instance každého zařízení, které inicializujeme jinde. Blízko konce funkce _init_audio prochází smyčka každou položkou v tabulce vektorů přerušení a volá dvě funkce, XScuGic_Connect () a XScuGic_Enable () pro připojení a povolení přerušení. Odkazují na xInterruptController, což je řadič přerušení vytvořený ve výchozím nastavení v souboru FreeRTOS main.c. V zásadě tedy připojujeme každé naše přerušení k tomuto řadiči přerušení, který pro nás již vytvořil FreeRTOS.

DMA

Inicializační kód DMA začíná v lh_main.c. Nejprve je deklarována statická instance struktury XAxiDma. Poté se ve funkci _init_audio () nakonfiguruje. Nejprve se zavolá funkce configure z demo projektu, která je v dma.c. Je to docela dobře zdokumentované a pochází to přímo z ukázky. Poté se přerušení připojí a povolí. Pro tento projekt je vyžadováno pouze přerušení master-to-slave, protože všechna data jsou odesílána DMA do řadiče I2S. Pokud chcete nahrávat zvuk, budete také potřebovat přerušení slave-to-master. Přerušení master-to-slave se zavolá, když DMA dokončí odesílání všech dat, která jste mu řekli odeslat. Toto přerušení je pro náš projekt neuvěřitelně důležité, protože pokaždé, když DMA dokončí odeslání jedné vyrovnávací paměti zvukových vzorků, musí okamžitě začít odesílat další vyrovnávací paměť, jinak by mezi odesláním mohlo dojít k slyšitelnému zpoždění. Uvnitř funkce dma_mm2s_ISR () vidíte, jak zvládáme přerušení. Důležitá část je blízko konce, kde používáme xSemaphoreGiveFromISR () a portYIELD_FROM_ISR () k upozornění _audio_task (), že může zahájit další přenos DMA. Způsob, jakým odesíláme konstantní zvuková data, je střídání dvou vyrovnávacích pamětí. Když je jedna vyrovnávací paměť přenášena do bloku I2C, druhá vyrovnávací paměť má své hodnoty vypočítané a uložené. Když pak přerušení přijde z DMA, přepne se aktivní vyrovnávací paměť a začne se přenášet novější zapsaná vyrovnávací paměť, zatímco dříve přenesená vyrovnávací paměť se začne přepisovat novými daty. Klíčovou součástí funkce _audio_task je místo, kde se volá fnAudioPlay (). fnAudioPlay () převezme instanci DMA, délku vyrovnávací paměti a ukazatel na vyrovnávací paměť, ze které budou data přenášena. Do registrů I2S je odesláno několik hodnot, aby bylo možné vědět, že přicházejí další vzorky. Poté se zavolá XAxiDma_SimpleTransfer () k zahájení přenosu.

Zvuk I2S

audio.c a audio.h jsou místem, kde probíhá inicializace I2S. Inicializační kód I2S je docela běžný kus kódu, který se vznáší na několika místech, můžete najít drobné odchylky od jiných zdrojů, ale tento by měl fungovat. Je to docela dobře zdokumentováno a pro harfový projekt toho není třeba moc měnit. Zvukové demo DMA, ze kterého pochází, má funkce pro přepnutí na mikrofonní nebo linkové vstupy, takže je můžete použít, pokud tuto funkci potřebujete.

Syntéza zvuku

Abych popsal, jak funguje zvuková syntéza, uvedu seznam všech zvukových modelů použitých při vývoji, které vedly ke konečné metodě, protože vám poskytne pocit, proč se to dělá tak, jak se to dělá.

Metoda 1: Pro každý řetězec se vypočítá jedna perioda hodnot sinusů na odpovídající frekvenci pro notu daného řetězce a uloží se do pole. Například délka pole bude periodou sinusové vlny ve vzorcích, která se rovná # vzorků / cyklus. Pokud je vzorkovací frekvence 48 kHz a frekvence not 100 Hz, pak 48 000 vzorků za sekundu a 100 cyklů za sekundu vede k 4800 vzorkům za cyklus a délka pole bude 4800 vzorků a bude obsahovat hodnoty jednoho úplného perioda sinusoidy. Když se přehraje řetězec, vyrovnávací paměť zvukového vzorku se naplní odebráním hodnoty z pole sinusových vln a vložením do zvukového bufferu jako vzorku, poté zvýšením indexu do pole sinusových vln, takže pomocí našeho předchozího příkladu v průběhu z 4800 vzorků je jeden cyklus sinusoidy vložen do zvukové vyrovnávací paměti. Operace modulo se používá na indexu pole, takže vždy spadá mezi 0 a délku, a když index pole překročí určitou prahovou hodnotu (například vzorky v hodnotě asi 2 sekund), řetězec se vypne. Chcete -li hrát více řetězců současně, sledujte index pole jednotlivých řetězců samostatně a přidáním hodnoty ze sinusové vlny každého řetězce získáte každý vzorek.

Metoda 2: Abychom vytvořili hudebnější tón, začneme předchozím modelem a přidáme harmonické ke každé základní frekvenci. Harmonické frekvence jsou frekvence, které jsou celočíselnými násobky základní frekvence. Na rozdíl od toho, když jsou sečteny dvě nesouvisející frekvence, což má za následek souběžné přehrávání dvou odlišných zvuků, když se sečtou harmonické, zní to stále jako jeden zvuk, ale s jiným tónem. Abychom toho dosáhli, pokaždé, když do zvukové ukázky přidáme hodnotu sinusové vlny v místě (index pole % délky pole), přidáme také (2 * index pole % délky pole) a (3 * index pole % délky pole), a tak dále, jakkoli je požadováno mnoho harmonických. Tyto násobené indexy budou procházet sinusovou vlnu na frekvencích, které jsou celočíselnými násobky původní frekvence. Aby bylo možné lépe ovládat tón, jsou hodnoty každé harmonické vynásobeny proměnnou, která představuje množství této harmonické v celkovém zvuku. Například základní sinusová vlna může mít všechny své hodnoty vynásobené 6, aby byla více faktorem celkového zvuku, zatímco 5. harmonická může mít multiplikátor 1, což znamená, že její hodnoty přispívají k celkovému zvuku mnohem méně.

Metoda 3: Dobře, takže teď máme na notách velmi pěkný tón, ale stále je tu docela zásadní problém: hrají s pevnou hlasitostí po fixní dobu. Aby zvuk znějící struny, která hraje, měl znít jako skutečný nástroj, měl by se v průběhu času plynule rozpadat. Aby toho bylo dosaženo, je pole naplněno hodnotami exponenciálně se rozpadající funkce. Nyní, když se vytvářejí zvukové vzorky, se zvuk vycházející z každého řetězce vypočítá jako v předchozí metodě, ale než se přidá do zvukového vzorku, vynásobí se hodnotou v indexu pole těchto řetězců v poli funkcí exponenciálního rozpadu. Díky tomu se zvuk v průběhu času plynule rozptýlí. Když index pole dosáhne konce pole rozpadu, řetězec se zastaví.

Metoda 4: Tento poslední krok skutečně dává zvukům strun jejich realistický zvuk. Než zněly příjemně, ale jasně syntetizovaně. Abychom se pokusili lépe napodobit řetězec harfy v reálném světě, je každé harmonické přiřazena jiná rychlost rozpadu. Ve skutečných řetězcích, když je struna poprvé zasažena, existuje vysoký obsah vysokofrekvenčních harmonických, které vytvářejí takový zvuk trhání, jaký od struny očekáváme. Tyto vysokofrekvenční harmonické jsou velmi stručně hlavní částí zvuku, zvuk strun, které jsou zasaženy, ale velmi rychle se rozpadají, protože pomalejší harmonické přebírají. Pro každé harmonické číslo použité při syntéze zvuku je vytvořeno pole rozpadu s vlastní rychlostí rozpadu. Nyní lze každou harmonickou nezávisle vynásobit hodnotou odpovídající jeho rozpadového pole v indexu pole řetězce a přidat do zvuku.

Celkově je syntéza zvuku intuitivní, ale výpočet těžký. Uložení celého zvuku řetězce do paměti najednou by zabralo příliš mnoho paměti, ale výpočet sinusové vlny a exponenciální funkce mezi každým snímkem by trvalo příliš dlouho, než abychom udrželi krok s rychlostí přehrávání zvuku. K urychlení výpočtu je v kódu použita řada triků. Veškerá matematika kromě počátečního vytváření sinusových a exponenciálních rozpadových tabulek se provádí ve celočíselném formátu, který vyžaduje rozložení dostupného numerického prostoru ve 24bitovém zvukovém výstupu. Například sinusový stůl má amplitudu 150, takže je hladký, ale není tak velký, aby mnoho společně hraných řetězců mohlo přidat více než 24 bitů. Podobně jsou hodnoty exponenciální tabulky vynásobeny 80 a poté zaokrouhleny na celá čísla a uloženy. Harmonické váhy mohou nabývat diskrétních hodnot mezi 0 a 10. Také všechny vzorky jsou ve skutečnosti zdvojnásobeny a sinusové vlny jsou indexovány čísly 2, čímž se efektivně sníží vzorkovací frekvence na polovinu. To omezuje maximální frekvenci, kterou lze přehrávat, ale bylo to nutné k tomu, aby byl aktuální počet řetězců a harmonických vypočítán dostatečně rychle.

Vytvoření tohoto zvukového modelu a jeho uvedení do provozu si vyžádalo značné úsilí na straně procesoru a bylo by neuvěřitelně obtížné zajistit, aby to fungovalo na straně fpga od začátku v časovém rámci tohoto projektu (představte si, že byste museli znovu vytvářet bitový tok každý čas, kdy byl kus verilogu změněn k otestování zvuku). Dělat to na fpga by však pravděpodobně mohlo být lepší způsob, jak to udělat, možná by to odstranilo problém s neschopností vypočítat vzorky dostatečně rychle a umožnit spuštění více řetězců, harmonických a dokonce i zvukových efektů nebo jiných úkolů na strana procesoru.

Krok 6: Zapojení senzorů

Zapojení senzorů
Zapojení senzorů

K vytvoření strun jsme použili infračervené senzory přerušení paprsku, které detekují, kdy se struna hraje. Objednali jsme naše senzory z následujícího odkazu. Senzory mají napájecí, zemnící a datový vodič, zatímco zářiče mají pouze napájecí a uzemňovací vodič. K napájení vysílačů a senzorů jsme použili 3,3 V a zemnící piny ze záhlaví PMOD. Pro napájení všech senzorů a emitorů je nutné zapojit všechny senzory a emitor paralelně. Každý datový vodič ze senzorů bude muset jít na svůj vlastní pin pmod.

Krok 7: Sestavení kostry

Stavba kostry
Stavba kostry

Aby se vytvořil tvar harfy, tři kusy se používají jako kostra pro umístění senzorů a emitorů. Na jednom ze dvou 18palcových kusů PVC trubky vyrovnejte senzory a zářiče ve střídavém pořadí 1,5 palce od sebe a poté je přilepte páskou dolů k potrubí. Na druhé 18 palcové PVC trubce vyrovnejte senzory a emitory ve střídavém pořadí, ale ujistěte se, že vykompenzujete pořadí (tj. Pokud první trubka měla nejprve senzor, druhá by měla mít nejprve emitor a naopak). Bude nutné pájet delší vodiče na datové, napájecí a zemnící vodiče, aby bylo zajištěno, že se budou moci dostat na desku.

Krok 8: Stavba exteriéru dřeva

Stavba exteriéru dřeva
Stavba exteriéru dřeva

Tento krok je volitelný, ale velmi doporučený. Exteriér dřeva nejen, že harfa vypadá hezky, ale také chrání senzory a dráty před poškozením. Dřevěný rám může být vytvořen svatým obdélníkovým prstencem ze dřeva. Vnitřek obdélníku musí mít otvor alespoň 1-1/2 palce, aby se vešel do skeletu potrubí a senzoru. Jakmile je rám zkonstruován, vyvrtejte dva otvory, které umožní vedení od senzoru a emitorů ven a spojí je s deskou.

*Poznámka: Doporučuje se přidat přístupové body, aby bylo možné vyjmout a vložit kostru potrubí v případě, že je třeba provést opravu nebo provést mírné úpravy.

Krok 9: Spojení všech kusů dohromady

Skládání všech kusů dohromady
Skládání všech kusů dohromady

Jakmile jsou všechny předchozí kroky hotové, je čas postavit harfu. Nejprve umístěte kostru potrubí do dřevěného exteriéru. Poté zapojte vodiče pro senzory a vysílače na správné místo na desce. Poté otevřete SDK a kliknutím na tlačítko ladění naprogramujte desku. Jakmile je deska naprogramována, připojte sluchátka nebo reproduktor. V závislosti na tom, který senzor skončí v jakém pmod portu, budou struny vaší harfy pravděpodobně mimo provoz. Protože může být obtížné zjistit, který vodič jde ke kterému senzoru, když je zapojeno tolik vodičů, zahrnuli jsme způsob mapování čísel řetězců k přerušení bitových pozic v softwaru. Najděte „static int sensor_map [NUM_STRINGS]“a upravujte hodnoty v poli, dokud se řetězce nehrají od nejnižší po nejvyšší v pořadí.

Nabídku lze použít otevřením sériového terminálu (např. RealTerm) a nastavit přenosovou rychlost na 115200 a displej na ANSI. V nabídce se lze pohybovat pomocí kláves w a s pro pohyb nahoru a dolů a a a d pro změnu hodnot.

Krok 10: VYKLIKNĚTE

Jakmile je harfa plně funkční. Ovládněte harfu a poslouchejte sladký zvuk vlastní hudby!

Doporučuje: