yoseli-books
Exemplesyoseli-org/books/yoseli-books
Projets PlatformIO + Zephyr cités dans le livre, prêts à cloner pour démarrer.
Voir sur GitLab
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.
Le plus simple. Une extension VS Code et tout est installé. Idéal pour démarrer vite.
Aller à la sectionL'outil officiel Zephyr. Contrôle total, mais plus d'étapes. Pour qui veut comprendre.
Aller à la sectionToolchain pré-construite dans un conteneur. Zéro installation sur ta machine.
Aller à la sectionPour 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.
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.
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.
PlatformIO IDE, cliquer Install.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.
oktalos-blink.BBC micro:bit V2.Zephyr.
Édite platformio.ini pour
forcer Zephyr 4.x (évite le bug distutils Python 3.12+) :
[env:bbc_microbit_v2]
platform = nordicnrf52
board = bbc_microbit_v2
framework = zephyr
platform_packages = platformio/framework-zephyr @ ~3.40201.0
monitor_speed = 115200
Remplace src/main.c par :
#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 :
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.
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.
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.
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.
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 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.
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.
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.
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).
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.
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 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.
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é.
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.
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.
Les sources du livre, des firmwares et des solutions sont publiques sur GitLab. Clone le projet, propose une amélioration : il est ouvert.
yoseli-org/books/yoseli-books
Projets PlatformIO + Zephyr cités dans le livre, prêts à cloner pour démarrer.
Voir sur GitLabyoseli-org/robots/maqueen-zephyr
Application Zephyr d'exploration autonome pour le robot Maqueen Plus V3 : LIDAR, occupancy grid, machine à états.
Voir sur GitLabyoseli-org/books/des-blocs-au-c/solutions
Corrigés des exercices et mini-projets du livre, chapitre par chapitre.
Voir sur GitLabDix soucis classiques rencontrés en chemin. Clique sur une ligne pour dérouler la solution.
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 apparaît normalement comme lecteur
MICROBIT sans pilote à installer.
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.
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.
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.
PlatformIO installé via VS Code n'ajoute pas
pio au PATH système.
Deux options :
echo 'export PATH="$HOME/.platformio/penv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc C'est normal au premier lancement : l'éditeur ne connaît pas encore les chemins Zephyr. Le code compilera quand même.
pio run).Si ça persiste après un build réussi : Ctrl+Shift+P puis « C/C++: Reset IntelliSense Database ».
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 Vérifie dans l'ordre :
ls /dev/ttyACM*
(Linux), gestionnaire de périphériques (Windows), ou
ls /dev/cu.usbmodem*
(macOS).
prj.conf ?
Sans cette option, printk
est compilé en no-op silencieux.
CONFIG_CONSOLE=y
et CONFIG_UART_CONSOLE=y.
printk("DEBUT\\n")
en première ligne de main.
Si même ça ne sort pas, le firmware ne démarre pas.
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.