Analogni ulazi služe kako bi mogli očitati vrijednost napona koji primaju takvi pinovi. Kod VIDI X-a ta vrijednost je maksimalno 3,3 V. Analogne ulaze možemo iskoristiti kako bi izmjereni signal prikazali na ekranu i tako napravili osciloskop.
Kompletan kod osciloskopa pronađite na linku https://github.com/VIDI-X/Vidi-X-MultiApp.
VIDI X uz pomoć expander slota za proširenje te uz prisustvo LCD ekrana vrlo lako može postati mjerni uređaj poput osciloskopa.
Osciloskop je uređaj koji služi za prikazivanje promjene električnog potencijala u nekom vremenskom periodu. Na svom ekranu prikazuje stvaran oblik napona koji se mijenja u vremenu. Mogu se izvoditi mjerenja i usporedbe valnih oblika koje vidimo na ekranu, a koje su iscrtane uslijed promjene tog napona. Dakle, osciloskop crta graf veličine napona kako vrijeme prolazi. Oblik vala koji se iscrtava je graf napona kroz vrijeme V(t).
Najjednostavniji kod osciloskopa
Mi ćemo vam pokazati i objasniti jednostavan kod koji će simulirati rad osciloskopa. Ozbiljni osciloskopi posjeduju mogućnost povećavanja i smanjivanja rezolucije i po veličini napona i kroz vrijednost vremena. Profesionalni osciloskopi također mogu imati više ticala za mjerenje pa se na nekima može mjeriti osam izvora napona dok će naš u drugom priloženom primjeru mjeriti samo dva signala. Vrlo korisna funkcija digitalnih osciloskopa je zapisivanje i pohrana podataka za naknadnu analizu na računalu.
Iako naš kod neće imati sve te napredne mogućnosti, kroz njega ćete naučiti što je to analogna vrijednost.
Najjednostavniji primjer promjene analogne vrijednosti je potenciometar. Potenciometar je promjenjivi otpornik. On ima 3 pina i spaja se na VIN, GND te treći na analogni pin. Osnovna funkcija mu je dijeljenje napona. U svakodnevnom životu ih najčešće koristite za kontrolu glasnoće zvuka na glazbenoj liniji, iako danas sve više uređaja koristi potpuno digitalne kontrole glasnoće, kao što je to primjer s vašim mobitelom.
VIDI X ima ugrađenih nekoliko analognih senzora. To je plava LED dioda spojena na GPIO2. Da, dobro ste pročitali. LEDice mogu poslužiti kao senzor svjetlosti ukoliko ih ne koristimo kao „žarulju“. U stvari, dobro je znati kako svaki otvoreni tip poluvodiča može poslužiti kao senzor svjetlosti. Tranzistor će imati istu funkcionalnost kada bi ga izvadili izvan njegovog plastičnog kućišta.
Osim spomenute diode, ugrađeni temperaturni senzor također je analogni senzor. Riječ je o mikročipu oznake MCP9700AT-E/LT koji je spojen na GPIO26 te ga je moguće očitavati kao analognu vrijednost.
VIDI X ima 12 bitnu rezoluciju analognih pinova. To znači da analogni pin može očitati 212 (dva na dvanaestu potenciju) vrijednosti. To je 4096 vrijednosti. S obzirom da je raspon čitanja od 0 V do 3,3 V, rezolucija promjene iznosi 0,0008 V. No kako vršna vrijednost od 3,3 volte rijeko iznosi točno toliko, treba je mjeriti te dobivenu vrijednost interpolirati prema vrijednosti od 3,3 V. Taj postupak zovemo kalibracija.
Mikrofon je također analogni senzor spojen na GPIO14 te ćemo za ovaj primjer koda za osciloskop koristiti upravo njega jer tako najbolje možete pratiti promjene analognih vrijednosti.
Osnovni kod za iscrtavanje vrijednosti dobivenih od analognog senzora izgleda ovako.
Pokrenut ćemo petlju kojom iscrtavamo piksel prema očitanoj vrijednosti analognog pina, zatim pomičemo koordinate piksela za jedan piksel desno te opet na tom mjestu iscrtavamo vrijednost analognog senzora.
for(int j = 0; j <= myWidth + 1; j = j + 1) { TFT.drawFastVLine( j, 0, myHeight, ILI9341_BLACK); int n = analogRead(analogInPin); int i = map(n, 0, 4095, myHeight - 1, 1); TFT.drawPixel(j, i, ILI9341_YELLOW); }
Kako bi optimizirali ovaj kod za brže izvođenje, treba ga svesti na što manje linija koda.
Tako for petlju možemo svesti u ovaj oblik koji se izvodi nešto brže, a umjesto
j = j + 1
napisalo bismo
j++
u drugom uvjetu petlje koji će nakon provjere je li j manji ili jednak izrazu myWidth + 1 na taj j zbrojiti jedan.
Sljedeći primjer optimiziraniji je kod koji će izvršavati puno brže nego onaj prvi:
for(int j = 0; j++ <= myWidth + 1; ) { TFT.drawFastVLine( j, 0, myHeight, ILI9341_BLACK); TFT.drawPixel(j, map(analogRead(analogInPin), 0, 4095, myHeight - 1, 1), ILI9341_YELLOW); }
Razvijete li iz ovoga koda nešto veći i kompleksniji kod koji će moći znatno više od jednostavnog iscrtavanja krivulje na ekranu, on će se izvoditi sve sporije i sporije radi količine zadataka koju ste mu zadali.
Želite li još brže izvoditi kod, moguće je podijeliti izvršavanje koda na obje jezgre.
Primjer gore prikazanog koda pronađite na Vidilabovom GitHub accountu i linku https://github.com/VidiLAB-com/Vidi-X/blob/master/Oscilloscope/Oscilloscope.ino
Nešto napredniji kod osciloskopa
Kako ne bismo izmišljali „toplu vodu“, negdje u bespućima interneta pronašli smo kod za Odroid-GO, također baziran na ESP32 SoC-u, koji je sposoban pokrenuti nekoliko aplikacija istovremeno bez potrebe za rebootom ili resetom. Kod je napisan za kompajliranje uz pomoć Visual Studio Code i PlatformIO dodatka.
Taj kod već koristi obje jezgre ESP32 procesora te je poželjno detaljno ga poučiti jer se iz njega može puno naučiti.
Konkretno, mi smo kod Oscilloscop aplikacije prilagodili za VIDI X jer u originalnom kodu neke stvari nisu radile zbog minimalnih hardverskih razlika. Tako se recimo analogne vrijednosti nekih pinova korištenih za gumbe razlikuju od onih koje su postavljene u kodu pa smo ih trebali prilagoditi.
Osim toga, dodali smo dio za prikazivanje frekvencije očitanog signala. Na koji način, bit će opisano u nastavku teksta.
Ukoliko već nemate instaliran Visual Studio Code i PlatformIO dodatak, sada je pravo vrijeme da ga instalirate.
Postupak kako instalirati Visual Studio Code i PlatformIO dodatak za Windows PC pronađite na linku https://hr.vidi-x.org/radionice/vidi-project-x-86-visual-studio-code-platformio/, dok za Mac i OS X potražite tutorial na linku https://hr.vidi-x.org/vidi-x-razvojno-okruzenje/.
Za ovaj programski kod osciloskopa vrlo je bitno u trećem koraku spomenutog tutorijala za instalaciju PlatfomIO dodatka odabrati verziju 2.0.0 Espressif 32 podrške jer s novijim verzijama kod u ovom obliku neće raditi.
Struktura PlatformIO projekata
VS Code i PlatformIO imaju strukturu mapa koja se razlikuje od standardnog Arduini IDE i .ino projekata. Ako kliknete karticu Explorer, vidjet ćete sve datoteke koje je PlatformIO stvorio u mapi vašeg projekta.
Ne biste trebali brisati ili premještati mape i datoteku platformio.ini. Inače više nećete moći kompajlirati projekt.
platformio.ini datoteka
Datoteka platformio.ini je konfiguracijska datoteka vašeg projekta. Prikazuje platformu, ploču i redno okruženje vašeg projekta. Također možete dodati druge konfiguracijske parametre kao što su biblioteke koje treba uključiti, opcije prijenosa, promjenu brzine prijenosa serijskog monitora i druge konfiguracije.
Konfiguracijska datoteka izgleda ovako:
[env:odroid_esp32] platform = espressif32 board = odroid_esp32 framework = arduino board_build.partitions = min_spiffs.csv board_build.f_flash = 80000000L monitor_speed = 115200 build_flags = -DBOARD_HAS_PSRAM
Varijable:
platform: odgovara SoC-u koji koristi ploča.
board: razvojna ploča koju koristite.
framework: softversko okruženje koje će pokrenuti projektni kod.
Na ESP32 odnosno VIDI X, ako želite koristiti brzinu prijenosa od 115200 u vašem serijskom monitoru, samo trebate dodati sljedeći redak u vašu platformio.ini datoteku.
monitor_speed = 115200
Nakon toga spremite napravljene promjene u datoteci pritiskom na Ctrl + S ili odabirom File -> Save s padajućeg izbornika.
U ovu datoteku također možete uključiti identifikator biblioteka koje ćete koristiti u vašem projektu.
Više o konfiguriranju i upotrebi biblioteka pronađite na linku https://docs.platformio.org/en/latest/projectconf/section_env_library.html
src mapa
Mapa src je vaša radna mapa. Unutar mape src nalazi se datoteka main.cpp. Tu se nalazi glavni kod, odnosno to je ono što je kod Arduini IDE .ino datoteka. Kliknite na main.cpp datoteku. Prepoznat ćete strukturu Arduino programske skice koja sadrži sve elemente kao i .ino skica, a to su deklaracije varijabli, pa zatim petlje setup() i loop() te druge.
Izmjene koda za VIDI X
Pokretanjem originalnoga koda primijetili smo kako nam gumbi ne rade dobro. Stoga prvo moramo povećati osjetljivost analogne vrijednosti za gumbe gore, dolje, lijevo i desno. Kako su analogne vrijednosti VIDI X-a 12-bita, odnosno kreću se od nula do 4095. Dva gumba od spomenutih daju nam analognu vrijednost otprilike na polovici vrijednosti od 12-bita što otprilike iznosi 2000.
U mapi lib, zatim Odroid_go, zatim utility pronađite datoteku Button.cpp. Spomenuta datoteka je biblioteka koja olakšava korištenje Odroid Go konzole te sadrži niz funkcija koje nam mogu biti od koristi u kreiranju vlastitoga koda.
U toj datoteci potražite funkciju uint8_t Button::readAxis() koja je zadužena za očitanje je li gumb stisnut ili nije te ukoliko je stisnut je li stisnut gore ili dolje, odnosno lijevo ili desno.
Kako biste povećali osjetljivost detekcije gumbića koji nam daju vrijednost oko ranije spominjanih 2000, na 101 liniji koda povećajte granicu od 1900 na recimo 2200.
Dakle:
else if (val > 1700 && val < 1900)
mijenjamo u:
else if (val > 1700 && val < 2200)
Sada će gumbi raditi dobro. Iako, radili bi dobro i da ove vrijednosti drastično povećamo na recimo
else if (val > 1000 && val < 3000)
To najviše ovisi o hardverskom dizajnu. No sada kada smo riješili problem biblioteke, pogledajmo što smo mijenjali u kodu aplikacije Oscilloscope.
U tu aplikaciju cilj je bio dodati mjerenje frekvencije krivulje. S obzirom da dio koda koji računa frekvenciju već imamo u radionici Light Show, na linku https://hr.vidi-x.org/radionice/vidi-project-x-61-light-show/
Za one koji ne znaju, frekvencija je broj ponavljanja nekog događaja u jedinici vremena. Također se naziva i vremenska frekvencija kako bi se naglasila suprotnost od prostorne frekvencije ili drugih frekvencija. Izražava se u hercima (Hz). Jedan Hz je ekvivalent jednom ponavljanju ciklusa događaja u sekundi. Vremensko trajanje jednog ciklusa u događaju koji se ponavlja je recipročno frekvenciji. Na primjer, ako srce kuca frekvencijom od 120 puta u minuti (2 herca), njegovo trajanje T, odnosno vremenski interval između otkucaja iznosi pola sekunde (60 sekundi podijeljeno sa 120 otkucaja). Frekvencija je važan parametar koji se koristi u znanosti i inženjerstvu za određivanje vremenske stope promjene uočene u oscilatornim i periodičnim pojavama kao što su mehaničke vibracije, audio signali, radio valovi i svjetlost.
Dio koda koji je zadužen za izračun frekvencije jednostavno ćemo kopirati u ovu aplikaciju. Kod koji kopiramo i dodajemo označit ćemo komentarima poput ovoga
// VIDI-X mod
Uvijek je vrlo dobro komentirati kod, i to što opsežnije možete, kako bi i vama i nama kasnije bilo lakše pronaći modifikacije ukoliko ih poželimo dorađivati.
Sada u mapi src, pa zatim Apps, otvorite datoteku imena Oscilloscope.h
Ovdje smo na sam početak dodali nekoliko #include datoteka te #define varijabli. Zatim smo na liniji koda 92 i 93 deklarirali i dodali ove varijable za korištenje pri računanju frekvencije:
unsigned long st, freq; // VIDI-X mod - dodano za frekvenciju int freqmax; // VIDI-X mod - dodano za frekvenciju
U datoteci Oscilloscope.cpp također smo na početak dodali deklaraciju varijabli i neke funkcije poput fft_dir, ffti_shuffle_f, ffti_evaluate_f i ffti_f.
Testiranje osciloskopa
Kako bismo provjerili radi li sve dobro, testirat ćemo osciloskop na nekoliko načina. VIDI X mikroračunalo već sada bi trebalo pokazivati krivulju mikrofona jer je GPIO 14 povezan s ugrađenim mikrofonom. Naravno, ako je tišina, nećete puno vidjeti pa izgovorite nešto u mikrofon ili jednostavno puhnite u njega.
Bolji način testiranja je da GPIO 14 spojite žicom direktno sa GPIO 25. Inače, u ovoj aplikaciji GPIO 25 generira testni signal za osciloskop. GIPO 14 pronaći ćete na expansion portu označen oznakom MIC jer je inače na njega spojen mikrofon. Kako biste odvojili ugrađeni mikrofon i time oslobodili GPIO14 za vanjsko korištenje uz pomoć expansion porta, morate mikro prekidače sa stražnje strane prebaciti u položaj USE EXP. i to prekidač 2 oznake MIC na prekidačima S4 i prekidač 1 oznake MIC_PCB na prekidačima S3.
Zatim prekidač za temperaturni senzor i mikrofon postavite u sredinu. Naime, taj prekidač pinove GPIO 25 i GPIO 26 spaja ili za korištenje sa zvučnikom ili za korištenje s temperaturnim senzorom i IrRx diodom. No forsirate li položaj prekidača u sredinu, srednji pinovi prekidača neće se spojiti niti na zvučnik niti na temperaturni senzor pa sada imate slobodne GPIO 25 i 26 za korištenje.
S obzirom da GPIO 25 nema promjenjivu frekvenciju, a i to želimo testirati, napisali smo maleni program koji mijenja frekvenciju pina GPIO 25. Pronađite ga na linku https://github.com/VidiLAB-com/Vidi-X/tree/master/Frequency_generator
Glavni dio koda zadužen je za generiranje PWM signala i izgleda ovako:
for (_freq = 250; _freq < 10000; _freq = _freq + 250) { ekran(); ledcWriteTone(_channel, _freq); delay(2000); }
Preuzeti kod uz pomoć Arduino IDE uploadajte na drugi VIDI X. Sada pin GPIO 32 tog drugog VIDI X-a spojite sa GPIO 14 VIDI X-a na kojem je pokrenuta aplikacija Oscillocope.
Osim tog pina, bit će potrebo spojiti i GND pin jednog VIDI X-a s GND-om drugog VIDI X-a. Ukoliko oba VIDI X-a napajate putem USB kabela s istog izvora napajanja (s istog laptopa recimo), onda je GND konekcija povezana putem GND-a od USB kabela, pa će stvar raditi i samo s jednom žicom.
Djelitelj voltaže i sonda osciloskopa
VIDI X mikroračunalo može očitati signale samo do 3,3 V. Stoga je ovdje nužno koristiti mrežu razdjelnika napona za razna mjerenja.
Shema spajanja sonde za mjerenje prikazuje spoj za djelitelj voltaže od 10 puta. Tako umjesto 3,3V sada na sondu možete dovesti signal od 33V, a da ne oštetite VIDI X.
Mi smo priloženu shemu testirali s napajanjem 12V, 2A i spojenim PC ventilatorom na taj izvor napajanja te je naš testni VIDI X preživio. Preživio je i laptop s kojim smo putem USB napajanja napajali VIDI X osciloskop.
Vrlo je bitno imati spojen potrošač u strujni krug kojeg mjerite kako nebiste napravili kratki spoj i time vodove VIDI X-a pretvorili u žarne niti koje će izgorjeti jer nisu u vakumu 😉
Kada izgradite vaš osciloskop putem priložene sheme, nikako ne preporučamo testirati ga na snažnim izvorima napajanja, kako vam se ne bi slučajno nešto kratko spojilo, a onda time možete i oštetiti ostatak strujnoga kruga, ili došlo do drugih neplaniranih i krivih spojeva.
Dakle, kako vam vjerojatno ne treba mjerenje signala od 33V, otpornik od 10 kOhma zamijenite otpornikom od 1 kOhm. Dakle sada na „zelenom“ vodu sonde ostaje otpornik od 100 kOhma dok na druga dva otpornika, koji su spojeni na GND i 3,3V, imate 1 kOhm otpornike. Time ste dobili djelitelj voltaže od dva puta i takvim spojem možete mjeriti raspon napajanja od -3,3V do +3,3V, što je pogodno za mjerenja zvuka s obzirom na to da sinusoida zvuka zadire koliko u pozitivne toliko i u negativne voltaže.
Formula za računanje dobivene voltaže na djelitelju napona jako je bitna kako ne biste na mjerni uređaj, u ovom slučaju VIDI X, poslali voltaže koje on nije sposoban prihvatiti. Tako u svim slučajevima otpornike morate složiti na način da Vout uvijek bude manji od 3V. Ako vam uvozna voltaža mjerenja (Vin) nije poznata, morate ju izmjeriti nekim mjernim uređajem poput multimetra (ili drugog voltmetra) kako biste znali koju vrijednost uvrstiti u formulu.
Isto tako trebate imati na umu da neki otpornici imaju veću grešku od drugih otpornika.
Razlika vrijednosti otpornika od 10% u odnosu na njegovu vrijednost koju je trebao imati može značiti vrlo veliku grešku u računici te i otpornike koje koristite treba provjeravati.
Vrijednost otpornika nije moguće izmjeriti kada se on nalazi u strujnome krugu tako da ga obavezno treba izvaditi iz strujnoga kruga i onda na otporniku odraditi mjerenje.
Najčešći je slučaj kod djelitelja voltaže da vam je poznata i ulazna i izlazna struja te jedan otpornik, a potrebno je izračunati drugi otpornik. Zato smo vam priložili gore prikazanu formulu na način da iz nje možete izračunati drugi otpornik, tj. R2.
Na drugom kraju sonde imamo otpornik od 100 kOhma kako bi oslabili jače signale koje mjerite te time umanjili mogućnost uništavanja VIDI X mikroračunala.
Za kraj
Sonde punokrvnih i moćnijih osciloskopa zaštićene su od vanjskih utjecaja te od drugih probijanja elektriciteta. Ova naša sonda, sa sheme, nije pa će dolaziti do manjih ili većih izobličenja u očitavanjima. Recimo, dovoljno je prstima primiti sondu i vidjeti kako krivulja „skače“. Isto tako, dotaknete li prstima otpornike, mijenjat će se vrijednosti krivulje.
Jedna od najosnovnijih metoda zaštite kabela, odnosno sonde, ali i kompletnih strujnih krugova je da okolo njih u potpunosti provučete vodljivi mrežasti materijal. Ukoliko ste „rastavljali“ razne kablove, možda ste primijetili vanjski omotač u vidu mreže isprepletenih žičica. To je u biti Faradijev kavez. Ta metalna mreža žica čine spomenuti kavez. Unutar tog kaveza se najčešće nalaze žice koje taj kavez štiti od djelovanja vanjskog električnog polja.
Na sondu bi još bilo korisno dodati i zaštitu od struje prevelike snage te druge zaštite. No što god radili, nikako nemojte pokušavati mjeriti izmjeničnu struju 220V jer je ona opasna po život.
Kompletan kod osciloskopa pronađite na linku https://github.com/VIDI-X/Vidi-X-MultiApp.