Avtor: Brian Millier
V prvem delu tega članka, ki je bil objavljen v decembrski številki revije Svet Elektronike, sem se osredotočil na Arm mikrokontroler STM32U585. To je bilo smiselno, saj je večina mojih izkušenj s strojno in programsko opremo temeljila na 8-bitnih in kasneje 32-bitnih mikrokontrolerjih, ki so bili programirani v jeziku C++ z Arduino IDE.
Menim, da je večina ljudi, ki so razmišljali o nakupu Uno Q, že uporabljala Arduino IDE za programiranje široke palete mikrokontrolerjev, katerih C++ orodja so bila prenesena v Arduino IDE.
Najbolj ekskluzivna lastnost Uno Q pa je štirijedrni sistem na čipu (SOC) Qualcomm QRB2210 Arm Cortex-A53. Ker je Qualcomm nedavno kupil podjetje Arduino, ni presenetljivo, da želijo svoje SOC-produkte začeti vključevati v linijo razvojnih plošč Arduino. Ko MCU ali SOC doseže raven kompleksnosti, ki jo najdemo v večjedrnih napravah Arm Cortex, to običajno pomeni, da postane programiranje v C++ (brez operacijskega sistema) preveč zahtevno. V tem trenutku se v razvojni proces uvede operacijski sistem, kot je Linux.
Ta vsebina je samo za naročnike
V drugem delu bom opisal svoje izkušnje pri preučevanju dela Uno Q plošče, ki se nanaša na QRB2210/Linux OS. Namesto da bi ponovil informacije, ki jih lahko najdete v dokumentaciji Arduino/Qualcomm, bom poskusil obravnavati nekatere težave, ki vas lahko zmedejo ali upočasnijo pri začetnem delu s to ploščo.



Uno Q praktični primeri
V 1. delu sem podrobno opisal, kako je paket podpore za Arduino ploščo mikrokontrolerja STM32U585 obdeloval različne periferne funkcije (SPI, UART, I2C itd.). To sem storil z uporabo standardne različice Arduino IDE 2.3.6. To je bilo zelo podobno moji izkušnji z uporabo Arduino 2.3.6 IDE z drugimi mikrokontrolerji. Programiranje STM32U585 MCU je potekalo transparentno v 2.3.6 IDE, čeprav je v tem primeru proces dejansko potekal v Linux SOC Uno Q.
Na plošči Qualcomm QRB2210 SOC teče Linux, programski jezik, ki ga podpira Arduino, pa je Python. Poleg tega uporablja pakete, imenovane Bricks, ki so popolne, samostojne funkcije, ki tečejo v kontejnerjih. Te Bricks lahko pokličemo s programom Python, da izvedejo rutine visoke ravni, ki tečejo asinhrono v ozadju.
Priznam, da je moje glavno programsko ozadje v C++. Z Raspberry Pi sem preživel dovolj časa, da sem se seznanil z Linuxom, vendar Windows je operacijski sistem, ki ga redno uporabljam. Uporabljal sem CircuitPython in MicroPython z nekaj družinami MCU in se malo ukvarjal s programiranjem v Pythonu z uporabo Raspberry Pi, ko je bil ta predstavljen. Z uporabo teh Python implementacij imate na voljo okolje REPL (Read-Eval-Print Loop). To pomeni, da lahko v ukazno vrstico vnesete Python ukaze/funkcije in takoj vidite rezultate ter sintaktične napake. Ker je to interpretirani jezik, boste ob dejanskem zagonu programske kode na konzoli dobili poročila, ki opisujejo napake v sintaksi itd. To je zelo prijazno do začetnikov, čeprav se Python sintaksa precej razlikuje od C/C++. Razvoj Python na Uno Q poteka z uporabo Arduino App Lab, ki je precej drugačno okolje kot CircuitPython/MicroPython.
Glede na moje omejeno poznavanje jezika Python sem vedel, da bom za začetek verjetno moral preveriti primerne aplikacije, ki jih ponuja Arduino. Pred nakupom plošče Uno Q sem na svoj računalnik namestil Arduino App Lab, v upanju, da bom lahko preveril primere z uporabo App Lab. Na žalost se je Arduino odločil, da bo App Lab zasnoval tako, da ne bo deloval, dokler ne zazna plošče Uno Q, povezane z računalnikom prek USB ali WiFi (v omrežnem načinu). Zato nisem mogel pregledati primerov, ki jih ponuja App Lab. Šele veliko kasneje sem na spletni strani z dokumentacijo Uno Q našel neopažen zavihek, ki je vseboval dober opis teh primerov:
https://docs.arduino.cc/software/app-lab/tutorials/examples/
Ti primeri vsebujejo zelo malo aplikacij, ki resno uporabljajo mikrokontroler STM32U585 ali katero koli periferno napravo, priključeno na njegova vhodno-izhodna vrata. Tiste, ki to počnejo, na splošno uporabljajo le 13×8 LED matriko za prikaz ikon. Primer bi bil prikaz kakovosti zraka kot dobra ali slaba.
Večina primerov vključuje rutine na relativno visokem nivoju, ki:
Pridobijo podatke z zunanje spletne strani ali iz Arduino oblaka in jih prikažejo na 13×8 LED matriki ali prek spletnega strežnika.
Sprejmejo in obdelajo signale iz USB naprave (USB kamera, USB mikrofon) in/ali pošljejo zvok v USB zvočnik/slušalke.
Uporabljajo strojno učenje za razvrščanje zvokov/predmetov, ki jih zagotavlja USB mikrofon/USB kamera ali so naloženi iz datoteke, s pomočjo spletne nadzorne plošče.
Vsa interakcija med Linux SOC in STM32U585 se obdeluje v programski opremi z uporabo oddaljenih postopkovnih klicev (angl. Remote Procedure Calls – RPC). O tem bom govoril v kasnejšem poglavju. V nadaljevanju bom opisal svoje izkušnje z nekaterimi od 24 primerov aplikacij, ki so trenutno na voljo. Nekatere uporabljajo zunanje USB naprave, ki sem jih imel na voljo ali sem jih kupil. Upoštevajte, da so te primerne aplikacije vgrajene že v tovarni, kot del Linux slike. Opazil sem, da je po posodobitvah programa App Lab na voljo več primerov. Z uporabo datotečnega upravitelja Thunar, ki se nahaja na namizju Debian Linux Uno Q, nisem našel nobenih znakov map, ki bi vsebovale te primere – zdi se, da so dobro skrite.
Upoštevajte, da so vsi primeri primerni samo za branje. Nekateri se bodo izvedli neposredno, v nekaterih primerih pa morate narediti kopijo primera in izpolniti nekatere podrobnosti, kot so vaše mesto, dostopni žetoni itd.
V App Labu, v zgornjem desnem kotu, je ikona, ki naredi kopijo katerega koli trenutno naloženega primera. Če to storite, lahko kopijo primera najdete v mapi Home/Arduino/ArduinoApps, skupaj z vsemi programi, ki jih ustvarite od začetka. Želel sem prikazati zaslonsko sliko hierarhije map Uno Q, kot je prikazana v Thunarju. Vendar je privzeta bližnjica za zaslonske slike v Debianu (tipka PrtSc) prikazala le sporočilo, da zahtevani pomožni program ni prisoten. V nadaljevanju je 10 primerov, ki sem jih preveril.
Uno Q vklop/izklop priključka
Ta primer ne zahteva zunanje strojne opreme in je bil prvi, ki sem ga preizkusil. Program uporablja web_ui Brick za ustvarjanje nadzorne plošče, ki jo lahko ogledate v svojem spletnem brskalniku. Slika 1 prikazuje to nadzorno ploščo. Slika plošče je enaka tisti, ki je uporabljena v dokumentaciji Uno Q, ki prikazuje razpored priključkov plošče. Poleg tega se za polnjenje preklopnih stikal ob vsakem GPIO priključku (komaj vidnih v svetlo sivi barvi) uporablja javascript. Ko spremenite položaj enega od teh stikal, se na mikrokontroler STM32U585 Arm pošlje sporočilo RPC, ki vsebuje oznako pinov Arduina in vrednost true/false.


STM32U585 Arm MCU razčleni to RPC sporočilo in zapiše ustrezno vrednost na pravi priključek, pri čemer uporabi digitalWrite(pinName, value). Ta primer vam ponuja idejo, kako uporabiti funkcijo RPC za prenos preprostih spremenljivk med dvema procesorjema na plošči Uno Q. Ta primer sem uporabil skupaj s svojim obsegom, da sem določil časovni overhead klica RPC, kot je uporabljen tukaj. To bom podrobneje razložil kasneje v članku.
Ko ta program zaženete iz App Lab v načinu SBC, program App Lab nekako ve, da je potreben spletni brskalnik, in samodejno zažene brskalnik Chrome na Uno Q z navedenim pravilnim URL-jem, ki prikaže to nadzorno ploščo. Če ga zaženete v načinu omrežja, se bo v spletnem brskalniku vašega računalnika odprl nov zavihek in prikazala se bo ista nadzorna plošča. Poleg tega lahko v načinu SBC tako brskalnik Chrome na Uno Q, kot brskalnik na vašem računalniku, hkrati prikazujeta in upravljata to nadzorno ploščo. To je resnično impresivno!
Detektor programa
To je čitalnik črtnih in QR kod, ki uporablja priključeno USB kamero. Kar sem imel na voljo, ni bilo ravno idealno – je bil USB mikroskop, vendar je deloval brez težav. Ta kamera se prikaže, če vnesete lsusb v ukazno okno – mojo je prikazalo kot Vimicro USB 2.0 UVC PC Camera. Ta primer vključuje tudi spletni strežnik, ki prikazuje sliko, ki jo trenutno zajema kamera. Ugotovil sem, da je hitrost snemanja precej počasna – ocenil bi, da je le 5 slik na sekundo. Ugotovil sem tudi, da je po tem, ko sem umaknil roko iz vidnega polja kamere, minilo približno 1–2 sekundi, preden je izginila iz okna brskalnika, ki prikazuje sliko. Obstaja tipka za začetek skeniranja črtne/QR kode. Ugotovil sem, da prvo QR kodo skenira brez težav in jo doda na seznam zaznanih kod. Vendar pa se večinoma, čeprav se slika kamere še naprej osvežuje, tipka za skeniranje ne prikaže ponovno. Če sem vstavil drugo QR-kodo, jo je včasih zaznal samodejno, vendar pogosto tega ni storil, ampak je samo nadaljeval s posodabljanjem slike kamere. Ta primer me ni preveč navdušil. Moj USB mikroskop deluje brez težav z mojim računalnikom, zato počasne hitrosti slikanja itd. ni mogoče pripisati mikroskopu.
Hey Arduino
V tem primeru se za zajemanje zvoka in prepoznavanje fraze »Hey Arduino« uporablja USB mikrofon. Osebno ne uporabljam USB mikrofonov, vendar sem kupil enoto za 7 dolarjev (slika 2), da bi preizkusil ta primer.
Ko sem ga priključil in uporabil ukaz lsusb, sem videl, da je na seznamu naveden kodek PCM2709, ki je USB avdio kodek Texas Instruments, uporabljen v mikrofonu. Pri izvajanju tega primera je dnevnik zagona aplikacije prikazal naslednje:
Init Microphone with device USB_MIC_1, sr 16000, 1 channel format S16_LE period size 1024
USB Microphone found [plughw:CARD=device, DEV=0
microphone connected successfully
Ta primer je uspešno zaznal frazo „Hey Arduino“ in prikazal gibljiv vzorec na zaslonu Uno Q 13 x 8 LED. Ugotovil sem, da se ni napačno sprožil ob nekaterih drugih besedah, ki sem jih izgovoril, ampak se je odzval samo na „Arduino“. Upoštevajte, da ta primer, kot tudi drugi, ki so potrebovali USB periferno napravo, sploh ne bi začel procesa »gradnje« (ki se začne, ko v App Lab kliknete »Run«), če ne bi bila zaznana ustrezna naprava. V tem primeru se je takoj pred izvedbo prevajanja/povezovanja/itd. v zavihku App Launch prikazalo sporočilo o napaki. To je lepa funkcija.
Zaznavanje slik
Ta primer ne potrebuje dodanih zunanjih naprav. Uporablja web-ui brick, ki služi spletni strani tako, da primemo/odložimo sliko v okno na nadzorni plošči. Brick z imenom objectdetectionje uporabljen za identifikacijo objekta(ov) v sliki, ki ste jo odložili v nadzorno ploščo. Preizkusil sem ga na slikah nekaterih običajnih predmetov in živali in je deloval precej dobro. Slika 3 prikazuje nadzorno ploščo, ki kaže pozitivno identifikacijo avtomobila.
Na žalost je identifikacijska oznaka težko berljiva zaradi temno sivega ozadja in zelenih črk. Zato mi boste morali verjeti, ko pravim, da je avtomobil identificiral z 92,9-odstotno stopnjo zaupanja. Na voljo je drsnik, s katerim lahko nastavite želeno vrednost spremenljivke zanesljivosti. Ko sem jo nastavil na 95 % ali več, identifikacija ni bila izvedena, kar se ujema z vrednostjo 92,9 %, ki je bila prvotno prikazana.
Brick z imenom objectdetection lahko deluje na slikovnih datotekah JPEG, JPG in PNG ter ustvari zelene okvirje okoli objekta. Ta brick, tako kot drugi ML/AI bricki, uporablja lokalni algoritem in lokalno shranjene modelne datoteke. Čeprav je lahko identificiral nekatere slike, ki sem jih poskusil, ni mogel identificirati nekaterih živali, ki sem jih poskusil – razen psov in mačk. Če bi sliko samo poslal na velik strežnik v oblaku in poročal o rezultatih zaznave, bi lahko precej lažje prepoznal različne stvari.
Kvaliteta zraka na LED matriki
To je še en primer, ki ne potrebuje zunanje strojne opreme. Podatke o kakovosti zraka in vremenu pridobiva iz odprte platforme za podatke o kakovosti zraka. Ne uporablja nobenih brickov, ampak Pythonovo WiFi zmogljivost za izvedbo GET zahtevka na naslednji URL:
https://api.waqi.info/feed/{city}/?token={API_TOKEN}
Če zgolj naložite in zaženete primer, boste na LED matriki Uno Q videli ikono smehljajočega se obraza. Vendar to nima pomena, saj morata biti vaše mesto in API žeton opredeljena, preden ta stran vrne kakršne koli podatke. Ker so vsi primeri samo za branje, morate ustvariti kopijo tega primera. Nato morate iti na spodnji URL naslov, da pridobite svoj API ključ:
https://aqicn.org/data-platform/token/
Za pridobitev tega ključa potrebujete le veljaven e-poštni naslov (na katerega boste prejeli e-poštno sporočilo za potrditev njegove veljavnosti) in svoje ime. Prejeli boste dolg niz znakov Hex za API ključ, ki ga vnesete v 11. vrstico datoteke main.py (pod zavihkom Python), pri čemer ne pozabite, da ga obdate z narekovaji. Nato v 13. vrstico vnesite svoje mesto.
Ko se program zažene, bi morali videti nekakšno ikono obraza. V zavihku Console/Python bi morali videti zadnji vnos „app running” (aplikacija teče). Če tega ne vidite, ampak namesto tega vidite „API Error: {‚status‘: ‚error‘, ‚data‘: ‚Invalid key‘}” (Napaka API: {‚status‘: ‚napaka‘, ‚data‘: ‘neveljaven ključ}), ste naredili napako pri kopiranju API žetona. Pomen vseh 6 ikon obrazov je naveden v datoteki readme.md, skupaj z drugimi navodili.
Upoštevajte, da ta storitev v oblaku zagotavlja veliko več podatkov, kot jih uporablja/zbira ta primer. Primer le preslika spremenljivko onesnaženosti v 6 ikon obrazov, ki se prikažejo na LED matriki plošče Uno Q. Spletna stran vrne številčne vrednosti za PM10, PM25 (verjetno se nanaša na PM2,5), CO, H, NO2, O3, SO2 ter nekatere druge, ki jih nisem mogel razvozlati. Kolikor lahko sodim, ta primer niti ne zbira teh drugih vrednosti, ampak le analizira vrnjeni JSON zapis za želeno število onesnaženja.
Utripanje LED-ice z UI
To je nekoliko bolj zapleten primer kot običajna skica utripanja LED-ice. Program Python gosti spletno stran, ki prikazuje LED tipko. Ko jo pritisnete, pošlje sporočilo mikrokontrolerju STM32U585 prek RPC klica. STM32U585 preklopi rdečo LED-ico, ki je priključena na ploščo Uno Q. Enako delovanje bi lahko dosegel z ESP32, pri čemer bi porabil manj kode!
Razvrščevalnik oseb na kameri
Ta primer bo identificiral ljudi v živo iz USB kamere. Uporablja web_UI brick za gostovanje spletne strani, ki deluje kot nadzorna plošča. Vnesete lahko stopnjo zanesljivosti, da filtrirate rezultate. Ker sem imel samo USB mikroskop in ne kamere, sem to preizkusil na zelo stari fotografiji moje mame. Kot lahko vidite na sliki 4, jo je zaznal z zanesljivostjo v visokem devetdesetodstotnem razponu.
Algoritem strojnega učenja in datoteke modela so shranjeni v pomnilniku eMMC plošče Uno Q, kar pomeni, da ne uporablja zunanje storitve v oblaku. Ni dokumentacije, ki bi navajala lokacijo algoritma ali datotek modela v datotečnem prostoru eMMC.


Nadzor in shranjevanje klime v domu
Za ta primer potrebujete modul Arduino Modulino Thermo. Ta modul vsebuje senzor HS3003 za merjenje temperature in vlažnosti ter se poveže z Uno Q prek I2C in kabla Qwiic. Sam tega modula nimam, vendar ne bi bilo preveč težko spremeniti datoteko sketch.ino, da bi delovala s podobnim senzorjem, kot je Silicon Labs SI7021, ki sem ga uporabil in ki prav tako uporablja I2C.
Ta primer uporablja dbstorage_tsstore brick, da shrani, bere in obdeluje podatke, ki so opremljeni z datumom.
Podatki z merilnika pospeška v realnem času
Za ta primer je potreben modul Arduino Modulino Movement. Ta modul vsebuje 6-osni senzor LSM6DSOX (pospeškomer + žiroskop) in se povezuje z Uno Q prek I2C in Qwiic kabla. Nisem imel tega modula, zato nisem mogel preizkusiti tega primera. Ta primer uporablja z motion_detection in web_ui brick-i.
Simulator Theremin
Ta primer simulira glasbeni instrument Theremin. Takšen instrument morda ni znan mnogim uporabnikom, vendar je elektronski instrument, ki proizvaja ton s frekvenco (višino), sorazmeren z bližino roke pri RF anteni. Glasnost tega tona je sorazmerna z bližino druge roke drugi anteni.
Ta primer ne uporablja nobene strojne opreme, razen USB zvočnika, ampak grafično simulira dve anteni na spletni nadzorni plošči, kot je prikazano na sliki 5.
Uporablja Wave Generator brick, ki ima naslednje lastnosti:
generira avdio signale v realnem času,
omogoča sinusne, pravokotne, žaga in trikotne signale,
nastavljati je možno frekvenco in amplitudo,
nastavljati je možno “attack” in “release” tona in omogoča prehod med notami (portamento).
Deluje neprekinjeno v ozadju in proizvaja avdio bloke z enakomerno hitrostjo s konfigurabilnimi parametri ovojnice za profesionalno zvenečo sintezo. V tem primeru morate za proizvodnjo zvokov priključiti USB zvočnik ali slušalke. Kupil sem USB adapter za 10 dolarjev na Amazonu, kot je prikazano na sliki 6.
Opazil sem nekaj nenavadnega. Če je bil ta USB adapter priključen ob vklopu (ali ponovnem zagonu) Uno Q, je Uno Q moj HDMI monitor prepoznal kot zaslon z nizko ločljivostjo (približno 640 x 480) namesto njegove dejanske ločljivosti 2640 x 1440. Če pa je bil priključen po vklopu in zagonu Uno Q, je zaslon deloval brez težav. Z uporabo lsusb se prikaže kot generična USB avdio naprava AB13X.
Upoštevajte, da ta primer ne pošilja digitalnega zvoka prek HDMI vmesnika na priključenem USB-C hubu. Torej v načinu SBC ne boste slišali zvoka prek HDMI monitorja.
Vendar Uno Q uporablja čip za upravljanje napajanja PM4125, ki vsebuje digitalni avdio kodek. Analogni linijski izhodi, izhod za slušalke in vhod za mikrofon so priključeni na JMISC priključek z visoko gostoto. To ne bo zlahka dostopno, dokler Arduino ne izda nosilne plošče za Uno Q.
Zaključek 2. dela
V zadnjem delu članka bom podal nekaj komentarjev glede drugih programskih primerov, ki so na voljo. Pokazal bom, kako je z nadgradnjami Uno Q, kako namestiti ADB programe, predstavil bom tudi naprednejše programiranje klicev oddaljenih postopkov.
