Avtor: Brian Millier
E-pošta: bmillier1@gmail.com
Kot je navedeno v prvem delu članka, ima M5Dial dva Grove priključka: enega za zunanje I2C naprave in drugega za UART vrata (serijska). V mnogih primerih to zadostuje, saj obstaja veliko perifernih čipov, ki uporabljajo I2C vmesnik.
Povezave na zunanja vezja
Druga možnost je, da povežete ločen MCU prek UART ali I2C in ga uporabite kot podrejeni procesor. Ta podrejeni MCU bi lahko upravljal različne vhodno-izhodne naprave, ki uporabljajo kaj drugega kot I2C vrata. Če potrebujete le več digitalnih vhodno-izhodnih priključkov, lahko uporabite razširitveni I2C čip, kot je NXP PCF8574 (8 linij) ali Microchip MCP23016 (16 linij).
Kot sem omenil na koncu 1. dela, sem želel na M5Dial priključiti več čipov z SPI vmesnikom. Zlasti me je zanimal AD9833 programabilni generator signalov podjetja Analog Devices, MCP41010 digitalni potenciometer podjetja Microchip in MCP4821, 12-bitni SPI DAC podjetja Microchip. AD9833 lahko proizvaja sinusne, trikotne in kvadratne signale z ločljivostjo 0,1 Hz, kar močno presega zvočno območje. MCP41010 je digitalno krmiljen uporovni potenciometer z 8-bitno ločljivostjo.
Ugotoviti sem moral, kako uporabiti I2C ali UART vrata M5Dial za povezavo z nekakšno „premostitveno“ napravo, ki vsebuje nadrejena (master) SPI vrata. Zdelo se je, da je to pogosto zahtevana premostitvena naprava, in pričakoval sem, da bo na voljo veliko takšnih naprav. Izkazalo se je, da sem našel le eno takšno napravo.
NXP izdeluje čip SC18IS602B, ki vsebuje podrejena I2C vrata in nadrejena SPI vrata (s 4 pripadajočimi linijami za izbiro čipa). To bi bila idealna naprava za to nalogo, le da je na voljo le v 16-pinskem TSSOP ohišju, ki ga je težko spajkati na tiskano vezje. Na voljo so razširitveni moduli, ki pa niso na voljo, če pa so, niso poceni.
Ta vsebina je samo za naročnike
S sedaj priljubljeno ploščo Raspberry Pi Pico, ki vsebuje poceni in zmogljiv MCU RP2040, še nisem naredil veliko projektov. Poleg Raspberry Pi Pico in Pico W plošč sem imel pri sebi tudi Seeed Studio RP2040 Xiao modul. To je ena od manjših plošč, ki temelji na RP2040 in je trenutno na voljo, stane pa le približno 5 USD. Vsebuje dovolj GPIO linij, da je lahko delovala kot premostitvena naprava med I2C in SPI, ki sem jo potreboval za ta projekt. Na sliki 1 je prikazan ta majhen modul – uporablja USBC vrata za programiranje Flash kartice in za zaporedno razhroščevanje.
8-bitne MCU-je redko uporabljam, vendar imam še vedno na voljo veliko različnih Atmel AVR MCU-jev. Vendar nobeden od tistih v manjših ohišjih ni imel podrejenih I2C in SPI vrat. Lahko bi uporabil Atmel ATmega328 (kot se uporablja na ploščah Arduino Uno). Toda ta je v večjem ohišju in bi potreboval priključek za ISP programiranje in kvarčni kristal.
Tako M5Dial kot ta RP2040 Xiao plošča uporabljata 3,3 V logične nivoje, kar olajša medsebojno povezovanje, saj ne potrebujeta pretvornikov nivojev. Na sliki 2 je diagram razporeditve priključkov za to ploščo.
Pričakujem, da bo večina uporabnikov programirala MCU RP2040 z uporabo SDK/toolchain C/C++ (ki ga zagotavlja organizacija Raspberry Pi) ali MicroPython/ CircuitPython. Obstaja pa tudi podporni paket za ploščo Arduino RP2040, ki ga je napisal/priskrbel Earle Philhower. Ker na splošno svoje razvojno delo opravljam z uporabo okolja Arduino IDE, sem se odločil za programiranje plošče RP2040 Xiao z uporabo okolja Arduino IDE. Dodatna prednost MCU RP2040 je, da vsebuje zagonski nalagalnik UF2 USB v ROM pomnilniku. To pomeni, da ko to ploščo priključite v USB vrata računalnika (s pritisnjenim gumbom BOOTSEL), se prikaže primerek programa File Manager, ki prikazuje ploščo kot Flash pomnilnik. Če želite prenesti kodo v napravo, morate želeno hex datoteko povleči in spustiti v to mapo upravitelja datotek. Če uporabljate Arduino IDE z RP2040 ploščo kot ciljnim MCU, vam tega sploh ni treba storiti – kliknete gumb Download in odpre se okno File Manager, v katerem je prikazan RP2040 Flash pogon. Programiranje se bo nadaljevalo samodejno. V tem primeru vam sploh ni treba pritisniti stikala BOOTSEL.
Uporabljam najnovejšo različico Arduino 2 IDE: različica 2.3.2. Za ta projekt priporočam uporabo tega Arduino IDE iz več razlogov. Nekatere od teh razlogov sem opisal v prvem delu, tukaj pa je še eden. V tem projektu je glavni krmilnik M5Dial. RP2040 Xiao deluje kot podrejeni I2C priključek in izvaja funkcijo mosta med I2C in SPI. Med razvojem sem pogosto pisal/spremljal kodo za ESP32S3 M5Dial in RP2040 Xiao hkrati. To se je zgodilo med razvijanjem protokola za komunikacijo med obema MCU-jema. Odprete lahko dva primerka okolja Arduino 2.3.2 IDE in neodvisno delate na kodi za vsako od dveh različnih MCU enot. Vsaka instanca lahko prikliče svoj namenski serijski terminal, povezan s ciljnim MCU, in vsaka instanca lahko neodvisno programira svoj ciljni MCU. S prejšnjimi različicami Arduino IDE v različici 1.8.x tega niste mogli storiti.
Če želite razvijati z MCU RP2040 v IDE Arduino 2.3.2, kliknite ikono Boards na levi strani zaslona in vnesite RP2040. Nato dodajte izbiro «Raspberry Pi RP2040 Boards (3.6.3 or later)».
Funkcije MCU RP2040 v tem projektu
Pri tem projektu sem želel, da RP2040 sprejema I2C ukaze in jih razčlenjuje v več funkcij:
- AD9833 ukazi (poslani po SPI).
- MCP41010 ukazi za digitalni potenciometer (poslani po SPI)
- MCP4821 DAC ukazi (poslani po SPI)
V primeru MCP4821 in MCP41010 jima je treba poslati le 16-bitno vrednost, ki vsebuje ukaz in podatke. Knjižnica gonilnikov ni potrebna. Vendar pa je programirljivi signalni generator AD9833 bolj zapletena naprava in ga je lažje programirati z uporabo vnaprej napisane knjižnice. Vse razpoložljive knjižnice gonilnikov AD9833 so napisane za neposredno komunikacijo s čipom z uporabo SPI. Nisem jih želel ponovno napisati za uporabo I2C vodila in SPI mosta. Zato sem se odločil, da na ploščo RP2040 Xiao naložim knjižnico gonilnika AD9833 in ji dovolim, da krmili AD9833 prek Xiaojevih SPI vrat. Izbral sem knjižnico MajicDesigns AD9833, ki jo najdete na Githubu na naslovu:
https://github.com/MajicDesigns/MD_AD9833
M5Dial pošlje naslednje ukaze prek I2C vrat, RP2040 pa te ukaze analizira in s klicem knjižnice AD9833 posreduje ustrezen parameter AD9833:
- AD9833 nastavi frekvenco
- AD9833 nastavi način (sinusni, trikotni, pravokotni, polovični pravokotni signal)
- Poleg tega sta na voljo dva ukaza za drugi dve periferni napravi:
- MCP41010 Nastavi vrednost potenciometra (8-bitov)
- MCP4821 nastavi vrednost DAC (16-bitov)
Ti 4 ukazi so ukazi višje ravni – naložijo ustrezen parameter v ciljno napravo in preklopijo linijo Chip Select za to napravo.
Poleg teh štirih posebnih ukazov sem opredelil tudi nekaj splošnih ukazov, ki počnejo naslednje:
- Pošlji 8-bit byte.
- Pošlji 32-bit long integer.
Ugotavljanje/izključevanje GPIO linije, ki deluje kot dodatna izbira čipa
Zadnje tri ukaze bi lahko uporabili, če bi želeli dodati dodatne SPI periferne čipe, ki bi jih M5Dial upravljal posredno prek I2C povezave z uporabo I2C podrejenih vrat RP2040 Xiao MCU-ja.
Dejanska struktura ukazov, ki sem jo uporabil, je prikazana v preglednici 1. Pošiljam kombinacijo kratkih ukazov v mnemoničnem slogu ter 8, 16 in 32-bitnih binarnih števil. Da bi bila rutina za razčlenjevanje preprosta in zanesljiva, se vsi ukazi začnejo s črko „W“, ki ji sledi unikatna črka za ta ukaz (črka, ki ni v razponu A-F, ki se uporabljajo za šestnajstiške številke). Vse tri vrste binarnih števil (8,16 in 32-bitna) se pošljejo kot šestnajstiška števila (brez predpone „0x“). S to metodo je nemogoče, da se podrejena naprava RP2040 Xiao I2C ne bi sinhronizirala s prejetimi ukazi iz M5Dial, če bi prišlo do napake pri prenosu I2C.
Opazil sem nekaj nenavadnega pri I2C prenosih naprave M5Dial. MCU ESP32S3, ki ga vsebuje M5Dial, bi moral biti sposoben izvajati I2C v standardnem (100 kHz) ali hitrem (400 kHz) načinu. Vendar pa sem ugotovil, da ko sem določil hitri način – Wire.setClock(400000) je dejanska frekvenca ure bila le 250 kHz. Ne vem, zakaj se to zgodi, vendar je 250 kHz hitrejša od 100 kHz, zato sem uporabil to nastavitev. RP2040 Xiao je podrejena naprava I2C, zato ji ni treba določiti takta.
Eden od razlogov, da sem za podrejeno I2C enoto izbral MCU RP2040, je ta, da ima zmogljivost podrejene I2C enote vgrajeno v standardno knjižnico I2C . V tem projektu podrejeni I2C samo sprejema podatke od nadrejenega – ne pošilja podatkov nazaj. Rutine podrejene I2C enote so vodene s prekinitvami in so v obliki medpomnilnika, zato je njihova uporaba precej enostavna. V delu setup() skice morate le opredeliti rutine za sprejemanje in pošiljanje podatkov, kot sledi:
Wire.onReceive(recv);
Wire.onRequest(req);
Nato v funkcijah recv in req določite svoje izvajalce. Pri tem projektu sem sprejemal samo I2C podatke, zato sem vhodni tok I2C podatkov obdelal v rec(int len)funkciji. Čeprav prekinitvena rutina I2C podrejene naprave vrne število razpoložljivih znakov v spremenljivki „len“, je ne uporabljam. Uporabim ukaz Wire.read() za pridobivanje znakov, enega za drugim, in poiščem začetni znak „W“, ki je pred vsakim ukazom. Naslednji znak določa, kakšen je ta ukaz, in z ukazom „switch“ preskočim na ustrezno rutino. Vsak ukaz vsebuje parameter določene dolžine, ki je izražen v šestnajstiškem sistemu.
Slika 3 prikazuje zajem podatkovnega paketa na osciloskopu, poslanega za ukaz AD9833 setFrequency. Ta ukaz je najdaljši, dolg 10 bajtov.
Zgornja sled je I2C SCL linija, navpične črte kazalca pa kažejo, da traja 424 µs, kar ustreza taktu 250 kHz, ki sem ga prej omenil za hitri I2C način. Spodnja sled je SPI -CS linija AD9833. Prenos podatkov AD9833 SPI je veliko hitrejši kot I2C paket – delno zato, ker je dolžina SPI paketa podatkov le tri 16-bitni binarni bajti namesto 10 znakov, poslanih prek I2C. Poleg tega je taktna frekvenca SPI-ja 1 MHz v primerjavi s taktno frekvenco I2C, ki je 250 kHz.
Zdaj, ko sem razložil, kako lahko M5Dial krmili naprave, ki temeljijo na SPI, z uporabo RP2040 kot podrejenega I2C z SPI mostom, si podrobneje oglejmo delovanje programabilnega generatorja signalov AD9833.
AD9833 programabilen generator signalov
AD9833 je na spodnjem koncu ponudbe čipov za neposredno digitalno sintezo (DDS), ki jih izdeluje podjetje Analog Devices. Na sliki 4 je blok diagram tega čipa. Za takt DDS uporablja 25 MHz vir kvarčnega kristala veuan na MCLK. Izhod iz DDS je 12-bitna vrednost, ki krmili sinusni ROM.
Ta ROM v načinu sinusnega signala krmili 10-bitni DAC pretvornik. Pri načinu trikotnega signala je pomnilnik sinusnega signala premoščen, izhod DDS pa neposredno krmili pretvornik DAC, saj gre za linearni signal rampe, ki ga je mogoče prilagoditi za generiranje trikotnega signala. Za način kvadratnega signala in polovičnega kvadratnega signala (frekvenca /2) se uporablja bit MSB izhoda DDS. Za način FREQ/2 se vstavi dodaten flip-flop DIV by 2.
Kot smo že omenili, je AD9833 na spodnjem koncu družine DDS družbe Analog Devices. Pred petnajstimi leti, preden sem se upokojil na univerzi Dalhousie, sem uporabljal AD9858 DDS, ki je uporabljal 1 GHz takt in je lahko ustvaril natančne izhodne frekvence v območju do 100 MHz.
Mislil sem, da je bil AD9858 v tistem času precej neverjeten, čeprav drag. Če imate danes na voljo štiristo ameriških dolarjev, lahko kupite AD9164 DDS, ki se lahko krmili pri frekvenci do 12 GHz in uporablja 16-bitni DAC za večjo natančnost oblike signala. Te naprave so idealno primerne za najzahtevnejše hitre radijske aplikacije.
Ena stvar, ki me še vedno čudi pri številnih razvojnih ploščah, izdelanih na Kitajskem je to, kako jih je mogoče izdelati po cenah, ki so na voljo. Celo v količini 1000 kosov stane čip AD9833 pri Digikeyu 13 ameriških dolarjev. Razvojna plošča, ki vsebuje ta čip, kristalni oscilator in nekaj pasivnih komponent, stane le 2,50 USD na AliExpressu ali približno 7 USD na mestih, ki ponujajo brezplačno dostavo.
Tako kot pri vseh DDS čipih lahko izhodno frekvenco AD9833 izračunamo z naslednjo formulo:
Izhodna frekvenca = Vrednost faznega koraka x FClock / 228
To temelji na taktni frekvenci 25,0 MHz, ki se uporablja na tej plošči, in numerično krmiljenem oscilatorju (NCO) v modelu AD9833, ki vsebuje 28-bitni akumulator. Pri najmanjši vrednosti faznega koraka 1 je frekvenčna ločljivost enaka:
25,000,000/268435456 or 0.093132 Hz.
V moji skici, ki teče na M5Dial, so frekvence določene na 1 decimalno mesto natančno. Preden se to število s fiksno vejico pošlje na RP2040 prek I2C, se pomnoži z 10, da se pretvori v dolgo celo število in se pošlje kot tako. To dolgo celo število se nato deli z 10,0 in pretvori v vrsto float, preden se pošlje na AD.setFrequency() funkcijo knjižnice.
Upoštevajte, da je v podatkovni mapi AD9833 navedena največja izhodna frekvenca 12,5 MHz, vendar to velja samo za izhodni kvadratni signal. Tako sinusni kot trikotni obliki signalov bi pri frekvenci 12,5 MHz vsebovali le 2 podatkovni točki na cikel, zato sploh ne bi bili podobni sinusnim ali trikotnim signalom. Glede na predvideno uporabo boste morda želeli vsaj 100 podatkovnih točk na cikel, da bi ustvarili razumno sinusno ali trikotno obliko signala, zato bi bila v tem primeru največja izhodna frekvenca omejena na največ 25 MHz/100 ali 250 kHz.
Pri sinusnih in trikotnih signalih proizvaja AD9833 600 mV izhodni signal od vrha do vrha (212 mV RMS). Ta signal se nahaja na 325 mV enosmerne prednapetosti. Z drugimi besedami, vrh negativnega cikla je 25 mV nad maso, vrh pozitivnega cikla pa 625 mV nad potencialom mase.
Kvadraten in polovičen kvadraten signal (Freq./2) imata amplitudo, ki je enaka vrednosti VDD, s katero se čip napaja. V tem projektu razvojna plošča ne vsebuje notranjega regulatorja, zato ploščo napajam s 5 V. Zato so izhodi kvadratnih signalov na ravni 5V od vrha do vrha.
AD9833 vsebuje dva frekvenčna registra in dva fazna registra. Ker čip temelji na SPI in lahko deluje z največjo taktno frekvenco SPI do 40 MHz, je mogoče dinamično naložiti ta dva frekvenčna in fazna registra ter ustvariti zelo hitro frekvenčno in/ali fazno modulacijo. Glede na naravo tega projekta se nisem ukvarjal z implementacijo funkcije drugega frekvenčnega registra niti z nastavitvami faznega zamika.
MCP41010 8-bit digitalno krmiljen potenciometer
Zaradi razmeroma nizke amplitude sinusnega in trikotniškega signala ter velike razlike med njima in med amplitudo kvadratnega signala sem se odločil, da izhodni signal AD9833 dovedem v digitalni potenciometer MCP41010 podjetja Microchip. Ta čip vsebuje 256-delno lestvico upornosti s skupno vrednostjo 10k. Položaj srednjega priključka v tem potenciometru nadzoruje 8-bitna vrednost, ki je vanj naložena prek SPI. Uporovno vezje lahko obdeluje digitalne ali analogne signale, dokler je napetost v območju od nič do VDD (v tem projektu je VDD 5 V). Ko je izbran meni Amplituda AD9833, lahko izberete vrednost do 9,99 V. Ta uporabniška nastavitev se pretvori v ustrezno nastavitev MCP41010 potenciometra, pri čemer se upošteva, da je za potenciometrom instrumentalni ojačevalnik INA128 z ojačenjem 16,15.
MCP41010 je SPI naprava in dobi Chip Select signal iz linije GPIO7 RP2040.
AD9833 izhodni ojačevalnik
Sinusni in trikotni signali AD9833 imajo relativno nizko amplitudo in so unipolarni. MCP41010 bo ta signal dušil za uporabniško programirano količino, pri čemer bosta ostala nizka po amplitudi in se gibala na enosmerni premici, kot je omenjeno v prejšnjem razdelku o AD9833. Shematski prikaz tega projekta je na sliki 5.
Izhodni signal MCP41010 se vodi neposredno na pozitivni vhod instrumentacijskega ojačevalnika podjetja TI z oznako INA128. Ojačenje tega ojačevalnika je:
Ojačenje = 1 + 50000/R1
Pri R1= 3300 Ω ojačenje znaša 16,15
Negativni vhod INA128 se napaja z običajnim mehanskim 100k linearnim potenciometrom. En konec se napaja iz 3,3V regulatorja na modulu Xiao – z uporovnim delilnikom R6 in R10 je zmanjšan na +0,77 volta. Drugi konec se napaja iz -12V napajalnika, ki ga R11 in R12 delita na -0,57 V. Razpon tega potenciometra je takšen, da lahko sinusne/trjkotne signale AD9833 zamakne za približno +/- 8 voltov.
Uporabil sem instrumentalni ojačevalnik INA128, ker sem potreboval diferencialni vhodni ojačevalnik za izravnavo enosmerne prednapetosti, po kateri se gibljeta sinusni/trikotni signal AD9833, in ker je omogočal širok razpon uporabniško nastavljivega odmika. Diferencialni vhodi morajo imeti visoko impedanco, da ne obremenjujejo 10k potenciometra MCP41010. INA128 to zagotavlja v manjšem ohišju kot izvedba z diskretnimi op-ampi.
Programabilna DC referenca z uporabo MCP4821 DAC
Zmožnost programabilne napetostne reference sem dodal z 12-bitnim SPI DAC pretvornikom Microchip MCP4821. Ta čip ima notranjo referenčno vrednost 2,048 volta in lahko zagotavlja izhodne napetosti 12-bitnega pretvornika DAC s polno vrednostjo 2,048 ali dvakratno vrednostjo (ob predpostavki, da se MCP4821 napaja s 5 V). MCP4821 napajam s 5 V in uporabljam nastavitev dvojnega ojačenja.
Izhod MCP4821 priključim na operacijski ojačevalnik OP07, ki je konfiguriran tako, da zagotavlja ojačenje 2 in vnaša odmik, tako da ima izhodna referenčna napetost območje +/- 4,096 volta.
Dvojno 12 voltno napajanje za analogna vezja
Za doseganje dvojnega napajanja v obsegu +/- 10 voltov sem potreboval dvojno napajanje +/- 12 V. Uporabil sem izolirani pretvornik DC-DC PEM1-S5-D12-S proizvajalca CUI. Ta zagotavlja tokovno zmogljivost do 42 mA na plus in minus izhodih, kar je za to aplikacijo dovolj. Za to potrebuje največ 250 mA pri 5 V. Ta pretvornik vsebuje hitri oscilator in gonilnik za napajanje notranjega ojačevalnega transformatorja. Izhod s sredinskim izvodom zagotavlja +/- 12 voltov (neregulirano). Ker vsebuje visokofrekvenčno stikalno vezje, je pomembno, da:
- Neposredno čez njegove vhodne sponke namestite majhen keramični in večji elektrolitski kondenzator.
- Vcc in maso napeljite z ločenima žicama, ki vodita neposredno na 5 V vir napajanja, ki se uporablja za napajanje projekta.
Projekt se napaja z USBC 5V/1A adapterjem, ki se priključi na M5Dial modul. Teh 5 V je na voljo na priključku I2C Grove in se prenaša na preostalo vezje, vključno z izoliranim pretvornikom DC-DC PEM1-S5-D12-S.
Delovanje
Ko se naprava vklopi, se prikaže glavni meni, kot je prikazano na sliki 6. Menije izberete tako, da se dotaknete zaslona v ustreznem kvadrantu. Najprej je treba nastaviti frekvenco, kot je prikazano na sliki 7. Z rotacijskim enkoderjem se izbere frekvenca. Z dotikom zaslona nad odčitano frekvenco povečate vrednost te številke, z dotikom pod njo pa jo zmanjšate. S pritiskom na logotip M5 na oranžnem okvirju zaslona se pošlje setFrequency() ukaz v AD9833. Če pritisnete logotip M5 na okvirju za 1 sekundo ali več, se vrnete v glavni meni. Meni z obliko signala deluje na enak način. Z enkoderjem izberemo obliko signala, gumb M5 na ohišju pa pošlje setMode() ukaz v AD9833.
Menija Amplituda AD9833 in Amplituda DAC delujeta na enak način. Obliko signala iz AD9833 je treba nastaviti pred nastavitvijo amplitude, ker je izhodna amplituda AD9833 le 600 mv za izbire Sine in Triangle, za izbire kvadratnega signala pa 5 voltov. To odstopanje je treba upoštevati v meniju Amplituda.
Vključil sem nekaj posnetkov enote med delovanjem. Slika 8 prikazuje sinusni izhodni signal pri frekvenci 90 kHz in 5 voltov od vrha do vrha. V zgornjem desnem kotu lahko vidite, da je dejanska frekvenca zelo podobna navedeni frekvenci 90 kHz: 90,0009 kHz. Amplituda je blizu izbrane vrednosti 5,0 voltov, tj. 5,04 V. Slika 9 prikazuje trikoten signal pri 200 kHz. Opazite lahko rahlo zaokroževanje vrhov zaradi omejitev pasovne prepustnosti pretvornika INA128. Slika 10 prikazuje kvadratni signal pri 20 kHz. Prisoten je majhen prenihaj (ne zaradi moje sonde – preveril sem jo, ko sem to videl).
Na sliki 11 je prikazano dokončano vezje, izdelano na ploščici Chip-Quik SBB2808-1. Te plošče so mi všeč, saj vsebujejo ploščice s tremi luknjami in dve napajalni vodili, stanejo pa le 5 dolarjev.
Zaključek
Ta projekt le delno izkorišča številne funkcije M5Dial. Nisem na primer uporabil WiFi ali Bluetooth ESP32S3. Tudi čitalnika RFID nisem takoj uporabil. Z več truda bi lahko v ESP32S3 uvedel datotečni sistem SPIFFS in prenesel nekaj slikovnih datotek, ki bi omogočile domiseln „splash screen“. Ta projekt je bil tudi dober izgovor, da sem izvedel nekaj več o MCU Raspberry Pi RP2040. Rekel bom, da mi je všeč njegov zagonski nalagalnik UF2.
Programi so na voljo v uredništvu revije
Svet elektronike.
https://svet-el.si