Control la distanță MicroPython: mpremote¶
Instrumentul de linie de comandă mpremote oferă un set integrat de utilitare pentru a interacționa la distanță cu un dispozitiv MicroPython, a gestiona sistemul său de fișiere și a-l automatiza printr-o conexiune serială. Funcționează cu toate camerele OpenMV Cam prin conexiunea lor serială USB și este o alternativă în linie de comandă la OpenMV IDE pentru fluxurile de lucru de scriptare și automatizare.
Pentru a folosi mpremote, instalați-l mai întâi prin pip:
$ pip install --user mpremote
Sau prin pipx:
$ pipx install mpremote
Cel mai simplu mod de a folosi acest instrument este pur și simplu invocându-l fără niciun argument:
$ mpremote
Această comandă detectează și se conectează automat la primul dispozitiv serial USB disponibil și oferă un terminal interactiv pe care îl puteți folosi pentru a accesa REPL-ul și ieșirea programului dvs. Porturile seriale sunt deschise în mod exclusiv, astfel încât rularea unei a doua (sau a treia etc.) instanțe a mpremote se va conecta la dispozitivele seriale ulterioare, dacă sunt disponibile.
În plus, pipx vă permite, de asemenea, să rulați direct mpremote fără a-l instala mai întâi:
$ pipx run mpremote ...args
Comenzi¶
mpremote acceptă primirea unei serii de comenzi date în linia de comandă, care vor efectua diverse acțiuni în succesiune pe un dispozitiv MicroPython la distanță. Consultați secțiunea de exemple de mai jos pentru a vă face o idee despre cum funcționează acest lucru și pentru câteva combinații obișnuite de comenzi.
Fiecare comandă are forma <command name> [--options] [args...]. Pentru comenzile care acceptă mai multe argumente (de exemplu, o listă de fișiere), lista de argumente poate fi terminată cu +.
Dacă nu se specifică nicio comandă, comanda implicită este repl. În plus, dacă orice comandă are nevoie să acceseze dispozitivul și nu a fost specificat anterior niciun connect, atunci se adaugă un connect auto implicit.
Pentru a aduce dispozitivul într-o stare cunoscută pentru orice comandă de acțiune (cu excepția repl), după conectare mpremote va opri orice program care rulează și va efectua un soft-reset asupra dispozitivului înainte de a rula prima comandă. Puteți controla acest comportament folosind comenzile resume și soft-reset. Consultați auto-conectarea și auto-soft-reset pentru mai multe detalii.
Pot fi specificate mai multe comenzi, iar acestea vor fi rulate secvențial.
Lista completă a comenzilor acceptate este:
connect¶
Se conectează la dispozitivul specificat după nume:
$ mpremote connect <device>
<device> poate fi unul dintre:
list: listează dispozitivele disponibileauto: se conectează la primul port serial USB disponibilid:<serial>: se conectează la dispozitivul cu numărul serial USB<serial>(a doua coloană din ieșirea comenziiconnect list)port:<path>: se conectează la dispozitivul cu calea dată (prima coloană din ieșirea comenziiconnect listrfc2217://<host>:<port>: se conectează la dispozitiv folosind conexiunea serială prin TCP (de exemplu, un port serial în rețea bazat pe RFC2217)orice nume/cale de dispozitiv valid(ă), pentru a vă conecta la acel dispozitiv
Notă: În locul folosirii comenzii connect, există mai multe scurtături predefinite pentru căi de dispozitive obișnuite. De exemplu, comanda scurtătură a0 este echivalentă cu connect /dev/ttyACM0 (Linux), sau c1 pentru COM1 (Windows).
Notă: Opțiunea auto va detecta doar porturile seriale USB, adică un port serial care are asociat un VID/PID USB (adică dispozitive de tip CDC/ACM sau FTDI). Alte tipuri de porturi seriale nu vor fi detectate automat.
disconnect¶
Deconectează dispozitivul curent:
$ mpremote disconnect
După o deconectare, auto-soft-reset este activat.
resume¶
Menține starea existentă a interpretorului pentru comenzile ulterioare:
$ mpremote resume
Acest lucru dezactivează auto-soft-reset. Este util dacă doriți să rulați o comandă ulterioară pe o placă fără a efectua mai întâi un soft-reset asupra acesteia.
soft-reset¶
Efectuează un soft-reset al dispozitivului:
$ mpremote soft-reset
Acest lucru va goli heap-ul Python și va reporni interpretorul. De asemenea, împiedică comanda ulterioară să declanșeze auto-soft-reset.
repl¶
Intră în REPL pe dispozitivul conectat:
$ mpremote repl [--options]
Opțiunile sunt:
--escape-non-printable, pentru a afișa octeții/caracterele neimprimabile sub forma codului lor hexazecimal--capture <file>, pentru a captura ieșirea sesiunii REPL în fișierul dat--inject-code <string>, pentru a specifica caractere de injectat în REPL când se apasăCtrl-J. Acest lucru vă permite să automatizați o comandă obișnuită.--inject-file <file>, pentru a specifica un fișier de injectat în REPL când se apasăCtrl-K. Acest lucru vă permite să rulați un fișier (de exemplu, conținând cod de configurare util, sau chiar programul la care lucrați în prezent).
În timp ce comanda repl rulează, puteți folosi Ctrl-] sau Ctrl-x pentru a ieși.
Notă: Numele „REPL” de aici reflectă utilizarea obișnuită a acestei comenzi pentru a accesa bucla Read Eval Print care rulează pe dispozitivul MicroPython. Strict vorbind, comanda repl funcționează doar ca un terminal (sau „monitor serial”) pentru a accesa dispozitivul. Deoarece această comandă nu declanșează comportamentul de auto-reset, aceasta înseamnă că, dacă un program rulează în prezent, va trebui mai întâi să-l întrerupeți cu Ctrl-C pentru a ajunge la REPL, ceea ce vă va permite apoi să accesați starea programului. Puteți, de asemenea, să folosiți mpremote soft-reset repl pentru a obține un REPL „curat”, cu toată starea programului golită.
eval¶
Evaluează și afișează rezultatul unei expresii Python:
$ mpremote eval <string>
exec¶
Execută codul Python dat:
$ mpremote exec <string>
În mod implicit, mpremote exec va afișa orice ieșire a expresiei până când aceasta se termină. Indicatorul --no-follow poate fi specificat pentru a reveni imediat și a lăsa dispozitivul să ruleze expresia în fundal.
run¶
Rulează un script din sistemul de fișiere local:
$ mpremote run <file.py>
Acest lucru va executa fișierul direct din RAM pe dispozitiv, fără a-l copia în sistemul de fișiere. Acesta este un mod foarte util de a itera asupra dezvoltării unei singure bucăți de cod fără a fi nevoie să vă preocupați de implementarea sa în sistemul de fișiere.
În mod implicit, mpremote run va afișa orice ieșire a scriptului până când acesta se termină. Indicatorul --no-follow poate fi specificat pentru a reveni imediat și a lăsa dispozitivul să ruleze scriptul în fundal.
fs¶
Execută comenzi de sistem de fișiere pe dispozitiv:
$ mpremote fs <sub-command>
<sub-command> poate fi:
cat <file..>pentru a afișa conținutul unui fișier sau al unor fișiere de pe dispozitivlspentru a lista directorul curentls <dirs...>pentru a lista directoarele datecp [-rf] <src...> <dest>pentru a copia fișiererm [-r] <src...>pentru a elimina fișiere sau foldere de pe dispozitivmkdir <dirs...>pentru a crea directoare pe dispozitivrmdir <dirs...>pentru a elimina directoare de pe dispozitivtouch <file..>pentru a crea fișierele (dacă nu există deja)sha256sum <file..>pentru a calcula suma SHA256 a fișierelortree [-vsh] <dirs...>pentru a afișa un arbore al directoarelor date
Comanda cp folosește o convenție în care un : la început reprezintă o cale la distanță. Fără un : la început înseamnă o cale locală. Aceasta se bazează pe convenția folosită de clientul Secure Copy Protocol (scp).
Astfel, de exemplu, mpremote fs cp main.py :main.py copiază main.py din directorul local curent în sistemul de fișiere la distanță, în timp ce mpremote fs cp :main.py main.py copiază main.py de pe dispozitiv înapoi în directorul curent.
Comanda mpremote rm -r acceptă atât căi relative, cât și absolute. Folosiți : pentru a face referire la directorul de lucru curent la distanță (cwd), pentru a permite eliminarea unui arbore de directoare din calea implicită a dispozitivului (de exemplu, /flash, /). Folosiți -v/--verbose pentru a vedea fișierele care sunt eliminate.
De exemplu:
mpremote rm -r :libsva elimina directorullibsși toate elementele sale subordonate de pe dispozitiv.mpremote rm -rv :/sdva elimina toate fișierele de pe un card SD montat și va genera un avertisment neblocant. Montarea va fi păstrată.mpremote rm -rv :/va elimina toate fișierele de pe dispozitiv, inclusiv pe cele aflate în sisteme vfs montate, precum/sdsau/flash. După eliminarea tuturor folderelor și fișierelor, aceasta va returna, de asemenea, o eroare pentru a imita comportamentul unixrm -rf /.
Atenționare
Nu există o modalitate acceptată de a recupera fișierele eliminate de mpremote rm -r :. Vă rugăm să folosiți cu precauție.
Comanda tree va afișa un arbore al directoarelor date. Folosirea opțiunii --size/-s va afișa dimensiunea fiecărui fișier, sau folosiți --human/-h pentru a utiliza un format mai ușor de citit de către oameni. Notă: Dimensiunea directorului este afișată doar atunci când o dimensiune diferită de zero este raportată de sistemul de fișiere al dispozitivului. Opțiunea -v poate fi folosită pentru a include numele dispozitivului serial în ieșire.
Toate celelalte comenzi presupun implicit că această cale este o cale la distanță, dar : poate fi folosit opțional pentru claritate.
Toate sub-comenzile de sistem de fișiere acceptă mai multe argumente de cale, așa că, dacă există o altă comandă în secvență, trebuie să folosiți + pentru a termina argumentele, de exemplu:
$ mpremote fs cp main.py :main.py + repl
Acest lucru va copia fișierul pe dispozitiv și apoi va intra în REPL. + împiedică interpretarea "repl" ca o cale.
Comanda cp acceptă opțiunea -r pentru a face o copie recursivă. În mod implicit, cp va omite copierea fișierelor pe dispozitivul la distanță dacă hash-ul SHA256 al fișierului sursă și al celui de destinație se potrivesc. Pentru a forța o copiere indiferent de hash, folosiți opțiunea -f.
Notă: Pentru comoditate, toate sub-comenzile de sistem de fișiere sunt, de asemenea, aliasate ca comenzi obișnuite, adică puteți scrie mpremote cp ... în loc de mpremote fs cp ....
df¶
Interoghează spațiul liber/folosit al dispozitivului:
$ mpremote df
Comanda df va afișa statistici de dimensiune/folosit/liber pentru sistemul de fișiere al dispozitivului, similar cu comanda Unix df.
edit¶
Editează un fișier de pe dispozitiv:
$ mpremote edit <files...>
Comanda edit va copia fiecare fișier de pe dispozitiv într-un director temporar local și apoi va lansa editorul dvs. pentru fiecare fișier (definit de variabila de mediu $EDITOR). Dacă editorul se închide cu succes, fișierul actualizat va fi copiat înapoi pe dispozitiv.
mip¶
Instalează pachete din micropython-lib (sau GitHub) folosind instrumentul mip:
$ mpremote mip install <packages...>
Consultați Gestionarea pachetelor pentru mai multe informații.
mount¶
Montează directorul local pe dispozitivul la distanță:
$ mpremote mount [options] <local-dir>
Acest lucru permite dispozitivului la distanță să vadă directorul gazdei locale ca și cum ar fi propriul său sistem de fișiere. Este util pentru dezvoltare și evită necesitatea de a copia fișiere pe dispozitiv în timp ce lucrați la ele.
Dispozitivul instalează un driver de sistem de fișiere, care este apoi montat în VFS-ul dispozitivului ca /remote, care folosește conexiunea serială către mpremote ca un canal secundar pentru a accesa fișierele. Dispozitivul își va seta directorul de lucru curent (prin os.chdir) la /remote, astfel încât importurile și accesarea fișierelor să aibă loc acolo în loc de calea implicită a sistemului de fișiere cât timp montarea este activă.
Notă: Dacă comanda mount nu este urmată de o altă acțiune în secvență, o comandă repl va fi adăugată implicit la sfârșitul secvenței.
În timpul utilizării, Ctrl-D va declanșa un soft-reset ca de obicei, dar montarea va fi reconectată automat. Totuși, dacă unitatea are un main.py care rulează la pornire, remontarea nu poate avea loc. În acest caz, poate fi folosită o repornire soft în mod raw: Ctrl-A Ctrl-D pentru a reporni, apoi Ctrl-B pentru a reveni la REPL-ul normal, moment în care montarea va fi gata.
Opțiunile sunt:
-l,--unsafe-links: În mod implicit, va fi generată o eroare dacă dispozitivul accesează un fișier sau un director care se află în afara (cu unul sau mai multe niveluri de director mai sus) directorului local care este montat. Această opțiune dezactivează această verificare pentru legăturile simbolice, permițând dispozitivului să urmărească legături simbolice în afara directorului local.
unmount¶
Demontează directorul local de pe dispozitivul la distanță:
$ mpremote umount
Acest lucru se întâmplă automat când mpremote se termină, dar poate fi folosit într-o secvență pentru a demonta o montare anterioară înainte de rularea comenzilor ulterioare.
romfs¶
Gestionează partițiile ROMFS de pe dispozitiv:
$ mpremote romfs <sub-command>
<sub-command> poate fi:
romfs querypentru a lista toate partițiile ROMFS disponibile și dimensiunea lorromfs [-o <output>] build <source>pentru a crea o imagine ROMFS din directorul sursă dat; fișierul de ieșire implicit este sursa la care se adaugă.romfsromfs [-p <partition>] deploy <source>pentru a implementa o imagine ROMFS pe dispozitiv; va crea, de asemenea, o imagine ROMFS temporară dacă sursa este un director
Sub-comenzile build și deploy acceptă ambele opțiunea -m/--mpy pentru a compila automat fișierele .py în .mpy la crearea imaginii ROMFS. Această opțiune este activată în mod implicit, dar funcționează doar dacă pachetul Python mpy_cross a fost instalat (de exemplu, prin pip install mpy_cross). Dacă pachetul nu este instalat, atunci se afișează un avertisment, iar fișierele .py rămân așa cum sunt. Compilarea fișierelor .py poate fi dezactivată cu opțiunea --no-mpy.
rtc¶
Setează/citește ceasul dispozitivului (RTC):
$ mpremote rtc
Acest lucru va interoga RTC-ul dispozitivului pentru ora curentă și o va afișa ca un tuplu datetime.
$ mpremote rtc --set
Acest lucru va seta RTC-ul dispozitivului la ora curentă a PC-ului gazdă.
sleep¶
Pauză (întârziere) înainte de executarea comenzii următoare:
$ mpremote sleep 0.5
Acest lucru va întrerupe execuția secvenței de comenzi pentru durata specificată în secunde, de exemplu pentru a aștepta ca dispozitivul să facă ceva.
reset¶
Efectuează un reset hardware al dispozitivului:
$ mpremote reset
Notă: resetul hardware este echivalent cu machine.reset().
bootloader¶
Intră în bootloader:
$ mpremote bootloader
Acest lucru va face dispozitivul să intre în bootloader-ul său. Bootloader-ul este specific plăcii — consultați secțiunea Recovery and debug pins din referința rapidă a plăcii dvs. pentru detalii.
Auto-conectare și soft-reset¶
Conectarea și deconectarea se vor face automat la începutul și la sfârșitul execuției instrumentului, dacă astfel de comenzi nu sunt date explicit. Conectarea automată va căuta primul dispozitiv serial USB disponibil.
Odată conectat la un dispozitiv, mpremote va efectua automat un soft-reset asupra dispozitivului dacă este necesar. Acest lucru golește heap-ul Python și repornește interpretorul, asigurându-se că codul Python ulterior se execută într-un mediu nou. Auto-soft-reset-ul se efectuează prima dată când se execută una dintre următoarele comenzi: mount, eval, exec, run, fs. După efectuarea unui soft-reset pentru prima dată, acesta nu va mai fi efectuat din nou automat, până când se emite o comandă disconnect.
Comportamentul de auto-soft-reset poate fi controlat de comanda resume. Acest lucru poate fi util pentru a folosi comanda eval pentru a inspecta starea dispozitivului. Comanda soft-reset poate fi folosită pentru a efectua un soft-reset explicit în mijlocul unei secvențe de comenzi.
Scurtături¶
Scurtăturile pot fi definite folosind sistemul de macrocomenzi. Scurtăturile încorporate sunt:
devs: Alias pentruconnect lista0,a1,a2,a3: Aliasuri pentruconnect /dev/ttyACMnu0,u1,u2,u3: Aliasuri pentruconnect /dev/ttyUSBnc0,c1,c2,c3: Aliasuri pentruconnect COMncat,edit,ls,cp,rm,mkdir,rmdir,touch: Aliasuri pentrufs <sub-command>
Scurtături suplimentare pot fi definite în fișierul de configurare al utilizatorului mpremote/config.py, aflat în Directorul de Configurare al Utilizatorului. Locația corectă pentru fiecare sistem de operare este determinată folosind modulul platformdirs.
Aceasta este de obicei: - $XDG_CONFIG_HOME/mpremote/config.py - $HOME/.config/mpremote/config.py - $env:LOCALAPPDATA/mpremote/config.py
Fișierul config.py ar trebui să definească un dicționar numit commands. Cheile acestui dicționar sunt scurtăturile, iar valorile sunt fie un șir de caractere, fie o listă de șiruri de caractere:
"c33": "connect id:334D335C3138",
Comanda c33 este înlocuită cu connect id:334D335C3138.
"test": ["mount", ".", "exec", "import test"],
Comanda test este înlocuită cu mount . exec "import test".
Scurtăturile pot accepta, de asemenea, argumente. De exemplu:
"multiply x=4 y=7": "eval x*y",
Rularea mpremote multiply 3 7 va seta x și y ca variabile pe dispozitiv, apoi va evalua expresia x*y.
Un exemplu de config.py ar putea arăta astfel:
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.
}
Exemple¶
mpremote
Se conectează la primul dispozitiv disponibil și rulează implicit comanda repl.
mpremote a1
Se conectează la dispozitivul de la /dev/ttyACM1 (Linux) și rulează implicit comanda repl. Consultați scurtăturile de mai sus.
mpremote c1
Se conectează la dispozitivul de la COM1 (Windows) și rulează implicit comanda repl. Consultați scurtăturile de mai sus.
mpremote connect /dev/ttyUSB0
Specifică explicit la ce dispozitiv să se conecteze și, ca mai sus, rulează implicit comanda repl.
mpremote a1 ls
Se conectează la dispozitivul de la /dev/ttyACM1 și apoi rulează comanda ls.
Este echivalent cu mpremote connect /dev/ttyACM1 fs ls.
mpremote exec "import micropython; micropython.mem_info()"
Rulează comanda Python specificată și afișează orice ieșire. Acest lucru este echivalent cu tastarea comenzii la promptul REPL.
mpremote eval 1/2 eval 3/4
Evaluează fiecare expresie pe rând și afișează rezultatele.
mpremote a0 eval 1/2 a1 eval 3/4
Evaluează 1/2 pe dispozitivul de la /dev/ttyACM0, apoi 3/4 pe dispozitivul de la /dev/ttyACM1, afișând fiecare rezultat.
mpremote resume exec "print_state_info()" soft-reset
Se conectează la dispozitiv fără a declanșa un soft reset și execută funcția print_state_info() (de exemplu, pentru a afla informații despre starea curentă a programului), apoi declanșează un soft-reset.
mpremote reset sleep 0.5 bootloader
Efectuează un reset hardware al dispozitivului, așteaptă 500ms pentru ca acesta să devină disponibil, apoi intră în bootloader.
mpremote cp utils/driver.py :utils/driver.py + run test.py
Actualizează copia fișierului utils/driver.py de pe dispozitiv, apoi execută scriptul local test.py pe dispozitiv. test.py nu este niciodată copiat în sistemul de fișiere al dispozitivului, ci este rulat din RAM.
mpremote cp utils/driver.py :utils/driver.py + exec "import app"
Actualizează copia fișierului utils/driver.py de pe dispozitiv, apoi execută app.py pe dispozitiv.
Acesta este un flux de lucru obișnuit de dezvoltare pentru a actualiza un singur fișier și apoi a reporni programul. În acest scenariu, main.py de pe dispozitiv ar face, de asemenea, import app.
mpremote cp utils/driver.py :utils/driver.py + soft-reset repl
Actualizează copia fișierului utils/driver.py de pe dispozitiv, apoi declanșează un soft-reset pentru a reporni programul, și apoi monitorizează ieșirea prin comanda repl.
mpremote cp -r utils/ :utils/ + soft-reset repl
La fel ca mai sus, dar actualizează mai întâi întregul director utils.
mpremote mount .
Montează directorul local curent la /remote pe dispozitiv și pornește o sesiune repl care va folosi /remote ca director de lucru.
mpremote mount . exec "import demo"
După montarea directorului local curent, execută demo.py din directorul montat.
mpremote mount app run test.py
După montarea directorului local app ca /remote pe dispozitiv, execută fișierul local test.py din directorul curent al gazdei fără a-l copia în sistemul de fișiere.
mpremote mount . repl --inject-code "import demo"
După montarea directorului local curent, execută demo.py din directorul montat de fiecare dată când se apasă Ctrl-J.
Va trebui mai întâi să apăsați Ctrl-D pentru a reseta starea interpretorului (ceea ce va păstra montarea) înainte de a apăsa Ctrl-J pentru a reimporta demo.py.
mpremote mount app repl --inject-file demo.py
La fel ca mai sus, dar execută conținutul fișierului local demo.py la REPL de fiecare dată când se apasă Ctrl-K. Ca mai sus, folosiți Ctrl-D pentru a reseta mai întâi starea interpretorului.
mpremote cat boot.py
Afișează conținutul fișierului boot.py de pe dispozitiv.
mpremote edit utils/driver.py
Editează utils/driver.py de pe dispozitiv folosind $EDITOR-ul dvs. local.
mpremote cp :main.py .
Copiază main.py de pe dispozitiv în directorul local.
mpremote cp main.py :
Copiază main.py din directorul local pe dispozitiv.
mpremote cp :a.py :b.py
Copiază a.py de pe dispozitiv în b.py pe dispozitiv.
mpremote cp -r dir/ :
Copiază recursiv directorul local dir pe dispozitivul la distanță.
mpremote cp a.py b.py : + repl
Copiază a.py și b.py din directorul local pe dispozitiv, apoi rulează comanda repl.
mpremote mip install aioble
Instalează pachetul aioble din micropython-lib pe dispozitiv. Consultați Gestionarea pachetelor.
mpremote mip install github:org/repo@branch
Instalează pachetul din ramura specificată de la org/repo de pe GitHub pe dispozitiv. Consultați Gestionarea pachetelor.
mpremote mip install gitlab:org/repo@branch
Instalează pachetul din ramura specificată de la org/repo de pe GitLab pe dispozitiv. Consultați Gestionarea pachetelor.
mpremote mip install --target /flash/third-party functools
Instalează pachetul functools din micropython-lib în directorul /flash/third-party de pe dispozitiv. Consultați Gestionarea pachetelor.