Kompletan kod pronađite na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/VIDI-X-kao-MP3-Player
VIDI X mikroračunalo ima ugrađeno pojačalo zvuka te se signali s pina GPIO 25 prosljeđuju na njega. Sa strane imamo maleni konektor zvučnika. Predviđeno je na njega spojiti zvučnik od 3 W i 32 Ω. Nemate li takav zvučnik, VIDI X mikroračunalo ima 3,5-milimetarski četveropolni audio jack koji koristi OMTP standard spajanja.
Ranije smo već pisali kako iskoristiti zvuk uz pomoć „XT_DAC_Audio.h“ biblioteke te se tog tutorijala prisjetite na linku: https://hr.vidi-x.org/radionice/vidi-project-x-60-vidi-x-kao-video-nadzor-za-psa/
ESP32 mikrokontroler korišten u VIDI X mikroračunalu posjeduje 8-bitni DAC, odnosno rezolucije od samo 256 koraka (vrijednosti su od 0 do 255). Takva 8-bitna rezolucija može se činiti lošom, ali zapravo nam omogućuje dovoljnu reprodukciju zvuka, iako ne baš audiofilske kvalitete. Dobiveni zvuk mogli bismo lako usporediti sa zvukom voki-tokija.
U teoriji, s procesorom od 3,3 volti vrijednost 0 (nula) poslana na DAC daje 0 volti na izlaznom pinu DAC-a, a vrijednost 255 dala bi 3,3 volte na istom tom izlaznom pinu. Međutim u stvarnosti strujni krug daje nešto drugačije vrijednosti iz brojnih različitih tehničkih razloga. U realnosti vrijednost 0 počinje na nešto više od 0 volti, dok vrijednost 255 završava na oko 3,24 volte. Vrijednosti između krajnjih trebale bi biti pravilno raspoređene na voltaže između njih. No niti to nije slučaj. Ne samo da nam je 8 bita premalena rezolucija za audio kakav bismo svi željeli čuti, nego nam potpuni doživljaj kvare i oscilacije voltaža koje nisu raspoređene u pravilnoj liniji.
Iz tog razloga na 3,5-milimetarski audio jack ugrađen na VIDI X mikroračunalo dolazi zvuk s pozadinskim šumom koji je generiran iz takta procesora i drugih oscilacija uzrokovanih napajanjem. Isto je i s konektorom za zvučnik koji je smješten sa stražnje strane VIDI X mikroračunala.
No to nam je dovoljno za dobivanje 8-bitnih zvukova tipičnih za videoigre. Sigurno ste čuli 8-bitne zvukove najpopularnijih igara 80-tih, Super Mario i Legend of Zelda.
Kako biste se prisjetili što je 8-bitni zvuk, odsvirajte melodiju „Sretan rođendan“ iz VIDI X priručnika koji se nalazi na linku: https://hr.vidi-x.org/prirucnik/.
Proučavajući spomenuti zadatak saznali ste kako određene note svirate definiranjem frekvencije titranja zvuka. S obzirom na to da nota A titra na frekvenciji 440 Hz za VIDI X to znači da će 440 puta promijeniti stanje GPIO25 pina koji koristimo za sviranje iz Low (0 V) u High (3,3 V). Dakle nema vrijednosti između spomenutih, od recimo 1,25 V ili 2,0 V kako bismo obogatili zvuk.
Funkcija za sviranje, ledcWriteTone (0, NOTA_A4);, korištena u melodiji „Sretan rođendan“ nije sposobna proizvesti analogne vrijednosti kakve nam trebaju za obogaćivanje melodije.
Kroz dva eksperimenta saznat ćete kako utišati zvuk zvučnika te na svakom od njih ponovno poslušajte melodiju „Sretan rođendan“.
Eksperiment prvi
Takvo grubo manipuliranje digitalnim vrijednostima možete utišati koristeći otpornik u serijskom spoju sa zvučnikom i to na način da od zvučnika od 8 ohma napravite zvučnik od 32 ohma dodajući mu otpornik od 24 ohma. Za taj zadatak trebat će vam spomenuti otpornik i lemilica.
Vrlo je bitno znati da otpornici imaju, osim vrijednosti otpora (ohm) i vrijednosti snage izražene jedinicom vat (W). Dakle kada na ovaj način stišavate zvuk zvučnika od 3 vata, morate koristiti i otpornik snage 3 vata. Ako stavite otpornik koji nije predviđen za korištenje pri snazi od 3 W, on će se pregrijavati te će nakon nekog vremena pregorjeti. Iz tog razloga nemojte ovo raditi sa zvučnicima Hi-Fi linija koji koriste puno jače zvučnike od možda 30 W pa do 100 W ili više.
Eksperiment drugi
Drugi način kako od zvučnika od 8 ohma napraviti zvučnik od 32 ohma je da spojite četiri takva zvučnika u seriju. Kod takvoga spoja bitno je spajati minus (-) jednog zvučnika s plusom (+) drugoga. Tako spojite sva četiri zvučnika s tri spoja. Krajnji spojevi minus prvog zvučnika te plus posljednjeg zvučnika spajaju se na konektor zvuka koji ide u VIDI X.
Možete primijetiti kako se kvaliteta reprodukcije zvuka znatno poboljšala. No još uvijek nam fale one vrijednosti između 0 i 3,3 V kako bismo obogatili zvuk. Za razliku od funkcije ledcWriteTone, njih može proizvesti funkcija dacWrite.
dacWrite(25,i);
Funkcija kojoj u rasponu također može biti od 0 do 255, na GPIO25 poslat će analognu vrijednost od 0 V do 3,3 V na pin 25. Dva su pina na kojima možemo koristiti dacWrite, a oni su 25 i 26.
Kako je osnovni element zvuka u biti sinusoida, proizvesti je možete vrlo jednostavnom petljom poput ove:
void loop() { for(int i=0;i<256;i++) dacWrite(25,i); }
Uz kontrolirane manipulacije takve sinusoide možete reproducirati digitalni wav (Waveform Audio) format zapisa zvuka kakav je korišten u radionici s linka: https://hr.vidi-x.org/radionice/vidi-project-x-60-vidi-x-kao-video-nadzor-za-psa/
Makar se i sada mogu primijetiti pozadinska zujanja uzrokovana nepravilnostima koja dopiru iz ostalih elektroničkih komponenti i napajanja.
Mnogobrojni su razlozi takve oscilacije te tako postoje i mnogobrojna rješenja koja okupiraju audiofile od davnina. Jedni su pozadinske šumove rješavali na jedan način, dok su drugi isto rješavali na drugi način. Tako su se stvorili mnogobrojni audio brendovi koji danas proizvode više ili manje kvalitetna i/ili cjenovno više ili manje pristupačna audio rješenja.
Povijest audio pojačala seže u vremena kada su se koristila cijevna pojačala (lampe) za pojačavanja analognog audio signala. Ona su i danas prisutna i audiofili ih cijene te još uvijek traju rasprave kakvo pojačalo je idealno. Tim raspravama nikada neće biti kraja jer se, jednostavno, kvaliteta zvuka ne sastoji samo od mjerljivih vrijednosti kao što su izobličenja ili izlazna snaga.
Danas audio pojačala masovno koriste digitalni I2S standard za komunikaciju, pogotovo s obzirom na to da je gotovo sva glazba u današnje vrijeme digitalna. Želite li pogledati kava sve mnogobrojna mono ili stereo mikroriješenja postoje, u Google utipkajte „i2s audio decoder“ te se dodatno informirajte.
Raspberry Pi Pico Audio modul
Mi smo se odlučili koristiti Raspberry Pi Pico Audio modul iz nekoliko razloga. Glavni razlog je što je dostupan za nabavku u Hrvatskoj putem trgovine i web shopa na linku: https://www.chipoteka.hr/raspberry-pi-pico-audio-modul-9150040568.
Drugi je rezlog što Pico Audio podržava I2S ili Inter-IC Sound standard za prijenos digitalnih audio podataka. Zahtijeva najmanje tri žice. Prva žica je sat, zove se bit clock (BCLK, ili ponekad označen kao serijski sat ili SCK). Druga žica, koja određuje kanal (lijevi ili desni) koji se šalje, zove se word select (WS). Kada se šalju stereo podaci, WS se prebacuje tako da se lijevi i desni kanal šalju naizmjenično, jedna po jedna podatkovna riječ. Treća žica prenosi podatke, a zove se serial data (SD). Alternativno se I²S piše I2S ili IIS. Unatoč sličnom nazivu, I²S nije povezan s dvosmjernom I²C (IIC) sabirnicom.
U ovom slučaju VIDI X uređaj je odašiljač koji generira bit clock, word select signal i serial data podatke te ih šalje prijemniku odnosno dekoderu i audio pojačalu. U ovom slučaju Pico Audio Pack, originalno razvijen za Raspberry Pico, naš je I2S prijemnik s kojim komuniciramo.
Pico Audio Pack koristi PCM5100A DAC za izlaz do 32-bitnog stereo zvuka od 384 kHz koji može poslati na 3,5-milimetarski linijski izlazni konektor, spreman za uključivanje u vanjsko pojačalo ili zvučnike s napajanjem. Ako želite glazbu malo glasniju za vaše uši, a tišu za okolinu, može generirati pojačani stereo zvuk iz 3,5- milimetarskog priključka za slušalice. Na sebi ima prekidač koji će generirati Low Gain (tiši zvuk) ili Hi Gain (glasniji zvuk) ovisno o vašim preferencijama. Također možete istovremeno spojiti oba izlaza na odgovarajuće zvučnike ili vanjska pojačala te time istu glazbu slušati i na slušalicama i slati je na linijsko pojačalo.
Za line out je korišten drugi IC (integrirani krug ili popularno čip) PCM510A koji uključuje stereo digitalno-analogni pretvarač i dodatni sklop za podršku. PCM510A koristi posljednju generaciju napredne segmentne DAC arhitekture Texas Instrumentsa za postizanje izvrsnih dinamičkih performansi i poboljšane tolerancije na eventualne greške u bit clock vezi.
Ta inteligentna komponenta sprječavanja pogreška bit clock veze i PowerSense zaštitu od podnapona koja koristi sustav za ispravljanje zvuka na dvije razine kako bi dobili performanse bez prekidanja reprodukcije u usporedbi s mnogim konvencionalnim DAC arhitekturama s komutiranim kondenzatorom, obitelj PCM510xA nudi do 20 dB niži šum van frekvencije zvuka.
PAM8908JER stereo pojačalo eliminira potrebu za velikim kondenzatorima za blokiranje istosmjerne struje, štedeći troškove, prostor na ploči i visinu komponente. PAM8908 isporučuje do 25 mW po kanalu uz opterećenje od 16 Ω i ima niskih 0,03% THD+N. Visok omjer odbijanja napajanja (80dB na 1kHz) omogućuje ovom pojačalu rad s bučnim, nestabilnim digitalnim napajanjem bez dodatnog linearnog regulatora. Upravo je iz tog razloga ovo savršen jeftini i kompaktni audio modul za korištenje. PAM8908 također ima zaštitu od kratkog spoja i previsoke temperature. Način isključivanja smanjuje mu potrošnju napajanja na manje od 1 µA kada je isključen.
Boblioteke
Ovom prilikom za komunikaciju ćemo koristiti nešto napredniju audio biblioteku koja je sposobna komunicirati s audio pojačalima koja koriste I2S protokol za slanje zvuka. Riječ je o ESP8266Audio biblioteci, a preuzeti je možete putem Arduino Library managera upisivanjem njenog imena u tražilicu ili preuzimanjem s GitHub-a putem linka: https://github.com/earlephilhower/ESP8266Audio.
Biblioteka je sposobna dekodirati MOD, WAV, MP3, FLAC, MIDI, AAC i RTTL datoteke te ih reproducirati na I2S DAC-u.
No nakon instalacije skripte prvo je poželjno vidjeti kompajlira li se skripta normalno. Mi smo koristili Arduino IDE 1.8.13, podršku za ESP32 verzije 1.0.4 i 1.0.6 te obje rade. Biblioteka ESP8266Audio je verzije 1.9.5.
Najjednostavniji primjer koda
S izbornika Datoteka → Primjeri → ESP8266Audio odaberite PlayFLACFromPROGMEMToDAC kako biste pokušali pokrenuti reprodukciju FLAC zvuka na zvučnik koji ste prilagodili kao 32-ohmski.
Kako biste, umjesto na I2S, zvuk poslali na DAC GPIO25 potrebno je prilagoditi ovu liniju koda:
out = new AudioOutputI2S();
Te umjesto nje napisati
out = new AudioOutputI2S(0, 1);
Ako je sve prošlo prema planu, na zvučnik ili slušalice VIDI X mikroračunala čut ćete zvuk. Koji točno, otkrijte sami.
Pucketa li, tj. prekida li zvuk kao da pojačalo probija gornju granicu koju zvučnik može izdržati, linijom koda
out->SetGain(0.3);
stišajte zvuk na 30% glasnoće. Čak i da niste modificirali zvučnik u 32-ohmski, ili nemate zvučnik uopće, a vaše slušalice isto tako nisu impedancije 32 ohma, pri vrijednostima ispod 55% trebali biste čuti čišći zvuk.
Shema spajanja
Radi li biblioteka, možemo prionuti na spajanje Pico Audio modula. Za njegovo spajanje bit će nam potrebno pet žica od kojih su dvije napajanje, dok su preostale tri zadužene za I2S komunikaciju.
Iako je izvorno biblioteka postavljena na korištenje DAC GPIO 25 i 26 te digitalni GPIO 22 za I2S komunikaciju, I2S komunikacija može se jednako kvalitetno ostvariti bez korištenja DAC pinova. Zato ćemo mi u našoj shemi koristiti druge pinove koji su nam lakše dostupni na expansion headeru.
Povežite žicama VIDI X mikroračunalo i Pico Audio modul kao na shemi.
Prije kompajliranja koda potrebno je promijeniti i I2S pinove u biblioteci kako bi odgovarali našoj shemi. Unutar mape %UserProfile%\Documents\Arduino\libraries\ESP8266Audio\src otvorite datoteku biblioteke AudioOutputI2S.cpp te u Notepadu ili drugom txt editoru ili editoru koda promijenite definiciju pinova za I2S komunikaciju kako bi koristili GPIO 4, 14 i 15 kao sa sheme.
bclkPin = 4; wclkPin = 14; doutPin = 15; //bclkPin = 26; //wclkPin = 25; //doutPin = 22;
Kompajlirate li sada isti primjer, zvuk ćete čuti na slušalice ili liniju priključenu na Pico Audio, no ovoga puta to možemo nazvati Hi-Fi zvukom. No spomenuli smo kako Pico Audio može reproducirati 32-bitni stereo zvuk od 384 kHz. Kako bi postigli takvu kvalitetu u biblioteci promijenite i ove varijable koje određuju kvalitetu zvuka:
bps = 32; channels = 2; hertz = 384100;
Čujete li razliku između onog 8-bitnog i ovog 16 odnosno 32-bitnog zvuka? Poigrajte se malo glazbom koju dobro poznajete te pokušajte čuti razlike. No imajte na umu kako za dekodiranje MP3 datoteka treba i nešto procesorske snage. Stoga, zadate li procesoru previše računica koje mora odraditi u kratkom roku, možda nećete imati gladak zvuk nego će on trzati i zastajkivati. Imajte na umu kako, čitate li datoteke s SD kartice, ona možda nije dovoljno brza za vaš vrlo malo kompresirani (ili nekompresirani FLAC) zvuk. Za tako nešto vjerojatno ćete trebati koristiti obje jezgre VIDI X mikroračunala, no to nećemo pokriti u ovoj radionici.
No sada ste spremni preuzeti kôd MP3 playera, na priloženu SD karticu prekopirati pokoju MP3 datoteku, umetnuti SD katicu u VIDI X mikroračunalo i pokrenuti kod MP3 playera koji ste preuzeli s linka: https://github.com/VidiLAB-com/Vidi-X/tree/master/VIDI-X-kao-MP3-Player/mp3-player
ili linka: https://github.com/VidiLAB-com/Vidi-X/tree/master/VIDI-X-kao-MP3-Player/mp3-player-DAC
Razlikuju se u tome koristite li zvuk ugrađen na VIDI X ili koristite vanjski I2S kompatibilni dekoder zvuka. Sve zasluge za kod MP3 playera idu GitHub korisniku ripper121 (https://github.com/ripper121/odroidgomp3) koji je napisao ovaj MP3 player, a mi smo ga preuzeli i malo ušminkali prema našim preferencijama.
Kako do GPIO25 i GPIO26 pina
S obzirom na to da spomenuti DAC pinovi GPIO25 i GPIO26 nisu dostupni putem expansion slota VIDI X-a, a želite li ih ipak koristit, do njih ćete doći tako da direktno na štampanu pločicu VIDI X mikroračunala zalemite dvije žice.
GPIO25 i 26 nalaze se na prekidaču s pomoću kojeg kontroliramo spoj zvučnika ili temperaturnog senzora i InfraRed transmittera. Uloga prekidača je srednje nožice spojiti ili s lijevim ili s desnim nožicama prekidača, ovisno o njegovu položaju. No postavite li prekidač u sredinu, srednje nožice neće imati kontakt niti s jednom stranom. Sada na te srednje nožice možete zalemiti žice koje ćete koristiti kao GPIO25 i GPIO26.
Kako biste se osigurali da se prekidač slučajno ne pomakne tokom korištenja uređaja, najbolje ga je odlemiti u potpunosti, no to je već ozbiljniji zahvat ako trajno želite koristiti te dvije žice umjesto spomenutih senzora i aktuatora.
Kompletan kod pronađite na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/VIDI-X-kao-MP3-Player