Aller au contenu

Build et flash firmware — Matek H743-WING V3

Cross-compilation d'ArduPlane / ArduRover pour la cible Matek H743-WING V3 depuis macOS, et flash via USB-C.

Prérequis : setup-macos.md terminé, toolchain arm-none-eabi-gcc installée.

1. Build ArduPlane pour H743-WING

cd ~/Project/bascanada/ardupilot
./waf configure --board MatekH743-bdshot
./waf plane

Le binaire est généré dans :

build/MatekH743-bdshot/bin/arduplane.apj    # 1.3 MB, JSON+zlib, à flasher
build/MatekH743-bdshot/bin/arduplane        # 2.8 MB, ELF brut ARM

Durée build à froid sur M1 Pro : ~2m40s (validé 2026-05-10). Builds incrémentaux <30 s grâce à ccache.

MatekH743-bdshot est la variante avec bidirectional DShot activé (télémétrie ESC inverse). Pour le Swordfish on n'a pas d'ESC DShot, mais cette config marche aussi en PWM standard. Si tu préfères la variante stricte : --board MatekH743.

⚠️ Ne jamais lancer deux waf en parallèle sur le même repo, même sur des boards différents — la config est globale au repo, pas au build dir, et un second waf configure écrase le premier en cours. Toujours séquentiel : configure → build → configure → build.

Build pour le rover (Phase 3) :

./waf configure --board MatekH743-bdshot
./waf rover
# binaire : build/MatekH743-bdshot/bin/ardurover.apj

waf configure doit être ré-appelé seulement quand on change de board. Pour itérer sur le code, ./waf plane suffit.

2. Flash via QGroundControl

C'est la voie la plus simple sur macOS. Le H743-WING est en mode bootloader DFU dès le branchement USB-C tant qu'aucun firmware ArduPilot n'a démarré (bouton boot maintenu, ou court-circuit pads BOOT).

Procédure

  1. Brancher le H743-WING en USB-C au Mac (en mode bootloader la première fois).
  2. QGC → Vehicle Setup → Firmware.
  3. Custom firmware file → sélectionner build/MatekH743-bdshot/bin/arduplane.apj.
  4. QGC flashe et reboot la carte.
  5. La carte apparaît ensuite comme port série /dev/tty.usbmodem* avec MAVLink à 115200 bauds.

Pour vérifier que macOS voit la carte : ls /dev/tty.usbmodem*

3. Flash en CLI (alternative)

Pour les itérations rapides sans QGC, utiliser uploader.py fourni par ArduPilot :

./Tools/scripts/uploader.py build/MatekH743-bdshot/bin/arduplane.apj

Le script détecte automatiquement le port série du bootloader. Si plusieurs cartes branchées, préciser :

./Tools/scripts/uploader.py --port /dev/tty.usbmodem14101 build/MatekH743-bdshot/bin/arduplane.apj

4. Workflow paramètres

Les paramètres ArduPilot (PIDs, mixages, modes) sont séparés du firmware. Workflow recommandé :

~/Project/bascanada/fleet-params/
├── swordfish-baseline.parm     # config V-tail, calibrations IMU initiales
├── swordfish-tuned.parm        # après AUTOTUNE
└── rover-baseline.parm

Sauvegarder depuis la carte

Dans MAVProxy connecté au véhicule (via USB ou via télémétrie ELRS) :

param fetch
param save ~/Project/bascanada/fleet-params/swordfish-current.parm

Charger sur une nouvelle carte

param load ~/Project/bascanada/fleet-params/swordfish-baseline.parm

Versionner les .parm dans git. C'est ton vrai état véhicule. Le firmware est reproductible depuis le SHA git d'ArduPilot ; les paramètres, non.

5. Récupération si la carte est briquée

Si un mauvais flash empêche la carte de booter :

  1. Maintenir le bouton BOOT du H743 pressé.
  2. Brancher l'USB.
  3. La carte est en DFU pur (visible via ls /dev/cu.usbmodem*).
  4. Re-flasher via QGC ou uploader.py.

Pour un cas vraiment dégénéré (pas de DFU), il faut un STLink V2 (~25 $) et OpenOCD :

brew install open-ocd stlink
# puis flash bas niveau via SWD

6. Modifier le code firmware

Pour ajouter une fonctionnalité custom (ex: un nouveau mode de vol, un handler MAVLink personnalisé) :

ardupilot/
├── ArduPlane/                  # code spécifique Plane
│   ├── mode_*.cpp              # un fichier par mode de vol
│   └── Plane.cpp               # boucle principale
├── libraries/                  # shared libs (AP_AHRS, AP_GPS, etc.)
└── modules/                    # submodules git

Cycle de dev :

# éditer ArduPlane/mode_loiter.cpp
./waf plane                    # recompile (incrémental, ~30s)
# flasher la nouvelle .apj

Pour tester sans flasher, toujours d'abord en SITL (voir sitl.md).

Références

  • ArduPilot build instructions — https://ardupilot.org/dev/docs/building-the-code.html
  • Matek H743-WING V3 — https://www.mateksys.com/?portfolio=h743-wing
  • Liste des boards supportés — Tools/scripts/build_options.py