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, Juli
Anonim
Laserski sintetizator harfe na Zybo ploči
Laserski sintetizator harfe na Zybo ploči

U ovom vodiču ćemo stvoriti potpuno funkcionalnu lasersku harfu pomoću IC senzora sa serijskim sučeljem koja će omogućiti korisniku da promijeni ugađanje i ton instrumenta. Ova harfa će biti remake 21. stoljeća starog instrumenta. Sistem je kreiran pomoću razvojne ploče Xilinx Zybo zajedno sa Vivado Design Suites. Šta će vam trebati za završ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: Preuzmite Digilent -ov Zybo DMA Audio Demo

FPGA strana ovog projekta uglavnom se temelji na demo projektu koji se ovdje nalazi. Koristi direktan pristup memoriji za slanje podataka direktno iz memorije na koje procesor može pisati preko AXI Stream -a u I2S audio blok. Sljedeći koraci pomoći će vam da pokrenete DMA audio demo projekt:

  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". Kada završi i pojavi se prozor koji vas pita želite li generirati izlazni proizvod, samo kliknite na "Generiraj". Ako dobijete kritičnu poruku upozorenja, zanemarite je.
  4. Pređite s dizajna na karticu izvora u Vivadu da vidite 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 omot koji generira korisnička uređivanja". Generirat će se datoteka omotača za projekt.
  5. Sada kada su dovršeni oni kritični koraci koji su nekako 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 kada pritisnete tipku za reprodukciju. Sve dok nešto izlazi iz priključka za slušalice kada pritisnete dugme za reprodukciju, to vjerovatno 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 izvršiti neke promjene kako bi se naši senzori mogli uključiti u zaglavlja PMOD -a i koristiti njihovu vrijednost na softverskoj strani.

  1. Otvorite blok dijagram u Vivadu
  2. Napravite GPIO blok desnim klikom na prazan prostor u blok dijagramu i odabirom "Add IP" iz menija. Pronađite i odaberite "AXI GPIO".
  3. Dvaput kliknite na novi IP blok i u prozoru za ponovno prilagođavanje IP idite na karticu IP konfiguracija. Odaberite sve ulaze i postavite širinu na dvanaest, jer ćemo imati 12 "žica" na harfi i stoga će nam trebati 12 senzora. Ako želite koristiti manje ili više senzora, prilagodite ovaj broj na odgovarajući način. Također postavite omogućavanje prekida.
  4. Desnom tipkom miša kliknite novi GPIO IP blok i odaberite "pokreni automatizaciju veze". Označite polje AXI i pritisnite OK. Ovo 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 sa 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 na izlaz "GPIO" novog GPIO IP bloka i odaberite "učini vanjskim". Pronađite kuda ide linija i kliknite na mali bočni peterokut, a s lijeve strane trebao bi se otvoriti prozor u kojem možete promijeniti ime. Promijenite ime u "SENZORI". Važno je koristiti isto ime ako želite da datoteka s ograničenjima radi, inače ćete morati promijeniti naziv u datoteci ograničenja.
  7. Nazad na kartici izvori pronađite datoteku ograničenja i zamijenite je onom koju pružamo. Možete izabrati 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 koju naša datoteka ograničenja radi je omogućavanje otpornika za izvlačenje na PMOD zaglavljima. To je potrebno za određene senzore koje smo koristili, međutim nisu svi senzori isti. Ako vaši senzori zahtijevaju padajuće otpornike, možete promijeniti svaku instancu "set_property PULLUP true" sa "set_property PULLDOWN true". Ako zahtijevaju vrijednost otpornika različitu od one na ploči, tada možete ukloniti ove linije 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 ovde. Ako želite koristiti različite pmod pinove, samo uparite imena u datoteci ograničenja sa oznakama u shemi. Koristimo PMOD zaglavlja JE i JD i koristimo šest pinova podataka 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 do sada, a stari prekopirajte i prepišite. Kada to završi, generirajte bitstream i izvezite hardver kao i prije te ponovo pokrenite SDK. Ako vas pitaju želite li zamijeniti staru hardversku datoteku, odgovor je da. Vjerovatno 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 FreeRTOS Zynq demo koji se nalazi na FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo. Proces uvoza je otprilike 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, trebali biste staviti cijelu mapu FreeRTOS u mapu vašeg projekta.
  3. Kreirajte novi paket podrške za ploču tako što ćete otići na "file" -> "new" -> "package support package". Provjerite je li odabrano samostalno i kliknite Završi. Nakon nekog vremena pojavit će se prozor, označite okvir pored lwip141 (ovo sprječava da jedan od FreeRTOS demonstracija ne uspije prevesti) i pritisnite OK. 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 greš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 fasciklu ispod mape src u demonstraciji 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, trebali biste moći pokrenuti kod laserske harfe u ovom trenutku. Za potrebe 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). Sviraće niz svaki put kada ga pritisnete i prelazi kroz sve nizove u sistemu 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 dugme.

Korak 5: O Kodeksu

Mnogi od vas koji čitate ovaj vodič vjerovatno će naučiti kako postaviti zvuk ili koristiti DMA za nešto drugačije ili za stvaranje drugog muzičkog instrumenta. Iz tog razloga, sljedećih nekoliko odjeljaka posvećeno je opisivanju kako navedeni kôd radi zajedno s prethodno opisanim hardverom kako bi se dobio radni audio izlaz 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 stvaraju prekidi u ovom projektu. Način na koji smo to učinili bio je tako što smo prvo stvorili strukturu vektorske tablice prekida koja prati ID, rukovatelj prekida i referencu na uređaj za svaki prekid. ID -ovi prekida dolaze s xparameters.h. Rukovalac prekida je funkcija koju smo napisali za DMA i GPIO, a prekid I2C dolazi iz upravljačkog programa Xlic I2C. Referenca uređaja ukazuje 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 kreiran u FreeRTOS main.c. Dakle, u osnovi svaki naš prekid povezujemo s ovim kontrolerom prekida koji je za nas već stvorio FreeRTOS.

DMA

DMA inicijalizacijski kod 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 direktno iz demoa. Tada se prekid povezuje i omogućava. Za ovaj projekt potreban je samo prekid master-to-slave, jer svi podaci šalju DMA na I2S kontroler. Ako želite snimati zvuk, bit će vam potreban i prekid rada slave-master. Prekid master-to-slave se poziva kada DMA završi sa slanjem podataka za koje ste mu rekli da ih šalje. Ovaj prekid je iznimno važan za naš projekt jer svaki put kada DMA završi slanje jednog međuspremnika audio uzoraka mora odmah početi slati sljedeći bafer, u protivnom bi došlo 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 () za obavještavanje _audio_task () da može pokrenuti sljedeći DMA prijenos. Način na koji šaljemo konstantne audio podatke je izmjenjivanjem dva bafera. Kada se jedan međuspremnik prenosi u I2C blok, drugi bafer izračunava i pohranjuje svoje vrijednosti. Zatim, kada prekid dolazi iz DMA -e, aktivni međuspremnik se prebacuje, a nedavno napisani bafer počinje se prenositi, dok se prethodno preneseni bafer počinje prepisivati novim podacima. Ključni dio funkcije _audio_task je mjesto gdje se poziva fnAudioPlay (). fnAudioPlay () uzima u DMA instancu, dužinu bafera i pokazivač na bafer iz kojeg će se prenositi podaci. Nekoliko vrijednosti se š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 kôd za inicijalizaciju je prilično uobičajen komad koda koji pluta 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 mnogo mijenjati za projekat harfe. DMA audio demonstracija iz koje je došao ima funkcije za prebacivanje na mikrofonski ili linijski ulaz tako da 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 to radi na način na koji se radi.

Metoda 1: Jedan period vrijednosti sinusa izračunava se za svaku žicu na odgovarajućoj frekvenciji za muzičku notu te žice i pohranjuje u niz. Na primjer, dužina niza bit će period 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 dužina niza bit će 4800 uzoraka i sadržavat će vrijednosti jedne potpune period sinusnog talasa. Prilikom sviranja niza, međuspremnik audio uzorka se popunjava preuzimanjem vrijednosti iz niza sinusnih valova i stavljanjem u audio međuspremnik kao uzorak, a zatim povećavanjem indeksa u niz sinusnih valova tako da se pomoću našeg prethodnog primjera u toku od 4800 uzoraka jedan ciklus sinusnog talasa se stavlja u audio bafer. Modularna operacija se koristi na indeksu niza tako da uvijek pada između 0 i dužine, a kada indeks niza pređe određeni prag (primjerice uzorke vrijedne možda 2 sekunde), niz se isključuje. Da biste svirali više žica u isto vrijeme, pratite indeks niza svake žice zasebno i dodajte vrijednost iz sinusnog vala svake žice zajedno kako biste dobili svaki uzorak.

Metoda 2: Da bismo stvorili muzičkiji ton, počinjemo s prethodnim modelom i dodajemo harmonike svakoj osnovnoj frekvenciji. Harmonične frekvencije su frekvencije koje su cijeli broj višekratnik osnovne frekvencije. Za razliku od toga da se dvije nepovezane frekvencije zbroje zajedno, što rezultira istovremenim sviranjem dva različita zvuka, kada se saberu harmonike, nastavlja zvučati samo kao jedan zvuk, ali s drugačijim tonom. Da bismo to postigli, svaki put kada dodamo vrijednost sinusnog vala na lokaciji (indeks niza % dužina niza) u audio uzorak, dodajemo i (2 * indeks niza % dužina niza) i (3 * indeks niza % dužina niza)), itd., bez obzira na to što se želi mnogo harmonika. Ovi umnoženi indeksi prelaze sinusni val na frekvencijama koje su cjelobrojne višekratnice izvorne frekvencije. Da 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, fundamentalni 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.

Metod 3: U redu, sada imamo jako lijep ton na notama, ali i dalje postoji prilično krupan problem: sviraju na fiksnoj jačini na određeno vrijeme. Da bi uopće zvučalo kao pravi instrument, jačina svirane žice trebala bi se lagano smanjivati s vremenom. Da 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. To čini da se zvuk s vremenom nesmetano 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 pokušali bolje oponašati niz harfe u stvarnom svijetu, svakom se harmoniku dodjeljuje drugačija stopa opadanja. U pravim žicama, kada se žica prvi put udari, postoji visok sadržaj visokofrekventnih harmonika koji stvara onu vrstu čupanja zvuka koju očekujemo od žice. Ovi visokofrekventni harmonici vrlo su kratko glavni dio zvuka, zvuk žice koja se udara, ali se vrlo brzo raspadaju 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.

Sve u svemu, sinteza zvuka je intuitivna, ali proračunska je teška. 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 sinusnih i eksponencijalnih tablica raspada radi se u cjelobrojnom formatu, što zahtijeva raspodjelu raspoloživog 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. Slično, vrijednosti eksponencijalne tablice množe se s 80 prije nego se zaokruže na cijele brojeve i pohrane. Harmonijske težine mogu poprimiti diskretne vrijednosti između 0 i 10. Također, svi uzorci su zapravo udvostručeni, a sinusni valovi indeksirani sa 2, čime se efektivno prepolovljava brzina uzorkovanja. Ovo ograničava maksimalnu 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 na strani procesora, a bilo bi nevjerojatno teško natjerati ga da radi na fpga strani od nule u vremenskom okviru ovog projekta (zamislite da morate ponovo stvoriti bitstream svaki kada je komad veriloga promijenjen radi testiranja zvuka). Međutim, to bi se moglo učiniti na fpga -i vjerovatno boljim načinom, što bi možda 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 kreiranje žica koristili smo IR senzore prekida snopa koji će detektirati kada se žica svira. Naše senzore smo naručili sa sljedeće veze. Senzori imaju žicu za napajanje, uzemljenje i prijenos podataka, a emiteri imaju samo žicu za napajanje i uzemljenje. Koristili smo 3,3 V i uzemljene pinove iz PMOD zaglavlja za napajanje i emitera i senzora. Za napajanje svih senzora i odašiljača potrebno je paralelno povezati sve senzore i odašiljač. Kablovi podataka sa senzora će morati ići na svoj pmod pin.

Korak 7: Konstrukcija kostura

Konstrukcija kostura
Konstrukcija kostura

Kako bi se stvorio oblik harfe, tri komada se koriste kao kostur za postavljanje senzora i emitera. Na jednom od dva komada PVC cijevi od 18 inča poravnajte senzore i odašiljače naizmjeničnim redoslijedom 1,5 inča jedan od drugog, a zatim ih zalijepite trakom do cijevi. Na drugoj 18 -inčnoj PVC cijevi poravnajte senzore i emitere naizmjeničnim redoslijedom, ali pazite da poništite redoslijed (tj. Ako je prva cijev imala senzor prva, 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 drvene vanjske strane

Izgradnja vanjskog drveta
Izgradnja vanjskog drveta

Ovaj korak nije obavezan, ali se toplo preporučuje. Drvena vanjština ne samo da čini harfu lijepim izgledom, 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 skeletu senzora. Nakon što je okvir izgrađen, izbušite dvije rupe koje će omogućiti žicama 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 je potrebno izvršiti neznatna prilagođavanja.

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 priključite žice za senzore i odašiljače na odgovarajuće mjesto na ploči. Zatim otvorite SDK i kliknite dugme za otklanjanje greš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 na kojem pmod portu će vaše žice harfe za početak vjerovatno biti u redu. Budući da može biti teško reći koja žica ide do kog 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 reproduciraju 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 zaslon na ANSI. Izbornikom 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 postane potpuno funkcionalna. Savladajte harfu i slušajte slatki zvuk vlastite muzike!

Preporučuje se: