oktalos-code 🛠 Atelier

Atelier

Tu veux compiler ton propre firmware Zephyr, modifier le code, aller plus loin que les projets prêts à flasher ? Cette page te guide depuis zéro jusqu'à ton premier blink.hex sur ton micro:bit V2. Trois chemins possibles : choisis celui qui colle à ton environnement.

Avant de commencer

Matériel requis

  • Une carte micro:bit V2 (la V1 ne fonctionne pas avec ce livre).
  • Un robot Maqueen Plus V3 (optionnel pour les premiers chapitres).
  • Un câble micro-USB data (pas seulement charge).
  • Un ordinateur Linux, macOS ou Windows 10/11.

Note pour Windows

Pour les chemins west et Docker, on recommande WSL2 (Windows Subsystem for Linux). Tu obtiens un environnement Linux complet, et tu peux flasher le micro:bit depuis Windows en glisser-déposer comme d'habitude. PlatformIO fonctionne nativement sous Windows sans WSL.

⚠ Piège classique : la moitié des soucis « mon micro:bit n'est pas détecté » viennent d'un câble USB qui ne transporte que la charge. Si rien n'apparaît, change de câble avant tout.

Chemin 1 : PlatformIO + VS Code (recommandé)

PlatformIO regroupe la chaîne d'outils ARM, Zephyr et un système de compilation dans une seule extension VS Code. C'est le chemin le plus court vers un firmware qui clignote.

  1. Installer Visual Studio Code.
  2. Installer l'extension PlatformIO IDE.
  3. Créer un projet micro:bit V2 avec le framework Zephyr.
  4. Compiler, flasher, ouvrir le moniteur série.

1. Installer VS Code

Sur Debian / Ubuntu, télécharge le .deb depuis code.visualstudio.com, puis :

sudo dpkg -i code_*.deb

Sur Arch, pacman -S code. Sur Fedora, paquet code depuis le dépôt Microsoft.

2. Installer l'extension PlatformIO IDE

  1. Ouvrir VS Code.
  2. Cliquer sur l'icône Extensions dans la barre latérale (ou Ctrl+Shift+X).
  3. Chercher PlatformIO IDE, cliquer Install.
  4. Attendre la fin de l'initialisation (3 à 5 minutes la première fois). Redémarrer VS Code si demandé.

Une icône en forme de tête d'alien apparaît dans la barre latérale. C'est ton point d'entrée PlatformIO.

3. Créer un projet micro:bit V2 + Zephyr

  1. Icône alien PIO Home Open.
  2. + New Project.
  3. Nom du projet : oktalos-blink.
  4. Carte : BBC micro:bit V2.
  5. Framework : Zephyr.
  6. Finish. Patiente, le téléchargement de Zephyr prend quelques minutes.

Édite platformio.ini pour forcer Zephyr 4.x (évite le bug distutils Python 3.12+) :

platformio.ini
[env:bbc_microbit_v2]
platform = nordicnrf52
board = bbc_microbit_v2
framework = zephyr
platform_packages = platformio/framework-zephyr @ ~3.40201.0
monitor_speed = 115200

4. Premier flash blink

Remplace src/main.c par :

src/main.c
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#define ROW1 DT_ALIAS(led0)
static const struct gpio_dt_spec led =
    GPIO_DT_SPEC_GET(ROW1, gpios);

int main(void) {
    gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
    while (1) {
        gpio_pin_toggle_dt(&led);
        k_msleep(500);
    }
    return 0;
}

Branche le micro:bit en USB. Puis, dans la barre du bas de VS Code :

  • = compiler (build).
  • = compiler puis flasher (upload).
  • 🔌 = ouvrir le moniteur série.

Clique sur . La LED jaune du micro:bit clignote pendant le flash, puis la matrice 5×5 s'anime. Bravo, tu viens de compiler ton premier firmware Zephyr.

5. Moniteur série

Ajoute printk("hello\n"); dans ta boucle, recompile, puis ouvre le moniteur série (icône prise électrique). Vérifie que le baudrate est bien à 115200. Si rien ne s'affiche, vois la résolution de problèmes.

Chemin 2 : west natif

west est l'outil officiel de gestion des projets Zephyr. Plus d'étapes qu'avec PlatformIO, mais tu obtiens un environnement de référence, identique à celui de la doc Zephyr.

1. Prérequis système

Sur Debian / Ubuntu :

sudo apt update
sudo apt install --no-install-recommends \
    git cmake ninja-build gperf ccache \
    dfu-util device-tree-compiler wget \
    python3-dev python3-pip python3-setuptools \
    python3-tk python3-wheel xz-utils file \
    make gcc gcc-multilib g++-multilib libsdl2-dev

Sur Fedora : sudo dnf install git cmake ninja-build python3-pip.

2. Installer west

pip3 install --user west

Ajoute ~/.local/bin au PATH si ce n'est pas déjà fait :

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

3. Initialiser un workspace Zephyr

mkdir ~/zephyrproject && cd ~/zephyrproject
west init
west update
west zephyr-export
pip3 install --user -r zephyr/scripts/requirements.txt

west update télécharge Zephyr et tous ses modules. Compte 10 à 20 minutes la première fois.

4. Installer le Zephyr SDK (ARM)

Le SDK contient le compilateur croisé ARM. Sur la page des versions du SDK Zephyr, récupère la 0.16.x ou plus récente. Sur Linux x86_64 :

cd ~
wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.17.0/zephyr-sdk-0.17.0_linux-x86_64.tar.xz
tar xvf zephyr-sdk-0.17.0_linux-x86_64.tar.xz
cd zephyr-sdk-0.17.0
./setup.sh -t arm-zephyr-eabi -h -c

L'option -h installe les règles udev (autorisation USB sur Linux). -c enregistre le SDK pour CMake.

5. Compiler blinky pour micro:bit V2

cd ~/zephyrproject/zephyr
west build -p always -b bbc_microbit_v2 samples/basic/blinky

-p always nettoie avant chaque compilation (utile en phase d'apprentissage). Le firmware est généré dans build/zephyr/zephyr.hex.

6. Flasher

west flash

Ou en glisser-déposer : copie build/zephyr/zephyr.hex sur le lecteur MICROBIT. C'est aussi la méthode à utiliser sous WSL2 (le micro:bit apparaît dans l'explorateur Windows).

Chemin 3 : Docker

Une image Docker pré-construite contient toute la chaîne d'outils. Tu n'installes rien sur ta machine, et tu obtiens un environnement reproductible, identique sur Linux, macOS et Windows.

1. Installer Docker

Sur Debian / Ubuntu, suis la procédure officielle : docs.docker.com/engine/install. Puis ajoute ton utilisateur au groupe docker :

sudo usermod -aG docker $USER
# Se deconnecter / reconnecter pour appliquer

2. Récupérer l'image oktal-builder

docker pull registry.gitlab.com/yoseli-org/oktal-builder:latest

L'image embarque PlatformIO, le SDK Zephyr ARM, et toutes les dépendances. Taille : environ 2 Go.

3. Compiler ton projet

Place-toi dans le dossier de ton projet PlatformIO (celui qui contient platformio.ini), puis :

docker run --rm \
    -v $(pwd):/workspace \
    -w /workspace \
    registry.gitlab.com/yoseli-org/oktal-builder:latest \
    pio run

Le .hex est généré dans .pio/build/bbc_microbit_v2/firmware.hex, directement accessible depuis ton système hôte grâce au volume monté.

4. Flasher depuis l'hôte

Le flash USB depuis un conteneur Docker est compliqué (passage de périphériques USB). On fait au plus simple : glisser-déposer le fichier firmware.hex sur le lecteur MICROBIT qui apparaît dans ton explorateur de fichiers. Universel, fonctionne sur les trois OS.

Flasher directement depuis Docker (Linux, avancé)

Sur Linux, tu peux exposer le micro:bit au conteneur :

docker run --rm \
    --device=/dev/ttyACM0 \
    --device-cgroup-rule='c 189:* rmw' \
    -v /dev/bus/usb:/dev/bus/usb \
    -v $(pwd):/workspace -w /workspace \
    registry.gitlab.com/yoseli-org/oktal-builder:latest \
    pio run -t upload

Sous Windows avec WSL2, Docker Desktop ne route pas l'USB nativement vers les conteneurs. Reste sur le glisser-déposer, c'est plus fiable.

Dépôts GitLab

Les sources du livre, des firmwares et des solutions sont publiques sur GitLab. Clone le projet, propose une amélioration : il est ouvert.

yoseli-books

Exemples

yoseli-org/books/yoseli-books

Projets PlatformIO + Zephyr cités dans le livre, prêts à cloner pour démarrer.

Voir sur GitLab

maqueen-zephyr

Firmware

yoseli-org/robots/maqueen-zephyr

Application Zephyr d'exploration autonome pour le robot Maqueen Plus V3 : LIDAR, occupancy grid, machine à états.

Voir sur GitLab

solutions

Corrigés

yoseli-org/books/des-blocs-au-c/solutions

Corrigés des exercices et mini-projets du livre, chapitre par chapitre.

Voir sur GitLab

Résolution de problèmes

Dix soucis classiques rencontrés en chemin. Clique sur une ligne pour dérouler la solution.

Câble USB qui ne fait que la charge 50 % des cas

Symptôme : le micro:bit s'allume mais n'apparaît jamais comme lecteur USB MICROBIT.

Cause : beaucoup de câbles micro-USB livrés avec smartphones ou batteries externes ne transportent que l'alimentation, sans fils de données.

Solution : teste un autre câble. Si le micro:bit apparaît avec un câble différent, le premier est à mettre de côté.

Le micro:bit n'est pas détecté sous Windows

Le micro:bit apparaît normalement comme lecteur MICROBIT sans pilote à installer.

  • Changer de câble (voir entrée précédente).
  • Essayer un autre port USB, de préférence à l'arrière du PC.
  • Sur Windows 7 ou 8 uniquement, installer le pilote mbed Serial Driver depuis microbit.org.
Permission denied sur /dev/ttyACM0 (Linux) Linux

Symptôme :

could not open port /dev/ttyACM0: [Errno 13] Permission denied

Solution :

sudo usermod -aG dialout $USER
# IMPORTANT : se deconnecter / reconnecter ensuite

Fermer VS Code ne suffit pas. Les groupes Unix ne sont relus qu'à la connexion. Redémarre la session si tu ne veux pas fermer toutes tes applis.

« unable to open CMSIS-DAP device » (Linux) Linux

Linux bloque par défaut l'accès USB direct au micro:bit. Crée une règle udev :

sudo tee /etc/udev/rules.d/99-microbit.rules << 'EOF'
SUBSYSTEM=="usb", ATTRS{idVendor}=="0d28", \
ATTRS{idProduct}=="0204", MODE="0666"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger

Débranche et rebranche le micro:bit. Si tu as installé le SDK Zephyr avec l'option -h, les règles udev sont déjà en place.

La barre d'outils PlatformIO n'apparaît pas

Cause : tu n'as pas ouvert le dossier qui contient platformio.ini, mais un dossier parent.

Solution : Fichier → Ouvrir le dossier, et sélectionne le dossier qui contient directement platformio.ini. Les boutons Build / Upload réapparaissent dans la barre du bas.

Commande « pio » introuvable dans le terminal

PlatformIO installé via VS Code n'ajoute pas pio au PATH système. Deux options :

  • Utiliser le terminal PlatformIO : icône alien Miscellaneous PlatformIO Core CLI.
  • Ou ajouter au PATH :
echo 'export PATH="$HOME/.platformio/penv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
VS Code souligne les #include en rouge

C'est normal au premier lancement : l'éditeur ne connaît pas encore les chemins Zephyr. Le code compilera quand même.

  1. Lance une compilation (Build ou pio run).
  2. Attends la fin.
  3. Les soulignements rouges disparaissent.

Si ça persiste après un build réussi : Ctrl+Shift+P puis « C/C++: Reset IntelliSense Database ».

Erreur « No module named distutils » (Python 3.12+)

Le module distutils a été retiré de Python 3.12. Zephyr 2.7.x s'en sert encore.

Solution recommandée : forcer Zephyr 4.x dans platformio.ini :

platform_packages = platformio/framework-zephyr @ ~3.40201.0

Solution de repli : rester sur Zephyr 2.7 mais installer setuptools :

pip install setuptools
Le moniteur série n'affiche rien

Vérifie dans l'ordre :

  1. Bon port : ls /dev/ttyACM* (Linux), gestionnaire de périphériques (Windows), ou ls /dev/cu.usbmodem* (macOS).
  2. Bon baudrate : Zephyr utilise 115200 bauds par défaut.
  3. CONFIG_PRINTK=y dans prj.conf ? Sans cette option, printk est compilé en no-op silencieux.
  4. Console activée : CONFIG_CONSOLE=y et CONFIG_UART_CONSOLE=y.
  5. Ajoute un printk("DEBUT\\n") en première ligne de main. Si même ça ne sort pas, le firmware ne démarre pas.
Codes d'erreur Zephyr (-ENODEV, -EIO, etc.)

Les fonctions Zephyr renvoient un entier négatif en cas d'erreur. Les plus fréquents :

  • -ENODEV : périphérique absent du Device Tree, ou status="okay" oublié dans l'overlay.
  • -EINVAL : pointeur NULL, valeur hors plage, mauvaise direction GPIO.
  • -EIO : le bus (I2C, SPI, UART) ne répond pas. Câblage, adresse, alimentation ?
  • -ETIMEDOUT : le périphérique n'a pas répondu à temps.
  • -EBUSY : une autre opération est en cours sur le même bus.
  • -ENOMEM : pile débordée, ou allocation refusée.

Affiche systématiquement le code retour avec LOG_ERR("op: %d", ret) : ça t'évite des heures à chercher à l'aveugle.

Problème pas listé ? Consulte la doc PlatformIO, la doc Zephyr, ou le forum PlatformIO.