Trois balises UWB et un iPhone
Faire dialoguer trois cartes UWB à 30 € avec un iPhone, puis s'en servir : une maison qui sait où l'on est, des enceintes qui suivent l'auditeur, une liaison de données entre cartes.
Exploration · septembre 2026
L'iPhone mesure sa distance à trois balises (A, B, C) et se place sur la carte du salon
Tout part d’une question simple : les trois shields UWB que j’avais dans un tiroir peuvent-ils parler à un iPhone ? L’iPhone embarque une puce UWB (U1/U2) et une API, Nearby Interaction, prévue pour des accessoires certifiés. Le kit officiel coûte cher et son firmware est un binaire fermé pour un autre microcontrôleur.
La réponse est oui. Le protocole de mesure, FiRa, est documenté et une implémentation ouverte existe côté Linux. Je l’ai réécrit pour le Raspberry Pi Pico : l’échange de paramètres, la synchronisation sur les trames de l’iPhone, le chiffrement des trames (clé statique, vérifiée contre les vecteurs de test), puis la réponse dans le créneau imparti, à quelques centaines de microsecondes près. Première session complète : 194 mesures sur 227, distance à 2 cm près.
À partir de là, trois directions, que je présente ci-dessous par onglets :
- RoomSense : deux balises au mur, l’iPhone sait dans quelle pièce et devant quel objet il se trouve, et pilote la maison (Home Assistant).
- SoundStage : trois balises, un home-cinéma 7.1, et un objet sonore virtuel qui reste à sa place quand on tourne autour.
- Liaisons de données : les mêmes cartes, entre elles, sans téléphone : mesure mutuelle des distances et échange de données à quelques mégabits par seconde.
Ce ne sont pas des produits. Ce sont des montages, des mesures, des impasses, et ce que j’en ai retenu. D’abord, quelques chiffres, et la mesure d’une distance, image par image.
En chiffres
Mesuré sur le banc, entre l'iPhone et les cartes DWM3000.
194 / 227
premières mesures réussies avec l'iPhone
2 cm
précision d'une distance
6 Hz
mesures par seconde et par balise
4 €
le microcontrôleur qui répond à l'iPhone
Quatre trames, une distance
Chaque nœud horodate ce qu'il émet et ce qu'il reçoit, sur sa propre horloge ; deux allers-retours entre A et B suffisent, et C, qui écoute, obtient la mesure gratuitement.
Trois nœuds, chacun avec sa propre horloge. Personne n'a encore émis.
Une maison qui sait où l’on est
Deux balises au mur, l’iPhone dans la main. L’app connaît la distance à chacune, plusieurs fois par seconde, et la caméra (ARKit) apporte ce que deux distances seules ne donnent pas : de quel côté on se trouve. On « apprend » les objets de la pièce en se plaçant devant eux (« ajouter cet objet ici »), puis l’app reconnaît qu’on s’en approche.
Ce qui se passe quand on s’approche. Un retour haptique continu dont l’intensité et la « brillance » suivent la distance, puis, sous un rayon réglable, la fiche de commande de l’objet s’ouvre : un thermostat, une lampe, une prise. Les objets sont liés à des entités Home Assistant ; la commande part par l’API REST avec un jeton stocké dans le trousseau.
Ce qui a demandé le plus de travail
Le repère. Deux balises, c’est une droite : la position a un côté ambigu. La caméra lève l’ambiguïté, mais sa carte du monde dérive et se réinitialise. Le repère de la pièce est donc re-mesuré en continu : les positions de la caméra et les distances brutes aux balises alimentent un ajustement robuste qui replace les balises, avec un score de qualité, et les objets sont reprojetés quand le repère s’affine. L’écart entre balises mesuré ainsi se répète à 1 cm d’une session à l’autre, là où l’estimation native variait de 40 cm.
Le corps. Une balise cachée derrière le dos lit 20 à 100 cm de trop pendant plusieurs secondes. L’erreur UWB est à sens unique : une distance trop longue est suspecte, une distance trop courte presque jamais. Le filtre en tient compte, mesure par mesure.
Un mode « test de précision » enregistre des points repères au sol (scotch) et les revérifie d’une session à l’autre, en séparant rotation, décalage et résidu.
Ce que j’en retiens
- Deux balises espacées d’un mètre et des objets à 2,5 m : 5 cm d’erreur sur une balise font 3°, donc 15 cm à l’objet. Il faut écarter les balises, ou en ajouter une troisième. C’est ce qui a mené à SoundStage.
- La sensation « ça marche au millimètre » vient surtout de la caméra ; l’UWB, lui, garantit que la carte ne dérive pas.
Dessous, l’histoire en six étapes : trois balises, un téléphone, et ce que fait une distance faussée par le corps.
Un corps devant une balise
Le téléphone ne bouge pas. En six étapes : ce qu'un corps fait à une mesure UWB, et comment le filtre s'en protège.
1/6Trois distances propres
erreur 3 cmChaque balise mesure sa distance au téléphone : trois cercles. Leur point commun, calculé par moindres carrés, tombe sur le téléphone à quelques centimètres près.
Des enceintes qui savent où vous êtes
Un home-cinéma sait faire venir un son de la gauche ou de la droite, quand on est assis à la bonne place. Si les enceintes savent où l’on est, on peut poser un objet sonore à un endroit fixe du salon et se promener autour : quand je passe derrière, le son passe devant.
Le montage. Trois balises scotchées aux murs, qui se mesurent entre elles au démarrage puis se mettent en mode FiRa dès que le téléphone se connecte. L’iPhone fusionne UWB et caméra et envoie sa position 20 fois par seconde au Mac. Le Mac calcule, pour chaque enceinte, un retard et un gain à partir de la position de l’auditeur, répartit l’objet sur les deux enceintes qui l’encadrent vu de l’auditeur, et sort 8 canaux par HDMI vers l’ampli en mode direct.
Les enceintes sont localisées par le son. Le Mac joue un clic par enceinte, le téléphone les enregistre et n’a besoin que des écarts d’arrivée : aucune synchronisation d’horloge. Une quarantaine de positions dans la pièce, un solveur robuste, et la carte des enceintes est connue à 8 cm près.
Et calibrées par le son. Une bouffée de bruit rose par enceinte, mesurée au micro du téléphone en neuf points ; on en déduit le niveau de chaque enceinte et son timbre par bande d’octave. Résultat mesuré : les enceintes avant étaient 2 à 3 dB trop fortes et plus riches à 500 Hz, les arrières plus présentes à 2 kHz. Deux corrections, et la voix garde le même timbre en passant de l’avant à l’arrière.
Ce que ça ne peut pas faire, et pourquoi
En tournant autour de l’objet, la direction est juste, mais il « sonne » à 4 mètres alors qu’il est à 1,4 m. C’est physique : une image fantôme entre deux enceintes ne peut exister que sur la ligne qui les joint, et des enceintes encastrées à 4 m produisent le rapport son direct / réverbéré de 4 m, qui est le premier indice de distance pour l’oreille.
Ce que dit la littérature : changer la directivité de l’enceinte (Laitinen & Pulkki, 2015), impossible avec des enceintes murales ; les sources focalisées de la synthèse de front d’onde, qui demandent des dizaines d’enceintes ; ou le transaural, l’annulation de la diaphonie entre les deux oreilles avec suivi de la tête, seule voie avec peu d’enceintes. Je l’ai implémenté en expérimental, sur la bande 600–1800 Hz, là où 2–3 cm d’erreur de position restent petits devant la longueur d’onde. Verdict à l’écoute : pas encore.
Ce que j’en retiens
- Le premier rendu compensait la distance en champ libre, jusqu’à +12 dB sur les enceintes lointaines : les avant dominaient tout. Un salon n’est pas un champ libre ; la compensation est maintenant mesurée et bornée à ±3 dB.
- Un micro d’iPhone suffit pour cartographier et calibrer des enceintes, à condition de ne mesurer que des écarts et des rapports.
- Une revue de code par un second modèle a trouvé cinq vrais défauts en une passe, dont deux que j’entendais sans les comprendre.
Dessous : les mesures de la calibration (réelles), puis le rendu dans votre navigateur, au casque.
Calibration des six enceintes
Vraies mesures du 26 septembre 2026, au micro de l'iPhone, à la place d'écoute : le niveau de chaque enceinte, puis son timbre par octave.
On ne fait que baisser : chaque enceinte descend au niveau de la plus faible (Ls), jamais d'amplification qui pourrait saturer.
Marche autour de la voix
Déplacez le point vert, ou lancez le tour. Au casque, la voix (la vraie lecture utilisée dans le salon) est rendue en binaural à sa vraie distance ; en dessous, ce que l'app enverrait à chaque enceinte.
+0.3 dB
+1.0 dB
+1.2 dB
-1.3 dB
+1.2 dB
-0.9 dB
En chiffres
Le système tel qu'il tourne dans le salon.
3
balises au mur
20 Hz
positions envoyées au Mac
8 cm
précision de la carte des enceintes
8
canaux audio calculés en continu
Les cartes entre elles
Sans téléphone, les trois cartes forment un petit réseau : chacune émet à son tour dans un créneau, et chaque trame porte l’heure d’émission et l’heure de réception des dernières trames entendues. Avec ces horodatages, chaque carte reconstruit toutes les distances du groupe, y compris celles qu’elle n’a pas mesurées elle-même. Pas de maître, pas d’ancre : une carte qui arrive écoute, prend un créneau libre, et la matrice des distances se met à jour chez tout le monde.
Ce que mesure le banc. Trois cartes, matrice complète sur chacune, écart-type de 6 à 9 mm par paire à 25 mesures par seconde, zéro erreur de trame. Une distance mesurée par un nœud et la même distance « entendue » par un troisième concordent au millimètre. La même radio transporte des données : 2,5 Mbit/s dans un sens, 1,27 + 1,27 Mbit/s dans les deux, avec la mesure de distance qui continue à 90 Hz.
Ce qui a demandé le plus de travail
L’horloge de la puce n’avance pas pendant l’écoute. Le compteur de temps du DW3110 ne se rafraîchit qu’à l’état de repos. Le premier firmware voyait le temps sauter de 64 créneaux et n’émettait jamais. La solution : compter le temps sur le microcontrôleur et se recaler sur la puce à chaque passage au repos.
Lire une trame rend sourd. Lire une trame de 1 Ko par SPI prend jusqu’à une milliseconde, pendant laquelle la trame suivante est perdue. Réarmer le récepteur avant de lire, en s’appuyant sur le fait que la lecture est plus rapide que l’écriture radio, a ramené le temps sourd à 150 µs, quelle que soit la taille des trames. Et l’horloge SPI compte : à 8 MHz la trame suivante rattrape la lecture et corrompt les données en silence.
La calibration. L’erreur de délai d’antenne se corrige par carte, sur un triangle équilatéral d’un mètre mesuré au mètre ruban. Deux fois j’ai calibré contre une distance supposée plutôt que mesurée, et deux fois j’ai eu 20 cm d’erreur. Toujours mesurer d’abord.
Ce que j’en retiens
- Le débit utile d’une puce à 6,8 Mbit/s en partage de temps, c’est 2 à 3 Mbit/s pour tout le groupe, quel que soit le nombre de nœuds. Au-delà, il faut réutiliser le canal dans l’espace, pas optimiser le logiciel.
- Un simulateur multi-nœuds côté PC, qui exécute le vrai code, a trouvé les problèmes de synchronisation avant le matériel. Le matériel a trouvé tout le reste.
- Le rapport technique complet (en anglais) sera publié avec le code.
Une supertrame, cinq nœuds
Chacun émet à son tour : une courte trame de mesure, puis un créneau de données. En écoutant tout, chaque nœud remplit la même matrice des distances.
Distances (m), identiques chez chaque nœud
« … » : deux trames sur trois. Une paire est complète quand le premier nœud réémet, au début de la supertrame suivante.
Part du temps de données
Créneaux de mesure : chaque nœud émet à son tour une trame courte (603 µs), horodatée à l'arrivée par tous les autres.
En chiffres
Mesuré sur le banc : données et distances sur les mêmes cartes UWB.
2,5 Mbit/s
débit mesuré dans un sens
90 Hz
mesures de distance sous charge
6–9 mm
écart-type par paire
0
erreur de trame



