OpenMV Cam RT1062¶
L’OpenMV Cam RT1062 est une carte de vision industrielle à faible consommation construite autour du NXP i.MX RT1062 (Cortex‑M7 @ 600 MHz). La carte associe un réseau USB‑C haut débit, le Wi‑Fi/Bluetooth et l’Ethernet 10/100 à un capteur OV5640 de 5 Mpx monté sur un support amovible. La caméra ne consomme qu’environ 30 µA depuis une batterie LiPo en sommeil profond, ce qui la rend bien adaptée aux projets alimentés par batterie.
Pour la fiche technique complète, les photos et les dimensions, consultez la page produit de l’OpenMV Cam RT1062.
Points forts¶
NXP i.MX RT1062 Cortex‑M7 à 600 MHz.
32 Mo de SDRAM externe (16 bits @ 160 MHz, 320 Mo/s) ainsi que 1 Mo de SRAM interne et 16 Mo de mémoire flash QSPI (133 MHz 4 bits SDR, lecture à 66 Mo/s) ; 4 Ko d’EEPROM sur R6+.
Capteur OV5640 de 5 Mpx à obturateur déroulant.
IMU embarquée (accéléromètre 3 axes 12 bits, ±2/4/8 g).
USB‑C haut débit (480 Mb/s, limite de courant 1,5 A), Ethernet 10/100 Mb/s (compatible PoE via shield), Wi‑Fi a/b/g/n + Bluetooth 5.1 (antenne sur puce ou option U.FL).
Logement microSD — SD jusqu’à 2 Go, SDHC jusqu’à 32 Go, SDXC jusqu’à 2 To.
Chargeur LiPo (500 mA sur R6+, 100 mA sur R4/R5), RTC avec plages de soudure pour batterie de secours. Le sommeil profond consomme ~30 µA sur batterie.
14 broches d’E/S, toutes en sortie 3,3 V / tolérantes 3,3 V, 4 mA par broche, compatibles interruption.
LED RGB utilisateur, bouton SW utilisateur, bouton d’alimentation matériel (machine à états sommeil profond / réveil) et une LED d’état distincte pour la charge / l’USB / l’alimentation VIN.
Avertissement
Les broches d’E/S du RT1062 ne sont pas tolérantes 5 V. Ne connectez pas l’appareil directement à un microcontrôleur 5 V comme l’Arduino Mega. Alimentez la carte uniquement via VIN.
Brochage¶
Référence des broches¶
Nom de la broche |
Fonction |
|---|---|
P0 |
SPI1 MOSI / PWM2 B3 |
P1 |
SPI1 MISO / CAN0 TX |
P2 |
SPI1 SCLK / PWM2 B3 |
P3 |
SPI1 SS / CAN0 RX |
P4 |
I2C1 SCL / UART1 TX / PWM1 X2 |
P5 |
I2C1 SDA / UART1 RX / PWM1 X3 |
P6 |
ADC |
P7 |
PWM2 A0 |
P8 |
PWM2 B0 |
P9 |
PWM1 A3 |
P10 |
PWM1 B3 / E/S de synchronisation de trame |
P11 |
réveil (actif à l’état bas, relier à GND pour réveiller) |
P12 |
RESET — relier à GND pour réinitialiser la carte (pas une GPIO) |
P13 |
E/S numérique |
P14 |
E/S numérique |
ON/OFF |
plage de connecteur reproduisant le bouton d’alimentation matériel (actif à l’état bas) |
SW |
bouton utilisateur (actif à l’état bas) |
ST |
bas sur alimentation VIN, haut sur alimentation USB |
CHG |
actif à l’état bas ; bas pendant qu’une batterie LiPo connectée se charge |
PG |
actif à l’état bas ; bas lorsque l’alimentation VIN ou USB est présente |
LED_RED |
canal rouge de la LED RGB (actif à l’état bas) |
LED_GREEN |
canal vert de la LED RGB (actif à l’état bas) |
LED_BLUE |
canal bleu de la LED RGB (actif à l’état bas) |
Note
La ligne de synchronisation de trame P10 est un bus partagé. Elle est câblée à la fois au microcontrôleur, à la broche de déclenchement / d’exposition du capteur de la caméra et au connecteur utilisateur. Le sens est défini par l’application — le microcontrôleur, le capteur ou un signal externe peut la piloter selon la configuration du capteur. Assurez-vous qu’un seul pilote est actif à la fois.
Note
ON/OFF et P11 sont référencés au rail RAW toujours actif (et non au rail 3,3 V commuté), de sorte qu’ils restent fonctionnels pendant que le reste de la carte est en mode sommeil profond / faible consommation. Les deux entrées sont actives à l’état bas.
Ces broches passent par des adaptateurs de niveau afin de pouvoir fonctionner sur le rail RAW. Si vous avez absolument besoin d’un comportement GPIO en 3,3 V direct sur ON/OFF ou P11 (par exemple pour les piloter depuis un microcontrôleur 3,3 V sans passer par l’adaptateur), la carte expose des plages de soudure de pull‑up et de cavalier 0 ohm qui permettent de contourner l’adaptateur. Il s’agit d’une modification matérielle avancée — la plupart des utilisateurs devraient s’en abstenir.
Note
P13 et P14 sont de simples GPIO par défaut, sans fonction spéciale. Les plages peuvent éventuellement être réacheminées vers d’autres signaux en refondant les ponts de soudure des résistances 0 ohm à l’arrière de la carte :
P13 ↔ état CHG / JTAG TRSTB
P14 ↔ état ST / JTAG TDI
La plupart des utilisateurs ne toucheront pas à ces cavaliers — laissez-les sur la valeur GPIO par défaut, sauf si vous avez spécifiquement besoin d’une relecture de la gestion d’alimentation ou du JTAG.
Broches d’alimentation¶
3.3V — rail 3,3 V régulé. Sortie uniquement sur le RT1062 — n’injectez pas d’alimentation externe dans cette broche. Jusqu’à 1 A disponible pour les shields.
VIN — entrée 5 V. Alimente la carte et le chargeur LiPo embarqué.
RAW — entrée/sortie, toujours active (3,6 V – 5 V). Transporte la source active du moment (VIN, USB ou batterie connectée) et peut aussi être utilisée comme entrée. Vous devez piloter RAW à travers une diode en série lorsque vous y injectez de l’alimentation — sinon le courant remontera vers VIN/USB et endommagera l’alimentation ou la protection embarquée.
GND — masse commune.
Note
La puce de gestion d’alimentation embarquée sélectionne automatiquement celle de l’USB ou de la VIN ayant la tension la plus élevée pour alimenter la carte et le chargeur de batterie. Si une LiPo est connectée, elle se charge sur la marge disponible, et le contrôleur bascule sur la batterie pour maintenir la carte en fonctionnement si la VIN/l’USB faiblissent ou sont débranchés.
Note
L’arrière de la carte comporte des plages de soudure pour une batterie de secours RTC 3,3 V externe. Le câblage d’une pile bouton sur ces plages maintient la RTC en fonctionnement pendant que le reste de la carte n’est pas alimenté.
Astuce
Utilisez l”estimateur d’autonomie de batterie pour modéliser la durée pendant laquelle le RT1062 fonctionnera sur batterie pour un cycle de service actif / sommeil profond donné.
Broches Ethernet¶
Le RT1062 expose les paires MDI du PHY Ethernet 10/100 Mb/s sur des plages dédiées à côté du connecteur GPIO. Les broches MDI ne peuvent pas être câblées directement à un RJ45 — des composants magnétiques Ethernet (un transformateur d’isolation, soit intégré à un magjack, soit sur le shield) sont obligatoires entre le PHY et le câble. Le shield PoE OpenMV les inclut ; si vous concevez votre propre prise, utilisez un RJ45 à magnétiques intégrés ou un transformateur externe.
ETH_LED — LED de liaison/activité. Active à l’état bas quand une liaison est établie ; clignote sur le trafic.
ETH_TXP / ETH_TXN — paire de transmission.
ETH_RXP / ETH_RXN — paire de réception.
Note
Le connecteur expose également quatre plages sérigraphiées Reserved. Elles sont compatibles en empreinte avec les paires Ethernet gigabit de l”OpenMV N6 (DC P/N et DD P/N), de sorte que le même shield Ethernet / PoE peut être branché sur l’une ou l’autre carte. Le PHY du RT1062 ne gère que le 10/100 Mb/s, donc ces quatre plages n’ont aucune connectivité électrique — laissez-les non connectées.
Broches de récupération et de débogage¶
RESET — relier à GND pour réinitialiser la carte. Sa libération permet au microcontrôleur de démarrer normalement.
SBL — relier à 3,3 V au moment d’alimenter la carte pour entrer en mode programme d’amorçage ROM (Serial Boot Loader). OpenMV IDE utilise ce mode pour reprogrammer le programme d’amorçage embarqué.
Un connecteur ARM 10 broches SWD/JTAG dédié est présent, compatible avec les adaptateurs ST‑LINK et SEGGER J‑Link.
Note
Le RT1062 n’expose par défaut que le débogage SWD via ce connecteur. Le JTAG complet n’est pas disponible d’origine.
Périphériques embarqués¶
LED¶
Le RT1062 possède deux LED RGB :
LED RGB utilisateur — contrôlable par logiciel, exposée sous les noms
LED_RED,LED_GREENetLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
LED d’alimentation — pilotée directement par le matériel de gestion d’alimentation embarqué, sans contrôle logiciel. Utilisez-la pour voir en un coup d’œil l’état de l’alimentation.
Pendant le fonctionnement :
Canal
Signification
Bleu
la VIN alimente la carte (éteinte sur USB)
Vert
alimentation USB ou VIN présente
Rouge
charge d’une batterie LiPo connectée
En sommeil profond, tous les canaux sont éteints sauf le rouge, qui reste allumé tant qu’une LiPo se charge.
Broches d’état d’alimentation¶
Trois entrées d’état actives à l’état bas provenant de la puce de gestion d’alimentation embarquée :
PG — bas lorsque l’alimentation VIN ou USB est présente. Toujours connectée.
ST — bas lorsque la carte fonctionne sur VIN, haut lorsqu’elle fonctionne sur alimentation USB. Non connectée par défaut.
CHG — bas pendant qu’une batterie LiPo connectée se charge. Non connectée par défaut.
from machine import Pin
power_ok = not Pin("PG", Pin.IN).value()
Capteur de la caméra¶
L’OV5640 est piloté via le module csi — capteurs de caméra
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
L’OV5640 dispose d’un compresseur JPEG embarqué. Réglez csi.CSI.pixformat sur csi.JPEG et le capteur fournit des trames compressées directement à la caméra via le bus de la caméra, ce qui rend les captures haute résolution pratiques : csi.HD (1280×720), csi.FHD (1920×1080) et le plein 5 Mpx csi.WQXGA2 (2592×1944) sont tous diffusés en JPEG. Ajustez la compression avec csi.CSI.quality (0-100, plus élevé = trames plus grandes, plus de détails)
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
Le capteur repose sur un module amovible — remplacez-le par n’importe quel autre module de caméra OpenMV (obturateur global, thermique, résolution supérieure, etc.) sans changer le reste de la carte.
Apprentissage automatique¶
ml — Apprentissage automatique exécute des modèles TFLite quantifiés sur le Cortex‑M7 avec les noyaux CMSIS‑NN — assez rapide pour des détecteurs compacts à quelques trames par seconde. Les modèles présents sur le système de fichiers en lecture seule /rom se chargent directement depuis la mémoire flash sans copie en RAM. Voici un détecteur BlazeFace 128×128 superposant le visage détecté et ses six points de repère sur chaque trame
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces is a list of ((x, y, w, h), score, keypoints) tuples
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints is a ndarray of shape (6, 2)
# 0 - right eye (x, y)
# 1 - left eye (x, y)
# 2 - nose (x, y)
# 3 - mouth (x, y)
# 4 - right ear (x, y)
# 5 - left ear (x, y)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
IMU¶
Le micrologiciel du RT1062 ne relie pas l’accéléromètre embarqué au module imu — capteur imu. Communiquez plutôt directement avec lui via le bus I²C interne — la puce se trouve à l’adresse 0x15 et regroupe trois canaux d’accélération signés sur 12 bits ainsi qu’un octet de température 8 bits à partir du registre 0x03
import machine
import time
ADDR = 0x15
DATA_REG = 0x03
LSB_PER_G = 1024.0 # ±2 g range
def s12(hi, lo):
v = ((hi << 8) | lo) >> 4
return v - 0x1000 if v & 0x800 else v
bus = machine.I2C(2)
print("Devices on I²C2:", bus.scan())
while True:
d = bus.readfrom_mem(ADDR, DATA_REG, 7)
x = s12(d[0], d[1]) / LSB_PER_G
y = s12(d[2], d[3]) / LSB_PER_G
z = s12(d[4], d[5]) / LSB_PER_G
temp_c = d[6] * 0.586 + 25.0
print("x=%+.2fg y=%+.2fg z=%+.2fg T=%.1f°C" % (x, y, z, temp_c))
time.sleep_ms(100)
EEPROM¶
Les cartes R6 et ultérieures incluent une EEPROM I²C générique de 4 Ko sur le même bus interne que l’accéléromètre. (Les révisions antérieures n’en ont pas — appeler ces extraits sur R4/R5 expirera sur un acquittement I²C manquant.) Utilisez l’API standard machine.I2C readfrom_mem / writeto_mem avec une adresse mémoire 16 bits
import machine
import time
EEPROM_ADDR = 0x50 # default address
PAGE_SIZE = 32 # bytes per page (both read and write)
EEPROM_SIZE = 4096
bus = machine.I2C(2)
# Dump the entire 4 KB one page at a time
data = bytearray()
for offset in range(0, EEPROM_SIZE, PAGE_SIZE):
data += bus.readfrom_mem(EEPROM_ADDR, offset, PAGE_SIZE, addrsize=16)
print(len(data), "bytes")
# Write a small payload back at offset 0 (fits in one page)
bus.writeto_mem(EEPROM_ADDR, 0, b"hello, world", addrsize=16)
time.sleep_ms(10) # ~5 ms write cycle after each page
# Read it back
print(bus.readfrom_mem(EEPROM_ADDR, 0, 12, addrsize=16))
Les lectures et les écritures doivent toutes deux rester dans une page de 32 octets. Découpez tout transfert plus grand en un appel par page, et ajoutez le délai de cycle d’écriture d’environ 5 ms entre des écritures consécutives.
Wi‑Fi¶
Le module embarqué de la famille CYW43 est exposé via network — configuration réseau en tant qu’interface station. Après connexion, ipconfig("addr4") renvoie la paire (ip, netmask)
import network, time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Bluetooth¶
Le même module sans fil expose également le Bluetooth 5.1. Utilisez aioble — BLE asynchrone pour du BLE compatible asyncio — par exemple, s’annoncer comme périphérique et attendre qu’un central se connecte
import asyncio
import aioble
async def run():
while True:
conn = await aioble.advertise(250_000, name="OpenMV-RT1062")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
Ethernet¶
Lorsqu’un RJ45 (avec composants magnétiques) est connecté aux plages MDI, le PHY 10/100 apparaît comme une interface LAN. Le DHCP s’exécute automatiquement dès que la liaison est établie
import network, time
lan = network.LAN()
lan.active(True)
while not lan.isconnected():
time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])
Carte microSD¶
Lorsqu’une carte est insérée, elle est montée automatiquement sur /sdcard et utilisable via le système de fichiers habituel
import os
for entry in os.listdir("/sdcard"):
print(entry)
Référence des bus¶
GPIO¶
Utilisez machine.Pin pour lire ou piloter n’importe laquelle des broches sérigraphiées. Les sorties sont en CMOS 3,3 V et peuvent absorber/fournir jusqu’à 4 mA par broche.
from machine import Pin
out = Pin("P0", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("P1", Pin.IN, Pin.PULL_UP)
print(inp.value())
Toute broche d’entrée peut aussi déclencher une interruption sur les transitions de front
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Bus |
TX |
RX |
|---|---|---|
UART1 |
P4 |
P5 |
from machine import UART
uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
Bus |
SCL |
SDA |
|---|---|---|
I2C1 |
P4 |
P5 |
from machine import I2C
i2c = I2C(1, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Le même matériel peut aussi être utilisé en mode cible (esclave) via machine.I2CTarget pour exposer une région mémoire à un autre contrôleur I²C
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(1, addr=0x42, mem=buf)
SPI¶
Bus |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI1 |
P0 |
P1 |
P2 |
P3 |
from machine import SPI
from machine import Pin
spi = SPI(1, baudrate=10_000_000)
cs = Pin("P3", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
CAN¶
Bus |
TX |
RX |
|---|---|---|
CAN1 |
P1 |
P3 |
Note
Le CAN n’est pas encore pris en charge sur cette carte dans le micrologiciel v5.0.0.
from machine import CAN
can = CAN(1, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())
ADC¶
La seule broche ADC utilisateur est P6, qui est à pleine échelle à ~3,3 V
from machine import ADC
import time
adc = ADC("P6")
while True:
voltage = adc.read_u16() * 3.3 / 65535
print(voltage)
time.sleep_ms(100)
PWM¶
Broche |
Canal FlexPWM |
|---|---|
P0 |
PWM2 B3 |
P2 |
PWM2 B3 |
P4 |
PWM1 X2 |
P5 |
PWM1 X3 |
P7 |
PWM2 A0 |
P8 |
PWM2 B0 |
P9 |
PWM1 A3 |
P10 |
PWM1 B3 |
Pilotez l’une d’elles via machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P9"), freq=1_000, duty_u16=32768)
Bus logiciels en bit‑banging¶
machine.SoftI2C et machine.SoftSPI fonctionnent sur n’importe quelle GPIO si vous avez besoin d’un bus supplémentaire.
Capteur thermique (externe)¶
Le micrologiciel inclut le pilote fir — pilote de capteur thermique (fir == infrarouge lointain) pour les imageurs thermiques câblés en externe :
MLX90621 — matrice IR 16 × 4
MLX90640 — matrice IR 32 × 24
MLX90641 — matrice IR 16 × 12
AMG8833 — matrice IR 8 × 8
Câblez le module au bus I²C de la carte et lisez les trames avec fir.init() + fir.snapshot()
import time
import image
import fir
fir.init() # auto‑detects the sensor
clock = time.clock()
while True:
clock.tick()
try:
img = fir.snapshot(x_scale=5, y_scale=5,
color_palette=image.PALETTE_IRONBOW,
hint=image.BICUBIC,
copy_to_fb=True)
except OSError:
continue
print(clock.fps())
Le pilote fir ne communique avec le capteur que via I²C 4 — câblez le module à P4 (SCL) et P5 (SDA).
Chronométrage¶
time¶
Le module time couvre les délais bloquants, les ticks monotones et la mesure du temps écoulé
import time
time.sleep(1) # seconds
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
# ...do work...
elapsed = time.ticks_diff(time.ticks_ms(), start)
Minuteurs virtuels¶
machine.Timer planifie des fonctions de rappel périodiques ou ponctuelles sans consommer d’emplacement de minuteur matériel. Passez -1 comme identifiant pour utiliser un minuteur virtuel (logiciel)
from machine import Timer
one_shot = Timer(-1)
one_shot.init(period=5_000, mode=Timer.ONE_SHOT,
callback=lambda t: print("once"))
periodic = Timer(-1)
periodic.init(period=2_000, mode=Timer.PERIODIC,
callback=lambda t: print("tick"))
Les valeurs de période sont en millisecondes. Appelez deinit() pour arrêter et libérer l’emplacement.
Horloge temps réel¶
machine.RTC conserve l’heure murale à travers les réinitialisations et (avec la batterie de secours 3,3 V optionnelle câblée aux plages arrière, voir Broches d’alimentation) à travers une perte totale d’alimentation
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0)) # Y, M, D, weekday, h, m, s, subsec
print(rtc.datetime())
La RTC fonctionne également pendant le sommeil profond, vous pouvez donc l’utiliser comme source de réveil pour machine.deepsleep().
Chien de garde¶
machine.WDT réinitialise la carte si l’application se bloque. Une fois démarré, il ne peut être ni arrêté ni reconfiguré — alimentez-le périodiquement dans votre boucle principale
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informations de démarrage et d’exécution¶
Fenêtre du programme d’amorçage USB¶
À chaque mise sous tension, la caméra exécute un court programme d’amorçage (quelques secondes) qui permet à OpenMV IDE de mettre à jour le micrologiciel sans que l’utilisateur ait à entrer en mode DFU. Une fois la fenêtre expirée, le programme d’amorçage passe la main à boot.py puis à main.py.
Un script en cours d’exécution peut réentrer dans le programme d’amorçage à la demande en appelant machine.bootloader()
import machine
machine.bootloader()
Système de fichiers et ordre de démarrage¶
Le micrologiciel du RT1062 monte jusqu’à trois systèmes de fichiers au démarrage :
Mémoire flash interne — toujours montée sur
/flash. Contientmain.pyetREADME.txtpar défaut ; créée au tout premier démarrage.Carte microSD — si une carte est insérée, elle est montée sur
/sdcard.ROMFS — système de fichiers en lecture seule, mappé en mémoire sur
/rom, utilisé pour livrer de gros volumes de données (par exemple des modèles d’IA) qui bénéficient d’un accès sans copie. Monté automatiquement par MicroPython au démarrage, avant l’exécution de tout code Python utilisateur.
Après le montage, le répertoire de travail est défini sur /sdcard lorsque la carte est présente, sinon sur /flash. L’interpréteur exécute ensuite les scripts depuis ce répertoire :
boot.pyest exécuté à chaque réinitialisation logicielle (démarrage à froid,Ctrl‑Ddepuis le REPL, ou chaque fois que le script en cours d’exécution se termine).main.pyest exécuté uniquement au démarrage à froid, immédiatement aprèsboot.py. Les réinitialisations logicielles ultérieures réexécutentboot.pymais passent directement au REPL — pour réexécutermain.py, vous devez réinitialiser complètement la carte.
Déposer un boot.py ou un main.py sur la carte SD remplace la copie en mémoire flash sans y toucher — les deux fichiers sont recherchés dans le répertoire de démarrage (/sdcard lorsque la carte est montée, sinon /flash).
Le main.py par défaut livré sur une carte fraîchement flashée se contente de faire clignoter le canal bleu de la LED RGB utilisateur en guise de battement de cœur (deux brèves impulsions, courte pause), de sorte que vous pouvez constater que le micrologiciel a démarré correctement sans aucun hôte connecté.
sys.path est étendu pour inclure les trois systèmes de fichiers et leurs sous-répertoires lib/, de sorte que des modules importables peuvent se trouver dans /flash/lib, /sdcard/lib ou /rom/lib.
Pour forcer le système à ignorer une carte SD insérée (par exemple pour exécuter le main.py de la mémoire flash même en présence d’une carte), créez un fichier vide nommé SKIPSD à la racine de /flash.
Lorsqu’elle est connectée en USB, le système de fichiers de démarrage (/sdcard si une carte est présente, sinon /flash) s’énumère également comme un lecteur de stockage de masse USB sur l’hôte, vous permettant d’éditer boot.py, main.py et tout autre fichier directement. Éjectez le lecteur avant de réinitialiser la caméra afin que l’hôte vide ses écritures en cache.
Note
Comme le système d’exploitation traite le lecteur comme un périphérique de bloc passif, les fichiers créés ou modifiés par le code s’exécutant sur l’OpenMV Cam n’apparaîtront pas tant que l’hôte n’aura pas remonté le lecteur. Si à la fois le système d’exploitation et l’OpenMV Cam écrivent sur le même système de fichiers en même temps, le système d’exploitation l’emportera et écrasera les modifications faites par la caméra. Utilisez la carte SD pour toute donnée que le script réécrit, et remontez avant de lire ces fichiers depuis l’hôte.
Note
Le canal rouge de la LED RGB utilisateur peut s’allumer brièvement pendant que l’hôte lit ou écrit sur le lecteur de stockage de masse USB — il s’agit d’un indicateur d’activité piloté par le micrologiciel, pas d’une défaillance.
Tailles de stockage¶
Le RT1062 est livré avec :
/flash— système de fichiers FAT de 4 Mo, lecture/écriture./rom— ROMFS mappé en mémoire en lecture seule de 8 Mo, utilisé pour livrer des scripts et des modèles ML qui bénéficient d’un accès mmap sans copie./sdcard— taille complète de la carte microSD insérée (lorsqu’elle est présente), lecture/écriture.
Indicateur de faute grave (hard fault)¶
Si la LED RGB utilisateur passe rapidement en boucle par toutes les couleurs — assez vite pour ressembler à une LED blanche scintillante plutôt qu’à des teintes distinctes — le micrologiciel a rencontré une faute grave irrécupérable. Reflashez le micrologiciel pour récupérer ; si le reflashage n’aide pas, la carte est peut-être physiquement endommagée.
Bibliothèques logicielles¶
Consultez l”index des bibliothèques pour la liste complète des modules — y compris ceux qui sont propres à la version RT1062.