Daljinsko upravljanje MicroPythonom: mpremote

Alat naredbenog retka mpremote pruža integrirani skup uslužnih programa za daljinsku interakciju, upravljanje datotečnim sustavom i automatizaciju MicroPython uređaja putem serijske veze. Radi sa svim OpenMV Cam uređajima preko njihove USB serijske veze i predstavlja alternativu naredbenog retka za OpenMV IDE namijenjenu izradi skripti i radnim tokovima automatizacije.

Da biste koristili mpremote, prvo ga instalirajte putem pip-a:

$ pip install --user mpremote

Ili putem pipx:

$ pipx install mpremote

Najjednostavniji način za korištenje ovog alata je da ga jednostavno pozovete bez ikakvih argumenata:

$ mpremote

Ova naredba automatski otkriva i povezuje se s prvim dostupnim USB serijskim uređajem te pruža interaktivni terminal koji možete koristiti za pristup REPL-u i izlazu vašeg programa. Serijski portovi otvaraju se u isključivom načinu rada, pa će pokretanje druge (ili treće, itd.) instance alata mpremote povezati uređaj sa sljedećim serijskim uređajima, ako su dostupni.

Dodatno, pipx vam također omogućuje da izravno pokrenete mpremote bez prethodne instalacije:

$ pipx run mpremote ...args

Naredbe

mpremote podržava zadavanje niza naredbi u naredbenom retku koje će redoslijedom izvršiti razne radnje na udaljenom MicroPython uređaju. Pogledajte odjeljak s primjerima u nastavku kako biste stekli predodžbu o tome kako to funkcionira te za neke uobičajene kombinacije naredbi.

Svaka naredba je oblika <command name> [--options] [args...]. Za naredbe koje podržavaju više argumenata (npr. popis datoteka), popis argumenata može se završiti znakom +.

Ako naredba nije navedena, zadana naredba je repl. Dodatno, ako bilo koja naredba treba pristupiti uređaju, a ranije nije navedena nijedna naredba connect, tada se implicitno dodaje connect auto.

Kako bi se uređaj doveo u poznato stanje za bilo koju akcijsku naredbu (osim repl), nakon povezivanja mpremote će zaustaviti svaki pokrenuti program i izvršiti meko resetiranje uređaja prije pokretanja prve naredbe. To ponašanje možete kontrolirati pomoću naredbi resume i soft-reset. Za više pojedinosti pogledajte automatsko povezivanje i automatsko meko resetiranje.

Može se navesti više naredbi i one će se izvršavati uzastopno.

Cijeli popis podržanih naredbi je:

connect

Povezivanje s navedenim uređajem prema imenu:

$ mpremote connect <device>

<device> može biti jedan od:

  • list: popis dostupnih uređaja

  • auto: povezivanje s prvim dostupnim USB serijskim portom

  • id:<serial>: povezivanje s uređajem koji ima USB serijski broj <serial> (drugi stupac u izlazu naredbe connect list)

  • port:<path>: povezivanje s uređajem na zadanoj putanji (prvi stupac u izlazu naredbe connect list

  • rfc2217://<host>:<port>: povezivanje s uređajem korištenjem serijske veze preko TCP-a (npr. mrežni serijski port temeljen na RFC2217)

  • bilo koje valjano ime/putanja uređaja, za povezivanje s tim uređajem

Napomena: Umjesto korištenja naredbe connect, postoji nekoliko unaprijed definiranih prečaca za uobičajene putanje uređaja. Na primjer, naredba prečaca a0 ekvivalentna je naredbi connect /dev/ttyACM0 (Linux), ili c1 za COM1 (Windows).

Napomena: Opcija auto otkriva samo USB serijske portove, tj. serijske portove koji imaju pridruženi USB VID/PID (npr. CDC/ACM ili FTDI uređaji). Ostale vrste serijskih portova neće biti automatski otkrivene.

disconnect

Prekid veze s trenutnim uređajem:

$ mpremote disconnect

Nakon prekida veze, omogućeno je automatsko meko resetiranje.

resume

Zadržavanje postojećeg stanja interpretera za sljedeće naredbe:

$ mpremote resume

Ovo onemogućuje automatsko meko resetiranje. Korisno je ako želite pokrenuti sljedeću naredbu na ploči bez prethodnog mekog resetiranja.

soft-reset

Izvođenje mekog resetiranja uređaja:

$ mpremote soft-reset

Ovo će isprazniti Python heap i ponovno pokrenuti interpreter. Također sprječava sljedeću naredbu da pokrene automatsko meko resetiranje.

repl

Ulazak u REPL na povezanom uređaju:

$ mpremote repl [--options]

Opcije su:

  • --escape-non-printable, za ispis bajtova/znakova koji se ne mogu ispisati u obliku njihovog heksadecimalnog koda

  • --capture <file>, za bilježenje izlaza REPL sesije u zadanu datoteku

  • --inject-code <string>, za određivanje znakova koji se umeću u REPL kada se pritisne Ctrl-J. To vam omogućuje automatizaciju uobičajene naredbe.

  • --inject-file <file>, za određivanje datoteke koja se umeće u REPL kada se pritisne Ctrl-K. To vam omogućuje pokretanje datoteke (npr. one koja sadrži koristan kôd za postavljanje, ili čak programa na kojem trenutno radite).

Dok je naredba repl pokrenuta, možete koristiti Ctrl-] ili Ctrl-x za izlaz.

Napomena: Naziv „REPL” ovdje odražava uobičajenu uporabu ove naredbe za pristup petlji Read Eval Print Loop koja se izvodi na MicroPython uređaju. Strogo govoreći, naredba repl funkcionira samo kao terminal (ili „serijski monitor”) za pristup uređaju. Budući da ova naredba ne pokreće ponašanje automatskog resetiranja, to znači da ako se program trenutno izvodi, prvo ćete ga morati prekinuti pomoću Ctrl-C kako biste došli do REPL-a, što vam zatim omogućuje pristup stanju programa. Također možete koristiti mpremote soft-reset repl kako biste dobili „čisti” REPL s obrisanim cijelim stanjem programa.

eval

Procjena i ispis rezultata Python izraza:

$ mpremote eval <string>

exec

Izvršavanje zadanog Python koda:

$ mpremote exec <string>

Prema zadanim postavkama, mpremote exec će prikazati svaki izlaz izraza dok se on ne završi. Zastavica --no-follow može se navesti za trenutni povratak, ostavljajući uređaj da izvodi izraz u pozadini.

run

Pokretanje skripte iz lokalnog datotečnog sustava:

$ mpremote run <file.py>

Ovo će izvršiti datoteku izravno iz RAM-a na uređaju bez kopiranja u datotečni sustav. To je vrlo koristan način za iterativni razvoj jednog dijela koda bez brige o njegovom postavljanju u datotečni sustav.

Prema zadanim postavkama, mpremote run će prikazati svaki izlaz skripte dok se ona ne završi. Zastavica --no-follow može se navesti za trenutni povratak, ostavljajući uređaj da izvodi skriptu u pozadini.

fs

Izvršavanje naredbi datotečnog sustava na uređaju:

$ mpremote fs <sub-command>

<sub-command> može biti:

  • cat <file..> za prikaz sadržaja datoteke ili datoteka na uređaju

  • ls za popis trenutnog direktorija

  • ls <dirs...> za popis zadanih direktorija

  • cp [-rf] <src...> <dest> za kopiranje datoteka

  • rm [-r] <src...> za uklanjanje datoteka ili mapa na uređaju

  • mkdir <dirs...> za stvaranje direktorija na uređaju

  • rmdir <dirs...> za uklanjanje direktorija na uređaju

  • touch <file..> za stvaranje datoteka (ako već ne postoje)

  • sha256sum <file..> za izračun SHA256 sume datoteka

  • tree [-vsh] <dirs...> za ispis stabla zadanih direktorija

Naredba cp koristi konvenciju u kojoj vodeća : predstavlja udaljenu putanju. Bez vodeće : označava lokalnu putanju. To se temelji na konvenciji koju koristi klijent Secure Copy Protocol (scp).

Tako na primjer, mpremote fs cp main.py :main.py kopira main.py iz trenutnog lokalnog direktorija u udaljeni datotečni sustav, dok mpremote fs cp :main.py main.py kopira main.py s uređaja natrag u trenutni direktorij.

Naredba mpremote rm -r prihvaća i relativne i apsolutne putanje. Koristite : za upućivanje na trenutni udaljeni radni direktorij (cwd) kako biste omogućili uklanjanje stabla direktorija sa zadane putanje uređaja (npr. /flash, /). Koristite -v/--verbose kako biste vidjeli datoteke koje se uklanjaju.

Na primjer:

  • mpremote rm -r :libs će ukloniti direktorij libs i sve njegove podstavke s uređaja.

  • mpremote rm -rv :/sd će ukloniti sve datoteke s montirane SD kartice i rezultirati neblokirajućim upozorenjem. Montiranje će se zadržati.

  • mpremote rm -rv :/ će ukloniti sve datoteke na uređaju, uključujući i one smještene u montiranim vfs sustavima poput /sd ili /flash. Nakon uklanjanja svih mapa i datoteka, ovo će također vratiti pogrešku kako bi oponašalo ponašanje unix naredbe rm -rf /.

Upozorenje

Ne postoji podržan način za vraćanje datoteka uklonjenih naredbom mpremote rm -r :. Koristite uz oprez.

Naredba tree će ispisati stablo zadanih direktorija. Korištenjem opcije --size/-s ispisat će se veličina svake datoteke, ili koristite --human/-h za čitljiviji format. Napomena: Veličina direktorija ispisuje se samo kada datotečni sustav uređaja prijavi veličinu različitu od nule. Opcija -v može se koristiti za uključivanje imena serijskog uređaja u izlaz.

Sve ostale naredbe implicitno pretpostavljaju da je putanja udaljena, ali : se može opcionalno koristiti radi jasnoće.

Sve podnaredbe datotečnog sustava primaju više argumenata putanja, pa ako u nizu postoji još jedna naredba, morate koristiti + za završetak argumenata, npr.

$ mpremote fs cp main.py :main.py + repl

Ovo će kopirati datoteku na uređaj, a zatim ući u REPL. Znak + sprječava da se "repl" protumači kao putanja.

Naredba cp podržava opciju -r za rekurzivno kopiranje. Prema zadanim postavkama cp će preskočiti kopiranje datoteka na udaljeni uređaj ako se SHA256 hash izvorne i odredišne datoteke podudaraju. Za prisilno kopiranje bez obzira na hash koristite opciju -f.

Napomena: Radi praktičnosti, sve podnaredbe datotečnog sustava također su navedene kao alias regularnih naredbi, tj. možete napisati mpremote cp ... umjesto mpremote fs cp ....

df

Upit o slobodnom/iskorištenom prostoru uređaja:

$ mpremote df

Naredba df će ispisati statistiku veličine/iskorištenosti/slobodnog prostora za datotečni sustav uređaja, slično unix naredbi df.

edit

Uređivanje datoteke na uređaju:

$ mpremote edit <files...>

Naredba edit će kopirati svaku datoteku s uređaja u lokalni privremeni direktorij, a zatim pokrenuti vaš uređivač za svaku datoteku (definiran varijablom okruženja $EDITOR). Ako uređivač uspješno završi, ažurirana datoteka kopirat će se natrag na uređaj.

mip

Instaliranje paketa iz micropython-lib (ili s GitHuba) pomoću alata mip:

$ mpremote mip install <packages...>

Pogledajte Upravljanje paketima za više informacija.

mount

Montiranje lokalnog direktorija na udaljeni uređaj:

$ mpremote mount [options] <local-dir>

Ovo omogućuje udaljenom uređaju da vidi lokalni direktorij domaćina kao da je njegov vlastiti datotečni sustav. To je korisno za razvoj i izbjegava potrebu za kopiranjem datoteka na uređaj dok radite na njima.

Uređaj instalira upravljački program datotečnog sustava, koji se zatim montira u VFS uređaja kao /remote, a koji koristi serijsku vezu s alatom mpremote kao bočni kanal za pristup datotekama. Uređaju će trenutni radni direktorij (putem os.chdir) biti postavljen na /remote tako da će se uvozi i pristup datotekama odvijati ondje umjesto na zadanoj putanji datotečnog sustava dok je montiranje aktivno.

Napomena: Ako naredbu mount ne slijedi druga radnja u nizu, na kraj niza implicitno će se dodati naredba repl.

Tijekom korištenja, Ctrl-D će pokrenuti meko resetiranje kao i obično, ali će se montiranje automatski ponovno povezati. Međutim, ako jedinica ima main.py koji se pokreće pri pokretanju, ponovno montiranje ne može se dogoditi. U tom slučaju može se koristiti meko ponovno pokretanje u sirovom načinu rada: Ctrl-A Ctrl-D za ponovno pokretanje, zatim Ctrl-B za povratak na normalan repl, u kojem će trenutku montiranje biti spremno.

Opcije su:

  • -l, --unsafe-links: Prema zadanim postavkama bit će prijavljena pogreška ako uređaj pristupi datoteci ili direktoriju koji je izvan (jednu ili više razina direktorija iznad) lokalnog direktorija koji je montiran. Ova opcija onemogućuje tu provjeru za simboličke poveznice, omogućujući uređaju da slijedi simboličke poveznice izvan lokalnog direktorija.

unmount

Odmontiravanje lokalnog direktorija s udaljenog uređaja:

$ mpremote umount

Ovo se događa automatski kada se mpremote završi, ali se može koristiti u nizu za odmontiravanje ranijeg montiranja prije pokretanja sljedećih naredbi.

romfs

Upravljanje ROMFS particijama na uređaju:

$ mpremote romfs <sub-command>

<sub-command> može biti:

  • romfs query za popis svih dostupnih ROMFS particija i njihove veličine

  • romfs [-o <output>] build <source> za stvaranje ROMFS slike iz zadanog izvornog direktorija; zadana izlazna datoteka je izvor s dodatkom .romfs

  • romfs [-p <partition>] deploy <source> za postavljanje ROMFS slike na uređaj; također će stvoriti privremenu ROMFS sliku ako je izvor direktorij

Podnaredbe build i deploy obje podržavaju opciju -m/--mpy za automatsko prevođenje .py datoteka u .mpy pri stvaranju ROMFS slike. Ova je opcija omogućena prema zadanim postavkama, ali radi samo ako je instaliran Python paket mpy_cross (npr. putem pip install mpy_cross). Ako paket nije instaliran, ispisuje se upozorenje i .py datoteke ostaju nepromijenjene. Prevođenje .py datoteka može se onemogućiti opcijom --no-mpy.

rtc

Postavljanje/dohvaćanje sata uređaja (RTC):

$ mpremote rtc

Ovo će uputiti upit RTC-u uređaja o trenutnom vremenu i ispisati ga kao datetime tuple.

$ mpremote rtc --set

Ovo će postaviti RTC uređaja na trenutno vrijeme glavnog računala.

sleep

Spavanje (odgoda) prije izvršavanja sljedeće naredbe:

$ mpremote sleep 0.5

Ovo će pauzirati izvršavanje niza naredbi za navedeno trajanje u sekundama, npr. kako bi se pričekalo da uređaj nešto napravi.

reset

Tvrdo resetiranje uređaja:

$ mpremote reset

Napomena: tvrdo resetiranje ekvivalentno je machine.reset().

bootloader

Ulazak u pokretač (bootloader):

$ mpremote bootloader

Ovo će natjerati uređaj da uđe u svoj pokretač (bootloader). Pokretač je specifičan za pojedinu ploču — pogledajte odjeljak Recovery and debug pins u brzom pregledu vaše ploče za pojedinosti.

Automatsko povezivanje i meko resetiranje

Povezivanje i prekid veze obavljaju se automatski na početku i kraju izvršavanja alata, ako takve naredbe nisu izričito zadane. Automatsko povezivanje će tražiti prvi dostupni USB serijski uređaj.

Nakon povezivanja s uređajem, mpremote će automatski izvršiti meko resetiranje uređaja ako je potrebno. To prazni Python heap i ponovno pokreće interpreter, osiguravajući da se sljedeći Python kôd izvršava u svježem okruženju. Automatsko meko resetiranje izvodi se prvi put kada se izvrši jedna od sljedećih naredbi: mount, eval, exec, run, fs. Nakon prvog mekog resetiranja, ono se neće ponovno automatski izvoditi sve dok se ne izda naredba disconnect.

Ponašanje automatskog mekog resetiranja može se kontrolirati naredbom resume. To može biti korisno za korištenje naredbe eval za pregled stanja uređaja. Naredba soft-reset može se koristiti za izvođenje izričitog mekog resetiranja usred niza naredbi.

Prečaci

Prečaci se mogu definirati pomoću sustava makronaredbi. Ugrađeni prečaci su:

  • devs: Alias za connect list

  • a0, a1, a2, a3: Aliasi za connect /dev/ttyACMn

  • u0, u1, u2, u3: Aliasi za connect /dev/ttyUSBn

  • c0, c1, c2, c3: Aliasi za connect COMn

  • cat, edit, ls, cp, rm, mkdir, rmdir, touch: Aliasi za fs <sub-command>

Dodatni prečaci mogu se definirati u korisničkoj konfiguracijskoj datoteci mpremote/config.py, smještenoj u korisničkom konfiguracijskom direktoriju. Ispravna lokacija za svaki OS određuje se pomoću modula platformdirs.

To je obično: - $XDG_CONFIG_HOME/mpremote/config.py - $HOME/.config/mpremote/config.py - $env:LOCALAPPDATA/mpremote/config.py

Datoteka config.py trebala bi definirati rječnik pod nazivom commands. Ključevi tog rječnika su prečaci, a vrijednosti su ili niz znakova ili popis nizova znakova:

"c33": "connect id:334D335C3138",

Naredba c33 zamjenjuje se s connect id:334D335C3138.

"test": ["mount", ".", "exec", "import test"],

Naredba test zamjenjuje se s mount . exec "import test".

Prečaci također mogu prihvaćati argumente. Na primjer:

"multiply x=4 y=7": "eval x*y",

Pokretanje mpremote multiply 3 7 postavit će x i y kao varijable na uređaju, a zatim procijeniti izraz x*y.

Primjer datoteke config.py mogao bi izgledati ovako:

commands = {
    "c33": "connect id:334D335C3138", # Connect to a specific device by ID.
    "bl": "bootloader", # Shorter alias for bootloader.
    "double x=4": "eval x*2",  # x is an argument, with default 4
    "wl_scan": ["exec", """
import network
wl = network.WLAN()
wl.active(1)
for ap in wl.scan():
    print(ap)
""",], # Print out nearby WiFi networks.
    "wl_ipconfig": [
"exec",
"import network; sta_if = network.WLAN(network.WLAN.IF_STA); print(sta_if.ipconfig('addr4'))",
], # Print ip address of station interface.
    "test": ["mount", ".", "exec", "import test"], # Mount current directory and run test.py.
    "demo": ["run", "path/to/demo.py"], # Execute demo.py on the device.
}

Primjeri

mpremote

Povezivanje s prvim dostupnim uređajem i implicitno pokretanje naredbe repl.

mpremote a1

Povezivanje s uređajem na /dev/ttyACM1 (Linux) i implicitno pokretanje naredbe repl. Pogledajte prečace gore.

mpremote c1

Povezivanje s uređajem na COM1 (Windows) i implicitno pokretanje naredbe repl. Pogledajte prečace gore.

mpremote connect /dev/ttyUSB0

Izričito navođenje uređaja s kojim se povezuje i, kao gore, implicitno pokretanje naredbe repl.

mpremote a1 ls

Povezivanje s uređajem na /dev/ttyACM1 i zatim pokretanje naredbe ls.

Ekvivalentno je mpremote connect /dev/ttyACM1 fs ls.

mpremote exec "import micropython; micropython.mem_info()"

Pokretanje navedene Python naredbe i prikaz svakog izlaza. Ovo je ekvivalentno upisivanju naredbe na REPL upitu.

mpremote eval 1/2 eval 3/4

Procjena svakog izraza redom i ispis rezultata.

mpremote a0 eval 1/2 a1 eval 3/4

Procjena 1/2 na uređaju na /dev/ttyACM0, zatim 3/4 na uređaju na /dev/ttyACM1, uz ispis svakog rezultata.

mpremote resume exec "print_state_info()" soft-reset

Povezivanje s uređajem bez pokretanja mekog resetiranja i izvršavanje funkcije print_state_info() (npr. za pronalaženje informacija o trenutnom stanju programa), zatim pokretanje mekog resetiranja.

mpremote reset sleep 0.5 bootloader

Tvrdo resetiranje uređaja, čekanje 500 ms da postane dostupan, zatim ulazak u pokretač (bootloader).

mpremote cp utils/driver.py :utils/driver.py + run test.py

Ažuriranje kopije utils/driver.py na uređaju, zatim izvršavanje lokalne skripte test.py na uređaju. test.py se nikada ne kopira u datotečni sustav uređaja, nego se pokreće iz RAM-a.

mpremote cp utils/driver.py :utils/driver.py + exec "import app"

Ažuriranje kopije utils/driver.py na uređaju, zatim izvršavanje app.py na uređaju.

Ovo je uobičajen razvojni radni tok za ažuriranje jedne datoteke i zatim ponovno pokretanje programa. U ovom scenariju, vaš main.py na uređaju također bi sadržavao import app.

mpremote cp utils/driver.py :utils/driver.py + soft-reset repl

Ažuriranje kopije utils/driver.py na uređaju, zatim pokretanje mekog resetiranja za ponovno pokretanje programa, a zatim praćenje izlaza putem naredbe repl.

mpremote cp -r utils/ :utils/ + soft-reset repl

Isto kao gore, ali prvo ažurirajte cijeli direktorij utils.

mpremote mount .

Montiranje trenutnog lokalnog direktorija na /remote na uređaju i pokretanje repl sesije koja će koristiti /remote kao radni direktorij.

mpremote mount . exec "import demo"

Nakon montiranja trenutnog lokalnog direktorija, izvršava demo.py iz montiranog direktorija.

mpremote mount app run test.py

Nakon montiranja lokalnog direktorija app kao /remote na uređaju, izvršava lokalni test.py iz trenutnog direktorija domaćina bez kopiranja u datotečni sustav.

mpremote mount . repl --inject-code "import demo"

Nakon montiranja trenutnog lokalnog direktorija, izvršava demo.py iz montiranog direktorija svaki put kada se pritisne Ctrl-J.

Prvo ćete morati pritisnuti Ctrl-D za resetiranje stanja interpretera (što će sačuvati montiranje) prije nego što pritisnete Ctrl-J za ponovni uvoz demo.py.

mpremote mount app repl --inject-file demo.py

Isto kao gore, ali izvršava sadržaj lokalne datoteke demo.py na REPL-u svaki put kada se pritisne Ctrl-K. Kao gore, prvo koristite Ctrl-D za resetiranje stanja interpretera.

mpremote cat boot.py

Prikazuje sadržaj boot.py na uređaju.

mpremote edit utils/driver.py

Uređivanje utils/driver.py na uređaju pomoću vašeg lokalnog $EDITOR-a.

mpremote cp :main.py .

Kopiranje main.py s uređaja u lokalni direktorij.

mpremote cp main.py :

Kopiranje main.py iz lokalnog direktorija na uređaj.

mpremote cp :a.py :b.py

Kopiranje a.py na uređaju u b.py na uređaju.

mpremote cp -r dir/ :

Rekurzivno kopiranje lokalnog direktorija dir na udaljeni uređaj.

mpremote cp a.py b.py : + repl

Kopiranje a.py i b.py iz lokalnog direktorija na uređaj, zatim pokretanje naredbe repl.

mpremote mip install aioble

Instaliranje paketa aioble iz micropython-lib na uređaj. Pogledajte Upravljanje paketima.

mpremote mip install github:org/repo@branch

Instaliranje paketa s navedene grane na org/repo na GitHubu na uređaj. Pogledajte Upravljanje paketima.

mpremote mip install gitlab:org/repo@branch

Instaliranje paketa s navedene grane na org/repo na GitLabu na uređaj. Pogledajte Upravljanje paketima.

mpremote mip install --target /flash/third-party functools

Instaliranje paketa functools iz micropython-lib u direktorij /flash/third-party na uređaju. Pogledajte Upravljanje paketima.