2025 C LVGL Raspberry Pi Zero 2W Meshtastic LoRa SX1262 SPI Protobuf GPS

BugQuest LoRa

Un nœud Meshtastic maison sur RPi Zero 2W — parce qu'un téléphone peut le faire, mais une vraie appliance le fait mieux.

Voir sur GitHub
BugQuest LoRa

LoRa et Meshtastic : le principe

LoRa (Long Range) est une technologie radio basse consommation qui permet d'envoyer de petits messages sur plusieurs kilomètres — sans WiFi, sans 4G, sans infrastructure classique. En pratique, des messages très simples qui passent dans l'air sur la bande 868 MHz en Europe.

Meshtastic construit une couche réseau au-dessus de ça : chaque appareil devient un nœud capable de relayer les messages des autres. Il n'y a pas de serveur central, pas d'abonnement, pas de point de contrôle unique. Si un chemin existe dans le réseau, le message finit par arriver, même si Internet est hors ligne.

Ce qui rend ce genre de système intéressant dépasse la technique pure. C'est une autre manière de penser la communication : distribuée, résiliente, indépendante des plateformes. Un réseau qui continue d'exister même quand l'infrastructure classique disparaît — ou simplement quand on choisit de s'en passer.

Pourquoi pas juste une app sur téléphone ?

L'application Meshtastic Android existe, elle fonctionne très bien et elle fait exactement ce qu'on attend d'elle.

Mais un téléphone reste un téléphone : batterie partagée, système d'exploitation imprévisible, applications tuées en arrière-plan, mises à jour qui arrivent quand elles veulent. Et surtout, difficile d'en faire un vrai relais permanent sans sacrifier un appareil.

L'objectif ici était différent : une machine dédiée. Un objet qui démarre vite, consomme peu (~3W), et ne fait qu'une seule chose correctement.

Le setup final : Raspberry Pi Zero 2W, écran tactile SPI 3.5", radio SX1262 LoRa 868 MHz, le tout dans un boîtier... improvisé! Une appliance, pas un compromis.

Le nœud — RPi Zero 2W + écran tactile + radio LoRa SX1262
Le nœud — RPi Zero 2W + écran tactile + radio LoRa SX1262

Une interface graphique sans environnement graphique

Sur un Raspberry Pi Zero 2W, lancer X11 ou Wayland juste pour afficher une UI n'a pas beaucoup de sens. C'est beaucoup d'abstraction pour peu de valeur.

Le système tourne donc sur Raspberry Pi OS Lite, sans bureau. L'application est écrite en C et dessine directement dans le framebuffer (/dev/fb0).

Pour l'interface, j'utilise LVGL, une bibliothèque graphique embarquée conçue pour des systèmes contraints, mais parfaitement adaptée ici.

Le vrai goulot d'étranglement, c'est le bus SPI de l'écran. Rafraîchir un framebuffer complet à chaque frame est trop coûteux. On utilise donc des dirty rectangles : seules les zones modifiées sont redessinées.

Pour la carte offline, un pas supplémentaire a été fait : les tuiles sont préconverties en RGB565, le format natif de l'écran, ce qui évite tout décodage à la volée.

Parler à Meshtastic depuis du C

Meshtastic utilise Protocol Buffers pour encoder ses messages. Sur le Pi, le daemon meshtasticd expose une interface locale via TCP (127.0.0.1:4403).

J'aurais pu passer par Python ou Node.js, mais ça aurait ajouté des couches inutiles pour une application entièrement en C.

J'ai donc implémenté un client protobuf natif en C pour dialoguer directement avec le daemon et décoder les messages.

Moins de dépendances, latence minimale, et surtout une compréhension plus directe du protocole. C'est plus verbeux, mais beaucoup plus stable dans le temps.

Liste des nœuds en temps réel — SNR, RSSI, batterie et statut réseau
Liste des nœuds en temps réel — SNR, RSSI, batterie et statut réseau

Fonctionnalités "non prévues"

Un nœud LoRa n'a pas besoin de scanner des QR codes WiFi. Ni de simuler un clavier USB. Ni d'afficher une galerie photo. Ni de se mettre à jour depuis son interface.

Mais une fois que le matériel est là — écran tactile, caméra CSI, USB gadget activé — les possibilités s'enchaînent naturellement.

Le scanner QR WiFi permet de configurer un réseau sans clavier ni interface complexe, via des QR codes WPA standards (libzbar).

Le mode USB HID permet au Pi de se présenter comme un clavier et d'envoyer des séquences automatiquement à un ordinateur connecté.

La galerie photo existe simplement parce que la caméra était déjà là.

La mise à jour OTA est, elle, réellement utile : git pull, rebuild, reboot, avec retour visuel dans l'interface.

Carte offline — tuiles RGB565, nœuds et position GPS en temps réel
Carte offline — tuiles RGB565, nœuds et position GPS en temps réel

Ce que ça donne en pratique

Le nœud est opérationnel sur le réseau LoRa EU_868 (869.525 MHz).

De l'extérieur, il apparaît comme n'importe quel autre nœud Meshtastic sur la carte publique.

De l'intérieur, c'est un système entièrement maîtrisé : une machine qui fait exactement ce pour quoi elle a été conçue, sans dépendre d'un téléphone, d'une application tierce ou d'un service externe.

Et surtout, un objet qui continue de fonctionner même quand tout le reste devient incertain.

realitynauts@bugquest:~
×
Realitynauts
RN

$ cat auteur.txt

Realitynauts — Dev PHP / Python / Hardware
Autiste. Intensément focalisé. Toujours en prod.

$ cat opportunites.txt

Ce projet te parle ? Tu as un projet similaire
ou complémentaire ? Parlons-en.

$ ./contact.sh