Sadržaj:

Laserski sintetizator harfe na Zybo ploči: 10 koraka (sa slikama)
Laserski sintetizator harfe na Zybo ploči: 10 koraka (sa slikama)

Video: Laserski sintetizator harfe na Zybo ploči: 10 koraka (sa slikama)

Video: Laserski sintetizator harfe na Zybo ploči: 10 koraka (sa slikama)
Video: Laser Harp Fully Functional 2024, Srpanj
Anonim
Laserski sintetizator harfe na Zybo ploči
Laserski sintetizator harfe na Zybo ploči

U ovom ćemo vodiču stvoriti potpuno funkcionalnu lasersku harfu pomoću IC senzora sa serijskim sučeljem koja će omogućiti korisniku promjenu ugađanja i tona instrumenta. Ova će harfa biti remake 21. stoljeća starog instrumenta. Sustav je stvoren pomoću razvojne ploče Xilinx Zybo zajedno s Vivado Design Suites. Što će vam trebati za dovršetak projekta:

  • 12 IC senzora i emitera (više ili manje se može koristiti ovisno o broju žica)
  • Zybo Zynq-7000 razvojna ploča
  • Besplatni RTOS
  • Vivado Design Suite
  • Žica (za spajanje senzora na ploču)
  • 3 komada PVC cijevi ((2) 18 inča i (1) 8 inča)
  • 2 PVC koljena

Korak 1: Nabavite Digilentov Zybo DMA Audio Demo

FPGA strana ovog projekta uvelike se temelji na demo projektu koji se ovdje nalazi. Koristi izravan pristup memoriji za slanje podataka izravno iz memorije na koju procesor može pisati preko AXI Stream -a u I2S audio blok. Sljedeći koraci pomoći će vam u pokretanju DMA audio demo projekta:

  1. Možda će biti potrebna nova verzija datoteke ploče za Zybo ploču. Slijedite ove upute za dobivanje novih datoteka ploče za Vivado.
  2. Slijedite korake 1 i 2 u uputama na ovoj stranici da biste otvorili demo projekt u Vivadu. Koristite metodu Vivado, a ne primopredaju hardvera SDK -a.
  3. Možda ćete dobiti poruku koja kaže da neke od vaših IP blokova treba ažurirati. Ako je tako, odaberite "Prikaži IP status", a zatim na kartici IP status odaberite sve zastarjele IP i kliknite "Nadograđeno odabrano". Kad završi i pojavi se prozor s pitanjem želite li generirati izlazni proizvod, samo kliknite na "Generiraj". Ako dobijete kritičnu poruku upozorenja, zanemarite je.
  4. Prijeđite s dizajna na karticu izvora u Vivadu da biste vidjeli izvorne datoteke. Desnom tipkom miša kliknite dizajn bloka "design_1" i odaberite "Create HDL Wrapper". Kad se to od vas zatraži, odaberite "kopiraj generirani omot kako biste dopustili korisnička uređivanja". Generirat će se datoteka omotača za projekt.
  5. Sada kada su dovršeni oni kritični koraci koji su na neki način izostavljeni u drugom vodiču, možete se vratiti na prethodno povezani vodič i nastaviti od koraka 4 do kraja i pobrinuti se da se demo projekt ispravno izvodi. Ako nemate način unosa zvuka za snimanje, samo snimajte sa slušalicama i slušajte nejasan zvuk od 5-10 sekundi kad pritisnete gumb za reprodukciju. Sve dok nešto izlazi iz priključka za slušalice kada pritisnete gumb za reprodukciju, vjerojatno radi ispravno.

Korak 2: Napravite neke promjene u Vivadu

Napravite neke promjene u Vivadu
Napravite neke promjene u Vivadu

Dakle, sada imate Digilentov DMA audio demo koji radi, ali to ovdje uopće nije krajnji cilj. Zato se moramo vratiti na Vivado i unijeti neke promjene kako bi se naši senzori mogli uključiti u zaglavlja PMOD -a, a mi bismo mogli koristiti njihovu vrijednost na strani softvera.

  1. Otvorite blok dijagram u Vivadu
  2. Izradite GPIO blok tako da desnom tipkom miša kliknete na prazan prostor u blok dijagramu i odaberete "Dodaj IP" s izbornika. Pronađite i odaberite "AXI GPIO".
  3. Dvaput kliknite novi IP blok i u prozoru za ponovno prilagođavanje IP-a idite na karticu Konfiguracija IP-a. Odaberite sve ulaze i postavite širinu na dvanaest, jer ćemo imati 12 "žica" na harfi i stoga trebamo 12 senzora. Ako želite koristiti manje ili više senzora, prilagodite ovaj broj na odgovarajući način. Također postavite omogući prekid.
  4. Desnom tipkom miša kliknite novi GPIO IP blok i odaberite "pokreni automatizaciju veze". Označite okvir AXI i pritisnite OK. To bi trebalo automatski povezati AXI sučelje, ali ostaviti izlaze bloka nepovezanim.
  5. Kako biste napravili mjesta za dodatni prekid, dvaput kliknite na xlconcat_0 IP blok i promijenite broj portova s 4 na 5. Zatim možete spojiti pin ip2intc_irpt iz novog GPIO bloka na novi neiskorišteni port na bloku xlconcat.
  6. Desnom tipkom miša kliknite izlaz "GPIO" novog GPIO IP bloka i odaberite "učini vanjskim". Pronađite kamo linija vodi i kliknite na mali bočni peterokut, a s lijeve strane trebao bi se otvoriti prozor u kojem možete promijeniti ime. Promijenite naziv u "SENZORI". Važno je koristiti isti naziv ako želite da datoteka s ograničenjima radi, inače ćete morati promijeniti naziv u datoteci ograničenja.
  7. Natrag na kartici izvori pronađite datoteku ograničenja i zamijenite je s onom koju nudimo. Možete odabrati da zamijenite datoteku ili samo kopirate sadržaj naše datoteke ograničenja i zalijepite je preko sadržaja stare. Jedna od važnih stvari koje naša datoteka s ograničenjima radi je omogućavanje izvlačnih otpornika na PMOD zaglavljima. To je potrebno za određene senzore koje smo koristili, no nisu svi senzori isti. Ako vaši senzori zahtijevaju padajuće otpornike, možete promijeniti svaku instancu "set_property PULLUP true" s "set_property PULLDOWN true". Ako zahtijevaju vrijednost otpornika različitu od one na ploči, tada možete ukloniti ove retke i upotrijebiti vanjske otpornike. Nazivi pinova nalaze se u komentarima u datoteci ograničenja i odgovaraju oznakama na prvom dijagramu u Zybo shemama stranicu koju možete pronaći ovdje. Ako želite koristiti različite pmod pinove, samo upišite imena u datoteci ograničenja s oznakama u shemi. Koristimo PMOD zaglavlja JE i JD i koristimo šest podatkovnih pinova na svakom, izostavljajući pinove 1 i 7. Ove su informacije važne pri povezivanju vaših senzora. Kao što je prikazano na shemi, pinovi 6 i 12 na PMODS -u su VCC, a pinovi 5 i 11 su uzemljeni.
  8. Regenerirajte HDL omot kao i prije, a stari prepišite i prepišite. Kada to završi, generirajte bitstream i izvezite hardver kao i prije te ponovno pokrenite SDK. Ako vas pitaju želite li zamijeniti staru hardversku datoteku, odgovor je da. Vjerojatno je najbolje da SDK zatvorite kada izvozite hardver kako bi se pravilno zamijenio.
  9. Pokrenite SDK.

Korak 3: Pokrenite FreeRTOS

Sljedeći korak je pokretanje FreeRTOS -a na Zybo ploči.

  1. Ako već nemate kopiju, preuzmite FreeRTOS ovdje i izdvojite datoteke.
  2. Uvezite demo FreeRTOS Zynq koji se nalazi na FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Postupak uvoza je približno isti kao i za drugi demo projekt, međutim budući da se demo FreeRTOS Zynq oslanja na druge datoteke u mapi FreeRTOS, ne biste trebali kopirati datoteke u svoj radni prostor. Umjesto toga, trebate staviti cijelu mapu FreeRTOS u mapu projekta.
  3. Izradite novi paket podrške ploče tako da odete na "file" -> "new" -> "package support package". Provjerite je li odabrano samostalno i kliknite Završi. Nakon nekog vremena pojavit će se prozor, potvrdite okvir pored lwip141 (ovo sprječava da jedan od FreeRTOS demonstracija ne uspije prevesti) i pritisnite U redu. Nakon toga dovršite desni klik na projekt RTOSdemo i idite na "svojstva", idite na karticu "reference projekta" i potvrdite okvir pored novog bsp -a koji ste stvorili. Nadajmo se da će biti prepoznat, ali ponekad Xilinx SDK može biti čudan zbog ovakvih stvari. Ako i dalje dobijete pogrešku nakon ovog koraka da xparameters.h nedostaje ili nešto slično, pokušajte ponoviti ovaj korak i možda izaći i ponovo pokrenuti SDK.

Korak 4: Dodajte kod laserske harfe

Sada kada je FreeRTOS uvezen, datoteke iz projekta laserske harfe možete unijeti u demo FreeRTOS -a

  1. Kreirajte novu mapu ispod mape src u demo FreeRTOS -a i kopirajte i zalijepite sve navedene c datoteke osim main.c u ovu mapu.
  2. Zamijenite RTOSDemo main.c priloženim main.c.
  3. Ako je sve učinjeno ispravno, u ovom biste trenutku trebali moći pokrenuti kod laserske harfe. U svrhu testiranja, ulaz tipki koji je korišten u DMA demo projektu sada se koristi za reprodukciju zvukova bez priključenih senzora (bilo koji od četiri glavna gumba će raditi). Svirat će niz svaki put kada ga pritisnete i prelazi kroz sve nizove u sustavu kroz više pritisaka. Priključite neke slušalice ili zvučnike u utičnicu za slušalice na Zybo ploči i pobrinite se da možete čuti zvukove žica koje dopiru kada pritisnete gumb.

Korak 5: O Kodeksu

Mnogi od vas koji čitate ovaj vodič vjerojatno će naučiti kako postaviti zvuk ili koristiti DMA za nešto drugačije ili za stvaranje drugog glazbenog instrumenta. Iz tog razloga sljedećih nekoliko odjeljaka posvećuje se opisu kako priloženi kod radi zajedno s prethodno opisanim hardverom za dobivanje ispravnog audio izlaza pomoću DMA -a. Ako razumijete zašto postoje kodovi, trebali biste ih moći prilagoditi za sve što želite stvoriti.

Prekida

Prvo ću spomenuti kako se u ovom projektu stvaraju prekidi. Način na koji smo to učinili bio je tako da smo prvo stvorili strukturu vektorske tablice prekida koja prati ID, rukovatelj prekida i referencu na uređaj za svaki prekid. ID -ovi prekida dolaze iz xparameters.h. Rukovalac prekida funkcija je koju smo napisali za DMA i GPIO, a prekid I2C dolazi iz upravljačkog programa Xlic I2C. Referentna oznaka uređaja upućuje na instance svakog uređaja koje inicijaliziramo na drugom mjestu. Pri kraju funkcije _init_audio petlja prolazi kroz svaku stavku u vektorskoj tablici prekida i poziva dvije funkcije, XScuGic_Connect () i XScuGic_Enable () za povezivanje i omogućavanje prekida. Pozivaju se na xInterruptController, koji je kontroler prekida koji je prema zadanim postavkama stvoren u FreeRTOS main.c. Dakle, u osnovi svaki naš prekid povezujemo s ovim kontrolerom prekida koji nam je već stvorio FreeRTOS.

DMA

DMA inicijalizacijski kôd počinje u lh_main.c. Prvo se deklarira statička instanca XAxiDma strukture. Zatim se u funkciji _init_audio () konfigurira. Prvo se poziva funkcija za konfiguriranje iz demo projekta, koja je u dma.c. Prilično je dobro dokumentirano i dolazi iz demo -a. Tada se prekid povezuje i omogućuje. Za ovaj projekt potreban je samo prekid master-to-slave, jer svi podaci se šalju putem DMA-a na I2S kontroler. Ako želite snimati zvuk, trebat će vam i prekid rada slave-to-master. Prekid master-to-slave se poziva kada DMA završi slanjem svih podataka koje ste mu rekli da pošalje. Ovaj je prekid nevjerojatno važan za naš projekt jer svaki put kad DMA završi slanje jednog međuspremnika audio uzoraka mora odmah početi slati sljedeći međuspremnik, u protivnom će doći do zvučnog kašnjenja između slanja. Unutar funkcije dma_mm2s_ISR () možete vidjeti kako postupamo s prekidom. Važan dio je pri kraju gdje koristimo xSemaphoreGiveFromISR () i portYIELD_FROM_ISR () da obavijestimo _audio_task () da može pokrenuti sljedeći DMA prijenos. Način na koji šaljemo stalne audio podatke je izmjenjivanjem dva međuspremnika. Kada se jedan međuspremnik prenosi u blok I2C, drugi međuspremnik izračunava i pohranjuje svoje vrijednosti. Zatim, kada prekid dolazi iz DMA -e, aktivni međuspremnik se prebacuje, a nedavno napisani međuspremnik počinje se prenositi, dok se prethodno preneseni međuspremnik počinje prepisivati novim podacima. Ključni dio funkcije _audio_task je mjesto gdje se poziva fnAudioPlay (). fnAudioPlay () uzima u DMA instancu, duljinu međuspremnika i pokazivač na međuspremnik iz kojeg će se podaci prenositi. Nekoliko se vrijednosti šalje u I2S registre kako bi se obavijestilo da dolazi još uzoraka. Tada se XAxiDma_SimpleTransfer () poziva da započne prijenos.

I2S audio

audio.c i audio.h su mjesto gdje se odvija inicijalizacija I2S. I2S inicijalizacijski kôd prilično je čest komad koda koji lebdi na brojnim mjestima, možda ćete pronaći male varijacije iz drugih izvora, ali ovaj bi trebao funkcionirati. Prilično je dobro dokumentirano i ne treba ga puno mijenjati za projekt harfe. DMA audio demonstracija iz koje je došao ima funkcije za prebacivanje na mikrofonski ili linijski ulaz pa ih možete koristiti ako vam je potrebna ta funkcija.

Sinteza zvuka

Da bih opisao kako funkcionira sinteza zvuka, navest ću svaki od zvučnih modela koji su korišteni u razvoju koji su doveli do konačne metode, jer će vam dati osjećaj zašto se radi na način na koji se radi.

Metoda 1: Jedno razdoblje vrijednosti sinusa izračunava se za svaku žicu na odgovarajućoj frekvenciji za glazbenu notu te žice i pohranjuje u niz. Na primjer, duljina niza bit će razdoblje sinusnog vala u uzorcima, što je jednako # uzoraka / ciklus. Ako je brzina uzorkovanja 48 kHz, a notna frekvencija 100Hz, tada postoji 48 000 uzoraka u sekundi i 100 ciklusa u sekundi što dovodi do 4800 uzoraka po ciklusu, a duljina niza bit će 4800 uzoraka i sadržavat će vrijednosti jedne potpune razdoblje sinusnog vala. Kad se niz reproducira, međuspremnik audio uzorka popunjava se tako da se uzme vrijednost iz niza sinusnih valova i stavi u audio međuspremnik kao uzorak, a zatim se indeks poveća u niz sinusnih valova tako da se pomoću našeg prethodnog primjera tijekom tečaja od 4800 uzoraka jedan ciklus sinusnog vala stavlja se u audio međuspremnik. Modularna operacija se koristi na indeksu niza tako da uvijek pada između 0 i duljine, a kada indeks niza pređe određeni prag (primjerice uzorke vrijedne možda 2 sekunde), niz se isključuje. Za sviranje više žica odjednom, pratite indeks niza niza svakog niza zasebno i dodajte vrijednost iz sinusnog vala svake žice zajedno kako biste dobili svaki uzorak.

Metoda 2: Kako bismo stvorili glazbeniji ton, počinjemo s prethodnim modelom i dodajemo harmonike svakoj temeljnoj frekvenciji. Harmonijske frekvencije su frekvencije koje su cijeli broj višekratnik osnovne frekvencije. Za razliku od zbrajanja dviju nepovezanih frekvencija, što rezultira istovremenom sviranjem dva različita zvuka, kada se zbroje harmoniji, nastavlja zvučati samo kao jedan zvuk, ali s drugačijim tonom. Da bismo to postigli, svaki put kad u audio uzorak dodamo vrijednost sinusnog vala na lokaciji (indeks polja % duljina niza), također dodajemo (2 * indeks niza % duljina niza) i (3 * indeks polja % duljina niza)), itd., bez obzira na to što se želi mnogo harmonika. Ovi umnoženi indeksi prelazit će sinusni val na frekvencijama koje su cjelobrojne višekratnice izvorne frekvencije. Kako bi se omogućila veća kontrola tona, vrijednosti svakog harmonika množe se s varijablom koja predstavlja količinu tog harmonika u ukupnom zvuku. Na primjer, temeljni sinusni val može imati vrijednosti pomnožene sa 6 kako bi bio više faktor u ukupnom zvuku, dok peti harmonik može imati množitelj 1, što znači da njegove vrijednosti mnogo manje doprinose ukupnom zvuku.

Metoda 3: U redu, sada imamo jako lijep ton na notama, ali i dalje postoji prilično krupan problem: sviraju na određenoj glasnoći na određeno vrijeme. Da bi uopće zvučalo kao pravi instrument, glasnoća žice koja se svira trebala bi se lagano smanjivati tijekom vremena. Kako bi se to postiglo, niz je ispunjen vrijednostima eksponencijalno raspadajuće funkcije. Sada kada se stvaraju audio uzorci, zvuk koji dolazi iz svakog niza izračunava se kao u prethodnoj metodi, ali prije nego što se doda u audio uzorak, pomnoži se s vrijednošću u indeksu polja tog niza u nizu funkcija eksponencijalnog raspada. Time se zvuk s vremenom glatko raspršuje. Kada indeks niza dođe do kraja raspadnog niza, niz se zaustavlja.

Metoda 4: Ovaj posljednji korak je ono što zvukovima gudača zaista daje njihov realističan zvuk. Prije su zvučali ugodno, ali jasno sintetizirano. Kako bi se pokušalo bolje oponašati žicu harfe u stvarnom svijetu, svakom se harmoniku dodjeljuje drugačija stopa opadanja. U pravim žicama, kad se žica prvi put udari, postoji visok sadržaj visokofrekventnih harmonika koji stvara vrstu čupanja zvuka koji očekujemo od žice. Ovi visokofrekventni harmonici vrlo su kratko glavni dio zvuka, zvuk žice koja se udara, ali vrlo brzo propadaju kako sporiji harmonici preuzimaju vlast. Niz raspada se stvara za svaki harmonički broj koji se koristi u sintezi zvuka, svaki sa svojom brzinom raspada. Sada se svaki harmonik može neovisno pomnožiti s vrijednošću odgovarajućeg polja raspada u indeksu niza žice i dodati zvuku.

Sveukupno, sinteza zvuka je intuitivna, ali proračun je težak. Pohranjivanje cijelog zvuka žice u memoriju odjednom zauzelo bi previše memorije, ali izračunavanje sinusnog vala i eksponencijalne funkcije između svakog kadra trajalo bi predugo kako bi se održala brzina reprodukcije zvuka. U kodu se koriste brojni trikovi za ubrzanje izračuna. Sva matematika osim u početnom stvaranju tablica sinusnog i eksponencijalnog raspada radi se u cjelobrojnom formatu, što zahtijeva raspodjelu dostupnog numeričkog prostora u 24 -bitnom audio izlazu. Na primjer, sinusna tablica ima amplitudu 150, tako da je glatka, ali ne toliko velika da se mnogi svirani nizovi mogu dodati preko 24 bita. Isto tako, vrijednosti eksponencijalne tablice množe se s 80 prije zaokruživanja na cijele brojeve i pohranjivanja. Harmonijski utezi mogu poprimiti diskretne vrijednosti između 0 i 10. Također se svi uzorci zapravo udvostručuju, a sinusni valovi indeksiraju se s 2, čime se brzina uzorkovanja prepolovljuje. To ograničava najveću frekvenciju koja se može svirati, ali je bilo potrebno da se trenutni broj žica i harmonika izračuna dovoljno brzo.

Stvaranje ovog zvučnog modela i njegovo pokretanje zahtijevalo je znatne napore sa strane procesora, a bilo bi nevjerojatno teško natjerati ga da radi na fpga strani ispočetka u vremenskom okviru ovog projekta (zamislite da morate ponovo stvoriti bitstream svaki vrijeme kada je komad veriloga promijenjen radi provjere zvuka). Međutim, to bi se moglo učiniti boljim načinom rada na fpga -i, što bi vjerojatno otklonilo problem nemogućnosti izračunavanja uzoraka dovoljno brzo i omogućilo izvođenje više žica, harmonika, pa čak i audio efekata ili drugih zadataka na strana procesora.

Korak 6: Ožičenje senzora

Ožičenje senzora
Ožičenje senzora

Za stvaranje žica koristili smo IR senzore slomljenog snopa koji će detektirati kada se svira žica. Naše smo senzore naručili sa sljedeće veze. Senzori imaju žicu za napajanje, uzemljenje i prijenos podataka, a odašiljači imaju samo žicu za napajanje i uzemljenje. Koristili smo 3,3 V i uzemljene igle iz PMOD zaglavlja za napajanje i emitera i senzora. Za napajanje svih senzora i odašiljača potrebno je paralelno spojiti sve senzore i odašiljač. Podatkovne žice sa senzora morat će otići svaki na svoj pmod pin.

Korak 7: Konstrukcija kostura

Konstrukcija kostura
Konstrukcija kostura

Kako bi se stvorio oblik harfe, tri se komada koriste kao kostur za postavljanje senzora i odašiljača. Na jednom od dva komada PVC cijevi od 18 inča poravnajte senzore i odašiljače u izmjeničnom redoslijedu 1,5 inča jedan od drugog, a zatim ih zalijepite ljepilom do cijevi. Na drugoj 18 -inčnoj PVC cijevi poravnajte senzore i emitere u izmjeničnom redoslijedu, ali pazite da poništite redoslijed (tj. Ako je prva cijev imala prvi senzor, druga bi trebala imati prvo emiter i obrnuto). Bit će potrebno lemiti duže žice na žicama za prijenos podataka, napajanje i uzemljenje kako bi se osiguralo da će moći doći do ploče.

Korak 8: Izgradnja vanjskog drva

Izgradnja vanjskog drva
Izgradnja vanjskog drva

Ovaj korak nije obavezan, ali se toplo preporučuje. Drvena vanjština ne samo da čini da harfa izgleda lijepo, već štiti i senzore i žice od oštećenja. Drveni okvir može biti izrađen od šupljeg pravokutnog prstena od drveta. Unutrašnjost pravokutnika mora imati otvor od najmanje 1-1/2 inča kako bi odgovarao cijevi i kosturu senzora. Nakon što je okvir izgrađen, izbušite dvije rupe koje će omogućiti žice iz senzora i emitera da ih spoje s pločom.

*Napomena: Preporučuje se dodavanje pristupnih točaka kako biste mogli ukloniti i umetnuti kostur cijevi u slučaju da je potrebno izvršiti popravke ili napraviti male prilagodbe.

Korak 9: Spajanje svih dijelova zajedno

Spajanje svih dijelova zajedno
Spajanje svih dijelova zajedno

Nakon što su svi prethodni koraci završeni, vrijeme je za izgradnju harfe. Najprije postavite kostur cijevi unutar drvene vanjske strane. Zatim spojite žice za senzore i odašiljače na ispravno mjesto na ploči. Zatim otvorite SDK i kliknite gumb za otklanjanje pogrešaka da biste programirali ploču. Nakon što je ploča programirana, priključite slušalice ili zvučnik. Ovisno o tome koji senzor završi u kojem pmod ulazu žice vaše harfe za početak vjerojatno neće biti u redu. Budući da može biti teško reći koja žica ide do kojeg senzora kada je uključeno toliko žica, uključili smo način mapiranja brojeva nizova za prekid položaja bitova u softveru. Pronađite "static int sensor_map [NUM_STRINGS]" i prilagodite vrijednosti u nizu dok se nizovi ne igraju od najniže do najviše po redoslijedu.

Izbornik se može koristiti otvaranjem serijskog terminala (npr. RealTerm) i postavljanjem brzine prijenosa na 115200, a zaslona na ANSI. Izborom se možete kretati pomoću tipki w i s za pomicanje gore -dolje i tipki a i d za promjenu vrijednosti.

Korak 10: ROCK OUT

Kad harfa potpuno funkcionira. Svladajte harfu i slušajte slatki zvuk vlastite glazbe!

Preporučeni: