<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Les pelotes de ficelle</title>
    <link>https://pf.olibrio.fr/</link>
    <atom:link href="https://pf.olibrio.fr/feed.xml" rel="self" type="application/rss+xml"/>
    <description>On attrape un bout, on tire le fil, on déroule la pelote. Le blog de Sam : électronique, données, climat, IA et rétro-ingénierie, enquêtes maison.</description>
    <language>fr</language>
    <lastBuildDate>Thu, 01 Oct 2026 12:00:00 +0000</lastBuildDate>
    <generator>build.py</generator>
    <item>
      <title>Un rayon cassé sur mon moteur-roue, et le tensiomètre que j&#x27;ai fini par souder</title>
      <link>https://pf.olibrio.fr/posts/tensiometre-rayons-moteur-roue.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/tensiometre-rayons-moteur-roue.html</guid>
      <pubDate>Thu, 01 Oct 2026 12:00:00 +0000</pubDate>
      <description>Deuxième roue de moteur-roue 2 000 W à perdre un rayon. Plutôt que de retendre à l&#x27;oreille, j&#x27;ai conçu puis soudé un tensiomètre : flexion trois points sur presque toute la longueur du rayon, force donnée par le déclic d&#x27;une clé dynamométrique, lecture au pied à coulisse. Le raisonnement, les fausses pistes, l&#x27;outil, les premiers chiffres, et ce qu&#x27;il reste à mesurer.</description>
      <category>vélo électrique</category>
      <category>moteur-roue</category>
      <category>rayons</category>
      <category>tension</category>
      <category>tensiomètre</category>
      <category>clé dynamométrique</category>
      <category>diy</category>
      <category>soudure</category>
      <category>mécanique</category>
      <category>ia</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/og-tensiometre.jpg" alt="Un rayon cassé sur mon moteur-roue, et le tensiomètre que j&#x27;ai fini par souder"></p>
<div class="tldr">
<p><strong>En deux minutes, si vous cassez des rayons sur un moteur-roue</strong></p>
<ul>
<li><strong>Le symptôme</strong> : un rayon cassé sur un moteur-roue de 2 000 W, après une première roue déjà perdue de la même façon. Trente-six rayons courts et épais, 160 mm pour 2,6 mm de diamètre, dont personne ne connaît la tension.</li>
<li><strong>Pourquoi pas un tensiomètre du commerce</strong> : sur un rayon aussi court et aussi gros, un appareil qui fléchit le rayon sur 60 mm mesure surtout la raideur propre du rayon, pas sa tension. Et la table papier s&rsquo;arrête avant la zone utile.</li>
<li><strong>L&rsquo;outil</strong> : une flexion en trois points sur 125 mm, presque toute la longueur libre du rayon. La force vient du déclic d&rsquo;une clé dynamométrique, donc elle est la même à chaque fois. Deux roulements de roller tiennent le rayon sans frotter, un pied à coulisse lit la flèche et garde le maximum quand le déclic relâche la charge.</li>
<li><strong>Les premiers chiffres</strong> : à 5 Nm, 100 N de tension font 0,07 mm au pied à coulisse. La dispersion de la clé vaut 8 % de tension. Le premier rayon mesuré sort vers 850 N. Et une leçon de mécanique au passage : un rayon monté est quatre fois plus raide en flexion qu&rsquo;un rayon libre, parce que ses bouts sont tenus.</li>
<li><strong>La suite</strong> : dix mesures sur un même rayon pour la dispersion réelle, un banc d&rsquo;étalonnage, puis le relevé des trente-six rayons. C&rsquo;est la prochaine étape.</li>
</ul>
</div>
<hr />
<h3 id="acte-i-le-rayon-qui-casse">Acte I : le rayon qui casse</h3>
<p>Un moteur-roue de 2 000 W, c&rsquo;est un moyeu de vingt et un centimètres de diamètre lacé dans une jante par des rayons courts et épais : 160 mm hors tout, 2,6 mm de diamètre, trente-six au total, croisés une fois. Quand l&rsquo;un d&rsquo;eux casse, ce n&rsquo;est jamais une surprise pour la roue, seulement pour le cycliste. J&rsquo;en étais à ma deuxième roue : la première avait fini de la même façon, un rayon, puis deux, puis une jante qui se dévoile et qu&rsquo;on ne rattrape plus.</p>
<p>Un rayon ne casse presque jamais parce qu&rsquo;il est trop tendu. Il casse parce qu&rsquo;il ne l&rsquo;est pas assez : à chaque tour de roue, quand il passe en bas, la charge le détend, et un rayon qui se détend et se retend des milliers de fois par kilomètre finit en fatigue, le plus souvent au coude, dans le trou du flasque. La bonne réponse n&rsquo;est donc pas de remplacer le rayon cassé, c&rsquo;est de savoir à quelle tension sont les trente-cinq autres, et de les amener tous au même niveau, le bon.</p>
<p>Le problème, c&rsquo;est que ce niveau, personne ne me le donnait. Égaliser à l&rsquo;oreille, en faisant sonner les rayons, c&rsquo;est une vieille méthode qui marche pour égaliser, mais qui ne dit rien de la valeur absolue : une roue entière trop tendue sonne aussi bien qu&rsquo;une roue entière trop détendue, et sur les forums de vélos électriques, les jantes fendues par excès de tension sont aussi courantes que les rayons cassés par défaut. Il me fallait une mesure.</p>
<h3 id="acte-ii-pourquoi-pas-un-tensiometre-du-commerce">Acte II : pourquoi pas un tensiomètre du commerce</h3>
<p>Un tensiomètre de vélo classique, le modèle à 18 euros comme le modèle à 80, fonctionne en fléchissant le rayon entre deux appuis espacés d&rsquo;une soixantaine de millimètres avec un ressort calibré, et une table convertit la flèche lue en tension. Ça marche bien sur un rayon de vélo de 2 mm et de 280 mm de long, parce que ce rayon-là, laissé à lui-même, ne résiste presque pas à la flexion : ce que l&rsquo;appareil mesure, c&rsquo;est bien la tension qui le raidit.</p>
<p>Sur mon rayon de 2,6 mm, c&rsquo;est une autre histoire. La raideur propre d&rsquo;une tige en flexion croît comme la puissance quatre de son diamètre : passer de 2 à 2,6 mm la multiplie par presque trois. Sur 60 mm d&rsquo;appuis, la part de la tension dans ce que l&rsquo;appareil mesure tombe à moins de la moitié ; le reste, c&rsquo;est le rayon lui-même qui se défend, tension ou pas. Et la table papier de ces appareils s&rsquo;arrête de toute façon avant 2,6 mm. J&rsquo;aurais eu un chiffre, mais pas une mesure.</p>
<p>La solution tient en deux idées. D&rsquo;abord fléchir sur une portée aussi longue que possible, parce que la part de la tension grandit avec la portée : sur 125 mm au lieu de 60, elle passe de 45 % à plus de 70 % pour un rayon libre. Ensuite, remplacer le ressort par une force vraiment reproductible. J&rsquo;avais une clé dynamométrique à déclic de 3 à 20 Nm dans un tiroir. Un déclic, c&rsquo;est un couple connu, le même à chaque fois, à 4 % près. Avec un levier, c&rsquo;est une force connue.</p>
<h3 id="acte-iii-la-conception-et-ses-fausses-pistes">Acte III : la conception, et ses fausses pistes</h3>
<p>Le principe est resté le même du premier croquis à l&rsquo;outil soudé : trois points de contact sur le rayon, deux d&rsquo;un côté aux extrémités de la portée, un au milieu de l&rsquo;autre côté, porté par un bras que la clé fait tourner autour d&rsquo;un pivot. La clé déclenche, le bras a poussé le rayon avec une force fixée, et la flèche qu&rsquo;il a prise dépend de sa tension.</p>
<p>Ce qui a changé, ce sont tous les détails, et je les ai travaillés sur un modèle paramétrique en 3D, avec un assistant IA pour tenir le modèle, l&rsquo;ouvrir dans Blender et faire les calculs à chaque itération. Quelques fausses pistes valent d&rsquo;être racontées, parce qu&rsquo;elles sont instructives.</p>
<p><strong>La première version était imprimée en plastique.</strong> Le calcul l&rsquo;a tuée avant l&rsquo;impression : pour 1,5 mm de flèche à mesurer sur le rayon, le bras en PLA fléchissait de 2,5 mm. Tout le chemin d&rsquo;effort est passé en acier.</p>
<p><strong>La deuxième fléchissait le rayon hors du plan de la roue</strong>, vers l&rsquo;extérieur, parce que c&rsquo;était plus facile à construire. Je l&rsquo;ai refusée : un rayon travaille dans le plan de la roue quand le moteur pousse, et je voulais le mesurer dans ce sens-là. Pour un rayon rond les deux sont équivalents, mais ce n&rsquo;était pas naturel, et le pivot aurait été à un endroit impossible une fois l&rsquo;outil posé sur une vraie roue, avec les rayons voisins qui passent à 24 mm.</p>
<p><strong>Les appuis sont des roulements, pas des pions.</strong> La littérature sur les tensiomètres est claire : le frottement du rayon sur ses appuis fausse la lecture, et de beaucoup. Deux roulements de roller, 22 mm de diamètre, 8 mm d&rsquo;alésage, coûtent presque rien et roulent sans frotter. Le troisième point est une simple fourche, parce qu&rsquo;il ne bouge pas.</p>
<p><strong>Le déclic relâche la charge.</strong> C&rsquo;est en animant le mécanisme dans Blender que ça m&rsquo;a sauté aux yeux : une clé à déclic prend environ trois degrés de jeu au moment où elle déclenche, et le couple chute. Le rayon, lui, ne demande que deux degrés au bras pour revenir. Si on lisait la position du bras après le déclic, on lirait n&rsquo;importe quoi. D&rsquo;où une lecture au maximum retenu : la tige de profondeur d&rsquo;un pied à coulisse, poussée par le bras, reste là où le bras l&rsquo;a amenée quand il recule. On lit le maximum, celui du déclic.</p>
<p><img alt="Vue de dessus du modèle 3D de l'outil posé sur une roue complète : tube orange au-dessus du rayon mesuré, bras bleu, galets, clé et pied à coulisse" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/08-blender-vue-de-dessus.png" /></p>
<p><img alt="Vue de côté du modèle : le rayon horizontal, les deux galets dans le plan des rayons, le tube au-dessus, le bras et la tête de clé encore au-dessus" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/09-blender-vue-de-cote.png" /></p>
<h3 id="acte-iv-loutil-soude">Acte IV : l&rsquo;outil soudé</h3>
<p>Entre le modèle et l&rsquo;atelier, l&rsquo;outil a encore changé, comme toujours quand on a des plats d&rsquo;acier, un poste à souder et une boîte de boulons sous la main plutôt que l&rsquo;inventaire exact du modèle. Le modèle 3D a été recalé ensuite sur l&rsquo;outil réel, cote par cote, photos à l&rsquo;appui. Voilà ce qui existe.</p>
<p>Le bâti est un tube carré de 25 mm qui se pose au-dessus du rayon, à 6 mm de lui, et qui reste entièrement hors de la nappe des rayons voisins. Seuls trois éléments descendent au niveau du rayon : la fourche à l&rsquo;extrémité côté moyeu, une fente de 3,5 mm pendue sous le bout du tube, et les deux roulements, chacun au bout d&rsquo;un boulon vertical. Le premier roulement, A, est au bout d&rsquo;un boulon soudé sous le tube, à 125 mm de la fourche. Le second, B, de l&rsquo;autre côté du rayon, à 60 mm de A, est au bout d&rsquo;un boulon soudé au bras mobile.</p>
<p>Le bras mobile est un plat de 4 mm posé au-dessus du tube. Il pivote sur un boulon laissé glissant, X, planté dans une plaque de 4 mm soudée sur le tube, à 15 mm de A et 46 mm de B. Une douille soudée sur le bras, à 25 mm de A, reçoit le carré de la clé dynamométrique, dont le manche part radialement vers la jante. Quand la clé pousse, le bras tourne autour de X et B appuie sur le rayon avec le couple divisé par 46 mm : 111 N à 5 Nm, 156 N à 7.</p>
<p>Le pied à coulisse est glissé entre le bras et le tube, à côté de la plaque du pivot, et sa tige de profondeur vient toucher le boulon de B. Il lit directement le déplacement de B par rapport au tube, c&rsquo;est-à-dire la flèche du rayon par rapport à la corde qui joint ses deux appuis fixes, A et la fourche.</p>
<p><img alt="L'outil posé sur l'établi, pied à coulisse en travers du tube, galet A et sa rondelle au premier plan" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/01-outil-et-pied-a-coulisse.jpg" /></p>
<p><img alt="Le dessous de l'outil, avec la clé dynamométrique engagée dans la douille soudée sur le bras mobile" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/02-outil-dessous-cle.jpg" /></p>
<p><img alt="Les trois points de contact repérés sur l'outil : A le galet côté jante, B le galet du bras mobile, C la fourche côté moyeu" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/03-outil-lettrage.jpg" /></p>
<p><img alt="Un rayon libre monté dans l'outil : il passe dans la fente de la fourche, longe le galet B d'un côté et le galet A de l'autre" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/04-rayon-libre-dans-l-outil.jpg" /></p>
<p><img alt="Vue de côté montrant les galets sur leurs boulons, nettement en dessous du tube : seuls les galets et la fourche sont dans le plan des rayons" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/06-galets-sur-entretoises.jpg" /></p>
<p><img alt="Élévation cotée de l'outil : tube au-dessus du rayon, plaque du pivot, bras mobile, galets A et B, fourche C, règle du pied à coulisse" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/07-schema-elevation.png" /></p>
<h3 id="acte-v-les-premiers-chiffres-et-une-lecon-de-mecanique">Acte V : les premiers chiffres, et une leçon de mécanique</h3>
<p>Première surprise, et c&rsquo;est celle qui m&rsquo;a appris le plus. Sur un rayon libre, tenu en l&rsquo;air dans l&rsquo;outil, j&rsquo;ai lu 3,4 mm à 3 Nm, 4,6 mm à 5 Nm et 5,9 mm à 7 Nm. Trois points parfaitement alignés, 0,625 mm par Nm, mais une droite qui ne passe pas par zéro : il y a 1,5 mm de lecture avant que le rayon ne commence à se défendre. C&rsquo;est le jeu de montage, la fente de 3,5 sur un rayon de 2,6, le pivot glissant, les boulons. Il est constant, du moins ces trois fois-là, et il se retranche. Mais il interdit de lire une mesure seule sans l&rsquo;avoir caractérisé.</p>
<p>Deuxième surprise : cette pente était deux fois et demie plus faible que ce que prévoyait le calcul pour un rayon de 2,6 mm libre sur deux appuis. J&rsquo;ai d&rsquo;abord cherché où partait le couple. Il ne partait nulle part. C&rsquo;est la poutre qui était fausse : un rayon qu&rsquo;on tient par le bout entre deux doigts n&rsquo;est plus libre, et surtout, un rayon monté dans une roue a ses extrémités tenues, le coude dans le trou du flasque à 20 mm de la fourche, l&rsquo;écrou dans la jante à 15 mm du galet A. Avec des bouts tenus aussi près des appuis, la raideur en flexion est quatre fois celle d&rsquo;une poutre libre. Du coup la part de la tension dans ce que lit l&rsquo;outil retombe à 40 % environ vers 1 000 N. C&rsquo;est moins qu&rsquo;espéré, mais c&rsquo;est encore largement mesurable.</p>
<p>Sur le rayon monté, j&rsquo;ai lu 3,8 mm à 7 Nm. Une fois le jeu retranché, il reste 2,3 mm élastiques, et le modèle les convertit en 850 N environ, entre 640 et 1 140 selon que le jeu vaut vraiment 1,2 ou 1,8 mm. Pour un rayon de 2,6 mm sur un moteur-roue, l&rsquo;ordre de grandeur couramment visé est de 1 000 N. Ce rayon-là n&rsquo;est donc pas loin, mais ce chiffre reste un calcul, pas une mesure : la position exacte des appuis et l&rsquo;encastrement réel du coude pèsent 20 % sur le résultat. Pour comparer les rayons entre eux, le modèle suffit. Pour des newtons, il faudra un banc.</p>
<p>Et la contrainte dans le rayon, parce que l&rsquo;outil peut plier ce qu&rsquo;il mesure. Le rayon libre a pris 6,7 mm de flèche vraie sur 125 mm à 7 Nm sans garder de courbure, ce qui correspond à 1 300 MPa en surface : la limite élastique d&rsquo;un rayon étiré, pas plus haut. Sur un rayon monté et détendu, 7 Nm montent à 1 500 MPa. <strong>Le bon réglage est 5 Nm</strong> : entre 800 et 1 100 MPa quelle que soit la tension, 0,07 mm de lecture pour 100 N autour de 1 000 N, et la clé dans la zone de sa plage où ses 4 % sont garantis. Ces 4 % de couple se lisent comme 8 % de tension, c&rsquo;est l&rsquo;incertitude dominante, et aucun levier ne la réduit. Pour égaliser une roue, c&rsquo;est suffisant.</p>
<p>Lecture attendue au pied à coulisse à 5 Nm, jeu de 1,5 mm compris, pour un rayon monté :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Tension du rayon</th>
<th>Lecture à 5 Nm</th>
</tr>
</thead>
<tbody>
<tr>
<td>0 N</td>
<td>4,57 mm</td>
</tr>
<tr>
<td>400 N</td>
<td>3,68 mm</td>
</tr>
<tr>
<td>800 N</td>
<td>3,19 mm</td>
</tr>
<tr>
<td>1 000 N</td>
<td>3,03 mm</td>
</tr>
<tr>
<td>1 200 N</td>
<td>2,89 mm</td>
</tr>
<tr>
<td>1 600 N</td>
<td>2,68 mm</td>
</tr>
</tbody>
</table></div>
<p>La courbe s&rsquo;aplatit vers les fortes tensions : au-delà de 1 200 N, l&rsquo;outil distingue mal. Pour ma roue, ce n&rsquo;est pas le problème.</p>
<p><img alt="L'outil en place sur la roue, clé dynamométrique engagée, manche radial par-dessus la jante, pied à coulisse en travers" src="https://pf.olibrio.fr/images/tensiometre-rayons-moteur-roue/05-mesure-sur-la-roue.jpg" /></p>
<h3 id="acte-vi-ce-quil-reste-a-faire">Acte VI : ce qu&rsquo;il reste à faire</h3>
<p>Tout ce qui précède repose sur une poignée de relevés. La prochaine étape, c&rsquo;est de faire parler l&rsquo;outil sérieusement, dans cet ordre.</p>
<ol>
<li><strong>Dix mesures à 5 Nm sur un même rayon</strong>, sans toucher l&rsquo;écrou, coulisseau remis à zéro entre chaque, manche de la clé toujours dans la même direction. C&rsquo;est la dispersion réelle de l&rsquo;outil, celle qui compte.</li>
<li><strong>Cinq mesures à 3 Nm sur le même rayon</strong>, pour vérifier que le jeu de 1,5 mm ne bouge pas.</li>
<li><strong>Un point de contrôle à tension nulle</strong>, sur le rayon libre, en ne tenant que le tube cette fois.</li>
<li><strong>Un banc d&rsquo;étalonnage</strong> : un profilé, un rayon de rechange, un peson, de 600 à 1 200 N. C&rsquo;est lui qui transformera les millimètres en newtons sans passer par le modèle.</li>
<li>Puis le relevé des trente-six rayons, la recherche de la tension cible, et le remplacement du rayon cassé, en notant exactement où il a cassé.</li>
</ol>
<p>Si vous cassez des rayons sur un moteur-roue, retenez surtout ceci : le son ne vous donnera pas le niveau, un tensiomètre de vélo classique non plus sur du 12G, et un rayon monté se comporte autrement qu&rsquo;un rayon libre. Le reste, c&rsquo;est de la ferraille, une clé à déclic et un pied à coulisse.</p>]]></content:encoded>
    </item>
    <item>
      <title>Une remorque de famille dessinée avant la première soudure : cuisine, bac de sport, trois vélos</title>
      <link>https://pf.olibrio.fr/posts/remorque-famille-cuisine-velos.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/remorque-famille-cuisine-velos.html</guid>
      <pubDate>Sat, 19 Sep 2026 12:00:00 +0000</pubDate>
      <description>Conception d&#x27;une remorque maison tractée par un VW T5 long : cuisine à tiroirs, frigo et gaz, grand bac pour la grimpe, le surf et la rando, trois vélos sur le toit. Pourquoi l&#x27;essieu de Mini classique était sous-dimensionné, pourquoi celui de Seat Cordoba 1.9D l&#x27;a remplacé, comment placer l&#x27;essieu pour 7 % de poids sur flèche, quelle longueur de timon pour reculer facilement, et pourquoi le vrai risque sur autoroute n&#x27;est pas le louvoiement mais le vent latéral.</description>
      <category>remorque</category>
      <category>bricolage</category>
      <category>blender</category>
      <category>essieu</category>
      <category>mini</category>
      <category>seat cordoba</category>
      <category>vw t5</category>
      <category>poids sur flèche</category>
      <category>porte-vélos</category>
      <category>cuisine nomade</category>
      <category>ia</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/og.jpg" alt="Une remorque de famille dessinée avant la première soudure : cuisine, bac de sport, trois vélos"></p>
<div class="tldr">
<p><strong>En deux minutes, si vous voulez construire une remorque vous-même</strong></p>
<ul>
<li><strong>Le projet</strong> : une remorque derrière notre T5 long, avec au rez-de-chaussée une cuisine à tiroirs (évier, réchaud) d&rsquo;un côté et le frigo avec sa bouteille de gaz de l&rsquo;autre ; au-dessus un grand bac pour le matériel de grimpe, de surf et de rando ; sur le toit, les trois vélos de la famille.</li>
<li><strong>La méthode</strong> : tout dessiner et tout calculer <strong>avant</strong> d&rsquo;acheter le moindre tube. Le modèle est un script Blender paramétrique : on change une cote, on relance, on a de nouvelles images.</li>
<li><strong>La mauvaise nouvelle</strong> : l&rsquo;essieu de Mini que j&rsquo;avais prévu <strong>ne tient pas la charge</strong>. Chargée, la remorque met environ 540 kg sur l&rsquo;essieu pour ~450 admissibles. Voir <a href="#essieu">L&rsquo;essieu de Mini n&rsquo;a pas passé les chiffres</a>.</li>
<li><strong>La bonne</strong> : l&rsquo;essieu de Seat Cordoba 1.9D que j&rsquo;ai aussi sous la main porte bien plus lourd. La première version de ce billet affirmait que ses ressorts hélicoïdaux ne coûtaient pas de hauteur : c&rsquo;était faux, ils montent vers la caisse. Depuis le 21 septembre, le problème est ramené à <strong>une seule cote à mesurer</strong>. Voir <a href="#correction">Correction : les ressorts prennent bien de la place</a>, puis <a href="#cordoba-montage">Le Cordoba, ramené à une cote</a>.</li>
<li><strong>Sur autoroute</strong>, le louvoiement n&rsquo;est pas le problème — un T5 pèse quatre fois la remorque. <strong>Le vrai risque, c&rsquo;est le vent latéral — et ce sont les vélos, pas la caisse</strong> : au retour, une rafale de 55 km/h suffit à délester une roue quand on roule à 110. Chiffres refaits le 21 septembre avec la méthode qui sert à fermer les ponts aux camions. Voir <a href="#vent">Le vent : trois objections, puis la méthode des ponts</a>.</li>
<li><strong>Pour reculer facilement</strong> : un timon de 2 m, et surtout <strong>une poutre unique sur le premier mètre derrière la boule</strong>. C&rsquo;est elle, plus que la longueur, qui évite de toucher le T5 en manœuvre. Voir <a href="#fleche">Une flèche pour reculer sans y penser</a>.</li>
<li><strong>Les vélos</strong> ne montent pas par une rampe (elle aurait fait 4,40 m) mais avec un <strong>mât amovible, une potence pivotante et une poulie</strong>. Voir <a href="#velos">Monter trois vélos à près de 2 m</a>. <em>Abandonné le 21 septembre : les vélos ne montent plus du tout.</em></li>
<li><strong>Mises à jour du 21 septembre</strong> : le calcul de vent refait avec la méthode des ponts et l&rsquo;essieu de Mini qui revient par deux (<a href="#maj">première mise à jour</a>), puis deux idées qui changent la forme de la remorque : l&rsquo;essieu noyé dans la caisse et les vélos descendus du toit. <strong>La version retenue fait 1,63 m de haut au lieu de 2,92</strong>, et la rafale qu&rsquo;elle encaisse à 110 km/h passe de 55 à 91 km/h. Voir <a href="#maj2">la seconde mise à jour</a>.</li>
</ul>
<p><em>Rien n&rsquo;est encore construit. Ce billet raconte la phase où tout ce qu&rsquo;on casse ne coûte que du temps de calcul.</em></p>
</div>
<p><img alt="Rendu 3D d'une remorque vert sauge fermée, trois vélos sur le toit, timon long avec un mât démonté rangé dessus" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/01-fermee-velos.jpg" /></p>
<p><em>La version du 19 septembre, fermée, vélos chargés. Essieu de Cordoba, caisse de 2,30 × 1,61 m, timon de 2 m avec le mât de levage démonté et couché dessus. Celle que j&rsquo;ai finalement retenue est <a href="#retenue">plus bas</a> : elle fait 1,30 m de moins en hauteur.</em></p>
<h2 id="le-cahier-des-charges-tient-en-une-phrase">Le cahier des charges tient en une phrase</h2>
<p>Quand on part grimper, surfer ou marcher en famille, le T5 se remplit vite. L&rsquo;idée : sortir de l&rsquo;habitacle tout ce qui encombre — la cuisine, le frigo, le matériel, les vélos — et le mettre dans une remorque pensée pour ça, où chaque chose a sa place et s&rsquo;ouvre sans déballer le reste.</p>
<p>Je l&rsquo;ai décrit d&rsquo;une traite, à peu près comme ça : un essieu de Mini ; au niveau zéro, des tiroirs de cuisine d&rsquo;un côté (évier et petit réchaud), le frigo et sa bouteille de gaz de l&rsquo;autre ; au niveau au-dessus, un grand bac pour la grimpe, le surf et les bâtons de marche, fermé par un couvercle sur charnières de coffre tenu ouvert par des vérins à gaz ; enfin, sur le dessus, trois emplacements pour nos trois vélos, montés par une rampe amovible rangée sous la remorque.</p>
<p>C&rsquo;est une IA (Claude) qui a transformé cette phrase en modèle 3D : un script Python qui construit la remorque pièce par pièce dans Blender, avec toutes les cotes en tête de fichier. Je n&rsquo;ai pas ouvert Blender pour la dessiner. J&rsquo;ai regardé les images, corrigé, précisé — et c&rsquo;est précisément quand on est passé des images aux chiffres que le projet a changé.</p>
<h2 id="trois-etages-un-par-usage">Trois étages, un par usage</h2>
<p>Le principe est celui d&rsquo;une commode : ce qui est lourd en bas, ce qui est encombrant au milieu, ce qui est léger et volumineux en haut.</p>
<p><img alt="Profil de la remorque avec les cotes en orange : plancher à 0,75 m, dessus du niveau cuisine à 1,41 m, couvercle à 1,88 m, vélos jusqu'à 2,93 m ; caisse de 2,30 m, timon de 2,00 m, 3,10 m entre la boule et l'essieu" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/02-profil-cote.jpg" /></p>
<p><em>Les cotes principales de la version retenue. Le plancher est haut (0,75 m) parce que la caisse passe au-dessus des roues : c&rsquo;est ce qui permet une caisse plus large que la voie.</em></p>
<p><strong>Le rez-de-chaussée, côté trottoir, c&rsquo;est la cuisine.</strong> Un volet se relève et sert d&rsquo;auvent. Dessous, deux tiroirs bas coulissent vers l&rsquo;extérieur : l&rsquo;un porte l&rsquo;évier et son robinet, l&rsquo;autre un réchaud deux feux. Leur dessus forme le plan de travail, <strong>à 0,95 m du sol</strong>, la hauteur d&rsquo;une cuisine. Ce n&rsquo;est pas un hasard : la hauteur de ces tiroirs est calculée à partir de la hauteur du plancher, qui dépend de l&rsquo;essieu. Changez d&rsquo;essieu, le plan de travail reste à 0,95 m. Au-dessus, deux tiroirs pour la vaisselle et l&rsquo;épicerie ; au bout, une colonne pour deux jerrycans de 20 L, une pompe 12 V et la batterie.</p>
<p><img alt="La remorque côté cuisine, volet relevé en auvent, tiroir évier et tiroir réchaud sortis, colonne d'eau ouverte, vélos sur le toit" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/03-cuisine.jpg" /></p>
<p><em>Côté cuisine, vélos en place. Tout s&rsquo;ouvre sans rien décharger du toit.</em></p>
<p><strong>De l&rsquo;autre côté, le frigo et le gaz.</strong> Un frigo trimixte de 40 L (12 V, 230 V, gaz) sur une coulisse extractible, pour l&rsquo;ouvrir par le dessus une fois sorti. À l&rsquo;avant, un coffre étanche vers l&rsquo;intérieur et ventilé vers l&rsquo;extérieur — grilles haute et basse sur la porte, grille au plancher, parce que le propane est plus lourd que l&rsquo;air — pour une bouteille de 6 kg. À l&rsquo;arrière, la table et les chaises pliantes.</p>
<p><img alt="La remorque côté frigo, volet relevé, frigo sorti sur sa coulisse, porte du coffre gaz ouverte sur une bouteille bleue" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/04-frigo-gaz.jpg" /></p>
<p><em>Côté frigo. La bouteille est isolée du reste par une cloison, avec sa propre ventilation.</em></p>
<p><strong>Au-dessus, le bac.</strong> 2,26 m de long à l&rsquo;intérieur : de quoi coucher une planche de surf de 7&lsquo;0, un crash-pad, les cordes, les sacs et les bâtons. Le couvercle pivote sur trois charnières de coffre et tient ouvert à 82° grâce à deux vérins à gaz.</p>
<p><img alt="Vue plongeante sur le bac ouvert : planche de surf, crash-pad, cordes lovées, sac étanche ; couvercle relevé tenu par deux vérins" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/05-bac-ouvert.jpg" /></p>
<p><em>Le bac ouvert, sans les vélos — et ce n&rsquo;est pas un choix de mise en scène.</em></p>
<p>C&rsquo;est la première chose que le modèle m&rsquo;a apprise, avant même le moindre calcul : <strong>les vélos sont posés sur le couvercle</strong>. Tant qu&rsquo;ils y sont, le bac ne s&rsquo;ouvre pas. La cuisine et le frigo, si. C&rsquo;est une contrainte à assumer (on charge le bac avant les vélos) ou à contourner (une galerie fixe sur montants et des trappes latérales), mais pas une chose qu&rsquo;on découvre sur le parking du site d&rsquo;escalade.</p>
<p><em>Mise à jour du 21 septembre : contrainte levée. Les vélos ont quitté le couvercle, et le bac s&rsquo;ouvre vélos chargés — voir <a href="#velos-bas">Les vélos descendent du toit</a>.</em></p>
<h2 id="le-premier-jet-etait-beau-et-il-ne-prouvait-rien">Le premier jet était beau, et il ne prouvait rien</h2>
<p>La première version sortait des images propres en une soirée. Essieu de Mini, caisse de 2,30 × 1,45 m, timon de 1,35 m, essieu placé « un peu en arrière du milieu pour avoir du poids sur la boule », rampe télescopique de quatre éléments pour monter les vélos. Tout avait l&rsquo;air plausible.</p>
<p>Et c&rsquo;est exactement le problème : <strong>un rendu propre ressemble à une validation</strong>. Rien sur ces images ne disait combien pèse la remorque, ce que l&rsquo;essieu supporte, ni comment elle se comporte à 130 km/h derrière un fourgon. J&rsquo;ai donc demandé ce qu&rsquo;un carrossier aurait demandé : la répartition des masses calculée pour de bon, et une flèche assez longue pour manœuvrer facilement avec mon T5 long.</p>
<p>Le calcul est un second script, indépendant de Blender. Il reprend chaque élément — cadre, timon, panneaux, tiroirs, frigo, eau, gaz, matériel, vélos — avec sa masse estimée et sa position, et en tire le centre de gravité, la charge sur la boule et sur l&rsquo;essieu, pour cinq cas de chargement : à vide ; chargée sans vélos ; chargée avec vélos ; au retour, eau et vivres consommés ; et avec des vélos électriques.</p>
<p>Premier résultat : <strong>la remorque pèse 416 kg à vide</strong> dans sa version la plus légère (cadre en tube 50×30, contreplaqué de peuplier de 15 mm). Chargée avec les vélos, 582 kg. La toute première estimation, faite à la louche avant ce calcul, annonçait 260 à 400 kg à vide : le bas de la fourchette était très optimiste.</p>
<h2 id="essieu">L&rsquo;essieu de Mini n&rsquo;a pas passé les chiffres</h2>
<p>Mon essieu, c&rsquo;est le train arrière d&rsquo;une Mini classique : un berceau, deux bras tirés, des cônes en caoutchouc en guise de ressorts, des roues de 10 pouces. C&rsquo;est compact et léger. C&rsquo;est aussi le train arrière d&rsquo;une voiture de 650 kg, qui porte en temps normal 250 à 300 kg — et de l&rsquo;ordre de 450 kg au maximum.</p>
<p>Chargée avec les vélos, la remorque met <strong>541 kg sur son essieu</strong> ; 563 kg avec des vélos électriques. Soit 20 à 25 % au-dessus de ce que le train est censé porter, en permanence, sur autoroute. Même en allégeant tout ce qui peut l&rsquo;être, on ne descend pas sous le seuil avec une cuisine, un frigo, 40 L d&rsquo;eau et trois vélos.</p>
<p>J&rsquo;avais deux autres options sous la main ou à portée : un train arrière de Peugeot 205 ou 206, et celui de <strong>Seat Cordoba 1.9D</strong> (première génération). Le calcul les passe tous au même crible :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th></th>
<th>Mini</th>
<th>205</th>
<th>206</th>
<th>Cordoba 1.9D</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pneus</td>
<td>145/80 R10</td>
<td>165/70 R13</td>
<td>175/65 R14</td>
<td>175/70 R13</td>
</tr>
<tr>
<td>Voie</td>
<td>1,17 m</td>
<td>1,30 m</td>
<td>1,43 m</td>
<td>1,40 m</td>
</tr>
<tr>
<td>Charge sur l&rsquo;essieu, chargée + vélos</td>
<td>541 kg</td>
<td>568 kg</td>
<td>586 kg</td>
<td>584 kg</td>
</tr>
<tr>
<td>Charge max arrière (ordre de grandeur)</td>
<td>~450 kg</td>
<td>~600 kg</td>
<td>~700 kg</td>
<td>~750 kg</td>
</tr>
<tr>
<td>Accélération latérale avant renversement</td>
<td>0,57 g</td>
<td>0,60 g</td>
<td>0,65 g</td>
<td>0,64 g</td>
</tr>
</tbody>
</table></div>
<p><em>Les charges maximales sont des ordres de grandeur ; la vraie valeur « essieu AR » se lit sur la plaque constructeur de la voiture donneuse.</em></p>
<p><img alt="Quatre vues de dessous de la même remorque avec quatre trains différents : Mini à berceau et cônes, 205 à barres de torsion et amortisseurs couchés, 206 à barres de torsion, Cordoba à poutre de torsion et ressorts hélicoïdaux rouges posés sur les bras" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/06-essieux.jpg" /></p>
<p><em>La même remorque sur les quatre trains, générée en changeant une seule variable. La caisse s&rsquo;élargit d&rsquo;elle-même pour couvrir les roues. Le Cordoba y est dessiné avec des ressorts séparés, posés sur les bras : ce n&rsquo;est pas le montage de la voiture (voir <a href="#correction">la correction</a>).</em></p>
<p>Sur le papier, le Cordoba l&rsquo;emporte : la plus grosse marge de charge, des roues de 13 pouces qui encaissent mieux les nids-de-poule et chauffent moins leurs roulements à 130, une voie large. Et sa suspension devrait travailler dans sa plage d&rsquo;origine : l&rsquo;arrière d&rsquo;une Cordoba diesel est dimensionné pour des charges du même ordre que celles de la remorque (430 à 610 kg selon le chargement). Bonus que je n&rsquo;avais pas vu venir : sur ce type d&rsquo;essieu, la poutre qui relie les deux bras se tord quand une roue monte et l&rsquo;autre pas — elle fait office de <strong>barre anti-roulis</strong>, exactement ce qu&rsquo;on veut avec des vélos perchés en hauteur.</p>
<h3 id="correction">Correction : les ressorts prennent bien de la place</h3>
<p><em>Ajout du 19 septembre 2026, le jour même de la publication.</em></p>
<p>La première version de ce billet disait ici que les ressorts hélicoïdaux du Cordoba « ne coûtent pas un centimètre de hauteur » : ils devaient se loger entre le bras de suspension et le dessous du cadre, dans la trentaine de centimètres que le pneu laisse de toute façon libre sous le plancher. C&rsquo;est ce que montre le rendu ci-dessus, avec ses ressorts rouges.</p>
<p>En relisant, j&rsquo;ai tiqué : sur la voiture, le ressort remonte dans la caisse, bien au-dessus de la roue. Vérification faite sur un guide de démontage de la Polo 6N, qui partage sa plateforme avec la Cordoba 6K, c&rsquo;est bien ça. <strong>Le ressort entoure l&rsquo;amortisseur</strong>, les deux forment un combiné, et <strong>sa tête se boulonne dans le coffre</strong>, en haut du passage de roue, derrière les garnitures. En bas, un œil horizontal le fixe à la poutre, près du moyeu. L&rsquo;IA avait raisonné sur un ressort séparé posé sur le bras, comme on en trouve sur d&rsquo;autres essieux de ce type, sans vérifier sur cette voiture-là. Et le rendu propre a rendu l&rsquo;hypothèse crédible : exactement le piège décrit plus bas.</p>
<p>La conséquence : entre l&rsquo;œil du bas et le dessous du cadre, il reste environ 38 cm, et le combiné est nettement plus long. Il dépasserait dans le niveau 0, précisément sous le tiroir réchaud d&rsquo;un côté et sous le frigo de l&rsquo;autre. Quatre façons de s&rsquo;en sortir, que je n&rsquo;ai pas encore tranchées :</p>
<ul>
<li><strong>séparer ressort et amortisseur</strong> : garder la poutre et les bras du Cordoba, poser le ressort seul dans une coupelle sur le bras (boulonnée plutôt que soudée, sur une pièce de suspension) et une autre sous le cadre, avec un amortisseur court monté à part ;</li>
<li><strong>des tourelles dans le niveau 0</strong>, en réorganisant la cuisine et le côté frigo autour de l&rsquo;essieu ;</li>
<li><strong>monter le plancher</strong> de ce qui dépasse : le plus simple, mais les vélos et le centre de gravité montent d&rsquo;autant, alors que le vent latéral est déjà le point faible ;</li>
<li><strong>revenir au train de 205</strong>, dont les barres de torsion logent dans le tube et les amortisseurs sont couchés : aucun problème de hauteur, mais une marge de charge mince avec des vélos électriques.</li>
</ul>
<p>Pour choisir, il me faut trois mesures sur l&rsquo;essieu : la longueur du combiné monté, celle du ressort seul au repos, et la hauteur de l&rsquo;œil inférieur par rapport au centre de la roue.</p>
<p><em>Mise à jour du 21 septembre : le calcul a depuis ramené ces trois mesures à une seule. Voir <a href="#cordoba-montage">Le Cordoba, ramené à une cote</a>.</em></p>
<h2 id="autoroute">Tenir la route derrière le T5</h2>
<p>La règle qu&rsquo;on entend partout : du poids sur la flèche, sinon la remorque louvoie. Encore faut-il savoir combien. J&rsquo;ai visé <strong>7 % de la masse sur la boule</strong> en charge complète. Le calcul place alors l&rsquo;essieu à 1,20 m de l&rsquo;arrière de la caisse — 5 cm devant le milieu, là où le premier jet l&rsquo;avait mis 17 cm derrière, au jugé. Selon le chargement, la charge sur la boule reste entre 5,8 et 7,6 %, soit 31 à 45 kg, loin des 100 kg qu&rsquo;accepte l&rsquo;attelage du T5.</p>
<p>Pour le louvoiement lui-même, le calcul utilise un modèle classique de dynamique : la voiture et la remorque vues d&rsquo;en haut, reliées par la rotule, chacune avec sa masse, son inertie et ses pneus qui dérivent. On cherche la vitesse à partir de laquelle une petite oscillation, au lieu de s&rsquo;amortir, s&rsquo;amplifie.</p>
<p>Résultat : <strong>au-delà de 400 km/h</strong>. Dans tous les cas de chargement, avec tous les essieux, et même en plaçant l&rsquo;essieu pour avoir un poids sur flèche nul ou négatif.</p>
<p>Un résultat aussi confortable, je m&rsquo;en méfie. Un modèle qui répond « tout va bien » quoi qu&rsquo;on lui donne peut très bien être un modèle qui ne calcule rien. Alors on l&rsquo;a testé sur un cas dont on connaît la réponse : une caravane de 1,5 t derrière une berline de 1,4 t. Le même modèle la fait décrocher vers 160 km/h avec 5 % sur la flèche, 110 km/h avec 3 %, 80 km/h avec rien — ce qui correspond à ce qu&rsquo;on lit partout sur les caravanes. Le modèle sait donc prédire un décrochage ; s&rsquo;il n&rsquo;en trouve pas ici, c&rsquo;est que <strong>le T5 pèse quatre fois la remorque</strong>. Le chien remue la queue, pas l&rsquo;inverse.</p>
<p>Le vrai risque est ailleurs, et il est bien plus banal : <strong>le vent latéral</strong>. Trois vélos à près de 3 m de haut, une caisse de 1,20 m de flanc, une voie de 1,40 m. Au retour, quand l&rsquo;eau et les vivres sont consommés, <strong>une rafale de travers de 55 km/h suffit à délester la roue au vent quand on roule à 110 km/h</strong> ; en courbe, une trentaine. <em>(Correction du 21 septembre : la première version annonçait « environ 100 km/h ». Ce chiffre sortait d&rsquo;un modèle maison, et il ne vaut que pour une remorque à l&rsquo;arrêt. L&rsquo;histoire de cette correction est racontée <a href="#vent">plus bas</a>.)</em> La consigne en découle : par vent fort annoncé, on roule moins vite, ou les vélos voyagent dans le T5.</p>
<h2 id="fleche">Une flèche pour reculer sans y penser</h2>
<p>Reculer avec une remorque courte est un exercice de nerfs : elle part en biais avant qu&rsquo;on ait compris pourquoi. Ce qui compte, c&rsquo;est le rapport entre deux longueurs : la distance de la boule à l&rsquo;essieu de la remorque, et celle de l&rsquo;essieu arrière du T5 à la boule (environ 1,10 m sur un T5 long). Plus ce rapport est grand, plus la remorque réagit lentement, et plus on a le temps de corriger.</p>
<p>Avec un timon de 2 m, la boule est à <strong>3,10 m de l&rsquo;essieu</strong> : un rapport de 2,8. Allonger encore ne fait gagner que peu (3,0 avec 2,20 m de timon) et coûte de l&rsquo;encombrement (4,35 m hors tout, déjà 9,60 m pour l&rsquo;ensemble avec le T5).</p>
<p>Deux erreurs de calcul, au passage, ont été plus instructives que les bons résultats. La première version du calcul annonçait qu&rsquo;à fond de braquage, la remorque ferait un angle de <strong>164°</strong> avec le T5 — autrement dit qu&rsquo;elle le doublerait. Une rotation dans le mauvais sens ; corrigé, l&rsquo;angle tombe à 51°. La seconde annonçait un contact entre la remorque et le T5 à 55°, quelle que soit la longueur du timon. Suspect : si la longueur ne change rien, c&rsquo;est que ce n&rsquo;est pas elle qui limite. C&rsquo;était la tête d&rsquo;attelage elle-même, à 25 cm de la boule — qui en réalité passe <strong>sous</strong> le pare-chocs, comme sur n&rsquo;importe quelle remorque. Une fois ce point retiré, ce qui limitait vraiment est apparu : l&rsquo;écartement du V du timon près de la boule.</p>
<p>D&rsquo;où la forme retenue : <strong>une poutre centrale seule sur le premier mètre derrière la boule</strong>, le V ne s&rsquo;ouvrant qu&rsquo;au-delà. Le premier contact avec le T5 recule alors au-delà de 100° d&rsquo;articulation. En tournant à fond, on n&rsquo;en utilise que 51.</p>
<p><img alt="Vue de dessus : le T5 braqué à fond, la remorque derrière à 51 degrés, loin de l'arrière du fourgon" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/07-braquage.jpg" /></p>
<p><em>À fond de braquage, en régime établi : 51° entre le T5 et la remorque, avec une bonne marge avant le moindre contact. La remorque coupe le virage d&rsquo;environ 1 m à l&rsquo;intérieur de la trajectoire des roues arrière du T5.</em></p>
<p>Un détail que le modèle rend évident et auquel je n&rsquo;aurais pas pensé : la remorque (1,61 m) est plus étroite que le T5 (1,90 m). En ligne droite, <strong>on ne la voit pas dans les rétroviseurs</strong>. Une caméra de recul sans fil, ou deux piquets-témoins aux angles arrière, font partie du projet.</p>
<p><img alt="Vue trois-quarts arrière de la remorque attelée au T5, vélos sur le toit dépassant le toit du fourgon" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/08-attelee-t5.jpg" /></p>
<p><em>Attelée. Les vélos dépassent le toit du T5 d&rsquo;un mètre : à garder en tête devant les barrières de parking.</em></p>
<h2 id="velos">Monter trois vélos à près de 2 m</h2>
<p><em>Mise à jour du 21 septembre : cette section décrit une solution abandonnée deux jours plus tard. Je la laisse, parce que le raisonnement qui tue la rampe reste valable — et parce que la bonne réponse était de ne plus monter les vélos du tout. Voir <a href="#velos-bas">Les vélos descendent du toit</a>.</em></p>
<p>La rampe de mon idée de départ est morte d&rsquo;un simple calcul de trigonométrie. Les vélos reposent à près de 1,90 m ; pour une pente de 25°, déjà raide pour pousser un vélo, il faut une rampe de <strong>plus de 4,40 m</strong> — quatre éléments télescopiques, une béquille au milieu pour qu&rsquo;elle ne plie pas, et un vélo électrique de 25 kg à pousser à bout de bras. Jouable à deux avec des vélos musculaires, pénible autrement.</p>
<p>L&rsquo;alternative est venue de moi, et c&rsquo;est celle qu&rsquo;on a gardée : <strong>un mât amovible, une potence qui pivote en tête de mât, une poulie au bout</strong>. Le mât, en deux tronçons d&rsquo;alu de 1,50 m, s&rsquo;emmanche dans un fourreau soudé sur la poutre du timon, juste devant la caisse. La potence, 1,45 m de portée, couvre les trois gouttières et une prise au sol à côté de la remorque. Un treuil à main sur le mât, un câble qui passe par une poulie en tête puis par celle du bout de potence, et un palonnier accroché à la selle et à la potence du vélo pour qu&rsquo;il monte à plat.</p>
<p><img alt="La potence en action : mât planté devant la caisse, potence pivotée vers le côté cuisine, un vélo bleu suspendu à un palonnier orange à mi-hauteur, deux autres vélos déjà en place" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/09-potence.jpg" /></p>
<p><em>Le vélo de droite en cours de levage. Démonté, le mât et la potence se couchent sur le timon (visible sur les autres vues).</em></p>
<p>Deux contraintes sont sorties du modèle. La hauteur d&rsquo;abord : pour qu&rsquo;un vélo posé dans sa gouttière passe sous la poulie, palonnier compris, le mât doit monter à 3,45 m. Et l&rsquo;ordre de chargement : <strong>le vélo du milieu en premier</strong>. Sinon il faudrait le faire passer par-dessus un autre, et aucun mât raisonnable ne monte assez haut. Enfin, une évidence qu&rsquo;il vaut mieux écrire : on ne lève rien sur une remorque dételée et mal calée.</p>
<h2 id="maj">Mise à jour du 21 septembre : la Mini revient par deux, et le vent passe par la bibliothèque</h2>
<p><em>Deux jours après la publication. Rien n&rsquo;est construit, donc tout peut encore bouger — et ça a bougé.</em></p>
<h3 id="tandem">Et avec deux essieux de Mini ?</h3>
<p>Après la publication, on m&rsquo;a soufflé une idée que j&rsquo;avais écartée trop vite : puisqu&rsquo;un berceau de Mini ne suffit pas, <strong>en mettre deux, l&rsquo;un derrière l&rsquo;autre</strong>, avec des élargisseurs de voie de 5 cm par roue. L&rsquo;argument tenait en une ligne : la charge est doublée, la tenue de route bien supérieure, la résistance au vent latéral bien plus importante.</p>
<p>Ajouter la variante au modèle a pris une ligne de paramètres, comme pour les autres essieux. Restait à chiffrer chaque affirmation.</p>
<ul>
<li><strong>La charge : vrai, et mieux que prévu.</strong> Chaque berceau porte 290 kg, soit 145 kg par roue — à peu près ce que porte une roue arrière de Mini sur la route. Chaque cône de caoutchouc travaille donc là où il a été conçu pour travailler. La marge passe de −25 % avec un seul berceau à <strong>+33 %</strong>, vélos électriques compris.</li>
<li><strong>La tenue de route : vrai, pour une raison précise.</strong> Deux essieux écartés de 80 cm s&rsquo;opposent à la rotation de la remorque sur elle-même (le <em>lacet</em>) bien plus qu&rsquo;un seul : le rappel exercé par les pneus est <strong>multiplié par 4,7</strong>. C&rsquo;est ce qui calme une remorque après une rafale ou le passage d&rsquo;un poids lourd.</li>
<li><strong>Le vent latéral : match nul.</strong> Le renversement ne dépend que de deux choses, la largeur de voie et la hauteur du centre de gravité. Le tandem gagne parce que ses roues de 10 pouces autorisent un plancher 11 cm plus bas, et reperd l&rsquo;équivalent parce que sa voie reste plus étroite que celle du Cordoba.</li>
<li><strong>« La charge est doublée » : oui pour l&rsquo;essieu, non pour la remorque.</strong> Ce qui plafonne la charge utile, c&rsquo;est le poids total déclaré à l&rsquo;homologation : au-delà de 750 kg, il faut des freins et un autre permis. Le tandem achète de la marge et de la durée de vie, pas des kilos à emporter.</li>
</ul>
<p><img alt="Vue de dessous de la remorque sur deux berceaux de Mini en tandem : quatre petites roues de 10 pouces, deux traverses noires, la caisse plus basse que sur les autres versions" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/11-tandem-mini.jpg" /></p>
<p><em>La variante à deux berceaux de Mini. Tout le reste du modèle s&rsquo;est adapté seul : caisse de 1,46 m, plancher à 0,64 m, vélos à 2,82 m au lieu de 2,93.</em></p>
<p>Et il a un prix. <strong>Le ripage</strong>, d&rsquo;abord : pour pivoter, une remorque à deux essieux doit faire glisser ses pneus de côté. À fond de braquage, il faut 52 kg de poussée latérale à la boule. Le T5 ne s&rsquo;en aperçoit pas ; moi si, le jour où je voudrai la déplacer à la main sur un emplacement de camping. Ensuite, un défaut connu de ce montage, que j&rsquo;ai trouvé décrit chez les fabricants d&rsquo;essieux : deux suspensions indépendantes <strong>ne se partagent pas la charge toutes seules</strong>. C&rsquo;est la hauteur de la boule du T5 qui règle l&rsquo;assiette — 5 cm d&rsquo;écart, et l&rsquo;essieu avant perd 51 kg pendant que l&rsquo;arrière en prend 39 — et sur une bosse, un seul essieu encaisse presque tout. Les fabricants déclassent ces essieux d&rsquo;environ 20 % quand ils les montent par deux ; ici chacun travaille à 65 % de sa charge, donc la règle est respectée. Enfin, 43 kg de plus à vide, et cinq pneus de 10 pouces à trouver, une taille devenue rare.</p>
<h3 id="vent">Le vent : trois objections, puis la méthode des ponts</h3>
<p>Le passage sur le vent latéral, <a href="#autoroute">plus haut</a>, était faux. Pas dans sa conclusion — les vélos sur le toit restent le point faible — mais dans ses chiffres. L&rsquo;histoire de la correction m&rsquo;a plus appris que la correction elle-même.</p>
<p>Le premier calcul était <strong>un modèle écrit à la main par l&rsquo;IA</strong> : la poussée du vent sur le flanc de la remorque, comme sur un panneau. J&rsquo;ai tiqué trois fois.</p>
<p><em>« J&rsquo;ai vu des remorques hautes, sans suspension, qui ne souffrent pas du vent. »</em> Vérification faite : la même caisse, <strong>sans les vélos</strong>, encaisse une rafale bien plus forte. Le problème n&rsquo;est pas la hauteur de la caisse, ce sont les vélos : perchés à 2,30 m, ils font à eux seuls 41 % de l&rsquo;effort qui cherche à coucher la remorque. Au passage, le modèle s&rsquo;est révélé trop optimiste. Il oubliait qu&rsquo;une remorque qui roule ne reçoit pas le vent de côté mais de trois quarts, additionné à sa propre vitesse, et qu&rsquo;une caisse prise de biais est poussée bien plus fort qu&rsquo;un panneau pris de face.</p>
<p><em>« Un vélo n&rsquo;est pas un panneau plein. »</em> Exact. Compté pièce par pièce — pneus, jantes, rayons, cadre — un vélo ne présente au vent que 34 % de sa silhouette. Et l&rsquo;air passe au travers : il subit de la traînée, pas l&rsquo;effet d&rsquo;aile que subit la caisse. Les deux vélos sous le vent sont en plus abrités par le premier.</p>
<p><em>« Tu oublies le T5 devant, qui ouvre la voie. »</em> Là, j&rsquo;ai été étonné que ce soit moi qui y pense. Réponse : le T5 abrite bien la remorque… par vent faible. Son sillage part avec le vent, pas dans l&rsquo;axe de la route. À 110 km/h, l&rsquo;abri est complet sous 20 km/h de vent de travers, à moitié perdu à 40, presque nul à 60. Et les vélos dépassent de toute façon de son toit.</p>
<p>Trois corrections en trois objections : on tâtonnait. J&rsquo;ai donc demandé ce que j&rsquo;aurais dû demander d&rsquo;emblée — <strong>comment font les gens dont c&rsquo;est le métier ?</strong> Dix minutes de recherche ont suffi. La méthode existe, elle est publiée et en accès libre : c&rsquo;est celle de Baker et Soper (2018), qui sert à décider à partir de quelle rafale on interdit un pont aux camions. Elle tient en trois lignes, elle repose sur des coefficients <strong>mesurés</strong> en soufflerie et en vraie grandeur, et elle contenait déjà ma troisième objection : une remorque mesurée derrière son camion ne gagne qu&rsquo;environ 10 % d&rsquo;abri.</p>
<p>Refait avec cette méthode, au retour et vélos sur le toit : <strong>une rafale de 55 km/h suffit à délester la roue au vent quand on roule à 110 km/h</strong>, 61 km/h quand on roule à 90. Remorque pleine et sans vélos : 85. Ces vitesses s&rsquo;entendent à hauteur de remorque ; la météo annonce des rafales mesurées à 10 m de haut, et en terrain dégagé le vent est environ un quart plus faible au ras de la route. La méthode classe chaque véhicule par une « vitesse caractéristique » : avec ses vélos, ma remorque est plus vulnérable qu&rsquo;un <strong>autobus à impériale vide</strong>, le premier véhicule qu&rsquo;on arrête quand le vent se lève sur le pont de Queensferry, en Écosse. La consigne pratique : dès 80 km/h de rafales annoncées, on ralentit à 90, ou les vélos voyagent dans le T5.</p>
<p>Le modèle maison donnait 58 km/h au lieu de 55 : le bon ordre de grandeur, obtenu après trois rustines. Une part du calcul reste de mon cru, et elle est signalée comme telle : le traitement des vélos, faute de mesure publiée sur des vélos posés sur un toit.</p>
<h3 id="limites">Quand ça décroche</h3>
<p>Ce que je voulais savoir, au fond, ce n&rsquo;est pas ce que dit le Code de la route : c&rsquo;est <strong>où sont les limites réelles</strong>. Le calcul en sort trois, réunies sur un graphique.</p>
<p><a href="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/10-limites.png"><img alt="Trois graphiques : la rafale limite en fonction de la vitesse de route pour trois chargements, les accélérations latérales de renversement comparées à l'adhérence des pneus, et l'amortissement du louvoiement en fonction de la vitesse" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/10-limites.png" /></a></p>
<p><em>Les trois façons de décrocher, pour la variante à deux berceaux de Mini. Le Cordoba donne les mêmes courbes à quelques km/h près. Cliquer pour agrandir.</em></p>
<ul>
<li><strong>Le vent.</strong> Pleine et sans vélos, rien ne décroche par temps normal : il faudrait 110 km/h de rafales annoncées pour l&rsquo;inquiéter à 130 km/h. Avec les vélos, la marge fond.</li>
<li><strong>Le virage.</strong> La remorque verse entre 0,56 et 0,64 g d&rsquo;accélération latérale, selon le chargement. C&rsquo;est avant que les pneus ne glissent sur route sèche (0,8 g), mais après sur route mouillée (0,5 g). Autrement dit : sur le sec, elle se couche sans avoir glissé ; sur le mouillé, l&rsquo;attelage glisse d&rsquo;abord. Avec les vélos, 0,58 g, c&rsquo;est 61 km/h dans une bretelle de 50 m de rayon.</li>
<li><strong>Le louvoiement.</strong> Pas de vitesse critique derrière le T5, même avec 120 kg mal placés tout à l&rsquo;arrière. La courbe verte est le cas témoin, une caravane de 1,5 t derrière une berline du même poids : elle passe sous zéro vers 115 km/h.</li>
</ul>
<h3 id="cordoba-montage">Le Cordoba, ramené à une cote</h3>
<p>Restait le problème laissé ouvert par <a href="#correction">la correction</a> : le combiné ressort-amortisseur qui monte vers la caisse. En regardant ce qu&rsquo;il y a à cet endroit dans la remorque, la contrainte s&rsquo;est d&rsquo;abord durcie : le tiroir du réchaud d&rsquo;un côté et la coulisse du frigo de l&rsquo;autre <strong>balayent le plancher</strong> juste au-dessus. Aucune saillie n&rsquo;est tolérable, pas même un bossage.</p>
<p>Puis le calcul l&rsquo;a desserrée. Sous la charge de la remorque (290 kg par roue), le ressort d&rsquo;origine se comprime et le combiné ne mesure plus qu&rsquo;environ 41 cm. Sa tête peut alors se loger <strong>dans l&rsquo;épaisseur du cadre</strong>, 45 mm sous le plancher, sur une simple platine percée soudée entre deux longerons.</p>
<p>À une condition, et c&rsquo;est la seule inconnue qui reste : que l&rsquo;œil inférieur du combiné soit à moins de 1,5 cm au-dessus du centre de la roue. Je l&rsquo;ai supposé 3 cm en dessous ; ça se mesure en cinq minutes sur la voiture, avant de la démonter. Si la cote est mauvaise, il existe des combinés filetés, réglables en hauteur, homologués pour cette voiture.</p>
<p><img alt="Vue de dessous de la remorque sur le train de Cordoba : le combiné rouge et jaune monte jusqu'au cadre, deux chapes noires descendent du cadre vers les articulations des bras, reliées par un tube" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/12-cordoba-montage.jpg" /></p>
<p><em>Le montage du Cordoba tel que le calcul le dessine maintenant : le combiné s&rsquo;arrête dans le cadre, et deux chapes descendent chercher les articulations des bras.</em></p>
<p>Le vrai travail de chaudronnerie est ailleurs, et je ne l&rsquo;avais pas vu. Comme la caisse passe au-dessus des roues, le cadre est à 67 cm du sol, alors que les articulations des bras de l&rsquo;essieu sont à 33 cm. Il faut donc deux <strong>chapes descendantes de 35 cm</strong>, qui encaissent environ 1,6 kN·m sur un nid-de-poule pris vite : des caissons en tôle de 5 mm, une jambe de force vers l&rsquo;avant, et un tube entre les deux pour tenir les efforts de côté.</p>
<p>Ce montage reste bien plus simple que le tandem : un train, quatre points de fixation, aucun réglage, des pneus qu&rsquo;on trouve partout, et une remorque qu&rsquo;on déplace encore à la main. Le tandem a plus de marge et un plancher plus bas. Je n&rsquo;ai pas tranché.</p>
<h2 id="maj2">Seconde mise à jour du 21 septembre : tout redescend</h2>
<p><em>Le même jour, quelques heures plus tard. Deux questions de conception ont fait plus pour la remorque que tous les raffinements de calcul de la matinée.</em></p>
<h3 id="surbaissee">Noyer l&rsquo;essieu dans la caisse</h3>
<p>Depuis le début, la caisse passait <strong>au-dessus</strong> des roues. C&rsquo;est ce qui lui permettait d&rsquo;être plus large que la voie, et c&rsquo;est aussi ce qui perchait le plancher à 75 cm. D&rsquo;où ma question : pourquoi ne pas faire comme la Seat elle-même, ou comme n&rsquo;importe quelle camionnette ? Descendre le plancher entre les roues, laisser celles-ci monter dans des <strong>passages de roue</strong> à l&rsquo;intérieur de la caisse, et construire les tiroirs autour.</p>
<p>Le plancher peut descendre jusqu&rsquo;à frôler la poutre qui relie les deux roues : 0,51 m au lieu de 0,75. Tout le reste suit d&rsquo;un bloc, 24 cm plus bas. Et les deux difficultés du montage, celles de la mise à jour du matin, disparaissent d&rsquo;un coup :</p>
<ul>
<li>les <strong>chapes de 35 cm</strong> qui devaient descendre du cadre jusqu&rsquo;aux articulations des bras n&rsquo;en font plus que 10 : les paliers se boulonnent presque directement sous les longerons, comme sur la voiture ;</li>
<li>la <strong>tête du combiné</strong> ressort-amortisseur n&rsquo;a plus à tenir sous un plancher. Elle monte dans le passage de roue, exactement comme dans le coffre de la Seat. La fameuse cote à mesurer ne conditionne plus rien : elle fixe seulement la hauteur du passage de roue.</li>
</ul>
<p>Le prix, c&rsquo;est de la menuiserie et du cadre. Deux passages de roue de 73 × 36 cm, hauts de 20 cm, prennent une centaine de litres sur 2 400. Chaque volet latéral reçoit une encoche au droit de la roue. Et le cadre n&rsquo;est plus un rectangle : la roue est sur le chemin des longerons de rive, donc deux longerons passent à l&rsquo;intérieur des roues, et des traverses portent les flancs devant et derrière.</p>
<p>L&rsquo;aménagement, lui, se réorganise selon une règle simple : <strong>ce qui se contente de peu de hauteur va au-dessus de la roue, ce qui en veut va devant ou derrière.</strong> Le tiroir du réchaud fait 22 cm de haut. Il était déjà au droit de l&rsquo;essieu, il y reste, posé sur le passage de roue. L&rsquo;évier gagne un tiroir profond, avec la place d&rsquo;un bidon d&rsquo;eaux grises dessous. Le frigo quitte le droit de l&rsquo;essieu pour l&rsquo;arrière — et comme tout a baissé, son couvercle passe de 1,27 m à 1,03 m : on peut enfin y plonger le bras.</p>
<p><img alt="La remorque surbaissée côté cuisine, volet relevé : tiroir évier profond à l'arrière, tiroir réchaud peu haut juste au-dessus de la roue, colonne d'eau haute à l'avant" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/13-cuisine-surbaissee.jpg" /></p>
<p><em>Côté cuisine. Le tiroir du réchaud est posé sur le passage de roue ; l&rsquo;évier et la colonne d&rsquo;eau, de part et d&rsquo;autre, descendent jusqu&rsquo;au nouveau plancher.</em></p>
<p><img alt="La remorque surbaissée côté frigo : frigo sorti sur sa coulisse à l'arrière, table et chaises rangées à plat au-dessus de la roue, coffre à gaz à l'avant" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/14-frigo-surbaisse.jpg" /></p>
<p><em>Côté frigo. Le frigo est passé à l&rsquo;arrière ; au-dessus de la roue, ce qui se range à plat.</em></p>
<p>Sur la route : le centre de gravité descend de 21 cm, le renversement en virage passe de 0,58 à 0,71 g, et la rafale limite à 110 km/h de 55 à 66 km/h.</p>
<p>L&rsquo;idée ne se cumule pas avec celle du matin. Avec deux essieux de Mini, les passages de roue feraient 1,45 m de long, soit 63 % de chaque flanc : il ne resterait presque plus de tiroirs bas.</p>
<h3 id="velos-bas">Les vélos descendent du toit</h3>
<p>Seconde question : pourquoi s&rsquo;acharner à monter trois vélos à près de 2 m ? On pourrait les poser sur un support derrière la remorque. Ou deux derrière et un devant, sur le timon.</p>
<p>Côté vent, il n&rsquo;y a pas photo. Posés en travers à un mètre du sol, les vélos sont pris <strong>de bout</strong> par le vent de côté, et ils ne sont plus perchés : ils ne comptent presque plus dans le renversement. Mais c&rsquo;est le <strong>poids sur la boule</strong> qui départage les emplacements, et là le calcul n&rsquo;a pas dit ce que j&rsquo;attendais.</p>
<p><a href="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/16-velos.png"><img alt="Trois graphiques : la rafale limite selon la vitesse pour quatre combinaisons, le poids sur la flèche selon l'emplacement des vélos, et la hauteur hors tout" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/16-velos.png" /></a></p>
<p><em>Au milieu, le poids sur la boule pour chaque emplacement : un point par cas de chargement, entre les bornes de 4 et 10 %. Cliquer pour agrandir.</em></p>
<ul>
<li><strong>Trois vélos à l&rsquo;arrière</strong> : 40 à 60 kg à un mètre cinquante derrière l&rsquo;essieu. Selon que la remorque est pleine ou vide, avec ou sans vélos, le poids sur la boule va de 3 à 10 % de la masse. Trop peu au retour avec des vélos électriques, trop quand on roule sans vélos. C&rsquo;est exactement ce que les caravaniers reprochent au porte-vélos arrière.</li>
<li><strong>Trois vélos sur le timon</strong> : le défaut inverse. La boule se déleste dès qu&rsquo;on roule sans vélos.</li>
<li><strong>Deux derrière, un devant</strong> : le vélo de devant compense ceux de derrière. Le poids sur la boule reste entre 5 et 8 % dans tous les cas, aussi sagement qu&rsquo;avec les vélos sur le toit. Le plus lourd va devant.</li>
</ul>
<p>Le louvoiement, lui, ne bouge pas. Trois vélos tout à l&rsquo;arrière augmentent de 17 % l&rsquo;inertie de la remorque en rotation, et derrière un T5 quatre fois plus lourd, ça ne change rien. Derrière une berline, ce serait une autre histoire.</p>
<p>Le porte-vélos, je le ferai moi-même, et il est d&rsquo;une simplicité reposante : <strong>une plateforme</strong>, et <strong>une pince qui coulisse sur un rail dans l&rsquo;axe de la remorque</strong>. On pose les vélos en travers, on avance la pince jusqu&rsquo;à plaquer les cadres contre des butées fixées à la caisse, on goupille, on cadenasse — la pince fait <strong>antivol</strong> — puis on sangle les roues. Le modèle a fait apparaître deux détails. Le guidon doit être tourné d&rsquo;un quart de tour. Et même manivelles à la verticale, la pédale dépasse de 14 cm : les butées sont donc déportées de 15 cm de la caisse, sinon c&rsquo;est la pédale qui touche avant le cadre.</p>
<p><img alt="Vue arrière : deux vélos en travers sur une plateforme, une pince verticale à deux mâchoires de caoutchouc les plaque contre la caisse, cadenas sur le coulisseau, rampe de feux et plaque sous la plateforme" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/17-porte-velos-arriere.jpg" /></p>
<p><em>Le porte-vélos arrière. La pince coulisse sur le rail percé, dans l&rsquo;axe ; goupille orange et cadenas sur le coulisseau ; sangles orange sur les roues ; feux et plaque répétés derrière les vélos.</em></p>
<p><img alt="Vue avant : un vélo en travers sur une plateforme posée sur le timon, entre la caisse et la roue jockey, tenu par la même pince" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/18-porte-velos-timon.jpg" /></p>
<p><em>Le même principe sur le timon, pour le vélo le plus lourd. En braquant à fond, il reste loin du T5.</em></p>
<p>Ce que ça change à l&rsquo;usage compte plus que les chiffres. Le mât, la potence et le treuil de la section <a href="#velos">Monter trois vélos à près de 2 m</a> n&rsquo;existent plus : on charge un vélo à hauteur de taille. Et la première leçon du modèle — <em>les vélos sont posés sur le couvercle, tant qu&rsquo;ils y sont le bac ne s&rsquo;ouvre pas</em> — tombe elle aussi.</p>
<p><img alt="Vue plongeante : le couvercle du bac grand ouvert alors que deux vélos sont en place à l'arrière et un à l'avant" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/19-bac-ouvert-velos.jpg" /></p>
<p><em>Le bac s&rsquo;ouvre vélos chargés.</em></p>
<h3 id="retenue">La version retenue</h3>
<p>Cette fois j&rsquo;ai tranché : <strong>train de Cordoba, caisse surbaissée, deux vélos derrière et un sur le timon.</strong></p>
<p><img alt="La remorque retenue attelée au T5 : caisse basse, deux vélos à l'arrière, l'ensemble sous la ligne de toit du fourgon" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/20-retenue-attelee.jpg" /></p>
<p><em>Attelée. Tout l&rsquo;ensemble passe sous le toit du T5.</em></p>
<div class="table-scroll"><table>
<thead>
<tr>
<th></th>
<th>Projet du 19 septembre</th>
<th>Version retenue</th>
</tr>
</thead>
<tbody>
<tr>
<td>Plancher</td>
<td>0,75 m</td>
<td>0,51 m</td>
</tr>
<tr>
<td>Hauteur hors tout, vélos chargés</td>
<td>2,92 m</td>
<td>1,63 m</td>
</tr>
<tr>
<td>Longueur hors tout</td>
<td>4,35 m</td>
<td>5,09 m</td>
</tr>
<tr>
<td>Renversement en virage</td>
<td>0,58 g</td>
<td>0,79 g</td>
</tr>
<tr>
<td>Rafale encaissée à 110 km/h, au retour</td>
<td>55 km/h</td>
<td>91 km/h</td>
</tr>
<tr>
<td>Poids sur la boule, tous chargements</td>
<td>5,5 à 7,6 %</td>
<td>5,1 à 8,2 %</td>
</tr>
<tr>
<td>Pour charger un vélo</td>
<td>un mât de 3,45 m, une potence, un treuil</td>
<td>le poser</td>
</tr>
</tbody>
</table></div>
<p>À 0,79 g, le seuil de renversement rejoint la limite d&rsquo;adhérence des pneus sur route sèche : la remorque glisserait avant de verser. Et à 1,63 m, tout l&rsquo;attelage passe sous le toit du T5, donc sous les mêmes barrières de parking que lui.</p>
<p>Le prix : 74 cm de plus en longueur, des feux et une plaque à répéter derrière les vélos, des vélos exposés aux projections de la route, et un cadre plus compliqué à souder qu&rsquo;un rectangle.</p>
<p><a href="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/15-architecture.png"><img alt="Trois graphiques comparant la caisse sur les roues et la caisse surbaissée : rafale limite, renversement en virage, hauteur" src="https://pf.olibrio.fr/images/remorque-famille-cuisine-velos/15-architecture.png" /></a></p>
<p><em>Caisse sur les roues contre caisse surbaissée, pour le Cordoba et pour les deux essieux de Mini. Cliquer pour agrandir.</em></p>
<h2 id="ce-que-je-retiens">Ce que je retiens</h2>
<p><strong>Un rendu n&rsquo;est pas une vérification.</strong> Les premières images étaient convaincantes et reposaient sur un essieu en surcharge de 20 %. Ce qui a fait avancer le projet, ce n&rsquo;est pas le modèle 3D, c&rsquo;est la question « combien ça pèse, et où ».</p>
<p><strong>Se méfier d&rsquo;un résultat trop confortable.</strong> « Stable au-delà de 400 km/h » aurait pu être un bug. Le seul moyen de le savoir était de faire tourner le même calcul sur un cas dont on connaît la réponse. C&rsquo;est le même réflexe qu&rsquo;avec une somme de cotes qui tombe juste : la cohérence n&rsquo;est pas une preuve.</p>
<p><strong>Vérifier sur la vraie pièce.</strong> L&rsquo;erreur des ressorts n&rsquo;est venue ni d&rsquo;un calcul ni d&rsquo;un rendu, mais d&rsquo;une généralisation (« sur ce type d&rsquo;essieu, le ressort est posé sur le bras ») jamais confrontée à la voiture. Il a suffi de se souvenir de la voiture pour la voir, et d&rsquo;un guide de démontage pour la confirmer.</p>
<p><strong>Une erreur absurde est une bonne nouvelle.</strong> 164° d&rsquo;articulation, on le voit tout de suite. Les erreurs dangereuses sont celles qui donnent un chiffre plausible — comme ces 55° qui ne dépendaient pas de la longueur du timon, et que seul ce détail trahissait.</p>
<p><strong>Tout paramétrer.</strong> Changer d&rsquo;essieu a pris une ligne : la caisse s&rsquo;est élargie, le plancher a monté, les tiroirs de cuisine se sont raccourcis pour garder le plan de travail à 0,95 m, et le calcul a replacé l&rsquo;essieu. Sur papier, c&rsquo;était une semaine de gomme.</p>
<p><strong>Chercher la méthode publiée avant d&rsquo;en écrire une.</strong> <em>(Ajout du 21 septembre.)</em> Le calcul de vent a été corrigé trois fois avant que je demande ce qu&rsquo;en disait la littérature. La réponse tenait en trois lignes et reposait sur des mesures ; le modèle maison, sur des hypothèses empilées. Une IA écrit un modèle physique plausible en trente secondes, et c&rsquo;est bien le danger : rien ne la pousse à aller voir s&rsquo;il existe déjà.</p>
<p><strong>Une objection de terrain vaut une revue de code.</strong> Je ne sais pas calculer une portance latérale. Mais « j&rsquo;ai vu des remorques hautes qui ne souffrent pas du vent », « un vélo n&rsquo;est pas un panneau », « il y a un fourgon devant » : chacune de ces remarques a trouvé un vrai défaut. Il faut les faire, et exiger qu&rsquo;elles soient vérifiées par le calcul plutôt que réfutées par un argument.</p>
<p><strong>Le levier était l&rsquo;architecture, pas le calcul.</strong> <em>(Ajout du 21 septembre au soir.)</em> Une matinée à raffiner le modèle de vent a déplacé le résultat de quelques km/h. Deux questions de conception — pourquoi la caisse est-elle si haute, pourquoi les vélos sont-ils sur le toit — l&rsquo;ont fait passer de 55 à 91. L&rsquo;IA optimisait avec application le projet que je lui avais donné ; elle ne l&rsquo;a jamais remis en cause. C&rsquo;était à moi de le faire, et j&rsquo;ai mis deux jours.</p>
<h2 id="ce-qui-reste-a-faire">Ce qui reste à faire</h2>
<ul>
<li><strong>Mesurer deux cotes sur la Cordoba</strong>, voiture sur ses roues : la hauteur de la poutre d&rsquo;essieu (elle fixe les 43 cm sous le cadre, donc tout le reste) et celle de l&rsquo;œil inférieur du combiné (elle fixe la hauteur du passage de roue). Relever en même temps la position des articulations des bras et le gabarit de perçage de leurs supports.</li>
<li><strong>Dessiner le cadre pour de bon</strong> : deux longerons à l&rsquo;intérieur des roues, des traverses qui portent les flancs, un pont de tubes au-dessus de chaque roue, et l&rsquo;étanchéité des passages de roue.</li>
<li><strong>Essayer le vélo de timon en vrai</strong> : il doit cohabiter avec la roue jockey et la porte du coffre à gaz.</li>
<li><strong>Relever la charge maximale de l&rsquo;essieu arrière</strong> sur la plaque constructeur de la Cordoba, et vérifier l&rsquo;état des silentblocs et des roulements.</li>
<li><strong>Peser.</strong> Les masses du calcul sont des estimations. La remorque finie passera sur une balance, flèche et essieu séparément, et l&rsquo;essieu pourra encore glisser de quelques centimètres sur ses longerons avant soudure définitive.</li>
<li><strong>L&rsquo;administratif.</strong> Chargée, la remorque dépassera 500 kg de PTAC : elle aura besoin de sa propre carte grise, donc d&rsquo;une réception à titre isolé à la DREAL pour une construction artisanale. En restant sous 750 kg, pas de freins obligatoires et le permis B suffit. À confirmer, avec la masse remorquable et le PTRA inscrits sur la carte grise du T5.</li>
<li><strong>Construire léger.</strong> Chaque kilo gagné sur la caisse est un kilo de marge sur l&rsquo;essieu et un peu de stabilité en plus par vent de travers.</li>
</ul>
<h2 id="questions-frequentes">Questions fréquentes</h2>
<h3 id="peut-on-utiliser-un-essieu-de-mini-pour-une-remorque">Peut-on utiliser un essieu de Mini pour une remorque ?</h3>
<p>Oui, pour une petite remorque légère : c&rsquo;est compact, bas, et les roues de 10 pouces permettent un plancher bas. Mais c&rsquo;est le train arrière d&rsquo;une voiture de 650 kg, prévu pour de l&rsquo;ordre de 450 kg au maximum. Une remorque aménagée (cuisine, frigo, eau, vélos) dépasse facilement 500 kg sur l&rsquo;essieu.</p>
<h3 id="quel-poids-sur-la-fleche-viser-pour-une-remorque">Quel poids sur la flèche viser pour une remorque ?</h3>
<p>Entre 5 et 10 % de la masse de la remorque, et jamais moins de 4 % ni plus que ce qu&rsquo;accepte l&rsquo;attelage de la voiture (souvent 75 à 100 kg). Ici, 7 % en charge complète, soit environ 44 kg. On l&rsquo;obtient en plaçant l&rsquo;essieu, pas en ajoutant du lest.</p>
<h3 id="un-essieu-a-ressorts-helicoidaux-prend-il-plus-de-place">Un essieu à ressorts hélicoïdaux prend-il plus de place ?</h3>
<p>Ça dépend du montage. Un ressort séparé, posé sur le bras, tient sous le cadre quand la caisse passe au-dessus des roues. Un combiné ressort-amortisseur, comme sur la Seat Cordoba 6K ou la VW Polo 6N, monte au-dessus de la roue : il faut lui faire de la place dans la caisse, relever le plancher, ou le remplacer par un ressort et un amortisseur séparés. À vérifier avant de conclure : sous la charge, le ressort se comprime, et sur ma remorque le combiné d&rsquo;origine tient finalement dans l&rsquo;épaisseur du cadre, à une cote près.</p>
<h3 id="quelle-longueur-de-timon-pour-reculer-facilement">Quelle longueur de timon pour reculer facilement ?</h3>
<p>Ce qui compte est le rapport entre la distance boule–essieu de la remorque et la distance essieu arrière–boule de la voiture. Au-dessus de 2,5, la marche arrière devient confortable ; ici, 2,8 avec un timon de 2 m. La forme compte autant que la longueur : une poutre centrale seule près de la boule évite que le V du timon touche la voiture en braquage serré.</p>
<h3 id="une-remorque-legere-derriere-un-fourgon-peut-elle-louvoyer">Une remorque légère derrière un fourgon peut-elle louvoyer ?</h3>
<p>Très peu probable si le fourgon est nettement plus lourd : le calcul ne trouve pas d&rsquo;instabilité en dessous de 400 km/h avec un T5 de 2,4 t et une remorque de 0,6 t. Le risque pratique est le vent latéral, et surtout ce qu&rsquo;on perche sur le toit.</p>
<h3 id="a-partir-de-quel-vent-une-remorque-risque-t-elle-de-se-renverser">À partir de quel vent une remorque risque-t-elle de se renverser ?</h3>
<p>Ça dépend de sa masse, de sa voie, de sa hauteur et de la vitesse à laquelle on roule. La méthode de référence est celle de Baker et Soper (2018), utilisée pour les restrictions de circulation sur les ponts. Pour ma remorque de 0,6 t : 85 km/h de rafale de travers à 110 km/h sans rien sur le toit, 55 km/h avec trois vélos. Ce sont des vitesses de vent à hauteur de remorque ; les rafales annoncées par la météo, mesurées à 10 m, sont plus fortes d&rsquo;environ 40 %.</p>
<h3 id="deux-essieux-valent-ils-mieux-quun-sur-une-petite-remorque">Deux essieux valent-ils mieux qu&rsquo;un sur une petite remorque ?</h3>
<p>Ils portent plus et tiennent mieux le cap : les pneus s&rsquo;opposent près de cinq fois plus à la mise en lacet. En échange, la remorque ripe en manœuvre et ne se déplace plus à la main, elle pèse plus lourd à vide, et si les deux essieux sont indépendants (suspension caoutchouc), c&rsquo;est la hauteur de la boule qui règle le partage de la charge : il faut la tracter bien de niveau.</p>
<h2 id="petit-glossaire">Petit glossaire</h2>
<p><strong>Bogie, tandem</strong> — Deux essieux rapprochés montés l&rsquo;un derrière l&rsquo;autre sous la même remorque.</p>
<p><strong>Combiné ressort-amortisseur</strong> — Un amortisseur autour duquel est enfilé le ressort ; les deux se montent et se démontent d&rsquo;un bloc. Sa tête se fixe dans la caisse de la voiture.</p>
<p><strong>Flèche (poids sur)</strong> — La charge verticale que la remorque exerce sur la boule d&rsquo;attelage. Trop faible ou négative, elle déleste l&rsquo;arrière de la voiture et favorise le louvoiement.</p>
<p><strong>Louvoiement</strong> — Oscillation de la remorque de gauche à droite qui, au-delà d&rsquo;une vitesse critique, s&rsquo;amplifie au lieu de s&rsquo;amortir.</p>
<p><strong>Lacet</strong> — Rotation d&rsquo;un véhicule autour d&rsquo;un axe vertical : l&rsquo;avant part à gauche, l&rsquo;arrière à droite.</p>
<p><strong>Poutre de torsion</strong> — Essieu où les deux bras tirés sont reliés par une traverse qui se tord quand les roues ne débattent pas ensemble ; elle joue le rôle de barre anti-roulis.</p>
<p><strong>PTAC / PTRA</strong> — Poids total autorisé en charge (d&rsquo;un véhicule) / roulant autorisé (d&rsquo;un ensemble voiture + remorque). Inscrits sur la carte grise.</p>
<p><strong>Ripage</strong> — Glissement latéral forcé des pneus quand une remorque à deux essieux tourne : ses deux essieux ne peuvent pas suivre le même cercle.</p>
<p><strong>RTI</strong> — Réception à titre isolé : homologation, par la DREAL, d&rsquo;un véhicule construit ou modifié à l&rsquo;unité.</p>
<p><strong>Timon</strong> — La partie avant de la remorque, du châssis jusqu&rsquo;à la tête d&rsquo;attelage.</p>
<p><strong>Voie</strong> — Distance entre les centres des deux roues d&rsquo;un même essieu.</p>
<h2 id="references">Références et copies locales</h2>
<ul>
<li>Le modèle complet, régénérable : scripts Blender et Python, <code>remorque.blend</code>, calcul détaillé — <a href="https://pf.olibrio.fr/assets/remorque-famille-cuisine-velos/remorque-famille.zip"><code>remorque-famille.zip</code></a></li>
<li>Le calcul seul, lisible en ligne : <a href="https://pf.olibrio.fr/assets/remorque-famille-cuisine-velos/CALCULS.md"><code>CALCULS.md</code></a></li>
<li>Les graphiques, en vectoriel : <a href="https://pf.olibrio.fr/assets/remorque-famille-cuisine-velos/limites.svg"><code>limites.svg</code></a>, <a href="https://pf.olibrio.fr/assets/remorque-famille-cuisine-velos/architecture.svg"><code>architecture.svg</code></a>, <a href="https://pf.olibrio.fr/assets/remorque-famille-cuisine-velos/velos.svg"><code>velos.svg</code></a></li>
<li><a href="https://pure-oai.bham.ac.uk/ws/files/56018864/Baker_and_Soper_Calculation_of_the_overturning_wind_speed_of_large_road_vehicles_ICEproceedings.pdf">Baker &amp; Soper (2018), <em>The calculation of the overturning wind speed of large road vehicles at exposed sites</em></a> (en anglais, accès libre) — la méthode de calcul du vent, et la mesure d&rsquo;une remorque derrière son camion</li>
<li><a href="https://mechanicalelements.com/torsion-axles-in-tandem-or-triple/">Mechanical Elements : les essieux à suspension caoutchouc montés par deux</a> (en anglais) — pourquoi ils ne se partagent pas la charge</li>
<li><a href="https://club.autodoc.co.uk/manuals/how-to-change-rear-suspension-strut-on-vw-polo-6n1-replacement-guide-13252">Guide Autodoc : remplacer la jambe de suspension arrière d&rsquo;une VW Polo 6N1</a> (en anglais) — la source de la correction sur les ressorts</li>
<li><a href="https://pf.olibrio.fr/posts//posts/vibe-design-ventouse-tpu.html">Le billet précédent</a> — une autre pièce dessinée en dialoguant avec une IA, et le piège de la somme de cotes qui tombe juste</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Le bogue que je voulais corriger était déjà réparé — et sa réparation était fausse</title>
      <link>https://pf.olibrio.fr/posts/premiere-contribution-libcamera.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/premiere-contribution-libcamera.html</guid>
      <pubDate>Tue, 08 Sep 2026 12:00:00 +0000</pubDate>
      <description>Comment choisir sur quoi contribuer quand on débute ? J&#x27;ai suivi le conseil habituel — trouver une tâche bien délimitée dans un projet actif — et je suis tombé sur trois choses que personne n&#x27;avait signalées : une entrée de table fausse dans du code fusionné depuis deux mois et relu par quatre personnes, un capteur absent, et un défaut de performance que le mainteneur du paquet avait lui-même instrumenté sans que personne ne le remonte. Récit d&#x27;une soirée sur un Pixel 3a, avec les impasses, la prédiction que j&#x27;ai ratée, et ce qu&#x27;il faut écrire quand on n&#x27;a pas réussi à prouver.</description>
      <category>contribution</category>
      <category>logiciel libre</category>
      <category>libcamera</category>
      <category>postmarketos</category>
      <category>pixel 3a</category>
      <category>méthode</category>
      <category>revue de code</category>
      <category>débogage</category>
      <category>premier patch</category>
      <category>upstream</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/pixel3a/og-pixel3a.jpg" alt="Le bogue que je voulais corriger était déjà réparé — et sa réparation était fausse"></p>
<div class="tldr">
<p><strong>En deux minutes</strong></p>
<ul>
<li><strong>Le point de départ</strong> : je voulais contribuer et je ne savais pas par où. J&rsquo;ai pris le conseil standard — une tâche bien délimitée, dans un projet actif, sur du matériel que je possède.</li>
<li><strong>Première surprise</strong> : la tâche que je visais avait été faite six semaines plus tôt. L&rsquo;avertissement que je voyais sur mon téléphone n&rsquo;était pas un manque, c&rsquo;était un décalage de version.</li>
<li><strong>Deuxième surprise</strong> : la correction récente contenait une erreur. Deux valeurs interverties, dans du code relu par quatre personnes dont le mainteneur, et marqué « testé ».</li>
<li><strong>Le vrai travail</strong> : un capteur absent des tables. Données relevées sur l&rsquo;appareil, sauf une que je n&rsquo;ai pas pu prouver — et que j&rsquo;ai signalée comme telle dans le message de commit.</li>
<li><strong>La prédiction ratée</strong> : j&rsquo;annonçais des photos plus claires après correction. Mesuré : 39,2 % avant, 38,1 % après. Rien. L&rsquo;explication tient à l&rsquo;arithmétique, et elle est instructive.</li>
<li><strong>La vraie trouvaille</strong> : en cherchant pourquoi l&rsquo;application gelait, un défaut de performance que le mainteneur du paquet avait lui-même instrumenté en écrivant qu&rsquo;il « signale un problème actionnable côté pilote ». Personne ne l&rsquo;avait remonté.</li>
</ul>
<p><em>Ce billet parle de méthode plutôt que de caméras. Il devrait se lire même si <code>libcamera</code> ne vous dit rien. La partie technique est dans <a href="https://pf.olibrio.fr/posts/pixel-3a-postmarketos-linux-mainline.html">le billet précédent</a>.</em></p>
</div>
<h2 id="le-probleme-de-la-premiere-contribution">Le problème de la première contribution</h2>
<p>Tout le monde donne le même conseil : « trouve une issue étiquetée <em>good first issue</em> ». C&rsquo;est un bon conseil et il ne marche pas très bien, pour une raison simple — ces tâches sont soit triviales au point de n&rsquo;apprendre rien, soit déjà prises par quelqu&rsquo;un de plus rapide.</p>
<p>Ce qui marche mieux, je crois, c&rsquo;est de partir de ce qu&rsquo;on a <strong>que les autres n&rsquo;ont pas</strong>. Dans mon cas : un vieux téléphone que j&rsquo;avais décidé de faire tourner sous Linux, et donc du matériel physique sur lequel exécuter le code que d&rsquo;autres écrivent à l&rsquo;aveugle.</p>
<p>C&rsquo;est un avantage plus rare qu&rsquo;il n&rsquo;y paraît. Beaucoup de développeurs travaillent sur des pilotes de matériel qu&rsquo;ils ne possèdent pas, en se fiant à des fiches techniques et aux rapports des utilisateurs. Celui qui a l&rsquo;appareil branché sur son bureau peut répondre à des questions que personne d&rsquo;autre ne peut trancher.</p>
<h2 id="le-fil-une-tache-bien-delimitee">Le fil : une tâche bien délimitée</h2>
<p>Le projet postmarketOS maintient une liste de tâches par appareil. Pour le mien, une issue parapluie intitulée « Camera TODOs » listait une dizaine d&rsquo;items, tous cochés sauf un :</p>
<blockquote>
<p>imx355 driver (front camera) is missing features for libcamera, makes the later complain (e.g. when running <code>cam -l</code>)</p>
</blockquote>
<p>Périmètre net, symptôme reproductible, une commande pour le constater. Exactement ce qu&rsquo;on cherche.</p>
<p>J&rsquo;ai lancé la commande sur le téléphone. Elle s&rsquo;est plainte, comme annoncé. J&rsquo;ai ouvert le dépôt de <code>libcamera</code> pour écrire le correctif.</p>
<p>Et l&rsquo;entrée était déjà là.</p>
<h2 id="premiere-lecon-une-issue-ouverte-nest-pas-forcement-ouverte">Première leçon : une issue ouverte n&rsquo;est pas forcément ouverte</h2>
<p>Le support du capteur avait été ajouté le 17 juillet 2026, par un ingénieur de Raspberry Pi. La version installée sur mon téléphone datait du 10 juillet.</p>
<p><strong>Sept jours d&rsquo;écart.</strong> L&rsquo;avertissement que je voyais n&rsquo;était pas un manque dans le projet, c&rsquo;était un décalage entre la version publiée et le dépôt.</p>
<p>C&rsquo;est une confusion facile à faire, et elle mérite un réflexe : avant de coder quoi que ce soit, vérifier que le problème existe encore <strong>en amont</strong>, pas seulement sur sa propre machine. Ça se fait en deux requêtes.</p>
<details>
<summary>Pour aller au fond : comparer une version publiée au dépôt</summary>
<p>La plupart des forges permettent de récupérer un fichier à une référence donnée. Il suffit de comparer la version qu&rsquo;on exécute et la branche principale :</p>
<pre><code class="language-bash">F=&quot;src/libcamera/sensor/camera_sensor_properties.cpp&quot;
for ref in v0.7.2 master; do
  echo -n &quot;$ref : &quot;
  curl -s &quot;.../repository/files/$(urlencode $F)/raw?ref=$ref&quot; | grep -c '&quot;imx355&quot;'
done
# v0.7.2 : 0
# master : 1
</code></pre>
<p>Zéro occurrence dans la version publiée, une dans le dépôt : le travail est fait mais pas encore sorti. Il n&rsquo;y a rien à écrire.</p>
<p>Le même réflexe vaut pour le noyau. Le second item de la liste concernait un pilote qui ne répondait pas à une requête ; là aussi, la correction existait déjà en amont — absente des versions 6.18, 7.0 et 7.1, présente dans la branche principale. Elle n&rsquo;avait simplement pas encore été publiée.</p>
</details>
<p>Deux tâches sur trois s&rsquo;étaient donc évaporées. J&rsquo;aurais pu m&rsquo;arrêter là avec le sentiment d&rsquo;avoir perdu ma soirée. Sauf qu&rsquo;en lisant l&rsquo;entrée fraîchement ajoutée, quelque chose n&rsquo;allait pas.</p>
<h2 id="deuxieme-lecon-la-relecture-ne-voit-pas-les-tables">Deuxième leçon : la relecture ne voit pas les tables</h2>
<p>L&rsquo;entrée associait deux motifs de test à des valeurs numériques. Or le pilote du capteur, dans le noyau, définit ces valeurs dans l&rsquo;ordre inverse. « Couleur unie » et « barres de couleur » étaient <strong>interverties</strong>.</p>
<p>J&rsquo;ai vérifié trois fois, par des chemins indépendants :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Source</th>
<th>Ce qu&rsquo;elle dit</th>
</tr>
</thead>
<tbody>
<tr>
<td>Le pilote sur mon téléphone, interrogé directement</td>
<td><code>1 = couleur unie</code>, <code>2 = barres de couleur</code></td>
</tr>
<tr>
<td>Le code source du pilote dans le noyau officiel</td>
<td>même ordre</td>
</tr>
<tr>
<td>Deux autres capteurs au menu identique, décrits juste à côté</td>
<td>correspondance correcte</td>
</tr>
</tbody>
</table></div>
<p>Et j&rsquo;ai cherché activement le contexte où l&rsquo;auteur aurait eu raison : son entreprise maintient son propre noyau, avec parfois des pilotes différents. J&rsquo;ai vérifié — même ordre dans les deux arbres. L&rsquo;erreur était réelle, y compris sur son propre matériel.</p>
<p>Ce qui rend cette histoire intéressante, ce n&rsquo;est pas l&rsquo;erreur. C&rsquo;est que le commit avait été <strong>relu par quatre personnes</strong>, dont le mainteneur du projet, et portait la mention « testé » par une cinquième.</p>
<p>Comment cinq personnes compétentes laissent-elles passer deux valeurs interverties ?</p>
<p>Parce qu&rsquo;il n&rsquo;y a <strong>aucune logique à relire</strong>. C&rsquo;est une correspondance entre deux documents qui ne vivent pas dans le même dépôt : une table d&rsquo;un côté, un tableau de chaînes de caractères dans le noyau de l&rsquo;autre. Pour la vérifier, il faut ouvrir les deux fichiers côte à côte, ou avoir l&rsquo;appareil sous la main. Et « testé » signifiait ici <em>la caméra fonctionne, je pointe l&rsquo;objectif et j&rsquo;obtiens une image</em> — ce qui est vrai, et n&rsquo;exerce jamais les motifs de test, qui sont un outil de diagnostic.</p>
<p>Le reste de l&rsquo;entrée était juste. La taille du photosite, les délais du capteur : tout ce qui est exercé au quotidien était correct. Seule la partie que personne ne fait tourner était fausse.</p>
<p><strong>C&rsquo;est là que possède l&rsquo;appareil devient un avantage décisif.</strong> Pas parce que je suis meilleur, mais parce que j&rsquo;étais le seul à pouvoir poser la question au matériel.</p>
<h2 id="ce-quun-correctif-de-deux-lignes-doit-contenir">Ce qu&rsquo;un correctif de deux lignes doit contenir</h2>
<p>Le correctif fait deux lignes. Son message de commit en fait trente, et c&rsquo;est délibéré.</p>
<p>Un relecteur ne doit rien avoir à aller chercher. J&rsquo;y ai donc mis le tableau du pilote noyau cité tel quel, la sortie de la commande qui interroge mon téléphone, la conséquence concrète en une phrase — <em>demander une couleur unie produit des barres, et réciproquement</em> — et l&rsquo;argument de cohérence avec les deux capteurs correctement décrits.</p>
<p>Et j&rsquo;ai devancé la question qui allait venir : « et les autres entrées, elles sont fausses aussi ? » Non, et je l&rsquo;ai vérifié pilote par pilote : deux autres capteurs utilisent bien l&rsquo;ordre inverse, parce que <strong>leurs</strong> pilotes le définissent ainsi. Une phrase dans le message évite un aller-retour de trois jours.</p>
<details>
<summary>Pour aller au fond : le piège du numéro de commit</summary>
<p>Ces projets utilisent une convention pour désigner le commit qu&rsquo;on corrige :</p>
<pre><code>Fixes: a1db25dabaee (&quot;libcamera: camera_sensor: Add Sony IMX355 sensor properties&quot;)
</code></pre>
<p>Le numéro fait douze caractères. J&rsquo;en avais sept sous les yeux et j&rsquo;ai <strong>complété les cinq manquants de tête</strong>. Ils étaient faux. Un identifiant inventé qui ressemble à un vrai est pire qu&rsquo;un identifiant absent : personne ne le vérifie, et il pointe vers rien.</p>
<p>La forme correcte demande à l&rsquo;outil plutôt qu&rsquo;à la mémoire :</p>
<pre><code class="language-bash">git rev-parse --short=12 &lt;référence&gt;
</code></pre>
<p>C&rsquo;est une petite chose. C&rsquo;est aussi exactement le genre de détail sur lequel un premier patch se fait renvoyer.</p>
</details>
<h2 id="le-vrai-travail-et-la-valeur-quon-ne-peut-pas-prouver">Le vrai travail, et la valeur qu&rsquo;on ne peut pas prouver</h2>
<p>Restait quelque chose de réellement absent : le second capteur du téléphone ne figurait nulle part. Ni dans la bibliothèque, ni dans le noyau officiel — son pilote a été écrit chez un fondeur il y a huit ans et n&rsquo;a jamais été remonté en amont.</p>
<p>J&rsquo;ai relevé les valeurs sur l&rsquo;appareil et dans le code du pilote. Trois se déduisent rigoureusement. La quatrième, non : c&rsquo;est un paramètre qui se lit dans une fiche technique, et les fiches techniques de ces capteurs ne sont pas publiques.</p>
<p>J&rsquo;ai cherché à l&rsquo;étayer. J&rsquo;ai trouvé un fichier de configuration, sur mon propre téléphone, qui déclarait exactement la valeur que j&rsquo;avais supposée. Excellente nouvelle pendant environ trois minutes — jusqu&rsquo;à ce que je vérifie s&rsquo;il était <strong>indépendant</strong>. Il ne l&rsquo;était pas : les dix fichiers équivalents du projet déclarent tous la même valeur, y compris pour des capteurs de trois fabricants différents. Ce n&rsquo;était pas dix mesures concordantes, c&rsquo;était un défaut recopié dix fois.</p>
<p><strong>Alors je l&rsquo;ai écrit tel quel dans le message de commit</strong> : cette valeur suit ce qui est documenté pour les capteurs de la même famille. Pas « d&rsquo;après la fiche technique », pas de formulation qui laisserait croire à une mesure. Un relecteur qui a la documentation la corrigera en un message, et c&rsquo;est très bien.</p>
<p>Habiller une incertitude est la façon la plus efficace de perdre la confiance d&rsquo;un projet dès son premier patch.</p>
<h2 id="la-prediction-que-jai-ratee">La prédiction que j&rsquo;ai ratée</h2>
<p>En lisant le code, j&rsquo;avais compris ce que l&rsquo;absence de ce capteur provoquait : sans lui, la bibliothèque ne convertit plus le gain de la caméra. Elle écrit un numéro de réglage là où elle devrait écrire un facteur d&rsquo;amplification, et relit le numéro comme s&rsquo;il était le facteur. La boucle d&rsquo;exposition automatique est faussée dans les deux sens.</p>
<p>J&rsquo;en ai déduit une prédiction : après correction, les photos en basse lumière devraient être meilleures. J&rsquo;ai monté un protocole propre — téléphone calé et jamais déplacé, mesures objectives de luminance et de bruit, série avant et série après.</p>
<p>Résultat : <strong>39,2 % de luminance avant, 38,1 % après.</strong> Rien.</p>
<p>L&rsquo;explication tient à l&rsquo;arithmétique, et je l&rsquo;avais signalée comme un risque avant de lancer le test — sans en tirer les conséquences, ce qui était l&rsquo;erreur.</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Gain demandé</th>
<th>Formule correcte</th>
<th>Formule fausse</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>1,0×</td>
<td>≈ 1,0×</td>
</tr>
<tr>
<td>50</td>
<td>1,1×</td>
<td>50×</td>
</tr>
<tr>
<td>300</td>
<td>2,4×</td>
<td>300×</td>
</tr>
</tbody>
</table></div>
<p>L&rsquo;erreur n&rsquo;est énorme qu&rsquo;à fort gain. Ma scène de test avait une zone blanche saturée : l&rsquo;exposition automatique avait de la lumière à revendre, restait près de zéro de gain, et à cet endroit-là <strong>les deux formules donnent le même résultat</strong>.</p>
<p>Le patch reste correct, et il fonctionne — je l&rsquo;ai vérifié autrement. Après installation, la bibliothèque n&rsquo;émet plus aucun avertissement pour ce capteur, tandis que l&rsquo;autre capteur du téléphone, non corrigé, les émet toujours tous. Un témoin négatif propre.</p>
<p><strong>Mais je n&rsquo;ai pas démontré d&rsquo;amélioration visible, et je ne l&rsquo;écrirai donc pas.</strong> La mention « testé » que je joindrai dira que le capteur est désormais reconnu. Pas que les images sont meilleures.</p>
<p>C&rsquo;est une distinction qui paraît tatillonne et qui ne l&rsquo;est pas. Un raisonnement correct sur un mécanisme ne dit rien de son amplitude dans les conditions du test. J&rsquo;avais le mécanisme ; je n&rsquo;avais pas l&rsquo;amplitude.</p>
<h2 id="la-trouvaille-qui-ne-figurait-dans-aucune-liste">La trouvaille qui ne figurait dans aucune liste</h2>
<p>Pendant tout ce travail, l&rsquo;application photo gelait régulièrement. Une nuisance, que j&rsquo;ai d&rsquo;abord contournée en relançant.</p>
<p>Puis j&rsquo;ai instrumenté, faute de mieux. Et il s&rsquo;est trouvé qu&rsquo;une <strong>seule ligne</strong>, émise une fois à l&rsquo;initialisation, expliquait tout :</p>
<pre><code>Importing input DMABuf failed, falling back to upload
</code></pre>
<p>Le traitement d&rsquo;image se fait sur le processeur graphique. Normalement, l&rsquo;image brute lui est transmise sans copie, par partage de mémoire. Ici l&rsquo;import échoue — et la bibliothèque bascule en mode recopie : <strong>douze mégapixels transférés vers le GPU à chaque image</strong>. Le bus mémoire sature, l&rsquo;affichage n&rsquo;obtient plus la bande passante pour ses propres opérations, et le pipeline finit étranglé.</p>
<p>Ce n&rsquo;est pas un plantage. C&rsquo;est un étouffement, ce qui explique pourquoi il ne laissait aucune trace exploitable.</p>
<p>Et voici ce qui donne à cette ligne toute sa valeur. Elle vient d&rsquo;un correctif ajouté par le mainteneur du paquet, qui l&rsquo;avait <strong>délibérément remise</strong> après que le projet amont l&rsquo;eut retirée. Son argumentaire :</p>
<blockquote>
<p>Les imports en échec dégradent massivement les performances et signalent des problèmes actionnables dans les pilotes V4L2 ou GPU.</p>
</blockquote>
<p>Le mainteneur avait donc posé le détecteur, en écrivant noir sur blanc que son déclenchement mérite une investigation. Il s&rsquo;est déclenché sur mon téléphone. Personne ne l&rsquo;avait remonté.</p>
<p>Je n&rsquo;ai pas encore prouvé la causalité — la corrélation est nette, le mécanisme cohérent, et un test simple trancherait. Mais c&rsquo;est de loin la chose la plus utile que j&rsquo;aie trouvée ce matin-là, et elle ne figurait dans aucune liste de tâches.</p>
<h2 id="ce-que-je-retiens-pour-une-prochaine-fois">Ce que je retiens, pour une prochaine fois</h2>
<p><strong>Ce qu&rsquo;on apporte, ce n&rsquo;est pas du talent, c&rsquo;est une position.</strong> Je n&rsquo;ai été meilleur que personne. J&rsquo;avais l&rsquo;appareil branché, et cinq relecteurs compétents ne l&rsquo;avaient pas. C&rsquo;est tout, et ça suffit.</p>
<p><strong>Vérifier que le problème existe encore avant d&rsquo;écrire.</strong> Deux tâches sur trois s&rsquo;étaient évaporées, corrigées en amont mais pas encore publiées. Deux requêtes l&rsquo;auraient dit d&rsquo;emblée.</p>
<p><strong>Une source qui confirme n&rsquo;est utile que si elle est indépendante.</strong> Dix documents qui recopient le même défaut ne valent pas mieux qu&rsquo;un seul.</p>
<p><strong>Séparer ce qui est démontré de ce qui est déduit</strong> — dans un message de commit comme dans une conversation. J&rsquo;avais un mécanisme juste et une prédiction fausse ; dire l&rsquo;un sans l&rsquo;autre aurait été un mensonge poli.</p>
<p><strong>Et instrumenter ce qui agace.</strong> Le gel de l&rsquo;application était une nuisance que je contournais depuis des heures. C&rsquo;est en cessant de la contourner que j&rsquo;ai trouvé la seule chose que personne d&rsquo;autre ne cherchait.</p>
<p>C&rsquo;est bien une pelote de ficelle : on tire sur un fil de deux lignes, et il vient trois choses qu&rsquo;on n&rsquo;avait pas demandées.</p>]]></content:encoded>
    </item>
    <item>
      <title>Vibe design : faire dessiner une pièce en CAO par une IA qui ne la verra jamais</title>
      <link>https://pf.olibrio.fr/posts/vibe-design-ventouse-tpu.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/vibe-design-ventouse-tpu.html</guid>
      <pubDate>Tue, 08 Sep 2026 12:00:00 +0000</pubDate>
      <description>Comment modéliser une ventouse en TPU à partir d&#x27;un croquis papier, en dialoguant avec une IA qui n&#x27;a ni la pièce ni le pied à coulisse. Pourquoi les questions en texte tournent en rond, pourquoi un rendu faux fait avancer plus vite qu&#x27;une bonne question, pourquoi une somme de cotes qui tombe juste ne prouve rien, et ce que le TPU 95A impose au dessin quand on imprime en bowden.</description>
      <category>impression 3d</category>
      <category>tpu</category>
      <category>cao</category>
      <category>python</category>
      <category>manifold3d</category>
      <category>ia</category>
      <category>vibe coding</category>
      <category>flsun qq-s</category>
      <category>ventouse</category>
      <category>filament flexible</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/og.jpg" alt="Vibe design : faire dessiner une pièce en CAO par une IA qui ne la verra jamais"></p>
<div class="tldr">
<p><strong>En deux minutes, si vous voulez faire modéliser une pièce par une IA sans passer par un logiciel de CAO</strong></p>
<ul>
<li><strong>La situation</strong> : une ventouse en caoutchouc à remplacer, un pied à coulisse, une feuille de papier — et une IA à qui je décris la pièce. Elle ne la voit pas, ne la touche pas, ne peut rien mesurer. Toutes les cotes viennent de moi.</li>
<li><strong>Ce qui ne marche pas</strong> : poser des questions. J&rsquo;ai envoyé un croquis coté correct, l&rsquo;IA a listé six ambiguïtés, j&rsquo;y ai répondu une par une — et au bout de six échanges, elle avait toujours une géométrie fausse.</li>
<li><strong>Ce qui marche</strong> : <strong>lui faire montrer</strong>. Un rendu faux, affiché avec ses hypothèses en couleur, se corrige en une phrase : « le 6,5 c&rsquo;est le fût, pas la hauteur totale ». Deux itérations ont suffi là où six questions ouvertes n&rsquo;avançaient plus.</li>
<li><strong>Le piège</strong> : mes cotes se refermaient parfaitement — 1 + 3,5 + 2 = 6,5 — sur une pièce entièrement fausse. <strong>Une somme qui tombe juste n&rsquo;est pas une preuve de lecture correcte.</strong> Voir <a href="#somme-juste">Le piège de la somme qui tombe juste</a>.</li>
<li><strong>Quand c&rsquo;est un mot qui bloque</strong> : j&rsquo;ai employé « creux », mon interlocuteur a compris « le trou ». Aucune reformulation n&rsquo;y a rien fait ; un schéma où l&rsquo;on <strong>colorie le volume dont on parle</strong> a réglé la question en un envoi.</li>
<li><strong>Le versant matériau</strong> : dessiner une ventouse en TPU 95A n&rsquo;est pas dessiner une ventouse. Le vrai caoutchouc est à 40–60 Shore A, l&rsquo;impression laisse des micro-canaux entre les couches, et sur une imprimante à extrudeur déporté le filament souple est le pire cas. Tout ça change le dessin, pas seulement les réglages.</li>
<li><strong>Le code</strong> : la pièce est un script Python de 120 lignes (<a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/ventouse.py"><code>ventouse.py</code></a>), toutes cotes en tête de fichier. Corriger une valeur et regénérer le STL coûte dix secondes — c&rsquo;est ce qui rend les allers-retours supportables.</li>
</ul>
<p><em>Ce billet ne suppose aucune connaissance en CAO. Il fait suite à <a href="https://pf.olibrio.fr/posts//posts/flsun-qqs-delta-klipper-calibration.html">la calibration de la même imprimante</a>, mais se lit seul.</em></p>
</div>
<p><img alt="Croquis à main levée d'une ventouse coté au stylo bleu, vue de dessus, coupe A-A et vue de dessous, avec la ventouse rouge posée à côté de la feuille" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/00-croquis.jpg" /></p>
<p><em>Le point de départ : trois vues, sept cotes, et la pièce d&rsquo;origine posée à côté. Tout ce que l&rsquo;IA aura jamais de cette ventouse, c&rsquo;est cette photo.</em></p>
<h2 id="le-probleme-nest-pas-de-dessiner-il-est-de-se-comprendre">Le problème n&rsquo;est pas de dessiner, il est de se comprendre</h2>
<p>J&rsquo;avais une ventouse en caoutchouc à refaire et une imprimante fraîchement calibrée. La modélisation elle-même n&rsquo;est pas le sujet : une ventouse, c&rsquo;est un disque, un cylindre, un téton et un perçage. N&rsquo;importe quel logiciel de CAO la sort en dix minutes — à condition de savoir <strong>ce qu&rsquo;on dessine</strong>.</p>
<p>Le sujet, c&rsquo;est que je voulais la faire dessiner par une IA. Pas par confort : parce que je voulais voir où ça casse. Une IA qui écrit du code a la boucle de retour la plus courte possible — le code tourne ou pas. Une IA qui dessine une pièce mécanique n&rsquo;a <strong>aucune</strong> boucle de retour : elle ne voit pas l&rsquo;objet, ne peut rien mesurer, et son résultat ne devient faux qu&rsquo;au moment où la pièce sort de l&rsquo;imprimante et n&rsquo;entre pas dans son logement. Tout ce qui se passe entre les deux est de la conversation.</p>
<p>Alors j&rsquo;ai fait un croquis. Trois vues, cotées, propres : ce qu&rsquo;on apprend à faire en dessin technique. Et c&rsquo;est là que ça devient intéressant, parce que ce croquis est <strong>juste</strong> — et qu&rsquo;il n&rsquo;a pas suffi.</p>
<h2 id="six-questions-posees-sur-ma-propre-photo">Six questions posées sur ma propre photo</h2>
<p>Premier réflexe de l&rsquo;IA, et il était bon : ne pas deviner. Elle a repris ma photo, y a posé six pastilles numérotées en rouge, et m&rsquo;a renvoyé l&rsquo;image avec ses six questions rattachées à des endroits précis du dessin.</p>
<p><img alt="Le même croquis avec six pastilles rouges numérotées ajoutées par l'IA, chacune reliée par un trait à une cote ou un détail ambigu du dessin" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/01-questions.jpg" /></p>
<p><em>Les six ambiguïtés, repérées sur le croquis lui-même. Annoter l&rsquo;image plutôt que décrire en texte : c&rsquo;est la seule chose qui a marché du premier coup dans toute cette histoire.</em></p>
<p>Cette méthode-là, je la connaissais déjà : elle vient du billet précédent, où décrire un geste de mesure en français m&rsquo;avait bloqué deux fois de suite, et où annoter ma propre photo avait débloqué en un envoi. Ça marche dans les deux sens. Quand l&rsquo;IA ne comprend pas mon dessin, elle doit me montrer <strong>où</strong> elle ne comprend pas, pas me demander « pouvez-vous préciser les dimensions ».</p>
<p>Et pourtant. J&rsquo;ai répondu aux six questions, une par une, en une ligne chacune. « C&rsquo;est une vue en coupe de la même pièce, elle matérialise l&rsquo;épaisseur de la ventouse. » « C&rsquo;est le trou, en dessous de la ventouse. » « Il fait 3 mm de diamètre et 4 de profondeur. » « Il est borgne. » Six réponses exactes, sans ambiguïté. Au terme de quoi la géométrie était <strong>toujours fausse</strong>.</p>
<h2 id="ce-qui-manque-a-un-croquis-ce-ne-sont-pas-les-cotes">Ce qui manque à un croquis, ce ne sont pas les cotes</h2>
<p>Voilà le nœud. Mon croquis portait toutes les cotes nécessaires. Ce qu&rsquo;il ne portait pas, c&rsquo;est <strong>à quoi chaque cote se rattache</strong> — et ça, c&rsquo;est précisément ce qu&rsquo;un dessin à main levée ne dit pas, alors qu&rsquo;un plan coté normalisé le dit par la position des lignes d&rsquo;attache.</p>
<p>Un exemple. J&rsquo;avais écrit « 6,5 mm » avec une flèche verticale sur la droite de ma coupe. Pour moi, évident : c&rsquo;est la hauteur du fût. Pour l&rsquo;IA, tout aussi évident : c&rsquo;est la hauteur hors-tout, puisque la flèche va d&rsquo;un bout à l&rsquo;autre du dessin. Les deux lectures sont défendables sur une photo prise de biais, où la flèche déborde un peu.</p>
<p>Même chose pour le trou et le téton, qui font tous les deux 3 et quelques millimètres, aux deux extrémités de la pièce. J&rsquo;ai écrit « 3 » d&rsquo;un côté et « 3,5 » de l&rsquo;autre en sachant lequel était lequel. Rien sur le papier ne le disait.</p>
<h2 id="montrer">Ce qui marche : lui faire montrer, pas lui faire dire</h2>
<p>Au bout du sixième échange, changement de méthode : au lieu de me poser une septième question, l&rsquo;IA a modélisé la pièce <strong>avec ses hypothèses</strong>, sorti un rendu, et me l&rsquo;a envoyé — avec un code couleur explicite sur la coupe cotée : <strong>en rouge les cotes qui viennent de moi, en cyan celles qu&rsquo;elle avait inventées</strong>.</p>
<p>J&rsquo;ai regardé le rendu trois secondes et j&rsquo;ai écrit : « du sommet du téton au bord de la lèvre, la ventouse fait 10,5 mm. 2 mm de téton, 6,5 mm de fût, 2 mm de corps de ventouse. »</p>
<p><img alt="Deux coupes de ventouse côte à côte : à gauche la version fausse écrasée, hauteur totale 6,5 ; à droite la bonne, fût de 6,5 et hauteur totale 10,5" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/02-deux-lectures.png" /></p>
<p><em>La même pièce, les mêmes cotes, deux lectures. À gauche ce que l&rsquo;IA avait compris ; à droite ce que j&rsquo;avais dessiné. Aucune question n&rsquo;aurait produit cette phrase — c&rsquo;est le dessin faux qui l&rsquo;a produite.</em></p>
<p>C&rsquo;est le renversement intéressant. Une question ouverte (« la cote 6,5, elle mesure quoi ? ») me demande de reconstruire mentalement le contexte, de retrouver ce que j&rsquo;avais en tête trois jours plus tôt, et de formuler une réponse dans le vide. Un rendu faux me met la géométrie sous les yeux, et <strong>mon œil corrige plus vite que ma mémoire</strong>. La correction ne coûte plus rien : je vois que le fût est écrasé, donc je sais quoi dire.</p>
<p>Il y a une condition pour que ça marche, et elle n&rsquo;est pas anodine : <strong>l&rsquo;IA doit signaler ce qu&rsquo;elle invente</strong>. Un rendu propre, sans distinction entre ce qui vient de moi et ce qu&rsquo;elle a comblé, m&rsquo;aurait fait valider une pièce dont je n&rsquo;aurais pas vu qu&rsquo;elle contenait cinq valeurs sorties de nulle part. Le cyan sur la coupe, c&rsquo;est l&rsquo;aveu d&rsquo;ignorance rendu visible. C&rsquo;est ce qui rend le rendu utilisable comme instrument de mesure plutôt que comme illustration.</p>
<h2 id="somme-juste">Le piège de la somme qui tombe juste</h2>
<p>Voici la partie que je trouve la plus instructive, et elle mérite qu&rsquo;on s&rsquo;y arrête.</p>
<p>Quand l&rsquo;IA a produit sa deuxième version — celle avec le fût, encore fausse — elle m&rsquo;a expliqué qu&rsquo;elle avait enfin réussi à placer la dernière cote orpheline de mon croquis, le fameux 3,5. Sa démonstration : la coupelle fait 1,0, le fût 3,5, le téton 2,0, <strong>total 6,5</strong>, exactement la hauteur hors-tout du dessin. Toutes les cotes se refermaient entre elles. Elle a écrit, et c&rsquo;était sincère : « tes cinq cotes se referment entre elles, ce qui est plutôt bon signe pour ma lecture ».</p>
<p>Sauf que c&rsquo;était faux. Le 6,5 n&rsquo;était pas le hors-tout, le 3,5 n&rsquo;était pas la hauteur du fût, et la pièce reconstruite ne ressemblait à rien. La bonne lecture donne 2 + 6,5 + 2 = 10,5, et le 3,5 est le diamètre du perçage — une cote qui n&rsquo;a rien à voir avec un empilement de hauteurs.</p>
<p><strong>Une somme qui tombe juste n&rsquo;est pas une preuve.</strong> Avec sept cotes et une pièce à symétrie de révolution, il y a assez de degrés de liberté pour que des combinaisons fausses se referment par hasard. La cohérence arithmétique est un indice faible, et c&rsquo;est exactement le genre d&rsquo;indice faible qu&rsquo;une IA présente avec assurance parce qu&rsquo;il <em>ressemble</em> à une vérification. C&rsquo;est un raisonnement qui a la forme d&rsquo;une preuve sans en avoir la force.</p>
<p>Ce qui a tranché, ce n&rsquo;est pas un calcul : c&rsquo;est que la pièce dessinée ne ressemblait pas à la pièce posée sur la table. Le seul juge, dans cette affaire, c&rsquo;est l&rsquo;objet.</p>
<h2 id="quand-cest-un-mot-qui-bloque-il-faut-colorier">Quand c&rsquo;est un mot qui bloque, il faut colorier</h2>
<p>Un dernier blocage, d&rsquo;une autre nature. Pour qu&rsquo;une ventouse tienne, sa face inférieure ne doit pas être plate : elle remonte légèrement vers le centre. J&rsquo;appelle ça, faute de mieux, le « creux ». On appuie, l&rsquo;air emprisonné s&rsquo;échappe par la lèvre ; on relâche, le caoutchouc veut reprendre sa forme, la pression baisse dans la cavité, et la pression atmosphérique plaque la pièce. C&rsquo;est tout le mécanisme.</p>
<p>Sauf que ma pièce a aussi un trou borgne au centre. Alors quand on m&rsquo;a parlé de « creux », j&rsquo;ai répondu : « tu appelles quoi le creux ? au centre de la ventouse tu as un trou de 3,5 mm par 4 mm de profondeur, c&rsquo;est le retrait au centre de la ventouse ? »</p>
<p>Reformuler n&rsquo;aurait rien donné — le mot était déjà pris. Ce qui a marché tient en une image :</p>
<p><img alt="Coupe de la ventouse posée sur une surface hachurée, avec en bleu le volume d'air emprisonné sous la coupelle et en rouge le perçage qui monte dans le fût" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/03-creux.png" /></p>
<p><em>Le creux, c&rsquo;est le bleu. Le trou, c&rsquo;est le blanc, à l&rsquo;opposé. Colorier le volume dont on parle règle en une image ce que trois paragraphes n&rsquo;auraient pas réglé.</em></p>
<p>La leçon générale : quand un échange bloque sur un mot, ce n&rsquo;est pas une question de vocabulaire mais de référent. Il ne faut pas mieux définir le mot, il faut <strong>désigner la chose</strong>. En géométrie, désigner se fait avec une couleur.</p>
<p>Détail qui compte : sur ses premières coupes, l&rsquo;IA dessinait le perçage comme un rectangle blanc qui débordait sous la pièce et dans le creux, « pour qu&rsquo;on le voie bien ». Je le lui ai dit — cette vue-là était moins claire, parce qu&rsquo;un trait qui déborde laisse croire à une géométrie qui n&rsquo;existe pas, et il débordait précisément dans la zone qu&rsquo;on essayait de discuter. Un schéma technique ne s&rsquo;améliore pas en exagérant les traits ; il s&rsquo;améliore en cadrant sur la zone utile et en coloriant les volumes.</p>
<h2 id="la-piece">La pièce</h2>
<p><img alt="Trois vues de la ventouse modélisée : vue 3/4 dessus montrant le fût et le téton, vue de dessous montrant la coupelle et le perçage, et coupe cotée" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/04-final.png" /></p>
<p><em>La pièce finie : coupelle Ø19,5, corps 2, fût Ø9 × 6,5, téton de centrage Ø3 × 2, perçage borgne Ø3,5 × 4. Hors-tout 10,5.</em></p>
<p>Le modèle est un script Python de 120 lignes qui utilise <a href="https://github.com/elalish/manifold">manifold3d</a>, une bibliothèque de géométrie solide. La pièce étant de révolution, tout tient dans un profil <code>(rayon, hauteur)</code> qu&rsquo;on fait tourner :</p>
<pre><code class="language-python">def profil(n=80):
    &quot;&quot;&quot;Contour ferme (r, z) de la demi-coupe, sens antihoraire.&quot;&quot;&quot;
    p = []
    r = np.linspace(0, R_INT, n)                    # dessous : concavite parabolique
    p += [(x, CREUX * (1 - (x / R_INT) ** 2)) for x in r]
    p += [(R_EXT, 0.0), (R_EXT, E_LEVRE)]           # levre : portee plate puis flanc
    r = np.linspace(R_EXT, R_FUT, n)                # dessus du corps, legerement bombe
    t = (r - R_FUT) / (R_EXT - R_FUT)
    p += [(x, E_LEVRE + (Z_FUT - E_LEVRE) * (1 - u) ** BOMBE) for x, u in zip(r, t)]
    p += [(R_FUT, Z_TET), (R_TETON, Z_TET), (R_TETON, H), (0.0, H)]
    return p

m = Manifold.revolve(CrossSection([profil()]), 128) - trou
</code></pre>
<p>Ce qui rend l&rsquo;exercice tenable, ce n&rsquo;est pas la bibliothèque : c&rsquo;est que <strong>toutes les cotes sont des constantes en tête de fichier</strong>, avec en commentaire d&rsquo;où vient chacune — croquis, déduction, ou hypothèse. Corriger une valeur et regénérer le STL prend dix secondes. Sur cinq allers-retours, c&rsquo;est la différence entre une conversation et une corvée.</p>
<details>
<summary>Pour aller au fond : pourquoi un profil de révolution plutôt qu'un assemblage de cylindres</summary>
<p>On pourrait dessiner cette pièce en empilant des primitives : un cylindre pour le corps, un pour le fût, un pour le téton, un cylindre soustrait pour le perçage. Ça marche, et c&rsquo;est ce que fait naturellement une IA à qui on demande « une ventouse ».</p>
<p>Le problème est la coupelle. Sa face inférieure est une surface courbe, et son épaisseur varie du bord vers le centre — c&rsquo;est ce qui lui permet de se déformer sous la pression du doigt puis de revenir. Avec des primitives, il faudrait soustraire une portion de sphère ou un ellipsoïde, et l&rsquo;épaisseur résultante deviendrait une conséquence difficile à contrôler.</p>
<p>Avec un profil de révolution, on décrit directement les deux surfaces — le dessous en parabole <code>z = creux · (1 − (r/R)²)</code>, le dessus en courbe bombée d&rsquo;exposant réglable — et l&rsquo;épaisseur est la différence entre les deux, visible et pilotable en chaque point. Sur une pièce souple dont toute la fonction tient dans la façon dont elle se déforme, c&rsquo;est la seule paramétrisation qui donne prise.</p>
<p><code>Manifold.revolve</code> prend une section dans le plan XY, la fait tourner autour de l&rsquo;axe Y, et renvoie un solide dont l&rsquo;axe est Z. Le perçage borgne est ensuite soustrait comme un cylindre — dessiné, dans la coupe d&rsquo;aperçu, <strong>exactement</strong> entre son entrée et son fond, sans dépasser.</p>
</details>
<h2 id="dessiner-pour-le-tpu-ce-nest-pas-dessiner-une-ventouse">Dessiner pour le TPU, ce n&rsquo;est pas dessiner une ventouse</h2>
<p><img alt="Bobine de TPU Overture orange, étiquette indiquant buse 210-230 °C, plateau 25-60 °C, vitesse 20-40 mm/s et un numéro de lot" src="https://pf.olibrio.fr/images/vibe-design-ventouse-tpu/05-bobine-tpu.jpg" /></p>
<p><em>La bobine qui a lancé toute l&rsquo;affaire. L&rsquo;étiquette annonce 20 à 40 mm/s — en précisant, un peu plus haut, qu&rsquo;elle vise les imprimantes à extrudeur direct.</em></p>
<p>Une vraie ventouse est en silicone ou en PVC souple, autour de <strong>40 à 60 Shore A</strong>. Le TPU le plus courant, celui que j&rsquo;ai, est du <strong>95A</strong> : à peu près la dureté d&rsquo;une roulette de chariot. Ce n&rsquo;est pas un détail de réglage, c&rsquo;est une contrainte de dessin.</p>
<p>Une lèvre épaisse en 95A ne se conformera pas aux micro-défauts de la surface : elle portera sur trois points hauts et fuira entre les deux. Il faut donc une lèvre <strong>fine</strong>, 0,6 à 0,8 mm, qui puisse fléchir — au risque de la fragiliser. Et il y a pire : une pièce imprimée en dépôt de fil est un empilement de cordons soudés, et entre deux cordons il reste des <strong>micro-canaux</strong>. Sur une pièce d&rsquo;aspect, personne ne les remarque. Sur une pièce dont la fonction est de tenir une dépression, ce sont des fuites. D&rsquo;où des couches fines, une température haute et un léger excès de matière — non pas pour la solidité, mais pour <strong>souder les couches entre elles</strong>.</p>
<p>C&rsquo;est le genre d&rsquo;arbitrage qu&rsquo;un dialogue avec une IA fait bien remonter, à condition de lui donner le matériau <strong>avant</strong> la géométrie. Si j&rsquo;avais demandé « dessine-moi une ventouse » sans préciser, j&rsquo;aurais eu une lèvre de 2 mm, correcte en caoutchouc moulé, inutilisable ici.</p>
<h2 id="le-tpu-sur-une-imprimante-a-extrudeur-deporte-le-pire-cas">Le TPU sur une imprimante à extrudeur déporté : le pire cas</h2>
<p>Reste à l&rsquo;imprimer, et c&rsquo;est là que ma machine se rappelle à moi. Sur une <strong>FLSun QQ-S</strong>, le moteur qui pousse le filament n&rsquo;est pas sur la tête : il est sur le châssis, et le fil parcourt environ 700 mm dans un tube guide avant d&rsquo;atteindre la buse. On appelle ça un montage <strong>bowden</strong>. Avec un filament rigide, ça marche : le fil se comporte comme une tige qu&rsquo;on pousse. Avec un filament souple, il se comporte comme un ressort — on pousse d&rsquo;un côté, rien ne sort de l&rsquo;autre, puis tout sort d&rsquo;un coup.</p>
<p>Trois choses en découlent, et elles se voient dans le profil de tranchage :</p>
<ul>
<li><strong>La rétraction.</strong> Mon profil PLA rétracte de 5 mm. Sur du TPU, 5 mm détendent le fil au point qu&rsquo;il peut s&rsquo;enrouler à l&rsquo;entrée du tube et bloquer — c&rsquo;est <em>le</em> mode de panne du souple en bowden. Descendu à 2 mm, à vitesse réduite.</li>
<li><strong>La vitesse.</strong> L&rsquo;étiquette annonce 20 à 40 mm/s, en supposant un extrudeur direct. En bowden, 15 à 25.</li>
<li><strong>L&rsquo;accélération.</strong> Sur une delta rapide, les à-coups sont absorbés par l&rsquo;élasticité du fil plutôt que par la buse : la matière manque dans les angles. Ramenée de 1500 à 800 mm/s², restaurée en fin d&rsquo;impression.</li>
</ul>
<details>
<summary>Pour aller au fond : faut-il mettre l'extrudeur sur la tête ?</summary>
<p>C&rsquo;est la question qui vient immédiatement : si le tube est le problème, pourquoi ne pas monter l&rsquo;extrudeur sur la tête et le supprimer ? J&rsquo;ai justement un extrudeur à double entraînement en attente, un OMG V2-S, qui pèse <strong>64 g</strong> et se monte indifféremment en bowden ou en direct.</p>
<p>Le calcul est moins favorable qu&rsquo;il n&rsquo;y paraît, parce que <strong>le poids n&rsquo;est pas dans l&rsquo;extrudeur, il est dans le moteur</strong> : environ 215 g avec un moteur plat, 365 g avec un moteur standard. Et sur une delta, l&rsquo;effecteur bouge dans les trois axes, contrairement à une cartésienne où un extrudeur direct ne charge que l&rsquo;axe X.</p>
<p>Or la fréquence de résonance d&rsquo;une structure suit <code>f ∝ 1/√m</code>. Ma machine résonne déjà à 20 Hz, ce qui est bas ; doubler la masse mobile la ferait tomber vers 14 Hz. La documentation de Klipper considère qu&rsquo;en dessous de 25 Hz il faut <strong>rigidifier la machine plutôt que compenser</strong> — en dessous, le filtre anti-vibrations arrondit les détails. Je paierais le confort du TPU par une dégradation sur tout le reste, sur une machine que je viens de calibrer.</p>
<p>La conclusion pratique : garder le bowden, et attaquer le problème par l&rsquo;autre bout. Le vrai coupable pour le souple, ce n&rsquo;est pas la longueur du tube, c&rsquo;est l&rsquo;extrudeur d&rsquo;origine à <strong>un seul galet</strong>, sous lequel le filament mou s&rsquo;échappe latéralement. Un double entraînement le tient des deux côtés. Et un tube d&rsquo;alésage 1,9 mm au lieu de 2,0 empêche le fil de flamber dans le jeu. Deux pièces bon marché qui règlent l&rsquo;essentiel sans toucher à la dynamique de la machine.</p>
</details>
<h2 id="ce-que-jen-retiens">Ce que j&rsquo;en retiens</h2>
<p><strong>Une IA qui dessine n&rsquo;a aucune boucle de retour.</strong> Elle ne voit pas la pièce, ne mesure rien, et son erreur ne devient visible qu&rsquo;à l&rsquo;impression. Tout le travail consiste à lui fabriquer cette boucle de retour à la main — et le rendu, c&rsquo;est ça.</p>
<p><strong>Montrer bat demander.</strong> Une question ouverte me demande de reconstruire un contexte ; un dessin faux met la géométrie sous mes yeux et mon œil corrige tout seul. Six questions n&rsquo;ont pas convergé ; deux rendus ont suffi.</p>
<p><strong>L&rsquo;IA doit signaler ce qu&rsquo;elle invente.</strong> Le code couleur rouge/cyan — vos cotes, mes hypothèses — est ce qui transforme un joli rendu en instrument de mesure. Sans lui, j&rsquo;aurais validé cinq valeurs sorties de nulle part.</p>
<p><strong>Une cohérence arithmétique n&rsquo;est pas une vérification.</strong> Mes cotes se refermaient parfaitement sur une pièce fausse. Une IA présente ce genre d&rsquo;indice avec l&rsquo;assurance d&rsquo;une preuve, parce qu&rsquo;il en a la forme. Le seul juge est l&rsquo;objet posé sur la table.</p>
<p><strong>Quand un mot bloque, désignez la chose.</strong> Pas de reformulation : une image où l&rsquo;on colorie le volume dont on parle.</p>
<p><strong>Le matériau se donne avant la géométrie.</strong> « Une ventouse » et « une ventouse en TPU 95A imprimée en dépôt de fil » ne sont pas la même pièce, et la deuxième ne s&rsquo;obtient pas en ajustant les réglages de la première.</p>
<p><strong>Et le paramétrage rend tout ça supportable.</strong> Cinq versions successives, dix secondes chacune. Si chaque correction avait coûté une reprise dans un logiciel de CAO, j&rsquo;aurais abandonné au deuxième rendu et dessiné la pièce moi-même — ce qui, d&rsquo;ailleurs, aurait été parfaitement raisonnable.</p>
<h2 id="ou-on-en-est">Où on en est</h2>
<div class="status">
<p><strong>État au 8 septembre 2026 : modèle figé, impression en attente.</strong> La géométrie est validée sur la coupe cotée, le script sort le STL et son aperçu, le profil de tranchage TPU est écrit. L&rsquo;impression attend le montage de l&rsquo;extrudeur à double entraînement, puis un test d&rsquo;humidité du filament — la bobine date de novembre 2023, et le TPU absorbe l&rsquo;eau plus vite encore que le PETG. Reste une inconnue qui ne se lèvera qu&rsquo;à l&rsquo;essai : le diamètre réel du fût imprimé. Dessiné à Ø9, il sortira sans doute à Ø9,2 ; en TPU c&rsquo;est rattrapable, la pièce s&rsquo;enfonce en se comprimant. En PLA, il aurait fallu trois essais.</p>
</div>
<h2 id="pour-reproduire">Pour reproduire</h2>
<p><strong>Ce qu&rsquo;il faut</strong> : la pièce d&rsquo;origine, un pied à coulisse, de quoi faire un croquis, et un environnement Python avec <code>manifold3d</code>, <code>numpy</code> et <code>matplotlib</code>. Pas de logiciel de CAO.</p>
<p><strong>Le croquis.</strong> Trois vues valent mieux qu&rsquo;une perspective. Mais surtout : <strong>écrivez à côté de chaque cote ce qu&rsquo;elle mesure</strong>, en toutes lettres. « 6,5 = hauteur du fût » et non « 6,5 ». C&rsquo;est laid sur un plan normalisé, c&rsquo;est ce qui vous fera gagner cinq allers-retours ici.</p>
<p><strong>La boucle.</strong> À chaque itération, exigez trois sorties : le STL, une <strong>vue 3D</strong> (est-ce que ça ressemble à l&rsquo;objet ?) et une <strong>coupe cotée</strong> (est-ce que les cotes sont aux bons endroits ?). La coupe est celle qui trouve les erreurs ; la 3D est celle qui trouve les absurdités.</p>
<p><strong>Le code couleur.</strong> Demandez explicitement que les cotes reprises de votre croquis et celles inventées par l&rsquo;IA soient distinguées à l&rsquo;écran. C&rsquo;est le point le plus rentable de toute la méthode.</p>
<p><strong>Les règles de dessin</strong> qui ont émergé, pour un schéma technique lisible : chaque forme s&rsquo;arrête à sa géométrie réelle, jamais de trait qui déborde « pour qu&rsquo;on le voie » ; le texte hors de la pièce, jamais par-dessus ; cadrer sur la zone discutée — un creux de 1 mm est invisible à l&rsquo;échelle d&rsquo;une pièce de 20 ; et colorier les volumes plutôt qu&rsquo;épaissir les traits.</p>
<p><strong>Les fichiers</strong> : le modèle <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/ventouse.py"><code>ventouse.py</code></a> et le <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/ventouse.stl">STL</a> qu&rsquo;il produit ; le profil de tranchage <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/qqs-tpu.ini"><code>qqs-tpu.ini</code></a> (PrusaSlicer en ligne de commande, delta 260 mm, buse 0,4) ; et <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/esp32-supermini-tray.py"><code>esp32-supermini-tray.py</code></a>, une pièce antérieure faite avec la même chaîne, pour comparer une géométrie prismatique à une géométrie de révolution.</p>
<p><strong>Le profil TPU en résumé</strong>, si vous imprimez du souple en bowden : rétraction 2 mm à 25 mm/s, périmètres 15–20 mm/s, accélération 800, buse 225–230, plateau 45–50, ventilation 40–60 %, première couche moins écrasée que d&rsquo;habitude (le souple refoule au lieu de s&rsquo;étaler), et un bâton de colle sur le verre comme <strong>démoulant</strong> — le TPU adhère assez pour arracher un éclat.</p>
<h2 id="questions-frequentes">Questions fréquentes</h2>
<h3 id="peut-on-vraiment-faire-de-la-cao-en-dialoguant-avec-une-ia-sans-logiciel">Peut-on vraiment faire de la CAO en dialoguant avec une IA, sans logiciel ?</h3>
<p>Pour une pièce simple et bien définie, oui, et le résultat est paramétrique, versionnable et commenté — trois choses qu&rsquo;un fichier de CAO donne mal. Pour une pièce dont vous ne savez pas encore la forme, non : le dialogue coûte plus cher que l&rsquo;esquisse. La bascule se situe à peu près là où vous savez décrire la pièce en une phrase.</p>
<h3 id="pourquoi-mon-croquis-cote-na-t-il-pas-suffi">Pourquoi mon croquis coté n&rsquo;a-t-il pas suffi ?</h3>
<p>Parce qu&rsquo;un croquis à main levée porte les cotes mais pas leurs attaches. Sur un plan normalisé, la position des lignes d&rsquo;attache dit à quoi la cote se rapporte ; à main levée, sur une photo prise de biais, cette information disparaît. Écrire en toutes lettres ce que mesure chaque cote la restitue.</p>
<h3 id="une-ia-peut-elle-inventer-des-cotes-sans-le-dire">Une IA peut-elle inventer des cotes sans le dire ?</h3>
<p>Elle le fait nécessairement — une pièce a plus de dimensions qu&rsquo;un croquis n&rsquo;en porte. La question est de savoir si elle le signale. Exigez que les valeurs inventées soient marquées dans le rendu et commentées dans le code ; c&rsquo;est vérifiable en un coup d&rsquo;œil, et ça change tout.</p>
<h3 id="le-tpu-95a-convient-il-pour-une-ventouse">Le TPU 95A convient-il pour une ventouse ?</h3>
<p>Il est nettement plus dur que le silicone d&rsquo;une vraie ventouse (40–60 Shore A). Ça peut fonctionner sur une surface bien lisse avec une lèvre fine et des couches fines, mais il ne faut pas s&rsquo;attendre à la tenue d&rsquo;une pièce moulée. Un TPU plus souple, en 85A, serait meilleur pour l&rsquo;usage — et bien plus difficile à imprimer en bowden.</p>
<h3 id="faut-il-un-extrudeur-direct-pour-imprimer-du-tpu">Faut-il un extrudeur direct pour imprimer du TPU ?</h3>
<p>Non pour du 95A, oui en pratique pour du 85A et plus souple. En bowden, ce qui compte le plus n&rsquo;est pas la longueur du tube mais l&rsquo;extrudeur : un double entraînement tient le filament des deux côtés, là où un galet unique le laisse s&rsquo;échapper. Un tube d&rsquo;alésage 1,9 mm complète bien.</p>
<h3 id="pourquoi-ne-pas-monter-lextrudeur-sur-la-tete-dune-delta">Pourquoi ne pas monter l&rsquo;extrudeur sur la tête d&rsquo;une delta ?</h3>
<p>Parce que la masse mobile y est le paramètre critique et qu&rsquo;elle pénalise les trois axes à la fois. Doubler la masse de l&rsquo;effecteur fait chuter la fréquence de résonance d&rsquo;un facteur √2 ; en dessous de 25 Hz, la compensation logicielle commence à arrondir les détails. Voir l&rsquo;encart de la section sur le bowden.</p>
<h3 id="combien-de-temps-a-pris-lensemble">Combien de temps a pris l&rsquo;ensemble ?</h3>
<p>Une petite heure de conversation, cinq versions du modèle. L&rsquo;essentiel de ce temps est passé à lever six ambiguïtés de croquis — pas à dessiner.</p>
<h2 id="petit-glossaire">Petit glossaire</h2>
<p><strong>Bowden (montage)</strong> — Le moteur qui pousse le filament est fixé au châssis, et le fil rejoint la buse par un tube guide. Allège la tête mobile, mais introduit de l&rsquo;élasticité dans la poussée.</p>
<p><strong>Direct drive</strong> — L&rsquo;inverse : le moteur est sur la tête. Meilleur contrôle de la matière, tête plus lourde.</p>
<p><strong>Effecteur</strong> — Sur une imprimante delta, la pièce mobile qui porte la buse, suspendue aux trois paires de bras.</p>
<p><strong>manifold3d</strong> — Bibliothèque de géométrie solide qui garantit des maillages toujours valides ; on décrit la pièce en Python par des opérations booléennes et des révolutions.</p>
<p><strong>Pressure advance</strong> — Compensation logicielle du retard entre la commande d&rsquo;extrusion et la sortie de matière, dû à la compressibilité du filament. D&rsquo;autant plus élevé que le montage est souple.</p>
<p><strong>Rétraction</strong> — Recul du filament pendant les déplacements sans extrusion, pour éviter les fils. Longue en bowden, très courte en direct.</p>
<p><strong>Shore A</strong> — Échelle de dureté des élastomères. Un silicone de ventouse est à 40–60, un joint de porte à 70, un TPU d&rsquo;impression courant à 95, une roulette de chariot à 98.</p>
<p><strong>STL</strong> — Format de fichier décrivant une surface par un maillage de triangles. Ce que le trancheur attend.</p>
<p><strong>Trancheur (slicer)</strong> — Le logiciel qui transforme un STL en trajectoires de buse. Ici PrusaSlicer, piloté en ligne de commande par un fichier de profil.</p>
<p><strong>TPU</strong> — Polyuréthane thermoplastique : le filament souple le plus courant.</p>
<h2 id="references">Références et copies locales</h2>
<ul>
<li>Le modèle et ses sorties : <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/ventouse.py"><code>ventouse.py</code></a>, <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/ventouse.stl"><code>ventouse.stl</code></a></li>
<li>Le profil de tranchage TPU : <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/qqs-tpu.ini"><code>qqs-tpu.ini</code></a></li>
<li>Une pièce prismatique faite avec la même chaîne : <a href="https://pf.olibrio.fr/assets/vibe-design-ventouse-tpu/esp32-supermini-tray.py"><code>esp32-supermini-tray.py</code></a></li>
<li><a href="https://github.com/elalish/manifold">manifold3d</a> — la bibliothèque de géométrie solide utilisée</li>
<li><a href="https://www.klipper3d.org/Measuring_Resonances.html">Documentation Klipper — mesure de résonance</a> — sur le seuil des 25 Hz et le compromis masse/rigidité</li>
<li><a href="https://pf.olibrio.fr/posts//posts/flsun-qqs-delta-klipper-calibration.html">Le billet précédent</a> — la calibration de la même machine, où la méthode de la photo annotée est née</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Un Pixel 3a français sous Linux : ce que Google a abandonné en 2022 tourne aujourd&#x27;hui sur un noyau de 2026</title>
      <link>https://pf.olibrio.fr/posts/pixel-3a-postmarketos-linux-mainline.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/pixel-3a-postmarketos-linux-mainline.html</guid>
      <pubDate>Mon, 07 Sep 2026 12:00:00 +0000</pubDate>
      <description>Un Pixel 3a G020F européen, dernière mise à jour Google en mai 2022, réinitialisé et fissuré. En une soirée : postmarketOS avec un noyau Linux mainline 7.1.3, Phosh, accès SSH par le câble USB. Le récit complet — pourquoi le noyau mainline plutôt qu&#x27;Ubuntu Touch, le déverrouillage du bootloader, et l&#x27;heure passée à croire que le câble était mort alors que le coupable était l&#x27;autosuspend USB du noyau relayé par TLP. Et pourquoi ce n&#x27;est pas qu&#x27;un passe-temps : Chat Control, la vérification d&#x27;âge, et la pièce d&#x27;identité que Google exigera bientôt des développeurs pour qu&#x27;on puisse installer leurs applications.</description>
      <category>pixel 3a</category>
      <category>postmarketos</category>
      <category>linux mainline</category>
      <category>sdm670</category>
      <category>obsolescence</category>
      <category>fastboot</category>
      <category>usb autosuspend</category>
      <category>tlp</category>
      <category>libcamera</category>
      <category>phosh</category>
      <category>logiciel libre</category>
      <category>droit à la réparation</category>
      <category>chat control</category>
      <category>vérification d&#x27;âge</category>
      <category>souveraineté numérique</category>
      <category>grapheneos</category>
      <category>vie privée</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/pixel3a/og-pixel3a.jpg" alt="Un Pixel 3a français sous Linux : ce que Google a abandonné en 2022 tourne aujourd&#x27;hui sur un noyau de 2026"></p>
<div class="tldr">
<p><strong>En deux minutes</strong></p>
<ul>
<li><strong>Le point de départ</strong> : un Pixel 3a de 2019, modèle européen G020F, dernière mise à jour de sécurité le 5 mai 2022, écran fissuré, réinitialisé aux réglages d&rsquo;usine. Officiellement : un déchet.</li>
<li><strong>Le point d&rsquo;arrivée</strong>, quelques heures plus tard : <strong>postmarketOS</strong> avec un <strong>noyau Linux 7.1.3 mainline</strong> — pas un noyau Android rafistolé, le vrai —, l&rsquo;environnement Phosh, les deux caméras détectées, et un accès <code>ssh</code> par le simple câble USB.</li>
<li><strong>Le choix qui compte</strong> : Ubuntu Touch fait tout fonctionner mieux, mais repose sur des pilotes Android figés. postmarketOS fait fonctionner moins de choses, sur du code que l&rsquo;on peut corriger et renvoyer en amont. Pour qui veut contribuer, c&rsquo;est le seul choix.</li>
<li><strong>L&rsquo;heure perdue</strong> : <code>fastboot</code> se figeait sans le moindre message. J&rsquo;ai successivement accusé les permissions, le câble, le port USB et la version du binaire. Les quatre étaient faux. Le coupable : <strong>le noyau endort l&rsquo;interface USB après deux secondes</strong>, le bootloader du Pixel ne sait pas se réveiller — et <strong>TLP</strong> repassait derrière ma correction.</li>
<li><strong>Ce que ça révèle</strong> : ce piège n&rsquo;est documenté nulle part. Quelqu&rsquo;un qui le rencontre conclut que son câble est mort et renonce. Un correctif de deux lignes le règle, pour tous les Pixel.</li>
<li><strong>La suite</strong> : <code>cam -l</code> reproduit un bogue connu de libcamera dès le premier démarrage — et en révèle un second, plus facile à corriger, que personne n&rsquo;avait signalé.</li>
<li><strong>Et votre téléphone ?</strong> postmarketOS gère 39 appareils en <code>community</code> (dont quatorze téléphones) et 149 en <code>testing</code> ; Ubuntu Touch en annonce 111. Le tableau complet est <a href="#et-votre-telephone-a-vous">plus bas</a>.</li>
</ul>
<p><em>Ce billet se veut lisible sans rien connaître à Android ni à Linux : chaque terme technique est expliqué à sa première apparition. Les encarts « Pour aller au fond » se déplient pour ceux qui veulent les commandes exactes.</em></p>
</div>
<p><img alt="Le dos du Pixel 3a : gravés dans le plastique blanc, le marquage CE, la poubelle sur roues barrée d'une croix, la mention « Model G020F », et le G de Google" src="https://pf.olibrio.fr/images/pixel3a/dos-g020f-ce-weee.jpg" /></p>
<p><em>Le dos de l&rsquo;appareil. « Model G020F » — la variante européenne. À côté, le marquage CE et la poubelle barrée, ce pictogramme qui signifie « ne pas jeter avec les ordures ménagères ». Il aura fallu attendre sept ans pour que ce symbole cesse d&rsquo;être une formalité et devienne le sujet.</em></p>
<h2 id="ce-que-veut-dire-fin-de-support">Ce que veut dire « fin de support »</h2>
<p>Le Pixel 3a est sorti en mai 2019. C&rsquo;était le bon élève de sa génération : un appareil photo remarquable pour 400 €, une prise casque que les modèles haut de gamme avaient déjà supprimée, un processeur Snapdragon 670 sans prétention. Google l&rsquo;a mis à jour jusqu&rsquo;au <strong>5 mai 2022</strong>. La dernière version installée sur celui-ci porte le numéro <code>SP2A.220505.008</code> — Android 12, correctif de sécurité de mai 2022.</p>
<p>Depuis, plus rien. Pas parce que le matériel a lâché : il fonctionne parfaitement. Parce qu&rsquo;une entreprise a décidé qu&rsquo;une durée était écoulée.</p>
<p>C&rsquo;est une phrase qu&rsquo;on lit sans y penser, « l&rsquo;appareil n&rsquo;est plus supporté ». Traduisons-la. Le processeur, l&rsquo;écran, les caméras, le modem, la batterie — tout cela marche encore. Ce qui s&rsquo;arrête, c&rsquo;est un service : quelqu&rsquo;un, quelque part, cesse de compiler du logiciel pour cette combinaison de puces. Le téléphone ne devient pas défectueux, il devient <strong>orphelin</strong>. Et comme le logiciel qu&rsquo;il exécute n&rsquo;est pas modifiable par son propriétaire, orphelin veut dire condamné.</p>
<p>Sauf que celui-ci était un Pixel. Et les Pixel ont une propriété rare : Google, contrairement à presque tous ses concurrents, autorise le propriétaire à <strong>déverrouiller le chargeur d&rsquo;amorçage</strong> — le petit programme qui décide quel système d&rsquo;exploitation a le droit de démarrer. Cette autorisation, sur laquelle je vais revenir, est ce qui sépare un appareil récupérable d&rsquo;une brique.</p>
<details>
<summary>Pour aller au fond : ce qu'un « bootloader » verrouille exactement</summary>
<p>Quand un téléphone s&rsquo;allume, un tout petit programme gravé dans la puce démarre en premier, vérifie une signature cryptographique sur le système qui vient ensuite, et refuse de continuer si elle ne correspond pas. C&rsquo;est le <em>démarrage vérifié</em> (<strong>verified boot</strong>), et c&rsquo;est une bonne chose : il empêche qu&rsquo;un logiciel malveillant remplace votre système à votre insu.</p>
<p>Le problème n&rsquo;est pas le mécanisme, c&rsquo;est <strong>qui détient la clé</strong>. Sur un appareil verrouillé, seul le fabricant peut signer un système. Le jour où il cesse d&rsquo;en produire, la serrure reste, mais plus personne n&rsquo;a la clé. La sécurité devient une condamnation.</p>
<p>Google laisse le propriétaire désactiver ce contrôle, avec un avertissement bien visible et un effacement complet des données au passage — ce qui est la bonne façon de faire, puisqu&rsquo;un voleur ne peut pas déverrouiller sans tout détruire. Les variantes vendues par certains opérateurs américains, elles, sont scellées définitivement. La différence n&rsquo;est pas technique : elle est commerciale. Sur le dos du mien, « G020F » signifie <em>Rest of World</em>, la version européenne. Vendue sans opérateur, donc déverrouillable.</p>
</details>
<h2 id="trois-facons-de-mettre-linux-sur-un-telephone-et-une-seule-qui-compte-ici">Trois façons de mettre Linux sur un téléphone, et une seule qui compte ici</h2>
<p>Un téléphone Android exécute déjà un noyau Linux. Mais un noyau Android, c&rsquo;est une version ancienne du noyau officiel, à laquelle le fabricant de la puce a ajouté des milliers de modifications qu&rsquo;il ne publie jamais en amont. Ce code ne vit que le temps du produit. C&rsquo;est là toute la différence entre les trois options qui s&rsquo;offraient :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th></th>
<th>postmarketOS</th>
<th>Ubuntu Touch</th>
<th>Droidian</th>
</tr>
</thead>
<tbody>
<tr>
<td>Base</td>
<td><strong>noyau Linux mainline</strong></td>
<td>pilotes Android figés (Halium)</td>
<td>pilotes Android figés</td>
</tr>
<tr>
<td>Sur le Pixel 3a</td>
<td>catégorie <em>community</em></td>
<td>version stable, très aboutie</td>
<td>fonctionnel</td>
</tr>
<tr>
<td>Appels, caméra, empreinte</td>
<td>partiels</td>
<td><strong>tout fonctionne</strong></td>
<td>partiels</td>
</tr>
<tr>
<td>Espérance de vie</td>
<td>celle du noyau Linux</td>
<td>celle des pilotes de 2019</td>
<td>idem</td>
</tr>
<tr>
<td>Corrigeable en amont</td>
<td><strong>oui</strong></td>
<td>non</td>
<td>non</td>
</tr>
</tbody>
</table></div>
<p>Ubuntu Touch est objectivement le meilleur choix pour <em>utiliser</em> ce téléphone : les appels, les SMS, la 4G, le Bluetooth, le NFC, les deux caméras, le lecteur d&rsquo;empreinte — tout marche. Mais il y parvient en réutilisant les pilotes binaires d&rsquo;Android 9. C&rsquo;est-à-dire en embaumant 2019. Rien de ce qu&rsquo;on y corrige ne profite à personne d&rsquo;autre, et le jour où cette base pourrira, il n&rsquo;y aura rien à faire.</p>
<p>postmarketOS prend le chemin inverse : faire tourner le <strong>noyau Linux officiel</strong>, celui que tout le monde utilise, sur cette puce. C&rsquo;est plus dur, il manque des choses, et c&rsquo;est précisément l&rsquo;intérêt — ce qui est écrit là remonte dans le noyau que le monde entier utilisera dans dix ans. Un groupe de développeurs s&rsquo;y consacre spécifiquement pour ce processeur, sous le nom <strong>sdm670-mainline</strong>.</p>
<p>Le choix était donc simple, à condition d&rsquo;assumer ce qu&rsquo;il implique : ce téléphone ne sera pas mon téléphone. C&rsquo;est un banc d&rsquo;essai.</p>
<h2 id="le-deverrouillage-et-le-piege-du-telephone-reinitialise">Le déverrouillage, et le piège du téléphone réinitialisé</h2>
<p>L&rsquo;appareil arrivait réinitialisé, ce qui semblait simplificateur. Ça ne l&rsquo;était pas.</p>
<p>Pour déverrouiller le chargeur d&rsquo;amorçage, il faut activer une option nommée <strong>Déverrouillage OEM</strong> dans les réglages Android. Or cette option reste grisée tant que le téléphone n&rsquo;a pas joint le réseau au moins une fois : Google vérifie que l&rsquo;appareil n&rsquo;est pas signalé volé. Il faut donc rallumer le téléphone, traverser l&rsquo;assistant de mise en route, connecter le Wi-Fi — puis seulement activer l&rsquo;option. Sur un appareil qu&rsquo;on s&rsquo;apprête entièrement à effacer, c&rsquo;est un détour absurde mais obligatoire.</p>
<p>Second piège, plus vicieux : la combinaison de touches pour entrer en mode <em>fastboot</em> — le mode de maintenance du bootloader — est <strong>Volume Bas + Power</strong>, mais <strong>uniquement depuis un téléphone complètement éteint</strong>. Sur un appareil allumé, cette même combinaison prend une capture d&rsquo;écran. On appuie, il ne se passe rien d&rsquo;attendu, on recommence, on doute de son matériel. Il faut éteindre, attendre deux secondes, maintenir Volume Bas <em>d&rsquo;abord</em>, puis appuyer sur Power.</p>
<p>Le reste tient en une commande, et un avertissement rouge sur l&rsquo;écran qu&rsquo;il faut confirmer avec les touches physiques :</p>
<pre><code>fastboot flashing unlock
</code></pre>
<p><img alt="L'écran du Pixel 3a en mode fastboot, fissuré, affichant les informations du bootloader : Product revision sargo MP1.0 (ROW), Secure boot PRODUCTION, et en rouge « Device state: unlocked »" src="https://pf.olibrio.fr/images/pixel3a/fastboot-unlocked.jpg" /></p>
<p><em>L&rsquo;écran de fastboot après l&rsquo;opération. « Device state: unlocked » en rouge : le téléphone accepte désormais de démarrer un système qui n&rsquo;est pas signé par Google. Notez « sargo MP1.0 (ROW) » — sargo est le nom de code du Pixel 3a, ROW confirme la variante internationale.</em></p>
<p>Le téléphone efface tout et redémarre. À partir de là, il n&rsquo;appartient plus vraiment à Google.</p>
<h2 id="preparer-le-systeme-une-demi-heure-de-questions">Préparer le système : une demi-heure de questions</h2>
<p>Côté ordinateur, postmarketOS se construit avec un outil nommé <code>pmbootstrap</code>, disponible dans les dépôts de la plupart des distributions. Il ne télécharge pas une image toute faite : il assemble le système pour votre appareil précis, dans un environnement isolé, en vous posant une vingtaine de questions.</p>
<p>La plupart appellent une réponse par défaut. Trois méritent réflexion, et j&rsquo;ai tranché les trois selon le même principe : <strong>coller à ce que les mainteneurs testent.</strong></p>
<p>C&rsquo;est un principe qui mérite d&rsquo;être explicité, parce qu&rsquo;il est contre-intuitif. Quand on installe un système pour soi, on choisit ce qu&rsquo;on préfère. Quand on l&rsquo;installe pour contribuer, chaque écart au choix majoritaire est une variable supplémentaire qui rendra vos rapports de bogue inexploitables. Si je remonte un problème audio sur une pile que personne d&rsquo;autre n&rsquo;utilise, le mainteneur ne peut ni le reproduire, ni le comparer. Mon rapport devient du bruit.</p>
<p>J&rsquo;ai donc pris <code>pulseaudio</code> plutôt que le plus moderne <code>pipewire</code>, <code>wpa_supplicant</code> plutôt qu&rsquo;<code>iwd</code>, l&rsquo;interface <strong>Phosh</strong> plutôt que la très tentante <code>sxmo</code>, et — à contrecœur — systemd. Sur ce dernier point, postmarketOS est un des rares endroits où OpenRC reste un citoyen de première classe ; mon réflexe n&rsquo;avait rien de marginal. Mais quatre des quinze bogues ouverts pour cet appareil sont rapportés sous Phosh avec systemd, et <code>journalctl</code> reste l&rsquo;outil le plus commode pour extraire une trace propre.</p>
<p>Deux réponses valent un avertissement.</p>
<p><strong>Ne pas activer le chiffrement du disque.</strong> L&rsquo;option est là, elle est tentante, et sur ce téléphone elle rend l&rsquo;appareil non démarrable : un bogue ouvert décrit un système qui ne détecte pas la saisie du mot de passe au démarrage. On se retrouve avec une machine qui demande une phrase secrète impossible à taper.</p>
<p><strong>Garder la locale en anglais.</strong> Contre-intuitif pour un billet en français, mais les messages d&rsquo;erreur et les journaux sortiront en anglais, donc directement collables dans un rapport et comparables à ceux des autres. Ça n&rsquo;empêche nullement d&rsquo;avoir un clavier AZERTY.</p>
<details>
<summary>Pour aller au fond : les réponses exactes, et les paquets à embarquer</summary>
<pre><code>Channel          edge          # là où les bogues sont rapportés et les correctifs atterrissent
Vendor           google
Device           sargo
UI               phosh
Audio backend    pulseaudio    # défaut
WiFi backend     wpa_supplicant # défaut
usb-moded        developer     # réseau USB TOUJOURS actif — le cordon de sécurité
Service manager  default       # systemd pour Phosh
Locale           en_US
</code></pre>
<p>Le choix <code>usb-moded: developer</code> mérite d&rsquo;être souligné : il maintient une interface réseau active sur le câble USB en permanence. Quand l&rsquo;écran ne répondra plus — et ça arrivera —, <code>ssh</code> par le câble sera le seul moyen d&rsquo;entrer récupérer les journaux. L&rsquo;autre option, <code>charging</code>, exigerait d&rsquo;activer le réseau à la main depuis un téléphone potentiellement inutilisable.</p>
<p>Pour les paquets supplémentaires, j&rsquo;ai embarqué de quoi travailler dès le premier démarrage :</p>
<pre><code>libcamera-tools,v4l-utils,evtest,tmux,vim,strace,usbutils
</code></pre>
<p><code>libcamera-tools</code> fournit la commande <code>cam</code>, qui est précisément l&rsquo;outil cité dans le bogue caméra que je voulais reproduire. <code>v4l-utils</code> fournit <code>v4l2-ctl</code>, l&rsquo;instrument de mesure du correctif visé. <code>evtest</code> sert aux bogues tactiles. <code>tmux</code> permet à une session SSH de survivre au débranchement du câble.</p>
<p>Une remarque de méthode : <strong>ne devinez pas les noms de paquets.</strong> Alpine, la distribution sur laquelle repose postmarketOS, ne les nomme pas toujours comme votre distribution habituelle. Un nom erroné fait échouer l&rsquo;installation après plusieurs minutes. L&rsquo;index est public et se vérifie en dix secondes :</p>
<pre><code class="language-bash">curl -s -o idx.tar.gz \
  &quot;https://dl-cdn.alpinelinux.org/alpine/edge/community/aarch64/APKINDEX.tar.gz&quot;
tar xzf idx.tar.gz -O APKINDEX | grep '^P:' | sed 's/^P://' &gt; paquets.txt
grep -qx &quot;libcamera-tools&quot; paquets.txt &amp;&amp; echo présent
</code></pre>
<p>C&rsquo;est comme ça que j&rsquo;ai découvert que <code>device-tree-compiler</code> s&rsquo;appelle <code>dtc</code> chez Alpine.</p>
<p><img alt="Beavis, l'air perplexe, articulant « WHAT? »" src="https://pf.olibrio.fr/images/pixel3a/dtc-what.gif" /></p>
<p><em>Oui. <code>dtc</code>. J&rsquo;ai relu deux fois avant de taper la commande.</em></p>
</details>
<p>Une trentaine de minutes plus tard, le système était construit. Restait à l&rsquo;écrire dans le téléphone. C&rsquo;est là que la soirée a dérapé.</p>
<h2 id="une-heure-a-accuser-le-mauvais-coupable">Une heure à accuser le mauvais coupable</h2>
<p>Le téléphone était en mode fastboot, branché, reconnu. La commande d&rsquo;écriture partait — et se figeait. Indéfiniment. <strong>Sans le moindre message d&rsquo;erreur</strong>, ni sur la sortie standard, ni sur la sortie d&rsquo;erreur. Un processus endormi, à l&rsquo;infini.</p>
<p>Ce qui rendait la chose déroutante, c&rsquo;est que l&rsquo;appareil semblait parfaitement présent :</p>
<pre><code>$ fastboot devices
058AY1WZGT     fastboot
</code></pre>
<p>Il répondait. Il était là. Et pourtant toute écriture se bloquait.</p>
<p>J&rsquo;ai formulé quatre hypothèses. Les quatre étaient fausses, et les écarter m&rsquo;a pris une heure. Elles valent d&rsquo;être listées, parce que ce sont exactement celles que n&rsquo;importe qui formulerait.</p>
<p><strong>Un problème de permissions.</strong> L&rsquo;hypothèse classique : le nœud USB appartient à <code>root</code>, l&rsquo;utilisateur n&rsquo;a pas le droit d&rsquo;écrire dessus. Vérification faite, le fichier portait une liste de contrôle d&rsquo;accès accordant explicitement l&rsquo;accès à mon compte. Écarté par la mesure, pas par la supposition.</p>
<p><strong>Un câble ou un port défectueux.</strong> C&rsquo;est le réflexe suivant, et le plus répandu sur les forums. Sauf que les journaux du noyau étaient d&rsquo;une propreté irréprochable : énumération en haute vitesse, aucune erreur, aucune réinitialisation, aucune déconnexion intempestive. Un câble abîmé laisse des traces ; il n&rsquo;y en avait aucune.</p>
<p><strong>Un problème de contrôleur USB.</strong> Piste sérieuse : les Pixel n&rsquo;ont qu&rsquo;de l&rsquo;USB 2.0, et les contrôleurs modernes sont réputés capricieux avec certains chargeurs d&rsquo;amorçage. Le conseil habituel est « branchez sur un port USB 2.0 ». Deux mesures l&rsquo;ont écarté : le téléphone négociait déjà en 480 mégabits, donc bien en USB 2.0, et la carte mère de la machine (une Raptor Lake d&rsquo;Intel) n&rsquo;a plus de contrôleur d&rsquo;ancienne génération — tout passe par le même bloc. « Changer pour un port USB 2.0 » n&rsquo;avait pas de sens.</p>
<p><strong>Une régression dans le logiciel.</strong> <code>pmbootstrap</code> exécute sa propre copie de <code>fastboot</code>, en version 37, tandis que mon système en avait une version 35. J&rsquo;ai donc contourné l&rsquo;outil pour flasher directement avec la version du système. <strong>Elle s&rsquo;est figée exactement pareil.</strong> Hypothèse morte.</p>
<p>Quatre pistes, quatre impasses. Et un détail qui aurait dû m&rsquo;alerter bien plus tôt : à chaque nouvelle entrée en mode fastboot, <strong>la première commande passait</strong> — en treize millisecondes — et toutes les suivantes se figeaient.</p>
<p>J&rsquo;avais ce fait sous les yeux depuis le début. J&rsquo;ai mis une heure à l&rsquo;écouter, parce que je continuais à interroger l&rsquo;appareil au lieu d&rsquo;interroger le système.</p>
<h2 id="la-reponse-tenait-dans-un-fichier">La réponse tenait dans un fichier</h2>
<p>Le mode fastboot est un dialogue : l&rsquo;ordinateur pose des questions, le bootloader répond. J&rsquo;ai fini par regarder non pas ce que répondait le téléphone, mais <strong>ce que le noyau Linux pensait de lui</strong>. Ces informations vivent dans <code>/sys</code>, un système de fichiers virtuel où le noyau expose son état interne sous forme de fichiers lisibles.</p>
<pre><code>$ cat /sys/bus/usb/devices/1-9/power/control
auto
$ cat /sys/bus/usb/devices/1-9/power/autosuspend_delay_ms
2000
$ cat /sys/bus/usb/devices/1-9/power/runtime_status
suspended
</code></pre>
<p><strong>Endormi.</strong></p>
<p>Pour économiser l&rsquo;énergie, le noyau met les périphériques USB en veille après un délai d&rsquo;inactivité — ici, deux secondes. C&rsquo;est un comportement normal et souhaitable pour la plupart des appareils, qui savent se réveiller quand on leur reparle. <strong>Le chargeur d&rsquo;amorçage du Pixel ne sait pas.</strong> Une fois endormi, il ne répond plus jamais.</p>
<p>Tout s&rsquo;explique d&rsquo;un coup :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Ce que j&rsquo;observais</th>
<th>Ce qui se passait</th>
</tr>
</thead>
<tbody>
<tr>
<td>La première commande passe, les suivantes se figent</td>
<td>Le téléphone s&rsquo;endort dans l&rsquo;intervalle</td>
</tr>
<tr>
<td><code>fastboot devices</code> liste l&rsquo;appareil quand même</td>
<td>L&rsquo;énumération est en cache, elle ne demande aucun échange</td>
</tr>
<tr>
<td>Le déverrouillage avait fonctionné</td>
<td>C&rsquo;était la première commande après une entrée en fastboot</td>
</tr>
<tr>
<td>Ressortir et rentrer en fastboot « réparait »</td>
<td>Une nouvelle énumération réveille l&rsquo;appareil, pour une commande</td>
</tr>
<tr>
<td>Les deux versions de <code>fastboot</code> échouaient pareil</td>
<td>Le binaire n&rsquo;y était pour rien</td>
</tr>
<tr>
<td>Les journaux du noyau restaient propres</td>
<td>La mise en veille n&rsquo;est pas une erreur, c&rsquo;est le fonctionnement normal</td>
</tr>
</tbody>
</table></div>
<p>La correction est une règle de trois lignes, qui demande au noyau de ne jamais endormir les appareils Google :</p>
<pre><code># /etc/udev/rules.d/52-fastboot-no-autosuspend.rules
ACTION==&quot;add&quot;, SUBSYSTEM==&quot;usb&quot;, ATTR{idVendor}==&quot;18d1&quot;, \
    TEST==&quot;power/control&quot;, ATTR{power/control}=&quot;on&quot;
</code></pre>
<p>Sauf que ça n&rsquo;a rien changé. Et la raison de cet échec est la partie la plus intéressante de l&rsquo;histoire.</p>
<h2 id="le-second-coupable-tapi-derriere-le-premier">Le second coupable, tapi derrière le premier</h2>
<p>Ma règle était pourtant correcte — l&rsquo;outil de diagnostic d&rsquo;udev confirmait qu&rsquo;elle était bien évaluée et bien appliquée. Mais après le branchement, le réglage retombait à <code>auto</code>.</p>
<p>Quelqu&rsquo;un repassait derrière moi. Ce quelqu&rsquo;un s&rsquo;appelait <strong>TLP</strong>, un gestionnaire d&rsquo;énergie très répandu sur les ordinateurs portables Linux, qui applique ses propres réglages d&rsquo;autosuspend USB <em>après</em> udev, et écrase donc silencieusement les vôtres. Beaucoup de gens l&rsquo;installent une fois pour gagner de l&rsquo;autonomie, puis l&rsquo;oublient complètement.</p>
<p>TLP a précisément une option prévue pour ce cas :</p>
<pre><code># /etc/tlp.conf
USB_EXCLUDE_PHONE=1
USB_DENYLIST=&quot;18d1:4ee0 18d1:4ee1 18d1:4ee2 18d1:4ee3 18d1:4ee7&quot;
</code></pre>
<p>Cette fois le réglage a tenu. Un détail à connaître : <strong>poser la correction ne débloque pas un appareil déjà endormi.</strong> L&rsquo;état USB du bootloader ne se répare qu&rsquo;à la ré-énumération. Il faut donc corriger, <em>puis</em> ressortir et rentrer en mode fastboot.</p>
<p>Et pour maximiser les chances, j&rsquo;ai groupé les trois écritures en une seule invocation, plutôt que trois processus successifs :</p>
<pre><code class="language-bash">fastboot flash vbmeta   vbmeta.img \
         flash boot     boot.img \
         flash userdata google-sargo.img
</code></pre>
<pre><code>Sending 'vbmeta_b' (4 KB)                   OKAY [  0.120s]
Writing 'vbmeta_b'                          OKAY [  0.071s]
Sending 'boot_b' (28008 KB)                 OKAY [  0.747s]
Writing 'boot_b'                            OKAY [  0.194s]
Sending sparse 'userdata' 1/9 (258751 KB)   OKAY [  6.306s]
...
Finished. Total time: 94.883s
</code></pre>
<p>Quatre-vingt-quinze secondes. Après une heure de blocage.</p>
<details>
<summary>Pour aller au fond : diagnostiquer un fastboot qui se fige</summary>
<p>Trois réflexes, dans cet ordre :</p>
<p><strong>1. Vérifier que l&rsquo;appareil est réellement là avant d&rsquo;interpréter quoi que ce soit.</strong> Un <code>&lt; waiting for any device &gt;</code> signifie souvent que le téléphone a simplement quitté le mode fastboot, pas qu&rsquo;il y a un problème d&rsquo;accès. J&rsquo;ai failli conclure à un problème de droits inversé sur un test dont l&rsquo;appareil était en réalité absent.</p>
<pre><code class="language-bash">lsusb | grep 18d1
</code></pre>
<p><strong>2. Regarder l&rsquo;état du noyau, pas seulement la sortie de la commande.</strong></p>
<pre><code class="language-bash">cat /sys/bus/usb/devices/&lt;port&gt;/power/runtime_status
</code></pre>
<p><strong>3. Inspecter le processus figé.</strong> Il dit s&rsquo;il a ouvert le périphérique — auquel cas il attend une réponse qui ne viendra pas — et dans quel environnement il tourne :</p>
<pre><code class="language-bash">sudo readlink /proc/&lt;pid&gt;/root        # tourne-t-il dans un chroot ?
sudo ls -l /proc/&lt;pid&gt;/fd | grep usb  # a-t-il ouvert le périphérique ?
</code></pre>
<p>Deux pièges de coquille rencontrés en chemin, qui m&rsquo;ont coûté du temps :</p>
<ul>
<li><code>rc=$?</code> après un tube capture le code du <strong>dernier maillon</strong>, jamais celui de <code>timeout</code>. Ma sonde de diagnostic affichait donc « OK » sur des commandes qui se figeaient. Rediriger vers des fichiers et tester directement, ou utiliser <code>set -o pipefail</code>.</li>
<li><code>pkill -f 'un motif'</code> tue le shell appelant quand le motif figure dans sa propre ligne de commande. Préférer une boucle sur <code>pgrep -x</code>.</li>
</ul>
</details>
<h2 id="ce-qui-a-demarre">Ce qui a démarré</h2>
<p>Vingt secondes après le redémarrage, la machine a vu apparaître une interface réseau. Le téléphone distribuait lui-même les adresses.</p>
<pre><code>$ ssh sam@172.16.42.1
$ uname -r
7.1.3-sdm670
$ df -h /
/dev/loop0p2   47.9G   2.2G   43.2G   5% /
</code></pre>
<p><strong>Noyau 7.1.3.</strong> Sur un téléphone dont le fabricant a cessé de s&rsquo;occuper en mai 2022, avec un noyau Android figé en 4.9. Le système de fichiers s&rsquo;était agrandi tout seul au premier démarrage pour occuper les 48 gigaoctets disponibles.</p>
<p><img alt="L'écran d'accueil de Phosh sur le Pixel 3a fissuré : « Welcome — Get to know the features of your Phone and Phosh »" src="https://pf.olibrio.fr/images/pixel3a/phosh-welcome.jpg" /></p>
<p><em>Premier démarrage. L&rsquo;écran est fissuré depuis longtemps ; l&rsquo;appareil, lui, vient de rajeunir de quatre ans.</em></p>
<p><img alt="Le panneau de réglages rapides de Phosh : Wi-Fi actif, Bluetooth actif, batterie 94 %, et une notification « USB Mode Selector — USB Developer mode »" src="https://pf.olibrio.fr/images/pixel3a/phosh-quicksettings.jpg" /></p>
<p><em>Le panneau de réglages rapides. Wi-Fi, Bluetooth, batterie à 94 %. Et dans les notifications, le sélecteur « USB Developer mode » — exactement le profil choisi à l&rsquo;installation, celui qui garde le réseau USB actif en permanence. L&rsquo;horloge affiche « jeudi 1er janvier, 4 h 12 » : l&rsquo;horloge matérielle n&rsquo;a pas encore été mise à l&rsquo;heure, personne ne lui a encore dit quel jour on était.</em></p>
<h2 id="la-camera-ou-comment-un-outil-bien-ecrit-vous-tend-le-travail">La caméra, ou comment un outil bien écrit vous tend le travail</h2>
<p>Restait à vérifier ce que je venais chercher. Sur postmarketOS, la gestion des caméras passe par <strong>libcamera</strong>, une bibliothèque libre qui remplace la pile propriétaire d&rsquo;Android. Un bogue connu signale que le pilote du capteur avant de ce téléphone est incomplet, et que la commande <code>cam -l</code> — qui liste les caméras — s&rsquo;en plaint.</p>
<p>Elle s&rsquo;en est plainte, en effet. Mais bien mieux que je ne l&rsquo;espérais :</p>
<pre><code>ERROR V4L2 'imx355 4-001a': Unable to get rectangle 2 on pad 0/0
ERROR V4L2 'imx355 4-001a': Unable to get rectangle 1 on pad 0/0
ERROR V4L2 'imx355 4-001a': Unable to get rectangle 0 on pad 0/0
 WARN  'imx355 4-001a': Failed to retrieve the sensor crop rectangle
 WARN  'imx355 4-001a': The sensor kernel driver needs to be fixed
 WARN  See Documentation/sensor_driver_requirements.rst
</code></pre>
<p>Il y a quelque chose de réjouissant dans un logiciel qui vous dit littéralement « le pilote noyau du capteur a besoin d&rsquo;être corrigé » et vous donne la référence du document qui explique comment. C&rsquo;est l&rsquo;opposé exact d&rsquo;<a href="https://pf.olibrio.fr/posts/erreur-4202-neato-obsolescence.html">une erreur 4202 sur un aspirateur</a>.</p>
<p>Concrètement : le pilote ne sait pas répondre quand on lui demande les dimensions réelles de sa matrice de pixels. libcamera invente alors des valeurs par défaut, et travaille sur une géométrie approximative.</p>
<p>Mais la sortie révélait aussi ceci, que je n&rsquo;attendais pas :</p>
<pre><code>WARN 'imx363': No static properties available — Please consider updating the database
WARN 'imx355': No static properties available
WARN IPASoft: Failed to create camera sensor helper for imx355 / imx363
</code></pre>
<p>Ce second problème n&rsquo;est pas dans le noyau. Ce sont deux tables de données, dans libcamera elle-même, où les capteurs du Pixel 3a manquent à l&rsquo;appel — alors que des dizaines d&rsquo;autres y figurent déjà et fournissent un modèle à recopier. Des données pures, aucune algorithmique.</p>
<p><strong>Mise à jour, quelques heures plus tard.</strong> En allant écrire ce correctif, j&rsquo;ai découvert que la moitié venait d&rsquo;être faite : le capteur avant, l&rsquo;<strong>imx355</strong>, a été ajouté en amont <em>après</em> la version 0.7.2 qu&rsquo;exécute ce téléphone. L&rsquo;avertissement ci-dessus est donc un artefact de version, pas un manque — une mise à jour suffira. Le capteur arrière, l&rsquo;<strong>imx363</strong>, reste absent de tout le dépôt, et son pilote n&rsquo;est même pas dans le noyau officiel : il a été écrit chez Intel, jamais remonté en amont, et postmarketOS le charge en module.</p>
<p>Et en comparant l&rsquo;entrée neuve de l&rsquo;imx355 avec ce que le pilote expose réellement sur l&rsquo;appareil, un détail cloche : elle associe « barres de couleur » à la valeur 1 et « couleur unie » à la valeur 2, quand le pilote fait exactement l&rsquo;inverse. Deux autres capteurs au menu identique, l&rsquo;imx258 et l&rsquo;imx471, sont correctement décrits juste à côté. Ça fait donc deux correctifs au lieu d&rsquo;un — et le plus simple est celui que personne n&rsquo;attendait.</p>
<p>Autrement dit : le premier correctif à écrire n&rsquo;est pas celui que je visais en arrivant. Il a fallu allumer le vrai matériel pour s&rsquo;en apercevoir. C&rsquo;est une leçon assez générale — on peut lire des rapports de bogue pendant des jours sans voir ce qu&rsquo;une machine allumée vous dit en trois secondes.</p>
<h2 id="pourquoi-ce-nest-pas-seulement-un-passe-temps">Pourquoi ce n&rsquo;est pas seulement un passe-temps</h2>
<p>Le matin même où ce téléphone a démarré, le compte <code>balade.nomade</code> publiait <a href="https://www.instagram.com/reel/Dc-vV23MGIi/">un reel</a> (<a href="https://pf.olibrio.fr/assets/pixel3a/refs/balade-nomade-reel-2026-09-07.md">copie locale de la légende et du fil de commentaires</a>) qui résume ce qui se joue en ce moment à Bruxelles. Il se termine par une question que je trouve bien posée :</p>
<blockquote>
<p>Es-tu prêt à scanner ta carte d&rsquo;identité pour utiliser Instagram ?</p>
</blockquote>
<p>Le ton est militant, alors j&rsquo;ai vérifié les trois points. Deux tiennent solidement, le troisième mérite une nuance — et le fil de commentaires en a ajouté un quatrième, plus pertinent que les trois autres pour ce billet.</p>
<p><strong>Chat Control.</strong> Exact. Le règlement européen dit CSAR reste bloqué en trilogue, et les négociations reprennent fin septembre 2026 sous présidence irlandaise du Conseil. Le 9 juillet 2026, le Parlement européen a voté à 314 voix contre 276 le retrait du dispositif — sans atteindre le seuil de 360 voix nécessaire pour bloquer la position du Conseil. La dérogation autorisant le scan « volontaire » des messages a donc été prolongée jusqu&rsquo;en 2028. L&rsquo;analyse côté client a été retirée de la dernière version du texte, mais le service juridique du Conseil lui-même, dans un avis du 10 juin 2026, estime que ce scan volontaire demeure une recherche généralisée dans les communications, incompatible avec l&rsquo;article 7 de la Charte des droits fondamentaux.</p>
<p><strong>La fin de l&rsquo;anonymat.</strong> Exact, avec une actualité que le reel ne mentionne pas : la loi française du 21 juillet 2026 interdisant les réseaux sociaux aux moins de quinze ans a été <strong>censurée le 14 août par le Conseil constitutionnel</strong> (décision n° 2026-911 DC), pour atteinte disproportionnée à la liberté d&rsquo;expression et à la vie privée. Elle n&rsquo;entrera donc pas en vigueur en l&rsquo;état. Mais le mouvement de fond continue ailleurs : la Commission européenne a annoncé le 15 avril 2026 que sa solution de vérification d&rsquo;âge était prête au déploiement, et le portefeuille d&rsquo;identité numérique européen doit arriver dans les États membres d&rsquo;ici la fin de l&rsquo;année.</p>
<p><strong>Les métadonnées.</strong> Là je nuance. L&rsquo;EDPB a bien adopté le 7 juillet 2026 de nouvelles lignes directrices sur l&rsquo;anonymisation, en consultation jusqu&rsquo;au 30 octobre, qui remplacent l&rsquo;avis de référence de 2014. Mais c&rsquo;est un travail de clarification technique, pas un coup de poing sur la table. Et la jurisprudence récente va plutôt dans l&rsquo;autre sens : la Cour de justice de l&rsquo;Union européenne, en septembre 2025, a retenu une approche <em>relative</em> — une même donnée pseudonymisée peut être anonyme pour qui n&rsquo;a aucun moyen de réidentifier, et personnelle pour un autre.</p>
<h3 id="le-quatrieme-point-celui-qui-parle-vraiment-de-ce-billet">Le quatrième point, celui qui parle vraiment de ce billet</h3>
<p>Dans les commentaires, quelqu&rsquo;un signale que Google change sa politique d&rsquo;installation d&rsquo;applications et s&rsquo;inquiète que cela « mette en péril GrapheneOS ». La réponse de l&rsquo;auteur corrige à juste titre la crainte, et les faits lui donnent raison.</p>
<p>Depuis août 2025, Google impose que <strong>toute application installée sur un appareil Android certifié provienne d&rsquo;un développeur vérifié</strong> — y compris quand on installe un fichier APK à la main, en dehors de toute boutique. Les premières restrictions visibles arrivent le <strong>30 septembre 2026</strong> au Brésil, en Indonésie, à Singapour et en Thaïlande, avant une extension mondiale en 2027. Installer l&rsquo;application d&rsquo;un développeur non vérifié passera par un parcours détourné avec un <strong>délai d&rsquo;attente obligatoire de vingt-quatre heures</strong>. Et pour être vérifié, un développeur doit ouvrir un compte, payer vingt-cinq dollars et fournir une <strong>pièce d&rsquo;identité officielle</strong>.</p>
<p>Relisez la question du reel, et remplacez l&rsquo;utilisateur par le développeur. C&rsquo;est le même geste : une pièce d&rsquo;identité comme condition d&rsquo;accès. D&rsquo;un côté pour lire, de l&rsquo;autre pour écrire.</p>
<p>Le commentateur se trompait pourtant sur un point, et c&rsquo;est celui qui compte. La contrainte porte sur les appareils <strong>certifiés</strong> — ceux qui embarquent les services Google sous licence. GrapheneOS ne les embarque pas : il est hors du périmètre. La restriction ne met donc pas en péril les systèmes dégooglisés, <strong>elle rend leur existence plus nécessaire</strong>.</p>
<h3 id="installer-son-propre-logiciel-ce-combat">Installer son propre logiciel, ce combat</h3>
<p>C&rsquo;est ce qui m&rsquo;exaspère le plus, et c&rsquo;est antérieur à toute cette actualité. Sur Android comme sur iOS, installer un logiciel qu&rsquo;on a compilé soi-même, ou récupéré sur un dépôt Git, est un parcours d&rsquo;obstacles.</p>
<p>Sur Android, il faut autoriser une source inconnue, passer trois avertissements, et bientôt fouiller les options développeur puis patienter vingt-quatre heures. Sur iOS c&rsquo;est pire : une application que vous compilez et signez avec un compte Apple gratuit <strong>cesse de fonctionner au bout de sept jours</strong> et doit être réinstallée depuis un ordinateur. Pour qu&rsquo;elle survive, il faut payer quatre-vingt-dix-neuf euros par an. Le règlement européen sur les marchés numériques a entrouvert la porte en 2024 — boutiques alternatives, distribution depuis son propre site — mais uniquement dans l&rsquo;Union, et sous conditions d&rsquo;Apple.</p>
<p>La justification est toujours la même : la sécurité. Elle mérite d&rsquo;être prise au sérieux, donc examinée.</p>
<p>Si l&rsquo;ouverture causait l&rsquo;insécurité, ça se verrait. Linux laisse installer n&rsquo;importe quoi depuis n&rsquo;importe où — un dépôt, une archive, du code compilé à la main — et ce n&rsquo;est pas un désastre sécuritaire : c&rsquo;est le système qui fait tourner l&rsquo;essentiel des serveurs de la planète, sous attaque permanente. Windows, à l&rsquo;inverse, a longtemps eu le modèle le plus permissif <strong>et</strong> la pire réputation. Si la théorie était bonne, Android et iOS seraient les systèmes les plus sûrs jamais conçus. On observe à peu près l&rsquo;inverse de ce qu&rsquo;elle prédit.</p>
<p>Ce qui protège n&rsquo;est donc pas la fermeture, c&rsquo;est <strong>une chaîne de confiance vérifiable</strong> : des dépôts signés, des mainteneurs identifiés, du code source que n&rsquo;importe qui peut relire, des constructions reproductibles. La sécurité vient de la transparence, pas de la permission. Et cette chaîne existe déjà sur Android : F-Droid distribue depuis des années des applications libres compilées à partir de sources publiques, sans péage ni pièce d&rsquo;identité.</p>
<p>Pendant ce temps, la boutique officielle laisse passer. En 2026, une famille de logiciels malveillants baptisée NoVoice a été trouvée dans plus de cinquante applications du Play Store, cumulant au moins 2,3 millions de téléchargements — avec accès root et survie à une réinitialisation d&rsquo;usine. L&rsquo;année précédente, la campagne SlopAds : 224 applications, 38 millions de téléchargements. Et Google a banni <strong>80 000 comptes développeurs en 2025</strong>, sous un régime qui exige déjà une vérification d&rsquo;identité pour publier sur le Play Store.</p>
<p>C&rsquo;est ce chiffre qui règle la discussion. La vérification des développeurs existe déjà là où elle est censée protéger, et il faut quand même bannir quatre-vingt mille comptes par an. L&rsquo;étendre à l&rsquo;installation manuelle n&rsquo;arrêtera pas les campagnes industrielles — elles passent par la grande porte, et c&rsquo;est documenté. Ça arrêtera le développeur isolé qui publie son code sur un dépôt Git.</p>
<p>Le risque, lui, est réel : quelqu&rsquo;un qui installe un fichier reçu par SMS se fait effectivement piéger. Mais ça plaide pour un avertissement clair, pas pour un droit d&rsquo;entrée. On protège quelqu&rsquo;un en lui disant ce qu&rsquo;il est en train de faire ; on ne le protège pas en faisant payer celui qui écrit.</p>
<p>Et il y a un critère qui tranche la question. Pour opérer une boutique alternative dans l&rsquo;Union européenne, Apple exige, à compter du <strong>1er octobre 2026</strong>, d&rsquo;être coté en bourse, ou financé par du capital-risque, ou d&rsquo;avoir passé un audit financier, ou de totaliser un million d&rsquo;installations annuelles. Aucun de ces critères ne mesure la sécurité de quoi que ce soit. Ce sont des critères de <strong>taille</strong>.</p>
<p>Je veux bien croire à la bonne foi sur le principe. J&rsquo;ai plus de mal quand la même entreprise verrouille la porte et tient la caisse.</p>
<h3 id="ce-que-ca-change-pour-un-vieux-telephone">Ce que ça change pour un vieux téléphone</h3>
<p>Le point commun de tout ça est technique, et c&rsquo;est lui qui relie cette actualité à un Pixel de 2019.</p>
<p>L&rsquo;analyse côté client, c&rsquo;est inspecter les messages <strong>sur l&rsquo;appareil, avant chiffrement</strong>. Un tel dispositif ne s&rsquo;implémente pas dans une application : il s&rsquo;implémente dans le système. C&rsquo;est le déplacement décisif. Tant que la garantie reposait sur le protocole, on pouvait l&rsquo;auditer de l&rsquo;extérieur. Dès qu&rsquo;elle repose sur l&rsquo;appareil, la seule question qui compte devient : <em>qui décide de ce que fait cet appareil ?</em></p>
<p>Sur un téléphone dont le système ne peut pas être remplacé, la réponse est : le fabricant. Et à travers lui, quiconque légifère sur le fabricant. Ce n&rsquo;est pas un scandale, c&rsquo;est une chaîne de décision parfaitement ordinaire — mais elle ne passe à aucun moment par le propriétaire.</p>
<p>Les deux échappatoires existantes — GrapheneOS, postmarketOS — reposent sur exactement la même chose : <strong>un bootloader qu&rsquo;on a le droit de déverrouiller</strong>. La même case à cocher dans les options développeur qui a ouvert cette soirée. Toute la voie de sortie pratique, pour Android, a tenu jusqu&rsquo;ici à la bonne volonté d&rsquo;un seul fabricant sur un seul réglage. GrapheneOS n&rsquo;est disponible que sur Pixel ; il faudra attendre les Motorola haut de gamme de 2027 pour que ce ne soit plus vrai.</p>
<p>Et il faut dire ce que ce billet ne démontre pas. <strong>postmarketOS sur un Pixel 3a n&rsquo;est pas une solution de vie privée.</strong> Le modem reste une boîte noire, un processeur autonome exécutant du logiciel propriétaire auquel le système n&rsquo;a pas accès. Cet appareil-ci n&rsquo;est pas utilisable au quotidien, je l&rsquo;ai dit dès le départ. Pour un usage réel, la réponse sérieuse est celle que le reel met en mot-clé : GrapheneOS.</p>
<p>Ce que démontre ce billet est plus modeste, et suffit : <strong>la capacité existe, elle est à la portée d&rsquo;une soirée, et elle s&rsquo;exerce.</strong> Une capacité qu&rsquo;on n&rsquo;exerce jamais finit par disparaître sans que personne ne s&rsquo;en aperçoive — pas par interdiction, simplement parce qu&rsquo;un jour plus aucun appareil ne la propose et que personne ne l&rsquo;aura réclamée.</p>
<h2 id="et-votre-telephone-a-vous">Et votre téléphone à vous ?</h2>
<p>C&rsquo;est la première question qu&rsquo;on m&rsquo;a posée, et elle est la bonne. Voici de quoi y répondre — les chiffres viennent du dépôt <code>pmaports</code> au 5 septembre 2026 et du site officiel d&rsquo;Ubuntu Touch, pas d&rsquo;une liste recopiée quelque part.</p>
<p>D&rsquo;abord un avertissement sur le vocabulaire. postmarketOS classe ses appareils en trois niveaux, et ils veulent dire quelque chose :</p>
<ul>
<li><strong><code>community</code></strong> — ça marche globalement, avec des manques identifiés. <strong>39 appareils</strong>, dont seulement quatorze téléphones.</li>
<li><strong><code>testing</code></strong> — de « ça démarre, en un sens » à « presque tout fonctionne ». <strong>149 appareils.</strong> C&rsquo;est là que se trouve la majorité du parc, et c&rsquo;est là qu&rsquo;il y a du travail.</li>
<li><strong><code>downstream</code></strong> — noyau Android d&rsquo;origine, fonctionnalités très limitées. <strong>20 appareils</strong>, déconseillés.</li>
</ul>
<p>Aucun appareil n&rsquo;est aujourd&rsquo;hui classé au-dessus de <code>community</code>. Ça situe honnêtement l&rsquo;état de l&rsquo;écosystème.</p>
<h3 id="les-quatorze-telephones-en-community">Les quatorze téléphones en <code>community</code></h3>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Année</th>
<th>Appareil</th>
</tr>
</thead>
<tbody>
<tr>
<td>2009</td>
<td>Nokia N900</td>
</tr>
<tr>
<td>2012</td>
<td>Samsung Galaxy S III</td>
</tr>
<tr>
<td>2014</td>
<td>Samsung Galaxy Core Prime VE LTE</td>
</tr>
<tr>
<td>2018</td>
<td>OnePlus 6 · OnePlus 6T · Samsung Galaxy S9 · Xiaomi Poco F1</td>
</tr>
<tr>
<td>2019</td>
<td><strong>Google Pixel 3a</strong> · Pixel 3a XL · Purism Librem 5</td>
</tr>
<tr>
<td>2020</td>
<td>SHIFT6mq</td>
</tr>
<tr>
<td>2021</td>
<td><strong>Fairphone 4</strong> · PinePhone Pro</td>
</tr>
</tbody>
</table></div>
<p>Deux surprises dans cette liste. Le <strong>Xiaomi Poco F1</strong> et les <strong>OnePlus 6 / 6T</strong> sont d&rsquo;excellents candidats : puissants pour leur âge, très répandus d&rsquo;occasion, et portés depuis longtemps. Et le <strong>PinePhone d&rsquo;origine</strong>, pourtant conçu pour Linux, est en <code>testing</code> — c&rsquo;est son successeur Pro qui est en <code>community</code>.</p>
<p>Le reste de la catégorie n&rsquo;est pas fait de téléphones : une douzaine de <strong>Chromebooks</strong> ARM, le Lenovo ThinkPad X13s, la PineNote, l&rsquo;Odroid XU4, le RockPro64. Si vous cherchez un petit ordinateur ARM sous Linux plutôt qu&rsquo;un téléphone, c&rsquo;est une piste largement sous-estimée.</p>
<p>Côté <code>testing</code>, les 149 appareils se répartissent surtout entre <strong>Samsung</strong> (30), <strong>Xiaomi</strong> (18), <strong>Sony</strong>, <strong>OnePlus</strong>, <strong>LG</strong> et <strong>Google</strong> (5 chacun), et <strong>Fairphone</strong> (4). Il y a donc de fortes chances que votre téléphone y figure — avec du travail à faire dessus, ce qui est précisément l&rsquo;intérêt.</p>
<h3 id="si-vous-voulez-un-telephone-qui-marche-pas-un-banc-dessai">Si vous voulez un téléphone qui marche, pas un banc d&rsquo;essai</h3>
<p>C&rsquo;est un autre besoin, et il a d&rsquo;autres réponses. <strong>Ubuntu Touch</strong> annonce <strong>111 appareils</strong> pris en charge, avec un taux de fonctionnalités par appareil. Les mieux servis :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Appareil</th>
<th>Fonctionnel</th>
</tr>
</thead>
<tbody>
<tr>
<td>Lenovo Tab M10 HD 2ᵉ gén. (WiFi)</td>
<td>100 %</td>
</tr>
<tr>
<td>BQ Aquaris M10 HD / FHD</td>
<td>98,7 %</td>
</tr>
<tr>
<td><strong>Fairphone 5</strong> (2023)</td>
<td>97,4 %</td>
</tr>
<tr>
<td>Xiaomi Redmi Note 9 Pro · Poco X3 NFC</td>
<td>97,4 %</td>
</tr>
<tr>
<td>OnePlus Nord N10 5G · Nord N100</td>
<td>97,4 %</td>
</tr>
<tr>
<td><strong>Fairphone 4</strong> · Pixel 3a / 3a XL</td>
<td>97,3 %</td>
</tr>
<tr>
<td><strong>Nothing Phone (1)</strong> (2022)</td>
<td>95,6 %</td>
</tr>
<tr>
<td>Fairphone 3 / 3+</td>
<td>95,6 %</td>
</tr>
</tbody>
</table></div>
<p>Le <strong>Fairphone 4</strong> est le point d&rsquo;équilibre de tout ça : il est à la fois en <code>community</code> chez postmarketOS <strong>et</strong> à 97,3 % chez Ubuntu Touch, et c&rsquo;est par ailleurs le téléphone le plus réparable du marché. Si quelqu&rsquo;un me demandait quoi acheter pour faire ça sérieusement, ce serait lui — ou le Fairphone 5 si l&rsquo;objectif est d&rsquo;abord de s&rsquo;en servir.</p>
<p>Et si vous voulez rester sur Android tout en sortant de chez Google, <strong>GrapheneOS</strong> reste la réponse la plus solide — mais uniquement sur Pixel 6 et suivants, avec sept ans de mises à jour garanties sur les Pixel 8, 9 et 10. Le partenariat annoncé en août 2026 avec Motorola devrait lever cette exclusivité en 2027 ; la liste officielle, elle, est encore exclusivement Pixel aujourd&rsquo;hui.</p>
<h3 id="comment-verifier-pour-le-votre">Comment vérifier pour le vôtre</h3>
<p>Cherchez le nom de code de votre appareil — pas son nom commercial — sur le wiki de postmarketOS et sur <code>devices.ubuntu-touch.io</code>. Le nom de code se lit en une commande, l&rsquo;appareil branché en USB :</p>
<pre><code class="language-bash">adb shell getprop ro.product.device
</code></pre>
<p>Sur le mien, ça répond <code>sargo</code>. Et deux conditions préalables valent pour tout le monde, indépendamment de la liste : <strong>le bootloader doit être déverrouillable</strong>, ce qui exclut la plupart des appareils vendus par les opérateurs américains ; et l&rsquo;opération <strong>efface tout</strong>.</p>
<h2 id="ce-que-je-retiens">Ce que je retiens</h2>
<p>La partie technique est presque anecdotique. Trois choses me restent.</p>
<p><strong>Le piège n&rsquo;est nulle part.</strong> L&rsquo;autosuspend USB n&rsquo;est mentionné dans aucun guide d&rsquo;installation. Quelqu&rsquo;un qui le rencontre voit une commande qui se fige sans message, essaie un autre câble, un autre port, et conclut que son matériel est en cause. Il renonce. Le correctif fait deux lignes et vaut pour tous les Pixel. C&rsquo;est ce que je vais écrire en premier — avant tout code, avant la caméra. Une soirée perdue par moi peut en épargner beaucoup à d&rsquo;autres, et c&rsquo;est probablement la contribution la plus rentable de toute l&rsquo;histoire.</p>
<p><strong>J&rsquo;ai cherché au mauvais endroit pendant une heure.</strong> Non par manque de méthode, mais parce que je continuais à interroger l&rsquo;appareil — retenter la commande, changer un paramètre, réessayer — au lieu d&rsquo;interroger le système qui pilotait l&rsquo;appareil. La réponse était dans un fichier texte de neuf caractères. Chaque fois qu&rsquo;un outil se tait au lieu d&rsquo;échouer, il faut arrêter de le relancer et aller lire l&rsquo;état de la couche d&rsquo;en dessous.</p>
<p><strong>Et puis il y a le fond.</strong> Ce téléphone porte gravée au dos une poubelle barrée, ce pictogramme qui signifie qu&rsquo;on ne le jette pas avec les ordures. Le symbole est là depuis 2019, obligatoire, décoratif. Ce soir il est devenu exact : l&rsquo;appareil n&rsquo;est pas allé à la benne, il tourne, et il tourne sur un noyau plus récent que celui de bien des machines en service.</p>
<p>Ce n&rsquo;est pas un exploit technique — des gens autrement compétents ont fait le travail difficile, celui de porter un noyau moderne sur cette puce. Je n&rsquo;ai fait que suivre leurs traces et me cogner à un piège qu&rsquo;ils n&rsquo;avaient pas documenté. Mais c&rsquo;est une démonstration : la fin de support n&rsquo;est pas une propriété du matériel. C&rsquo;est une décision. Et quand le fabricant laisse la porte ouverte — comme Google le fait sur les Pixel, à son honneur —, cette décision peut être reprise par quelqu&rsquo;un d&rsquo;autre.</p>
<p>Un Pixel 3a d&rsquo;occasion se trouve pour quelques dizaines d&rsquo;euros. Il y en a des millions dans des tiroirs.</p>
<p>La suite, c&rsquo;est la caméra.</p>]]></content:encoded>
    </item>
    <item>
      <title>Six ans de prints décevants : ce que ma delta FLSun QQ-S avait vraiment, et comment on l&#x27;a calibrée pour de bon</title>
      <link>https://pf.olibrio.fr/posts/flsun-qqs-delta-klipper-calibration.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/flsun-qqs-delta-klipper-calibration.html</guid>
      <pubDate>Sun, 06 Sep 2026 12:00:00 +0000</pubDate>
      <description>Une imprimante delta FLSun QQ-S de 2020, « toujours un peu décevante » face à une Bambu Lab. Passage à Klipper, et enquête : un extrudeur qui sous-extrudait de 11,5 % depuis le premier jour, des angles de tours jamais calibrés, un courant moteur que la config Klipper officielle ne règle pas, une méthode de nivellement qui mentait. Récit, chiffres, outils et procédure complète pour reproduire — sans palpeur, au papier.</description>
      <category>impression 3d</category>
      <category>delta</category>
      <category>flsun qq-s</category>
      <category>klipper</category>
      <category>calibration</category>
      <category>bed mesh</category>
      <category>pressure advance</category>
      <category>mks robin mini</category>
      <category>repetier</category>
      <category>diy</category>
      <category>ia</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/flsun/og-flsun.jpg" alt="Six ans de prints décevants : ce que ma delta FLSun QQ-S avait vraiment, et comment on l&#x27;a calibrée pour de bon"></p>
<div class="tldr">
<p><strong>En deux minutes, si vous avez une delta qui « imprime moyen » sans qu&rsquo;aucun réglage n&rsquo;y change rien</strong></p>
<ul>
<li><strong>Le symptôme</strong> : une FLSun QQ-S achetée en 2020, 233 heures et 970 m de filament, jamais vraiment satisfaisante. Des parois faibles, des cotes fausses de 2 %, une première couche impossible à régler partout à la fois. Comparée à une Bambu Lab, elle faisait pitié.</li>
<li><strong>Ce qu&rsquo;on a trouvé, dans l&rsquo;ordre</strong> : un extrudeur qui poussait <strong>11,5 % de matière en moins</strong> depuis le premier jour (une valeur fausse dans la mémoire du firmware) ; des <strong>angles de tours jamais calibrés</strong> (+1,02° et +0,45°, toutes les corrections à zéro dans l&rsquo;EEPROM) ; et, en passant à Klipper, un <strong>courant moteur que la carte règle par PWM</strong> et que la config Klipper officielle de cette imprimante ne règle pas — moteurs sans couple, homing impossible.</li>
<li><strong>Ce qui a marché</strong> : tout recalibrer <strong>à chaud</strong>, dans l&rsquo;état où la machine imprime, avec <strong>une seule méthode de mesure</strong> (la feuille de papier), dans l&rsquo;ordre géométrie → zéro → grille du plateau → première couche. Trente-cinq minutes. Une spirale de contrôle uniforme d&rsquo;un bord à l&rsquo;autre, un cube à 20,00 mm en Z.</li>
<li><strong>Ce qui n&rsquo;a pas marché</strong>, et qui a coûté deux jours : corriger la grille du plateau par-dessus une géométrie fausse, avec une méthode de mesure au micromètre qui se trompait précisément là où la buse était trop près. Le détail est dans <a href="#fausse-piste">La fausse piste</a>, parce que c&rsquo;est le plus instructif.</li>
<li><strong>Pour reproduire</strong> : <a href="#pour-reproduire">la procédure complète</a>, les fichiers de configuration, les scripts et les pièces de test sont <a href="#references">en fin de billet</a>. Pas de palpeur, pas d&rsquo;accéléromètre, une feuille de papier et un pied à coulisse.</li>
</ul>
<p><em>Ce billet se veut lisible sans rien connaître aux imprimantes delta : chaque terme est expliqué la première fois, et un glossaire récapitule à la fin. Les encarts « Pour aller au fond » se déplient pour ceux qui veulent la cinématique, les valeurs et les commandes.</em></p>
</div>
<p><img alt="Établi de calibration de la FLSun QQ-S : pied à coulisse, micromètre en pouces, cube de 20 mm, cadres de première couche et carrés d'épaisseur numérotés" src="https://pf.olibrio.fr/images/flsun/00-etabli.jpg" /></p>
<p><em>L&rsquo;établi le troisième jour. Tout ce qui a servi de juge : le pied à coulisse, un vieux micromètre en pouces, le cube de 20 mm, les cadres de première couche, les carrés d&rsquo;épaisseur numérotés au feutre, et derrière, la pièce à sept piliers de la calibration étendue.</em></p>
<h2 id="une-machine-toujours-un-peu-decevante">Une machine « toujours un peu décevante »</h2>
<p>J&rsquo;ai une imprimante delta FLSun QQ-S, achetée en janvier 2020. Une <strong>delta</strong>, c&rsquo;est cette imprimante en forme de tour triangulaire où la buse est suspendue à trois bras articulés qui montent et descendent le long de trois colonnes ; il n&rsquo;y a pas d&rsquo;axe X, Y et Z séparés comme sur une imprimante cartésienne, la position de la buse est le résultat d&rsquo;un calcul à partir de la hauteur des trois chariots. C&rsquo;est rapide, silencieux, élégant, et beaucoup plus sensible aux erreurs de géométrie qu&rsquo;une machine à axes droits : un bras d&rsquo;un millimètre trop long ou une colonne décalée d&rsquo;un degré ne donnent pas une erreur simple, mais une déformation en creux, en dôme ou en trèfle qui varie sur tout le plateau.</p>
<p>Peu utilisée, cette machine a toujours été un peu décevante. Pas catastrophique : les pièces sortaient. Mais les parois manquaient de tenue, les cotes étaient fausses de quelques dixièmes, la première couche n&rsquo;accrochait jamais partout, et surtout <strong>aucun réglage n&rsquo;avait d&rsquo;effet net</strong>. J&rsquo;avais fini par imprimer avec une buse plus grosse « pour que ça aille plus vite », changé les courroies après en avoir détruit un jeu par sur-tension, et rangé la machine à côté d&rsquo;une Bambu Lab qui, elle, imprime juste sans qu&rsquo;on lui demande rien.</p>
<p>C&rsquo;est cette comparaison qui a lancé l&rsquo;enquête. Non pas « comment régler mon slicer », mais <strong>qu&rsquo;est-ce que cette machine a, exactement</strong>, et qu&rsquo;est-ce qui est rattrapable. Le billet raconte trois jours, du 4 au 6 septembre 2026, menés avec une IA (Claude) qui pilote l&rsquo;imprimante, écrit les outils et lit les manuels, pendant que je tiens le pied à coulisse, la feuille de papier et l&rsquo;appareil photo. Il raconte aussi une belle erreur de méthode, la sienne et la mienne, parce que c&rsquo;est ce qui arrive quand on cherche pour de vrai.</p>
<h2 id="le-dispositif">Le dispositif</h2>
<p>Le firmware d&rsquo;origine allait être remplacé par <strong>Klipper</strong>. Klipper est un firmware d&rsquo;imprimante 3D en deux parties : un tout petit programme sur la carte de l&rsquo;imprimante, qui ne fait que piloter les moteurs et les chauffes en temps réel, et un programme hôte, sur un ordinateur à côté, qui fait tout le reste — la cinématique, les calibrations, les macros. On perd l&rsquo;écran tactile de l&rsquo;imprimante (Klipper ne sait pas le piloter), on gagne des outils de calibration qui n&rsquo;existent nulle part ailleurs, en particulier pour les deltas.</p>
<p>Ce que Klipper apporte, concrètement, par rapport au Repetier d&rsquo;origine — ou à un Marlin :</p>
<ul>
<li><strong>Le calcul déporté.</strong> Un firmware classique fait toute la cinématique delta sur le petit microcontrôleur de la carte, avec les approximations que ça impose ; Klipper la fait sur l&rsquo;ordinateur hôte, en virgule flottante, et n&rsquo;envoie à la carte que des instants de pas précalculés. Sur une delta, où chaque déplacement est une racine carrée par colonne, ça se voit dans la précision des mouvements et la vitesse possible.</li>
<li><strong>Les outils de calibration</strong> : <code>DELTA_CALIBRATE</code>, qui déduit la géométrie complète de sept points, avec ou sans palpeur ; la calibration étendue des bras ; la grille de plateau ; et <code>TUNING_TOWER</code>, qui fait varier un paramètre avec la hauteur pendant l&rsquo;impression, pour régler en une pièce ce qui demanderait dix essais.</li>
<li><strong>Le pressure advance et l&rsquo;input shaper</strong>, la compensation de la pression dans le bowden et celle des vibrations, que le firmware d&rsquo;origine n&rsquo;a pas, et qui font l&rsquo;essentiel de l&rsquo;écart de qualité avec une machine moderne.</li>
<li><strong>Une configuration en fichier texte</strong>, lisible, commentable, versionnable, où chaque valeur a sa provenance ; et une prise locale par laquelle on pilote tout depuis un script.</li>
</ul>
<p>Ce qu&rsquo;il n&rsquo;apporte pas : il ne relève pas le plafond de débit du hotend, il ne remplace pas une mécanique fausse, et il demande un ordinateur à côté.</p>
<p>L&rsquo;hôte, provisoirement, c&rsquo;est mon ordinateur portable branché en USB ; un Raspberry Pi prendra le relais. Pas d&rsquo;interface web pour l&rsquo;instant : Klipper expose une prise locale sur laquelle on envoie des commandes, et l&rsquo;IA a écrit en une heure ce qu&rsquo;il fallait pour ne pas taper de G-code à la main : un client pour envoyer une commande et lire la réponse, un script de suivi d&rsquo;impression, et surtout <code>calib.py</code>, un pilotage au clavier où une touche vaut un geste — <code>h</code> pour le homing, <code>s</code> pour lancer la calibration delta, <code>m</code> pour la grille du plateau, <code>d</code>/<code>u</code> pour descendre ou monter la buse de 0,1 mm, <code>[</code>/<code>]</code> pour ajuster la première couche pendant qu&rsquo;elle s&rsquo;imprime.</p>
<p>Le parti pris, dès le départ, est le même que sur la Bambu : <strong>on mesure, on n&rsquo;invente pas</strong>. Chaque valeur inscrite dans la configuration vient d&rsquo;une mesure sur la machine, et chaque correction est suivie d&rsquo;une pièce de contrôle.</p>
<details>
<summary>Pour aller au fond : ce que fait un firmware delta, et ce que chaque réglage corrige</summary>
<p>Sur une delta, la position de la buse est calculée à partir de sept nombres et demi : la <strong>longueur des bras</strong> (<code>arm_length</code>), le <strong>rayon delta</strong> (<code>delta_radius</code>, la distance horizontale entre l&rsquo;axe d&rsquo;une colonne et le pivot du bras sur le chariot, moins celle côté effecteur), l&rsquo;<strong>angle</strong> de chaque colonne (nominalement 210°, 330° et 90°), et la <strong>hauteur de butée</strong> de chaque colonne (<code>position_endstop</code>, là où le chariot déclenche son interrupteur de fin de course). Quand l&rsquo;un est faux, l&rsquo;erreur sur le plateau a une forme reconnaissable :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Réglage faux</th>
<th>Forme de l&rsquo;erreur sur le plateau</th>
</tr>
</thead>
<tbody>
<tr>
<td>hauteur d&rsquo;une butée</td>
<td>un <strong>plan incliné</strong> vers la colonne concernée</td>
</tr>
<tr>
<td>rayon delta</td>
<td>un <strong>creux</strong> ou un <strong>dôme</strong> centré, symétrique</td>
</tr>
<tr>
<td>longueur des bras</td>
<td>un creux/dôme aussi, plus une <strong>erreur d&rsquo;échelle</strong> en XY (les pièces trop grandes ou trop petites)</td>
</tr>
<tr>
<td>angle d&rsquo;une colonne</td>
<td>une distorsion en <strong>trèfle</strong>, à trois lobes, et des pièces vrillées</td>
</tr>
</tbody>
</table></div>
<p>Klipper les mesure tous avec <code>DELTA_CALIBRATE</code> : on pose la buse sur sept points du plateau (avec un palpeur, ou au papier), et il ajuste les paramètres pour que ces sept points soient dans un plan. La version <strong>étendue</strong> (<code>DELTA_ANALYZE</code>) ajoute les mesures d&rsquo;une pièce imprimée pour ajuster les bras un par un. Par-dessus cette géométrie, la <strong>bed mesh</strong> (grille du plateau) corrige ce qui reste — les défauts de planéité du verre lui-même — en interpolant entre des points mesurés. L&rsquo;ordre compte : la grille ne peut corriger proprement que ce qui est <em>local</em> ; une erreur de géométrie n&rsquo;est pas locale, et une grille qui essaie de la compenser n&rsquo;y arrive jamais tout à fait. C&rsquo;est le cœur de ce billet.</p>
</details>
<h2 id="dabord-la-mecanique-les-courroies">D&rsquo;abord la mécanique : les courroies</h2>
<p>Avant de toucher au firmware, un audit rapide de ce qui bouge. Les courroies, sur cette machine, ont une histoire : un premier jeu détruit par sur-tension (« j&rsquo;avais lu qu&rsquo;il ne fallait jamais les tendre, et c&rsquo;est ce qui m&rsquo;est arrivé »), à l&rsquo;époque où « aucun réglage n&rsquo;avait d&rsquo;effet ». Cette phrase-là, avec le recul, était la signature d&rsquo;un problème mécanique et non de slicer, et c&rsquo;est ce qui justifie de commencer par là.</p>
<p>L&rsquo;IA a d&rsquo;abord proposé la méthode qu&rsquo;on lit partout : pincer la courroie, mesurer la note avec une application de guitare, viser une fréquence. Trois tours d&rsquo;échanges plus tard, j&rsquo;ai tranché : « <em>c&rsquo;est pas une corde, si je tends assez pour que ça sonne ça cassera tout</em> ». Elle a vérifié, et j&rsquo;avais raison : sur cette machine le brin libre fait 65 cm, la fréquence cible serait sous 30 Hz, là où les applications décrochent d&rsquo;une octave (je lisais 70 Hz sans jamais retomber sur la même valeur). Surtout, un article de Hackaday rappelle que la qualité d&rsquo;impression ne change quasiment pas avec des courroies franchement lâches, tant que l&rsquo;axe ne prend pas de retard sur le moteur ; alors que trop tendre casse des arbres de moteur (un NEMA 17 accepte 28 N de charge radiale). Il n&rsquo;y a pas de compromis à chercher : <strong>aucun bénéfice à serrer, un risque à serrer.</strong></p>
<p>La méthode retenue est celle que j&rsquo;utilise depuis des années : détendre franchement, puis retendre juste au seuil où la courroie se met à vibrer mollement au lieu de flotter. On approche par en dessous, donc la sur-tension est impossible ; le seuil est exactement la limite basse du sans-jeu ; le même geste sur les trois colonnes égalise par construction. Les six poulies tournaient librement. Audit clos. <em>On verra plus loin que cette retension, faite au mauvais moment, a quand même coûté cher.</em></p>
<h2 id="ce-que-la-machine-avait-dans-le-ventre">Ce que la machine avait dans le ventre</h2>
<p>Avant de flasher, il fallait lire la mémoire du firmware d&rsquo;origine : les valeurs qu&rsquo;il utilisait sont le point de départ de la configuration Klipper, et une fois flashé, on ne peut plus les lire. Première surprise, en branchant l&rsquo;USB : <strong>ce n&rsquo;est pas Marlin</strong>. Tout ce qu&rsquo;on lit sur la QQ-S suppose Marlin, et l&rsquo;IA avait préparé les commandes Marlin (<code>M503</code> pour lire la configuration, <code>M665</code>/<code>M666</code> pour la géométrie delta). Réponse de la machine : <code>Unknown command</code>. Le firmware s&rsquo;annonce <code>FIRMWARE_NAME:Robin</code> et c&rsquo;est <strong>Repetier</strong>, qui dumpe sa mémoire avec <code>M205</code>. Première leçon, pas la dernière : vérifier avant d&rsquo;affirmer.</p>
<p>Le dump, 970 m de filament et 233 heures de machine, a livré deux choses.</p>
<p>D&rsquo;abord les valeurs réelles : bras 278,6 mm (la config Klipper de référence dit 280), rayon delta <strong>140,8</strong> (la référence dit 130 — dix millimètres d&rsquo;écart, de quoi faire un dôme monstrueux si on avait pris la référence), hauteur 376,03, pas de moteur 100 pas/mm sur les colonnes et <strong>367 pas/mm sur l&rsquo;extrudeur</strong> (retenez ce chiffre).</p>
<p>Ensuite, un constat qui expliquait déjà beaucoup : <strong>tous les termes de correction par colonne étaient à zéro</strong>. Rayon delta A/B/C, correction de diagonale A/B/C, tout à zéro. Cette machine n&rsquo;avait <strong>jamais</strong> été finement calibrée en delta — ou l&rsquo;avait été en usine et l&rsquo;avait perdu lors d&rsquo;une mise à jour du firmware, qui réinitialise l&rsquo;EEPROM : c&rsquo;est mon hypothèse, et l&rsquo;EEPROM ne garde pas d&rsquo;historique pour la trancher. Dans les deux cas, ses erreurs de géométrie, quelles qu&rsquo;elles soient, étaient intactes depuis des années, et les pas de l&rsquo;extrudeur venaient probablement du même reset.</p>
<details>
<summary>Pour aller au fond : lire l'EEPROM d'un Repetier, et ce qu'on transpose vers Klipper</summary>
<p><code>M205</code> renvoie une ligne par valeur, au format <code>EPR:&lt;type&gt; &lt;position&gt; &lt;valeur&gt; &lt;libellé&gt;</code>. Le firmware répond <code>ok</code> <strong>avant</strong> la réponse, et non après : un script qui lit « jusqu&rsquo;au ok » rate tout ; il faut lire jusqu&rsquo;au silence. Ce qui se transpose vers Klipper : <code>Diagonal rod length</code> → <code>arm_length</code>, <code>Horizontal rod radius at 0,0</code> → <code>delta_radius</code>, <code>Z max length</code> → <code>position_endstop</code> des trois colonnes, <code>Max printable radius</code> → <code>print_radius</code>, et les pas/mm → <code>rotation_distance</code> (pour une courroie GT2 sur poulie de 16 dents, 32 mm par tour ; pour l&rsquo;extrudeur, <code>rotation_distance = pas_par_tour / pas_par_mm</code>, soit 3200 / 367 = 8,719). Les PID ne se transposent pas (échelles différentes), on les refait. Les décalages de butée par colonne (X 0, Y 7, Z 83 pas dans l&rsquo;EEPROM) n&rsquo;ont pas été reportés : la convention de signe de Repetier n&rsquo;est pas sûre, et <code>DELTA_CALIBRATE</code> les redérive de toute façon.</p>
<p>Le dump complet est dans les fichiers en fin de billet (<code>README-flsun.md</code> renvoie vers <code>eeprom-repetier.txt</code> du dépôt).</p>
</details>
<h2 id="klipper-et-des-moteurs-qui-nont-plus-de-force">Klipper, et des moteurs qui n&rsquo;ont plus de force</h2>
<p>Le flash lui-même est sans histoire : Klipper compilé pour le STM32F103 de la carte <strong>MKS Robin Mini</strong>, avec un bootloader de 28 Ko, un quartz de 8 MHz et le port série USART3 ; le binaire passé par le petit script <code>update_mks_robin.py</code> de Klipper qui le brouille au format que le bootloader MKS attend ; copié sur une carte SD de 4 Go en FAT32, imprimante éteinte à l&rsquo;insertion. Un bip, « complete » en vert, et Klipper répond <code>Klipper state: Ready</code>.</p>
<p>Et puis le premier homing a échoué. <code>No trigger on stepper_b after full movement</code> : un chariot n&rsquo;a pas atteint son interrupteur. Le deuxième homing aussi, sur une autre colonne. Les moteurs grognaient, montaient à 5 mm/s, décrochaient à 25, et redescendaient « mollement ».</p>
<p>La suite tient en une leçon plutôt qu&rsquo;en un récit. L&rsquo;IA a enchaîné les hypothèses — durée des impulsions de pas, mode de micro-pas, courroies, un potentiomètre de courant qui n&rsquo;existe pas sur cette carte —, chacune testée, chacune écartée, et chaque test allongeait la conversation sans y ajouter d&rsquo;information. C&rsquo;est un comportement à connaître quand on travaille avec une IA : plus sa fenêtre de contexte se remplit d&rsquo;essais ratés, plus elle glisse vers l&rsquo;essai suivant au lieu de revenir aux faits. Ce qui l&rsquo;a arrêtée tient en une phrase, une contrainte forte : « avant le flash, tout marchait parfaitement ». La veille, sous Repetier, la même mécanique fonctionnait ; le matériel était hors de cause par construction, et la seule question valable devenait : <em>qu&rsquo;est-ce que l&rsquo;ancien firmware faisait que le nouveau ne fait pas ?</em></p>
<p>Elle a alors fait ce qu&rsquo;elle aurait dû faire d&rsquo;abord : lire le fichier de brochage de cette carte dans les sources de Marlin, <code>pins_MKS_ROBIN_MINI.h</code>, et y chercher <strong>tout</strong> ce que l&rsquo;ancien firmware initialisait au démarrage. Et là :</p>
<pre><code>MOTOR_CURRENT_PWM_XY_PIN  PA6
MOTOR_CURRENT_PWM_Z_PIN   PA7
MOTOR_CURRENT_PWM_E_PIN   PB0
MOTOR_CURRENT_PWM_RANGE   1500
DEFAULT_PWM_MOTOR_CURRENT { 800, 800, 800 }
</code></pre>
<p>Sur la Robin Mini, la tension de référence qui fixe le <strong>courant des moteurs</strong> n&rsquo;est pas réglée par un potentiomètre : elle est <strong>générée par le microcontrôleur</strong>, par un signal PWM sur trois broches. Repetier les fixait au démarrage. Klipper les laissait flotter — référence quasi nulle, couple minuscule, dérive au fil des minutes (« ça bouge mieux qu&rsquo;au début »). Et <strong>la configuration Klipper officielle de cette imprimante, <code>printer-flsun-qqs-2020.cfg</code>, ne contient pas ces lignes</strong> (au moment où j&rsquo;écris). Quiconque suit cette config sur une Robin Mini a des moteurs sous-alimentés.</p>
<p>La correction tient en trois blocs de configuration : une sortie PWM matérielle par broche, 800 sur une échelle de 1500, à 1 kHz, la valeur par défaut de Marlin. Homing immédiat, trois colonnes déclenchées, vitesse normale. « <em>Déplacement parfait !</em> »</p>
<details>
<summary>Pour aller au fond : les trois blocs, et la leçon de méthode</summary>
<pre><code>[output_pin motor_current_ab]
pin: PA6
pwm: True
hardware_pwm: True
cycle_time: 0.001
scale: 1500
value: 800

[output_pin motor_current_c]
pin: PA7
# idem

[output_pin motor_current_e]
pin: PB0
# idem
</code></pre>
<p>800/1500 correspond à environ 1,28 V de référence, soit ~0,9 A efficaces sur les drivers TMC2208 de la carte. On peut ajuster par pas de 50, sans dépasser ~1000 sans refroidissement. Les trois broches sont sur le même timer (TIM3), <code>hardware_pwm</code> est accepté sans erreur.</p>
<p>La leçon dépasse cette carte : quand « ça marchait avant » sous un autre firmware, il faut inventorier <strong>tout</strong> ce que l&rsquo;ancien firmware initialisait — courant, micro-pas, modes de driver, pas seulement STEP/DIR/ENABLE. L&rsquo;erreur de l&rsquo;IA n&rsquo;a pas été de se tromper, mais de raisonner (« le courant vient d&rsquo;un potentiomètre, donc il n&rsquo;a pas changé ») au lieu de vérifier comment cette carte-là produit sa référence.</p>
</details>
<h2 id="calibrer-une-delta-sans-palpeur">Calibrer une delta sans palpeur</h2>
<p>Le palpeur de la machine n&rsquo;était pas là. Ce n&rsquo;est pas grave : la documentation de Klipper recommande de toute façon la calibration <strong>manuelle</strong> sur une delta, parce qu&rsquo;un palpeur monté à côté de la buse introduit sa propre erreur quand l&rsquo;effecteur s&rsquo;incline. La méthode, c&rsquo;est la feuille de papier : <code>DELTA_CALIBRATE METHOD=manual</code> envoie la buse à 2 mm au-dessus de sept points du plateau, un au centre et six en cercle ; à chaque point on descend la buse par pas de 1 mm, puis 0,1, puis par bissection, jusqu&rsquo;à ce qu&rsquo;une feuille de papier de 0,1 mm frotte juste entre la buse et le verre ; on valide, la buse va au point suivant. Sept points, un quart d&rsquo;heure. Klipper calcule ensuite les paramètres qui mettent ces sept points dans un plan.</p>
<p><img alt="Pièce calibrate_size.stl de Klipper sur le plateau de la FLSun QQ-S : anneau, six rayons, sept piliers hexagonaux, lettres A, B, C vers les colonnes" src="https://pf.olibrio.fr/images/flsun/04-calibrate-size.jpg" /></p>
<p><em>La pièce <code>calibrate_size.stl</code> livrée avec Klipper, pour la calibration étendue des bras. Elle sera imprimée mais pas utilisée : on verra pourquoi.</em></p>
<p>Le premier résultat, le 4 septembre après-midi : rayon delta 141,18 (l&rsquo;EEPROM disait 140,8), et surtout <strong>angle de la colonne A à 211,02° et de la colonne B à 330,45°</strong>, au lieu des 210° et 330° nominaux. Un degré sur A. C&rsquo;est énorme pour une delta, et c&rsquo;était le défaut « qu&rsquo;aucun réglage ne corrigeait » : un angle de colonne faux vrille les pièces et déforme le plateau en trèfle, et aucun réglage de slicer, aucune grille de plateau, ne rattrape ça.</p>
<p>Dans la foulée, la <strong>bed mesh</strong>, la grille du plateau : <code>BED_MESH_CALIBRATE METHOD=manual</code>, même geste au papier sur 13 points, pour corriger ce que le verre a de non plan. Étendue 0,51 mm, dominée par les deux bords de l&rsquo;axe Y. Sauvegardé, chargé au début de chaque impression. Calibration à froid terminée.</p>
<p><em>Notez ce détail : la grille a été mesurée à froid, et j&rsquo;ai retendu les courroies entre la calibration delta et sa vérification. On y reviendra.</em></p>
<h2 id="lextrudeur-mentait-de-115">L&rsquo;extrudeur mentait de 11,5 %</h2>
<p>Le test le plus simple du monde, et je ne l&rsquo;avais jamais fait en six ans : un trait au feutre sur le filament à 120 mm de l&rsquo;entrée de l&rsquo;extrudeur, on demande à la machine d&rsquo;en avancer 100, on mesure ce qui reste. Attendu : 20 mm. Mesuré : <strong>31,5 mm</strong>. La machine avait poussé 88,5 mm pour 100 demandés.</p>
<p>Les 367 pas/mm de l&rsquo;EEPROM, reportés fidèlement dans Klipper (<code>rotation_distance</code> 8,719), étaient faux de 11,5 %. Corrigé à 7,716, contre-vérifié sur un second test : 20,0 mm restants, « <em>parfait !</em> ».</p>
<p>Mesurez ce que ça veut dire : <strong>chaque couche jamais posée par cette machine manquait d&rsquo;un dixième de sa matière</strong>. Parois faibles, jointures ouvertes, dessus irréguliers, mauvaise adhérence entre couches — tout ce que je mettais sur le compte de « la delta » ou « le PETG ». Et aucun réglage de slicer ne compense une erreur qu&rsquo;on ignore : on peut monter le débit à 110 % au hasard, on ne sait pas pourquoi, et ça ne tient pas d&rsquo;un filament à l&rsquo;autre.</p>
<p>Avec les angles de colonnes et le courant moteur, ça fait <strong>trois défauts d&rsquo;origine</strong> — d&rsquo;origine ou d&rsquo;une mise à jour de firmware qui a tout remis à zéro, la machine ne dira pas lequel — jamais vus.</p>
<h2 id="pid-petg-humide-et-le-premier-print">PID, PETG humide et le premier print</h2>
<p>Les régulations de température (PID) se recalibrent en dix minutes, mais celle de la buse a fait sauter la protection thermique de Klipper : <code>heater extruder not heating at expected rate</code>. La courbe montrait une chauffe parfaitement saine (27 → 234 °C en 95 s), puis une inertie inhabituelle entre le bloc et sa thermistance qui fait croire à la protection que la chauffe s&rsquo;arrête. Pas de désactivation : une fenêtre élargie dans <code>[verify_heater extruder]</code>, documentée dans la config.</p>
<p>Puis la première pièce, en PETG, celui qui vivait sur la machine depuis des lustres. Le cube est sorti… comme ça :</p>
<p><img alt="Cube de 20 mm en PETG noir imprimé sur la FLSun QQ-S, parois mousseuses et irrégulières, filaments qui pendent : filament humide" src="https://pf.olibrio.fr/images/flsun/01-cube-petg-humide.jpg" /></p>
<p><em>Le premier cube, en PETG. Ça crépitait dans la buse pendant l&rsquo;impression : la bobine était saturée d&rsquo;eau. Les parois sont de la mousse.</em></p>
<p>Ce n&rsquo;est pas l&rsquo;imprimante : c&rsquo;est le filament. Le PETG est hygroscopique, et une bobine laissée à l&rsquo;air pendant des années crépite dans la buse (l&rsquo;eau se vaporise) et sort mousseux. Une bonne part de la « fiabilité décevante » de cette machine, c&rsquo;était ça. Bobine de PLA neuve pour toute la calibration ; le PETG passera au sèche-filament.</p>
<p>En PLA, <code>square.stl</code> de Klipper (un cadre d&rsquo;un millimètre de paroi, cinq millimètres de haut, six minutes) : paroi 1,00 mm, hauteur 5,00. Et le premier cube de contrôle : <strong>Z 20,00 · X 20,40 · Y 20,45</strong>. La hauteur est parfaite — les colonnes sont bonnes. L&rsquo;excès de 2 % en XY, on le règlera à la fin.</p>
<p><img alt="Test de première couche square.stl de Klipper : deux cadres imbriqués en PLA blanc sur le plateau noir de la delta" src="https://pf.olibrio.fr/images/flsun/03-square.jpg" /></p>
<p><em><code>square.stl</code> : le test de première couche et de débit de Klipper. Paroi 1,00 mm pile.</em></p>
<p><img alt="Gros plan sur le pied d'un cadre : une fine lèvre déborde à la base de la paroi" src="https://pf.olibrio.fr/images/flsun/02-square-levre.jpg" /></p>
<p><em>Le pied d&rsquo;un cadre, vu de très près : la petite lèvre qui déborde à la base dit que la première couche est un peu trop écrasée. C&rsquo;est avec ce test qu&rsquo;on règle le décalage de première couche, par pas de 0,05 mm, pendant l&rsquo;impression.</em></p>
<h2 id="pressure-advance">Pressure advance</h2>
<p>Dernier réglage avant de s&rsquo;attaquer au plateau : le <strong>pressure advance</strong>. Sur une machine à bowden (le moteur d&rsquo;extrudeur est sur le châssis, un long tube amène le filament à la buse), la pression dans le tube met du temps à monter et à retomber ; sans compensation, les coins gonflent et les fins de ligne bavent. Klipper compense en poussant un peu plus avant les accélérations et en retirant avant les décélérations, avec un seul paramètre. On le mesure avec une tour de test où le paramètre augmente avec la hauteur (<code>TUNING_TOWER</code>), et on cherche à l&rsquo;œil la hauteur où les coins sont les plus nets.</p>
<p><img alt="Coin de la tour de pressure advance square_tower de Klipper en PLA blanc, vue rasante : l'arête change d'aspect avec la hauteur" src="https://pf.olibrio.fr/images/flsun/05-pa-tower.jpg" /></p>
<p><em>La tour <code>square_tower.stl</code> : en bas, pas assez de compensation, les coins gonflent ; en haut, trop, ils se creusent. Le meilleur coin est à 19 mm.</em></p>
<p>Meilleur coin à 19 mm, pas de 0,020 par millimètre : <strong>pressure advance 0,38</strong>, dans la plage attendue pour un bowden. Gravé.</p>
<h2 id="la-spirale-ou-comment-voir-sa-premiere-couche">La spirale, ou comment voir sa première couche</h2>
<p>Pour juger le nivellement, il me fallait mieux que la feuille de papier : je me souvenais d&rsquo;un objet en spirale qu&rsquo;on imprime pour voir la première couche d&rsquo;un coup d&rsquo;œil. Plutôt que de chercher un fichier tranché pour une autre machine, l&rsquo;IA a généré le G-code directement : une seule ligne continue, en spirale d&rsquo;Archimède, du centre jusqu&rsquo;à 120 mm de rayon, une spire tous les 2,5 mm, une seule couche de 0,2. Douze minutes. Là où la buse est trop près, le cordon est écrasé, plat, translucide ; là où elle est trop loin, il est rond, étroit, mal collé. Sur un plateau rond, c&rsquo;est le test le plus lisible qui soit.</p>
<p><img alt="Spirale de nivellement sur le plateau rond de la FLSun QQ-S : trois secteurs brillants alternant avec trois secteurs sombres, en trèfle" src="https://pf.olibrio.fr/images/flsun/06-spirale-1-trefle.jpg" /></p>
<p><em>La première spirale. Trois lobes brillants à 120° l&rsquo;un de l&rsquo;autre : la signature d&rsquo;une géométrie delta, pas d&rsquo;un plateau gondolé.</em></p>
<p>La première spirale montrait un <strong>trèfle à trois lobes</strong>. Un verre gondolé ne fait pas de trèfle ; une delta mal calibrée, si. Et pourtant la calibration venait d&rsquo;être faite. La bonne conclusion aurait été : <em>la géométrie n&rsquo;est pas encore juste, refaire la calibration</em>. On a pris l&rsquo;autre chemin.</p>
<h2 id="fausse-piste">La fausse piste : deux jours à corriger la grille</h2>
<p>Ma demande était raisonnable : « <em>une impression avec une épaisseur prédéterminée serait plus pertinente que le test de la feuille</em> ». L&rsquo;IA a construit la méthode : imprimer un carré d&rsquo;une couche sur chacun des 13 points de la grille, mesurer leur épaisseur, et corriger chaque point de la grille de l&rsquo;écart à la moyenne. Un carré plus épais que les autres = la buse était plus haute là = le plateau y est plus bas que ce que la grille croit = on abaisse le point. Elle a écrit le script (<code>fix-mesh.py</code>) qui fait le homing, place la buse à 100 mm au-dessus de chaque carré pour l&rsquo;identifier (« <em>comment déterminer qui est qui ?</em> » — le logo n&rsquo;est pas une référence), enregistre les mesures, réécrit la grille. Mon micromètre étant gradué en pouces, on saisit en millièmes (<code>13t</code>).</p>
<p><img alt="Treize carrés d'une couche en PLA imprimés sur les treize points de la bed mesh Klipper, plateau rond de la delta" src="https://pf.olibrio.fr/images/flsun/07-carres-13.jpg" /></p>
<p><em>Passe 1 : treize carrés de 20 mm, une couche, un par point de la grille.</em></p>
<p><img alt="Le fourreau d'un vieux micromètre : graduations 0 à 7, un trait tous les 25 millièmes de pouce" src="https://pf.olibrio.fr/images/flsun/09-micrometre-pouces.jpg" /></p>
<p><em>Le micromètre, gradué en pouces : un trait du fourreau vaut 25 millièmes, le tambour donne l&rsquo;unité. 13 thou = 0,33 mm.</em></p>
<p><img alt="Un micromètre Lufkin Rule Co. de Saginaw, Michigan, modèle n° 1941, rouillé, sa broche serrée sur un fragment de première couche en PLA translucide" src="https://pf.olibrio.fr/images/flsun/09b-micrometre-lufkin.jpg" /></p>
<p><em>L&rsquo;instrument lui-même : un Lufkin Rule Co. de Saginaw, Michigan, n° 1941. Il a plus d&rsquo;années que moi et mesure toujours au millième de pouce. Entre ses touches, une couche de PLA.</em></p>
<p>Ça marchait. Passe 1 : étendue des épaisseurs 0,30 mm. Passe 2 : <strong>0,084 mm</strong>. La spirale suivante était nettement meilleure, le trèfle s&rsquo;estompait. Puis on est passés à une grille plus fine, 7×7 (29 points, pas de 40 mm au lieu de 55), parce que les défauts restants semblaient tomber <em>entre</em> les points. Passe 3, passe 4, gain réduit pour ne pas osciller. Et à chaque spirale, <strong>les mêmes zones revenaient</strong>, atténuées mais au même endroit.</p>
<p><img alt="Spirale n°3 annotée : cinq zones cerclées en rouge et une en bleu au bord avant-droit" src="https://pf.olibrio.fr/images/flsun/10-spirale-3-annotee.jpg" /></p>
<p><em>Spirale n°3, annotée par moi : rouge = trop près (raclé), bleu = trop loin (pas collé). Cinq taches, plus de trèfle net.</em></p>
<p><img alt="Spirale n°4 annotée : deux zones rouges, une bleue au même bord" src="https://pf.olibrio.fr/images/flsun/11-spirale-4-annotee.jpg" /></p>
<p><em>Spirale n°4, après la grille 7×7 : deux zones rouges au lieu de cinq, le bleu toujours au même coin.</em></p>
<p><img alt="Vingt-neuf carrés d'une couche sur la grille bed mesh 7×7 de la FLSun QQ-S, deux carrés à gauche arrachés" src="https://pf.olibrio.fr/images/flsun/12-carres-29.jpg" /></p>
<p><em>Grille 7×7, 29 carrés de 10 mm. Deux carrés de gauche sont arrachés : trop près. Le micromètre, lui, les mesurait « épais ».</em></p>
<p>C&rsquo;est là que j&rsquo;ai dit ce qu&rsquo;il fallait dire : « <em>pour moi l&rsquo;erreur est très répétable sur les trois dernières spirales. On a du manque aux mêmes zones et les corrections ont bien amélioré les choses mais ça ne corrige pas vraiment le fond du problème.</em> » Trois passes de correction auraient dû suffire. Quelque chose d&rsquo;indépendant du réglage résistait.</p>
<p><img alt="Spirale n°5 annotée : deux zones rouges, trois roses, une bleue" src="https://pf.olibrio.fr/images/flsun/13-spirale-5-annotee.jpg" /></p>
<p><em>Spirale n°5 : rouge, quasi absence de filament ; rose, léger manque ; bleu, pas collé. Les mêmes zones, encore.</em></p>
<p>Deux macros ont tranché. Dans la zone bleue, le cordon est rond, étroit, posé sans être pressé, et la transition est progressive sur 25 mm vers le bord : la buse s&rsquo;éloigne régulièrement en allant vers le bord. Dans la zone rouge, les cordons sont <strong>larges, plats, translucides, écrasés jusqu&rsquo;au film</strong> — on voit les points du plateau à travers. Trop près, réellement.</p>
<p><img alt="Macro de la zone bleue : cordons ronds et étroits, ondulants, avec de petits nœuds" src="https://pf.olibrio.fr/images/flsun/14-macro-trop-loin.jpg" /></p>
<p><em>Zone bleue : cordon rond, non pressé, qui ondule et fait des nœuds là où il a accroché. Trop loin.</em></p>
<p><img alt="Macro de la transition vers la zone rouge : cordons larges, plats et translucides, presque un film" src="https://pf.olibrio.fr/images/flsun/15-macro-trop-pres.jpg" /></p>
<p><em>Zone rouge : cordons écrasés, translucides, on voit le plateau à travers. Trop près, sans discussion.</em></p>
<p>Et voilà la contradiction : dans ces zones rouges, les carrés mesuraient une épaisseur <em>normale</em>. Explication, une fois qu&rsquo;on la voit : <strong>un carré imprimé trop près se fait une lèvre relevée sur son pourtour</strong>, et les touches du micromètre, six millimètres de diamètre, se posent sur cette lèvre. Il lit « épais » exactement là où c&rsquo;est écrasé. La méthode des carrés était biaisée dans le sens précis qui empêchait de converger. Deux conclusions de l&rsquo;IA bâties sur ces mesures (« la buse est à 0,4 mm du verre en moyenne », « il faut descendre le zéro global ») sont tombées avec.</p>
<p>Restait la question de fond : pourquoi des zones si répétables ? Ma piste était les courroies. L&rsquo;IA a écrit un test de répétabilité (touche <code>R</code> : même point, cinq approches par des chemins différents, feuille de papier) : <strong>répétable à 0,1 mm</strong> quel que soit le chemin. Courroies et jeu hors de cause. Mais ce test a donné autre chose : à ces points, la feuille frottait à Z = +0,2 et <strong>+0,6 mm</strong> — la machine croyait le plateau un demi-millimètre plus bas qu&rsquo;il n&rsquo;est. Et la grille elle-même portait une pente de 0,65 mm d&rsquo;avant en arrière, que rien ne justifie sur une delta calibrée.</p>
<p>La cause était dans le déroulé du premier jour. La calibration delta avait été faite <strong>à froid</strong> ; <strong>entre</strong> cette calibration et sa vérification, j&rsquo;avais retendu les courroies ; la vérification avait montré un décalage, et l&rsquo;IA avait appliqué <strong>+0,4 mm uniforme</strong> aux trois butées. Mais la retension avait déplacé les trois colonnes <em>inégalement</em>. Le résidu, une pente inclinée, était parti dans la grille, et une grille de delta ne rend jamais une pente plane : elle laisse des lobes, que quatre passes de carrés au micromètre ont poursuivis sans les attraper.</p>
<details>
<summary>Pour aller au fond : pourquoi une grille ne compense pas une erreur de géométrie</summary>
<p>Une erreur de butée sur une colonne ne produit pas un plan incliné exact mais une surface légèrement courbe, parce que l&rsquo;inclinaison de l&rsquo;effecteur change avec sa position ; une erreur d&rsquo;angle produit un trèfle. La grille échantillonne cette surface en 13 ou 29 points et interpole (ici en bicubique) entre eux : elle capture la tendance, pas la courbure fine, et laisse un résidu partout où la vraie surface s&rsquo;écarte de l&rsquo;interpolation. Plus l&rsquo;erreur de géométrie est grande, plus le résidu l&rsquo;est. C&rsquo;est pour ça que Klipper demande la géométrie d&rsquo;abord, la grille ensuite, et que « refaire la grille » ne remplace jamais « refaire la calibration delta ». Et c&rsquo;est pour ça qu&rsquo;il faut calibrer dans l&rsquo;état où l&rsquo;on imprime : un plateau à 60 °C n&rsquo;est pas exactement à la même place qu&rsquo;à 20 °C (ici, +0,36 mm au centre), et l&rsquo;écart n&rsquo;est pas nécessairement uniforme.</p>
</details>
<h2 id="larrivee-tout-refaire-a-chaud-au-papier">L&rsquo;arrivée : tout refaire à chaud, au papier</h2>
<p>Plateau à 60 °C, buse froide, grille vidée. <code>DELTA_CALIBRATE</code> manuel, sept points au papier, quinze minutes. Le verdict est dans les butées :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Colonne</th>
<th>Butée avant</th>
<th>Butée après</th>
<th>Écart</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>376,252</td>
<td>376,075</td>
<td>−0,18</td>
</tr>
<tr>
<td>B</td>
<td>376,533</td>
<td>375,970</td>
<td><strong>−0,56</strong></td>
</tr>
<tr>
<td>C</td>
<td>377,204</td>
<td>376,859</td>
<td>−0,35</td>
</tr>
</tbody>
</table></div>
<p>Les angles n&rsquo;ont presque pas bougé (A 211,02 → 210,93, B 330,45 → 330,33), le rayon non plus (141,18 → 141,29). La géométrie tenait. Ce qui était faux, c&rsquo;étaient <strong>les butées, inégalement</strong> : 0,38 mm d&rsquo;écart entre A et B. Exactement la pente que la grille portait.</p>
<p>Sauvegarde, homing, puis la grille au papier sur les 29 points, une demi-heure. Centre plat à ±0,1 mm sur 80 mm de rayon ; le bord avant plonge de 0,6 mm à 120 mm du centre — c&rsquo;est le verre lui-même, ou la delta en bout de course, et cette fois c&rsquo;est mesuré directement et la grille le sait. Puis la spirale :</p>
<p><img alt="Spirale de nivellement uniforme sur la FLSun QQ-S après recalibration delta à chaud sous Klipper : spires régulières d'un bord à l'autre" src="https://pf.olibrio.fr/images/flsun/16-spirale-6-uniforme.jpg" /></p>
<p><em>Spirale n°6, la première avec géométrie et grille cohérentes, toutes deux mesurées à chaud. Uniforme d&rsquo;un bord à l&rsquo;autre, bord avant compris.</em></p>
<p><img alt="Macro de la sixième spirale : cordons réguliers, de même largeur d'une spire à l'autre" src="https://pf.olibrio.fr/images/flsun/17-macro-spirale-6.jpg" /></p>
<p><em>Le cordon, à la loupe : régulier, même largeur d&rsquo;une spire à l&rsquo;autre, collé partout.</em></p>
<p>Six spirales, et la bonne a été celle où l&rsquo;on a arrêté de corriger et recalibré, en trente-cinq minutes, avec une seule méthode.</p>
<p>Restait un dernier piège, de la même famille : le décalage de première couche, +0,07 mm, avait été réglé le premier jour sur le zéro <em>froid</em>. Sur le nouveau zéro, à chaud, le cube de contrôle n&rsquo;a pas collé. <strong>Un nouveau zéro implique de re-régler l&rsquo;offset de première couche, jamais de reporter l&rsquo;ancien.</strong> Cadre de test, ajustement en direct par pas de 0,05 : −0,10 colle à peine, −0,20 colle avec une lèvre de 0,3 mm au pied ; gravé à <strong>−0,15</strong>.</p>
<p><img alt="Première couche d'un cube en PLA décollée du plateau : fragment recroquevillé avec des fils, offset de première couche trop haut" src="https://pf.olibrio.fr/images/flsun/18-cube-pas-colle.jpg" /></p>
<p><em>Le cube de contrôle relancé avec l&rsquo;ancien décalage de première couche : il n&rsquo;a pas collé. Le zéro avait changé, l&rsquo;offset non.</em></p>
<p>Et le cube, enfin : <strong>20,3 × 20,4 × 20,00</strong>, lèvre de 0,1 mm par côté. Le premier jour il faisait 20,40 × 20,45 × 20,00. L&rsquo;excès en XY n&rsquo;a pas bougé avec la géométrie, parce que ce n&rsquo;est pas de la géométrie : la pièce à sept piliers, mesurée au pied à coulisse, donnait un entraxe de 65,0 ± 0,4 mm sur 65 nominaux, soit une échelle juste à 0,5 % près ; une erreur de bras aurait donné +1,3 mm là-bas. Ce qui reste est un <strong>excès constant</strong> de largeur de cordon, coins qui gonflent, paroi à 1,07 pour 1,00, et ça se règle dans le tranchage comme sur n&rsquo;importe quelle machine : multiplicateur d&rsquo;extrusion 0,95, compensation XY −0,1 mm, compensation de pied d&rsquo;éléphant 0,1 mm, dans un profil de production séparé du profil brut de test. La calibration étendue des bras, longue et délicate, n&rsquo;était pas nécessaire. Cube de contrôle avec ce profil : <strong>20,0 × 20,1 × 20,0</strong>.</p>
<h2 id="ce-que-jen-retiens">Ce que j&rsquo;en retiens</h2>
<p><strong>Calibrer dans l&rsquo;état où l&rsquo;on imprime.</strong> À chaud. Une machine calibrée à froid décrit un plateau qui n&rsquo;existe plus quand le PLA arrive.</p>
<p><strong>Une seule méthode de mesure, du début à la fin.</strong> Le papier pour la géométrie, le papier pour la grille, le cadre de test pour la première couche. Chaque changement de méthode a introduit un biais que personne ne voyait.</p>
<p><strong>La géométrie d&rsquo;abord, la grille ensuite, jamais l&rsquo;inverse.</strong> Une grille qui n&rsquo;arrive pas à converger en deux passes ne manque pas de points : elle compense une erreur qui n&rsquo;est pas la sienne. Et toute retension de courroie remet la géométrie en jeu — refaire <code>s</code> puis <code>m</code>, pas de raccourci.</p>
<p><strong>Quand deux mesures se contredisent, on va voir.</strong> La loupe sur le cordon a tranché en une minute ce que quatre passes de micromètre n&rsquo;avaient pas résolu. Une mesure n&rsquo;est pas une vérité, c&rsquo;est un instrument avec ses angles morts.</p>
<p><strong>L&rsquo;IA sur-ingénie quand elle comprend mal.</strong> Le script de correction de grille par carrés au micromètre était astucieux, bien fait, persistant, avec reprise et corrections — et il optimisait une mauvaise idée. C&rsquo;est moi qui ai dit « c&rsquo;est répétable, ce n&rsquo;est pas le réglage », et c&rsquo;est la macro qui a tranché. Elle a en revanche trouvé en une lecture ce que six ans de forums n&rsquo;avaient pas : le courant moteur par PWM, l&rsquo;extrudeur faux de 11,5 %, la calibration jamais faite.</p>
<p><strong>« Ça marchait avant » est une donnée.</strong> Deux fois dans cette histoire, mon jugement sur ma machine valait mieux qu&rsquo;une méthode lue ailleurs : sur la tension des courroies, sur le homing. Et deux fois, l&rsquo;IA a fini par le vérifier et me donner raison, avec les sources. C&rsquo;est la bonne répartition : elle lit vite, elle ne mesure pas à ma place.</p>
<h2 id="ou-on-en-est">Où on en est</h2>
<div class="status">
<p><strong>État au 6 septembre 2026 : calibration machine terminée.</strong> Géométrie, zéro et grille mesurés à chaud au papier ; première couche à −0,15 ; extrudeur à 7,716 ; pressure advance 0,38 ; PID refaits ; courant moteur fixé. Spirale uniforme ; cube de contrôle à 20,0 × 20,1 × 20,0 avec le profil de production. Reste, par ordre d&rsquo;intérêt : la compensation de résonance (input shaper) avec la tour de test de Klipper, un extrudeur à double entraînement en stock, et le Raspberry Pi comme hôte pour rendre l&rsquo;imprimante autonome. Le PETG sèche.</p>
</div>
<h2 id="pour-reproduire">Pour reproduire</h2>
<p><strong>Matériel</strong> : une FLSun QQ-S de 2020 (carte MKS Robin Mini) — la démarche vaut pour toute delta, les broches non ; un ordinateur sous Linux avec un port USB ; une carte SD ≤ 8 Go en FAT32 ; une feuille de papier de 80 g ; un pied à coulisse ; une bobine de PLA <strong>sèche</strong>. Pas de palpeur, pas d&rsquo;accéléromètre.</p>
<p><strong>Avant de flasher</strong>, lire la mémoire du firmware d&rsquo;origine (sur Repetier : <code>M205</code> ; sur Marlin : <code>M503</code>) et garder le dump. Noter en particulier la longueur des bras, le rayon delta, la hauteur, et les pas/mm de l&rsquo;extrudeur.</p>
<p><strong>Firmware</strong> : Klipper, <code>make menuconfig</code> → STM32F103, bootloader 28 KiB, quartz 8 MHz, USART3 (PB11/PB10), 250000 bauds ; puis <code>scripts/update_mks_robin.py out/klipper.bin Robin_mini.bin</code> ; le fichier à la racine de la carte SD, imprimante éteinte à l&rsquo;insertion, allumer, attendre « complete ». Le bootloader renomme le fichier en <code>.CUR</code>. Le script <a href="https://pf.olibrio.fr/assets/flsun/build-firmware.sh"><code>build-firmware.sh</code></a> fait tout ça.</p>
<p><strong>Configuration</strong> : <a href="https://pf.olibrio.fr/assets/flsun/printer.cfg"><code>printer.cfg</code></a>, avec ses valeurs réelles et ses commentaires. Les trois blocs <code>[output_pin motor_current_*]</code> sont <strong>indispensables</strong> sur une Robin Mini. Le bloc <code>SAVE_CONFIG</code> en fin de fichier contient les résultats des calibrations ; pour repartir de zéro, le supprimer et remettre les valeurs de l&rsquo;EEPROM en <code>[stepper_a/b/c]</code> et <code>[printer]</code>.</p>
<p><strong>Outils</strong> : <a href="https://pf.olibrio.fr/assets/flsun/start-klipper.sh"><code>start-klipper.sh</code></a> (démarrer l&rsquo;hôte), <a href="https://pf.olibrio.fr/assets/flsun/send-gcode.sh"><code>send-gcode.sh</code></a> et <a href="https://pf.olibrio.fr/assets/flsun/klippy-client.py"><code>klippy-client.py</code></a> (envoyer une commande), <a href="https://pf.olibrio.fr/assets/flsun/calib.py"><code>calib.py</code></a> (pilotage clavier des calibrations), <a href="https://pf.olibrio.fr/assets/flsun/watch-print.py"><code>watch-print.py</code></a> (suivi d&rsquo;impression), <a href="https://pf.olibrio.fr/assets/flsun/make-spiral.py"><code>make-spiral.py</code></a> (la spirale). Les profils PrusaSlicer en ligne de commande sont dans <a href="https://pf.olibrio.fr/assets/flsun/slicer/"><code>slicer/</code></a> : <code>qqs-pla.ini</code> brut pour les tests, <code>qqs-pla-prod.ini</code> pour les pièces.</p>
<p><strong>Dans l&rsquo;ordre, à chaud</strong> (plateau à la température d&rsquo;impression, buse froide pour le papier) :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Étape</th>
<th>Commande / touche</th>
<th>Durée</th>
<th>Ce qu&rsquo;on obtient</th>
</tr>
</thead>
<tbody>
<tr>
<td>1. Homing</td>
<td><code>h</code></td>
<td>1 min</td>
<td>position connue</td>
</tr>
<tr>
<td>2. Géométrie</td>
<td><code>s</code> (DELTA_CALIBRATE manuel), 7 points au papier, puis <code>c c</code></td>
<td>15 min</td>
<td>rayon, angles, butées</td>
</tr>
<tr>
<td>3. Vérification</td>
<td><code>v</code> (7 points à Z = 0,1)</td>
<td>5 min</td>
<td>±0,05 attendu ; sinon refaire 2</td>
</tr>
<tr>
<td>4. Grille</td>
<td><code>m</code> (BED_MESH_CALIBRATE manuel), puis <code>c c</code></td>
<td>20–30 min</td>
<td>profil <code>default</code>, chargé par START_PRINT</td>
</tr>
<tr>
<td>5. Extrudeur</td>
<td>trait à 120 mm, <code>M83</code> <code>G1 E100 F60</code>, mesurer</td>
<td>5 min</td>
<td><code>rotation_distance</code> × extrudé/100</td>
</tr>
<tr>
<td>6. PID</td>
<td><code>PID_CALIBRATE HEATER=extruder TARGET=210</code>, idem <code>heater_bed</code></td>
<td>15 min</td>
<td>gains, <code>SAVE_CONFIG</code></td>
</tr>
<tr>
<td>7. Première couche</td>
<td><code>square.stl</code>, <code>[</code> <code>]</code> en direct, graver dans START_PRINT</td>
<td>7 min</td>
<td>offset</td>
</tr>
<tr>
<td>8. Pressure advance</td>
<td><code>square_tower.stl</code> + <code>TUNING_TOWER … START=0 FACTOR=.020</code></td>
<td>50 min</td>
<td>hauteur du meilleur coin × 0,020</td>
</tr>
<tr>
<td>9. Contrôle</td>
<td>spirale, puis cube de 20 mm</td>
<td>12 + 19 min</td>
<td>uniforme ; 20,00 en Z</td>
</tr>
</tbody>
</table></div>
<p>Trois règles, si vous vous y mettez : <strong>à chaud</strong>, <strong>une seule méthode de mesure</strong>, et <strong>toute intervention mécanique (courroies, bras, plateau) renvoie à l&rsquo;étape 2</strong>. Si une grille ne converge pas en deux passes, ne pas ajouter de points : refaire la géométrie.</p>
<p><strong>Lire la spirale</strong> : rouge = trop près (cordon plat, translucide, raclé), bleu = trop loin (cordon rond, mal collé). Un trèfle à trois lobes = géométrie ; des taches locales = plateau ou grille ; un bord qui plonge progressivement = le verre ou la delta en bout de course. En cas de doute, la loupe.</p>
<h2 id="questions-frequentes">Questions fréquentes</h2>
<h3 id="faut-il-un-palpeur-pour-calibrer-une-delta-sous-klipper">Faut-il un palpeur pour calibrer une delta sous Klipper ?</h3>
<p>Non. La documentation Klipper recommande la calibration manuelle au papier sur les deltas, parce qu&rsquo;un palpeur décalé de la buse introduit sa propre erreur quand l&rsquo;effecteur s&rsquo;incline. Sept points pour la géométrie, treize à vingt-neuf pour la grille, une demi-heure en tout.</p>
<h3 id="mes-moteurs-grognent-et-le-homing-echoue-apres-le-passage-a-klipper-sur-une-mks-robin-mini-pourquoi">Mes moteurs grognent et le homing échoue après le passage à Klipper sur une MKS Robin Mini. Pourquoi ?</h3>
<p>Parce que le courant des moteurs est réglé par PWM depuis le microcontrôleur (broches PA6, PA7, PB0) et que la config Klipper officielle de la QQ-S ne le fait pas. Trois blocs <code>[output_pin]</code> en PWM matériel, valeur 800 sur 1500, règlent le problème. Voir <a href="#klipper-et-des-moteurs-qui-nont-plus-de-force">Klipper, et des moteurs qui n&rsquo;ont plus de force</a>.</p>
<h3 id="ma-flsun-qq-s-est-elle-sous-marlin">Ma FLSun QQ-S est-elle sous Marlin ?</h3>
<p>Pas la QQ-S de 2020 : elle est sous Repetier (<code>FIRMWARE_NAME:Robin</code>). <code>M503</code>, <code>M665</code>, <code>M666</code>, <code>M900</code> répondent <code>Unknown command</code> ; c&rsquo;est <code>M205</code> qui lit la mémoire. Les tutoriels Marlin ne s&rsquo;appliquent pas.</p>
<h3 id="ma-grille-de-plateau-ne-converge-pas-meme-apres-plusieurs-passes-faut-il-plus-de-points">Ma grille de plateau ne converge pas, même après plusieurs passes. Faut-il plus de points ?</h3>
<p>Presque jamais. Une grille qui ne converge pas compense en général une erreur de géométrie (butées inégales, angle de colonne) ou une calibration faite à froid. Refaire <code>DELTA_CALIBRATE</code> à chaud, puis la grille, avec la même méthode de mesure.</p>
<h3 id="comment-savoir-si-mon-extrudeur-pousse-la-bonne-quantite">Comment savoir si mon extrudeur pousse la bonne quantité ?</h3>
<p>Un trait sur le filament à 120 mm de l&rsquo;entrée de l&rsquo;extrudeur, <code>M83</code> puis <code>G1 E100 F60</code>, mesurer ce qui reste : 20 mm attendus. Ici il en restait 31,5 : 11,5 % de sous-extrusion depuis toujours. Nouveau <code>rotation_distance</code> = ancien × extrudé / 100.</p>
<h3 id="la-methode-des-carres-depaisseur-au-micrometre-est-elle-bonne">La méthode des carrés d&rsquo;épaisseur au micromètre est-elle bonne ?</h3>
<p>Elle est biaisée là où la buse est trop près : le carré écrasé fait une lèvre relevée sur son pourtour, et le micromètre la lit « épais ». Si vous y tenez, des carrés de 20 mm mesurés au centre, touches loin du bord. La spirale et le papier sont plus fiables.</p>
<h3 id="faut-il-tendre-les-courroies-dune-delta-a-une-frequence-precise">Faut-il tendre les courroies d&rsquo;une delta à une fréquence précise ?</h3>
<p>Non. La fréquence dépend de la longueur du brin, de la masse et de la composition de la courroie ; une même note ne signifie pas une même tension d&rsquo;une machine à l&rsquo;autre, et sur une QQ-S le brin est trop long pour être mesuré. Détendre, puis retendre au seuil où la courroie vibre mollement au lieu de flotter, sur les trois colonnes. Et refaire la calibration delta après.</p>
<h3 id="le-cube-fait-203-au-lieu-de-2000-en-xy-dois-je-calibrer-les-bras">Le cube fait 20,3 au lieu de 20,00 en XY : dois-je calibrer les bras ?</h3>
<p>Pas si l&rsquo;excès est constant. Vérifiez sur une pièce plus grande (la pièce à sept piliers de Klipper, entraxe 65 mm) : si l&rsquo;échelle est juste, l&rsquo;excès vient de la largeur de cordon et se corrige dans le slicer (multiplicateur d&rsquo;extrusion, compensation XY). La calibration des bras corrige une erreur d&rsquo;échelle, pas un excès constant.</p>
<h3 id="qua-fait-lia-exactement-et-qua-fait-lhumain">Qu&rsquo;a fait l&rsquo;IA exactement, et qu&rsquo;a fait l&rsquo;humain ?</h3>
<p>Claude a lu l&rsquo;EEPROM et le fichier de brochage de la carte, compilé et préparé le firmware, écrit la configuration et tous les scripts, généré la spirale, conduit les calibrations et rédigé ce billet avec moi. Elle s&rsquo;est trompée sur le firmware (Marlin), sur la cause du homing (plusieurs heures), sur la tension des courroies, et sur la méthode des carrés. J&rsquo;ai tenu la feuille de papier, le pied à coulisse, le micromètre et l&rsquo;appareil photo ; j&rsquo;ai lu les spirales ; j&rsquo;ai dit « ça marchait avant », « c&rsquo;est pas une corde » et « c&rsquo;est répétable, ce n&rsquo;est pas le réglage ». Les trois fois, c&rsquo;était la bonne piste.</p>
<h2 id="petit-glossaire">Petit glossaire</h2>
<ul>
<li><strong>Delta</strong> : imprimante où la buse est portée par trois bras articulés sur trois chariots verticaux ; la position est calculée, pas mesurée axe par axe.</li>
<li><strong>Effecteur</strong> : la pièce centrale qui porte la buse, au bout des bras.</li>
<li><strong>Bras (<code>arm_length</code>)</strong>, <strong>rayon delta (<code>delta_radius</code>)</strong>, <strong>angle de colonne</strong>, <strong>butée (<code>position_endstop</code>)</strong> : les paramètres de la géométrie ; voir l&rsquo;encart « ce que chaque réglage corrige ».</li>
<li><strong>Homing</strong> : envoyer les chariots en haut jusqu&rsquo;à leurs interrupteurs, pour connaître leur position.</li>
<li><strong>Bed mesh (grille du plateau)</strong> : carte des hauteurs du plateau, mesurée en quelques points, que le firmware interpole pour corriger la buse en continu.</li>
<li><strong>Test du papier</strong> : descendre la buse jusqu&rsquo;à ce qu&rsquo;une feuille de 0,1 mm frotte juste ; le Z = 0 est alors 0,1 mm au-dessus du verre.</li>
<li><strong>Offset de première couche</strong> : petit décalage en Z appliqué au début de chaque impression pour ajuster l&rsquo;écrasement de la première couche.</li>
<li><strong>Rotation distance</strong> : sous Klipper, la distance parcourue (ou de filament poussée) par tour de moteur ; remplace les pas/mm.</li>
<li><strong>Pressure advance</strong> : compensation de la pression dans le tube bowden, qui nettoie les coins.</li>
<li><strong>PID</strong> : la régulation de température ; se recalibre par <code>PID_CALIBRATE</code>.</li>
<li><strong>Bowden</strong> : configuration où le moteur d&rsquo;extrudeur est sur le châssis et pousse le filament dans un long tube jusqu&rsquo;à la buse ; léger pour l&rsquo;effecteur, mais élastique.</li>
<li><strong>Thou</strong> : millième de pouce, 0,0254 mm. Les micromètres anciens sont gradués ainsi.</li>
<li><strong>Lèvre / pied d&rsquo;éléphant</strong> : bourrelet à la base d&rsquo;une pièce, signe d&rsquo;une première couche trop écrasée.</li>
<li><strong>PWM</strong> : signal carré dont on module la largeur ; sert ici à fabriquer une tension de référence pour le courant des moteurs.</li>
<li><strong>EEPROM</strong> : la mémoire du firmware d&rsquo;origine où il garde ses réglages.</li>
</ul>
<hr />
<h2 id="references">Références et copies locales</h2>
<p>Pour que ce billet reste utile quand les liens auront disparu, les fichiers du projet sont hébergés ici.</p>
<ul>
<li><strong>Klipper</strong>, documentation : <a href="https://www.klipper3d.org/Delta_Calibrate.html">Delta Calibrate</a> · <a href="https://www.klipper3d.org/Bed_Mesh.html">Bed Mesh</a> · <a href="https://www.klipper3d.org/Bed_Level.html">Bed Level</a> · <a href="https://www.klipper3d.org/Manual_Level.html">Manual Level</a> · <a href="https://www.klipper3d.org/Pressure_Advance.html">Pressure Advance</a> · <a href="https://www.klipper3d.org/Resonance_Compensation.html">Resonance Compensation</a> · <a href="https://www.klipper3d.org/Config_Reference.html">Config Reference</a>. Les pièces de test (<code>square.stl</code>, <code>square_tower.stl</code>, <code>calibrate_size.stl</code>, <code>ringing_tower.stl</code>) sont dans <a href="https://github.com/Klipper3d/klipper/tree/master/docs/prints"><code>docs/prints/</code></a> du dépôt.</li>
<li><strong>Config Klipper de référence</strong> pour la QQ-S 2020 — <a href="https://github.com/Klipper3d/klipper/blob/master/config/printer-flsun-qqs-2020.cfg"><code>printer-flsun-qqs-2020.cfg</code></a> (sans les sorties de courant moteur, au 6 septembre 2026).</li>
<li><strong>Brochage de la MKS Robin Mini</strong> dans Marlin — <a href="https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h"><code>pins_MKS_ROBIN_MINI.h</code></a> (source des broches PWM de courant).</li>
<li><strong>Hackaday</strong>, « Don&rsquo;t Tune Your 3D Printer To Middle &lsquo;C&rsquo; After All » — sur la tension des courroies par fréquence (<a href="https://hackaday.com/?s=belt+tension+middle+C">recherche sur le site</a>).</li>
<li><strong>PrusaSlicer 2.8.1</strong>, dernière version avec une AppImage Linux — <a href="https://github.com/prusa3d/PrusaSlicer/releases/tag/version_2.8.1">releases</a>. Lancé en ligne de commande sans affichage (<code>env -u DISPLAY</code>) ; il ajoute ses propres commandes de chauffe sauf s&rsquo;il trouve de vrais <code>M104</code>/<code>M140</code> dans le G-code de départ.</li>
<li><strong>Les fichiers du projet</strong> : <a href="https://pf.olibrio.fr/assets/flsun/printer.cfg"><code>printer.cfg</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/calib.py"><code>calib.py</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/klippy-client.py"><code>klippy-client.py</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/send-gcode.sh"><code>send-gcode.sh</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/start-klipper.sh"><code>start-klipper.sh</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/watch-print.py"><code>watch-print.py</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/build-firmware.sh"><code>build-firmware.sh</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/make-spiral.py"><code>make-spiral.py</code></a> · profils <a href="https://pf.olibrio.fr/assets/flsun/slicer/"><code>slicer/</code></a> · <a href="https://pf.olibrio.fr/assets/flsun/README-flsun.md"><code>README-flsun.md</code></a> (l&rsquo;état de la machine et le mode d&rsquo;emploi du dépôt).</li>
<li><strong>Pour mémoire</strong>, la fausse piste : <a href="https://pf.olibrio.fr/assets/flsun/pour-memoire/fix-mesh.py"><code>fix-mesh.py</code></a>, <a href="https://pf.olibrio.fr/assets/flsun/pour-memoire/mesh-to-7.py"><code>mesh-to-7.py</code></a>, <a href="https://pf.olibrio.fr/assets/flsun/pour-memoire/first_layer_29.stl"><code>first_layer_29.stl</code></a>, et <a href="https://pf.olibrio.fr/assets/flsun/pour-memoire/analyze-delta.py"><code>analyze-delta.py</code></a> pour la calibration étendue des bras, si un jour elle devient nécessaire.</li>
</ul>
<p><em>Photos et mesures : les miennes. Firmware, configuration, scripts et rédaction : avec Claude. Ce billet est aussi disponible en <a href="https://pf.olibrio.fr/posts/flsun-qqs-delta-klipper-calibration.md">Markdown brut</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Neato erreur 4202 « batterie déchargée » : le jour où mon aspirateur a décidé qu&#x27;il était mort</title>
      <link>https://pf.olibrio.fr/posts/erreur-4202-neato-obsolescence.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/erreur-4202-neato-obsolescence.html</guid>
      <pubDate>Sat, 29 Aug 2026 12:00:00 +0000</pubDate>
      <description>Erreur 4202 sur un Neato D8, D9, D10 ou D800 : la batterie n&#x27;est pas forcément morte. Comment j&#x27;ai fait parler la puce bq40z50 du pack avec un ESP32 à deux euros, ce qu&#x27;elle a dit (un compteur à 1547 cycles, un faux espoir, un mode veille), ce qu&#x27;on a corrigé, le rebondissement du lendemain (une cellule en surtension, 240 fois) et la nouvelle tentative, ce que ça m&#x27;aurait coûté sans IA, ce que cette puce permet en DIY — et ce que tout ça raconte de l&#x27;obsolescence.</description>
      <category>neato</category>
      <category>erreur 4202</category>
      <category>réparation</category>
      <category>batterie</category>
      <category>bq40z50</category>
      <category>esp32</category>
      <category>smbus</category>
      <category>obsolescence</category>
      <category>droit à la réparation</category>
      <category>diy</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/neato/pack-pads-da-cl.jpg" alt="Neato erreur 4202 « batterie déchargée » : le jour où mon aspirateur a décidé qu&#x27;il était mort"></p>
<div class="tldr">
<p><strong>En deux minutes, si votre Neato clignote rouge avec l&rsquo;erreur 4202</strong></p>
<ul>
<li><strong>Le symptôme</strong> : voyant rouge, erreur 4202, « batterie déchargée », le robot refuse de charger ou de partir. Sur les D8, D9, D10 et D800, l&rsquo;application (tant qu&rsquo;elle existait) ajoutait que le <em>compteur de charge</em> de la batterie était dépassé.</li>
<li><strong>Ce que ça veut dire</strong> : pas forcément que la batterie est morte. Elle contient une puce qui parle au robot ; c&rsquo;est <strong>ce qu&rsquo;elle raconte</strong> qui déclenche l&rsquo;erreur. Changer les cellules (les « piles » à l&rsquo;intérieur) ne change pas ce qu&rsquo;elle raconte.</li>
<li><strong>Ce qu&rsquo;on a trouvé</strong> en la faisant parler avec un microcontrôleur à deux euros : aucune panne, aucune protection déclenchée, un compteur à <strong>1547 cycles</strong>, et un « ne me charge pas » qui n&rsquo;était que son mode veille.</li>
<li><strong>Ce qu&rsquo;on a fait</strong> : sauvegardé sa mémoire, remis le compteur à zéro. Le robot a remarché… une journée. <strong>Mise à jour du 1er septembre</strong> : la vraie cause était ailleurs — une cellule de récupération plus faible qui déclenchait la protection de surtension à chaque charge (240 fois en trois jours). Tension de charge abaissée, jauge remise en apprentissage, en observation (voir <a href="#ou-on-en-est">Où on en est</a>).</li>
<li><strong>Épilogue</strong> : les cellules « mortes » d&rsquo;origine, passées au testeur de capacité, rendent encore 1819 à 1916 mAh sur 2500 nominaux. Elles n&rsquo;avaient rien à se reprocher non plus.</li>
<li><strong>Avant d&rsquo;acheter une batterie</strong> : lisez <a href="#pour-reproduire">Pour reproduire</a>. Il faut un fer à souder, trois fils, un ESP32 et une soirée. Pas de programmateur du fabricant à 150 €, pas de mot de passe à casser.</li>
</ul>
<p><em>Ce billet se veut lisible sans rien connaître à l&rsquo;électronique : chaque terme technique est expliqué la première fois qu&rsquo;il apparaît, et un glossaire récapitule à la fin. Les encarts « Pour aller au fond » se déplient pour ceux qui veulent les registres, les adresses et les octets.</em></p>
</div>
<p><img alt="La carte électronique du pack Neato, gaine ouverte : les pastilles C+ et C− au centre, et à droite les deux petites pastilles marquées DA et CL, avec les fils jaunes déjà soudés" src="https://pf.olibrio.fr/images/neato/pack-pads-da-cl.jpg" /></p>
<p><em>La carte du pack, une fois la gaine ouverte. Les deux petites pastilles marquées « DA » et « CL », à droite, sont tout ce dont on a besoin. Les grosses au centre, C+ et C−, sont celles qu&rsquo;on ne touche pas.</em></p>
<h2 id="un-cloud-eteint-puis-un-bouton-qui-meurt">Un cloud éteint, puis un bouton qui meurt</h2>
<p>Mon robot aspirateur est un Neato D800. Un bon robot : un LIDAR rotatif (un petit radar laser qui tourne sur le dessus et mesure les distances aux murs), une cartographie de la maison, des lignes interdites qu&rsquo;on trace dans l&rsquo;application, 600 € à l&rsquo;époque. En 2023, Neato Robotics a fermé. Vorwerk, la maison mère, a gardé les serveurs allumés un moment — le « cloud », c&rsquo;est-à-dire les ordinateurs distants sans lesquels l&rsquo;application, les cartes et la programmation ne fonctionnent pas —, puis a annoncé <a href="https://support.neatorobotics.com/support/solutions/articles/204000073686-announcement-6th-oct-2025">le 6 octobre 2025</a> (<a href="https://pf.olibrio.fr/assets/neato/refs/neato-announcement-2025-10-06.md">copie locale</a>) que ce cloud s&rsquo;éteignait. « <em>Your Neato robot will continue to function manually. Simply press the button once to launch a full house run.</em> » Un robot à 600 € rétrogradé en aspirateur à un bouton, par communiqué.</p>
<p>Et puis, quelques mois plus tard, le bouton lui-même a cessé de répondre. Voyant rouge, <strong>erreur 4202</strong>, « batterie déchargée ». L&rsquo;application, dans ses derniers souffles, précisait que le compteur de charge de la batterie était dépassé et qu&rsquo;il fallait la remplacer. Batterie d&rsquo;origine : 90 €, quand on en trouve. Compatible : 30 à 50 €, avec le risque bien documenté sur les forums que le robot la refuse.</p>
<p>Ce billet raconte comment on est passé de « robot mort, batterie morte » à une batterie qui explique elle-même ce qui ne va pas — sans rien acheter, avec trois fils et un microcontrôleur qui coûte le prix d&rsquo;un café. Il raconte aussi un faux espoir, parce que c&rsquo;est ce qui arrive quand on cherche pour de vrai. Il s&rsquo;arrête sur ce que cette enquête m&rsquo;aurait coûté il y a trois ans, avant qu&rsquo;une IA puisse lire un manuel de 250 pages à ma place, et sur la petite puce remarquable qui gère cette batterie. Et il explique pourquoi cette histoire me laisse un goût amer sur la manière dont on fabrique les objets.</p>
<h2 id="premier-reflexe-les-cellules">Premier réflexe : les cellules</h2>
<p>Une batterie de robot, c&rsquo;est un boîtier qui contient plusieurs <strong>cellules</strong> — des accumulateurs lithium au format 18650 (18 mm de diamètre, 65 mm de long, l&rsquo;allure d&rsquo;une grosse pile AA) — reliées en série et gérées par une petite carte électronique. Une batterie « déchargée » qui ne se recharge plus, c&rsquo;est classiquement des cellules mortes. J&rsquo;ai donc fait ce que fait tout bricoleur : ouvert le pack, dessoudé les quatre cellules, soudé à la place quatre cellules de récupération — dépareillées, ce qui aura son importance plus loin —, refermé.</p>
<p>Résultat : <strong>toujours erreur 4202.</strong></p>
<p>Multimètre en main (l&rsquo;appareil qui mesure la tension, c&rsquo;est-à-dire la « pression » électrique, en volts), pourtant, tout était parfait. 4,1 V sur chaque cellule, ce qui est une cellule lithium pleine ; 16,4 V aux bornes du pack ; 16,4 V <em>au connecteur de sortie</em>, ce qui signifie que le circuit de protection — l&rsquo;interrupteur électronique qui peut isoler les cellules en cas de danger — laissait bien passer le courant. La thermistance (une résistance dont la valeur change avec la température, que le robot lit pour surveiller la batterie) affichait 6 kΩ, une valeur normale pour une pièce tiède. Le robot avait entre les mains une batterie chargée à 95 % et en bonne santé, et il affichait « batterie déchargée ».</p>
<p>C&rsquo;est le moment où l&rsquo;on comprend que le problème n&rsquo;est pas la batterie. C&rsquo;est <strong>ce que la batterie dit d&rsquo;elle-même</strong>.</p>
<details>
<summary>Pour aller au fond : mesurer sans se brûler</summary>
<p>Le pack fait 14,4 V nominal (quatre cellules en série, « 4S »), 16,8 V chargé. Ce n&rsquo;est pas une tension dangereuse pour la peau, mais un <strong>court-circuit</strong> — relier directement le plus et le moins — sur des 18650 laisse passer des dizaines d&rsquo;ampères : de quoi souder une pince, faire fondre une gaine ou enflammer une cellule. Règles simples : pas de bracelet ni de bague, un seul outil métallique à la fois, et on mesure sur les <strong>pastilles B+ / B−</strong> (côté cellules) ou <strong>C+ / C−</strong> (côté connecteur) sans jamais les relier. La thermistance (une NTC de 10 kΩ à 25 °C : sa résistance <em>baisse</em> quand il fait chaud) se lit entre le fil de température et le moins.</p>
<p>Si la tension est bonne côté cellules mais nulle au connecteur, c&rsquo;est le circuit de protection qui a coupé : là, c&rsquo;est bien la puce qui a décidé, et on est dans le sujet de ce billet.</p>
</details>
<h2 id="la-batterie-a-un-cerveau">La batterie a un cerveau</h2>
<p>Les packs des Neato de dernière génération (D8, D9, D10, D800) sont des « batteries intelligentes » (<em>smart batteries</em>) : à côté des cellules, la petite carte porte une <strong>jauge de charge</strong>, une puce — un circuit intégré, une minuscule plaquette de silicium qui contient un ordinateur spécialisé — de Texas Instruments, le <strong>bq40z50-R2</strong>. C&rsquo;est elle qui mesure le courant, additionne ce qui entre et ce qui sort, en déduit l&rsquo;état de charge, coupe en cas de surtension ou de surchauffe — et c&rsquo;est elle qui <em>parle au robot</em>, par un <strong>bus série</strong> : deux fils sur lesquels circulent des messages numériques, un fil pour les données et un pour l&rsquo;horloge qui rythme la conversation. Le protocole (la langue parlée sur ces fils) s&rsquo;appelle <strong>SMBus</strong>, cousin industriel de l&rsquo;I²C que connaissent tous les bricoleurs d&rsquo;Arduino. Un fil bleu supplémentaire dans le connecteur du pack porte cette conversation jusqu&rsquo;au robot.</p>
<p>Le robot ne mesure pas la tension de la batterie. Il <em>demande</em> à la jauge : « tu es chargée à combien ? », « quel courant de charge veux-tu ? », « quelle tension ? », « combien de cycles as-tu faits ? ». Et il obéit à ce qu&rsquo;elle répond. Si la jauge dit « 0 % » ou « ne me charge pas », le robot affiche « batterie déchargée », quelle que soit la réalité électrique à trois centimètres de là.</p>
<p>Cette architecture n&rsquo;est pas absurde : une jauge dans le pack connaît l&rsquo;historique des cellules, gère leur équilibrage (maintenir les quatre cellules au même niveau de charge, faute de quoi la plus faible s&rsquo;use en premier), et protège efficacement contre l&rsquo;emballement thermique (la réaction en chaîne qui fait prendre feu une cellule lithium maltraitée). Mais elle a une conséquence : <strong>remplacer les cellules ne remet pas la jauge à zéro.</strong> Le compteur de cycles, la capacité apprise, les drapeaux d&rsquo;erreur (des cases « oui/non » que la puce coche quand elle détecte un problème) — tout ça vit dans la mémoire de la puce, pas dans les cellules. On change le cœur, le cerveau garde ses souvenirs.</p>
<p>Sur les forums, la piste s&rsquo;arrête généralement là. Les puces des packs D3–D7 sont d&rsquo;un fabricant obscur et verrouillées ; pour les bq40z50 « il faut un EV2400 et bqStudio » — l&rsquo;adaptateur officiel de Texas Instruments, 150 €, et son logiciel Windows — et personne ne sait vraiment quelles données le robot vérifie. Fin de l&rsquo;histoire, achetez une batterie.</p>
<details>
<summary>Pour aller au fond : SMBus, SBS et ce que « smart battery » veut dire</summary>
<p>Le <em>Smart Battery System</em> (SBS) est une norme des années 1990, née pour les ordinateurs portables. Une batterie SBS est un périphérique à l&rsquo;<strong>adresse</strong> SMBus <code>0x0B</code> — sur un bus partagé, chaque puce a un numéro pour qu&rsquo;on sache à qui l&rsquo;on parle ; la notation <code>0x…</code> signifie que le nombre est écrit en hexadécimal, en base 16, l&rsquo;habitude des informaticiens — qui répond à une centaine de <strong>commandes</strong> standardisées, chacune désignée par un numéro : <code>0x09</code> tension, <code>0x0A</code> courant, <code>0x0D</code> état de charge relatif (RSOC, le « pourcentage de batterie »), <code>0x10</code> capacité à pleine charge, <code>0x17</code> compteur de cycles, <code>0x14</code> / <code>0x15</code> courant et tension de charge <em>demandés</em>… Ce que renvoie une commande, on l&rsquo;appelle un <strong>registre</strong> : une petite case de mémoire lisible de l&rsquo;extérieur. Un chargeur « intelligent » lit ces deux derniers registres et fournit exactement ce qu&rsquo;on lui demande. À zéro, il ne fournit rien.</p>
<p>Le bq40z50 ajoute par-dessus une commande fourre-tout, <code>ManufacturerBlockAccess</code> (<code>0x44</code>), par laquelle on lit les registres d&rsquo;état internes (statut de sécurité, défauts permanents, état des transistors) et, en accès suffisant, <strong>toute la mémoire flash de configuration</strong> — la mémoire qui survit à l&rsquo;extinction, comme une clé USB —, 8 Ko d&rsquo;adresses <code>0x4000</code> à <code>0x5FFF</code>, où vivent le compteur de cycles, la capacité nominale, les seuils de protection et une cinquantaine d&rsquo;options.</p>
<p>Trois niveaux d&rsquo;accès existent : <em>Sealed</em> (scellé, lecture des registres standards seulement), <em>Unsealed</em> (déverrouillé par une clé de 32 bits) et <em>Full Access</em> (tout, y compris l&rsquo;écriture de la flash, derrière une seconde clé). TI recommande de sceller avant de sortir d&rsquo;usine.</p>
</details>
<h2 id="trois-fils-et-un-esp32-a-deux-euros">Trois fils et un ESP32 à deux euros</h2>
<p>Sauf que le bq40z50 est une puce publiquement documentée. Texas Instruments publie son <em>Technical Reference Manual</em> — le manuel de référence, 250 pages qui décrivent chaque registre, chaque commande, chaque adresse en mémoire (<a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-r2-trm-sluubk0b.pdf">copie locale du PDF</a>, 1,6 Mo). Et le SMBus, n&rsquo;importe quel <strong>microcontrôleur</strong> — un ordinateur complet sur une puce, quelques euros, celui qu&rsquo;on trouve dans une carte Arduino — sait le parler dès qu&rsquo;il a deux broches I²C.</p>
<p>J&rsquo;ai des ESP32-C3 « Super Mini » plein un tiroir : une carte de la taille d&rsquo;un timbre, deux euros pièce, qui se branche en USB et se programme comme un Arduino.</p>
<p><img alt="Le dessous d'un ESP32-C3 Super Mini : de haut en bas les broches 5V, G, 3.3, 4, 3, 2, 1, 0 ; on utilise G, 4 et 5" src="https://pf.olibrio.fr/images/neato/esp32c3-supermini-pinout.jpg" /></p>
<p>Sur la carte du pack, deux <strong>pastilles de test</strong> — des points de contact laissés exprès par le fabricant pour brancher ses appareils de contrôle en fin de chaîne — sont sérigraphiées <strong>DA</strong> et <strong>CL</strong> : <em>data</em> et <em>clock</em>, les deux fils du SMBus. Un fil sur DA, un sur CL, un sur le moins des cellules, et de l&rsquo;autre côté les broches GPIO 4, GPIO 5 (GPIO : les broches d&rsquo;entrée-sortie numérotées d&rsquo;un microcontrôleur) et GND (la masse, le « zéro volt » commun) de l&rsquo;ESP32. Pas de composant à ajouter, pas d&rsquo;alimentation à fournir : la jauge est alimentée par ses cellules et l&rsquo;ESP32 par son USB.</p>
<p><img alt="Schéma de câblage : GPIO 4 de l'ESP32-C3 vers la pastille DA, GPIO 5 vers CL, GND vers le moins des cellules ; C+ à 16,4 V n'est jamais touché" src="https://pf.olibrio.fr/images/neato/cablage-esp32c3-bq40z50.svg" /></p>
<p>Côté logiciel, deux cents lignes en Arduino, écrites avec une IA (Claude) qui a lu le manuel à ma place : on lit les registres standards (tension, courant, état de charge, compteur de cycles, tensions par cellule), puis les registres d&rsquo;état internes — statut de sécurité, défauts permanents, état des transistors de charge et de décharge —, puis on recopie la mémoire flash. <strong>Rien n&rsquo;est écrit sans un ordre explicite.</strong> On écoute.</p>
<details>
<summary>Pour aller au fond : le câblage, les pull-ups et le code</summary>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Pack (carte BMS)</th>
<th>ESP32-C3 Super Mini</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pastille <strong>DA</strong> (SMBus data)</td>
<td>GPIO 4 (SDA)</td>
</tr>
<tr>
<td>Pastille <strong>CL</strong> (SMBus clock)</td>
<td>GPIO 5 (SCL)</td>
</tr>
<tr>
<td>Fil noir (− des cellules, pastille B−)</td>
<td>G (GND)</td>
</tr>
</tbody>
</table></div>
<p>Le SMBus a besoin de résistances de rappel (<em>pull-up</em> : elles tirent doucement chaque ligne vers 3,3 V quand personne ne parle, faute de quoi le signal flotte) sur les deux lignes. Les résistances internes de l&rsquo;ESP32 (≈ 45 kΩ) ont suffi ici à 100 kHz sur dix centimètres de fil ; si la puce ne répond pas au scan I²C, ajouter deux 4,7 kΩ entre chaque ligne et le 3,3 V de l&rsquo;ESP32. La jauge tolère 3,3 V sur ses lignes de bus, on ne relie <strong>jamais</strong> le 3,3 V ni le 5 V de l&rsquo;ESP32 au pack.</p>
<p>Le sketch — c&rsquo;est le nom qu&rsquo;Arduino donne à un programme — (<a href="https://pf.olibrio.fr/assets/neato/bq40z50-reader.cpp"><code>bq40z50-reader.cpp</code></a>, <a href="https://pf.olibrio.fr/assets/neato/platformio.ini"><code>platformio.ini</code></a>) tourne en boucle : toutes les dix secondes, un relevé complet sur le <strong>port série</strong> (le canal texte entre la carte et l&rsquo;ordinateur, lu dans un « moniteur série ») à 115200 bauds (la vitesse de la liaison). Il n&rsquo;écrit dans la jauge que sur trois lettres tapées dans le moniteur : <code>r</code> (redémarrage de la puce), <code>c</code> (compteur de cycles à zéro), <code>C</code> (compteur remis à sa valeur d&rsquo;origine). Tout le reste est de la lecture.</p>
</details>
<h2 id="ce-que-la-puce-a-dit">Ce que la puce a dit</h2>
<p>Première lecture, sur le moniteur série :</p>
<pre><code>Voltage            : 16386 mV
RSOC               : 97 %
RemainingCapacity  : 2343 mAh
FullChargeCapacity : 2437 mAh
DesignCapacity     : 2500 mAh
CycleCount         : 1547
ChargingCurrent    : 0 mA
ChargingVoltage    : 0 mV
Cellules           : 4094 / 4097 / 4100 / 4095 mV
ManufacturerName   : BLUEWAY-
DeviceName         : bq40z50-
ManufactureDate    : 2022-01-09
OperationStatus    : PRES DSG CHG SEC0  -&gt; sécurité : FULL ACCESS
SafetyStatus       : (aucun flag)
PFStatus           : (aucun flag)
</code></pre>
<p>Pour lire ce relevé : mV et mA sont des millivolts et des milliampères (millièmes de volt et d&rsquo;ampère) ; les mAh, milliampères-heures, mesurent une quantité d&rsquo;énergie stockée — 2437 mAh, c&rsquo;est de quoi fournir 2,4 A pendant une heure ; RSOC est le pourcentage de batterie affiché ; <em>FullChargeCapacity</em> est ce que la jauge pense pouvoir stocker aujourd&rsquo;hui, <em>DesignCapacity</em> ce que le pack stockait neuf.</p>
<p>Trois choses sautent aux yeux.</p>
<p><strong>La jauge est en pleine forme.</strong> Aucun défaut de sécurité, aucun défaut permanent, transistors de charge et de décharge passants (les <strong>transistors</strong>, ou FET, sont les interrupteurs électroniques par lesquels la jauge autorise ou coupe la charge et la décharge), état de charge estimé à 97 % — cohérent avec les 4,1 V par cellule. Elle n&rsquo;est pas « déchargée », et elle le sait.</p>
<p><strong>Elle n&rsquo;est même pas verrouillée.</strong> Le niveau de sécurité est <em>FULL ACCESS</em> : le mode le plus permissif de la puce, celui que TI recommande de quitter avant de sortir de l&rsquo;usine. Pas de mot de passe à casser, pas de clé à deviner. Toute la mémoire est lisible et inscriptible. Le fabricant du pack a livré la maison avec les clés sur la porte.</p>
<p><strong>Et pourtant elle dit au robot de ne pas la charger.</strong> <code>ChargingCurrent = 0 mA</code>, <code>ChargingVoltage = 0 mV</code>. Ce sont les deux registres qu&rsquo;un chargeur intelligent lit pour savoir quoi faire. À zéro, ils signifient : « n&rsquo;envoie pas de courant ».</p>
<p>Et le compteur : <strong>1547 cycles</strong>. Un cycle, pour une jauge, c&rsquo;est une décharge cumulée équivalant à une batterie entière — deux demi-décharges font un cycle. Pour une batterie fabriquée en janvier 2022, c&rsquo;est un cycle par jour depuis quatre ans — plausible pour un robot qui passe quotidiennement. C&rsquo;est aussi le nombre que l&rsquo;application m&rsquo;avait reproché.</p>
<details>
<summary>Pour aller au fond : lire les drapeaux d'état</summary>
<p><code>OperationStatus</code> (commande <code>0x44</code> + <code>0x0054</code>) est un mot de 32 <strong>bits</strong> — trente-deux cases valant 0 ou 1, chacune un drapeau. Ceux qui comptent ici : <code>PRES</code> (le robot est détecté), <code>DSG</code> et <code>CHG</code> (transistors de décharge et de charge passants), <code>SEC1:SEC0</code> (niveau de sécurité : <code>01</code> = Full Access, <code>10</code> = Unsealed, <code>11</code> = Sealed), <code>PF</code> (défaut permanent : le pack s&rsquo;est auto-condamné), <code>XCHG</code> / <code>XDSG</code> (charge / décharge interdites), <code>SLEEP</code> (retenez celui-là). <code>SafetyStatus</code> (<code>0x0051</code>) liste les protections actives — surtension, sous-tension, surintensité, température ; <code>PFStatus</code> (<code>0x0053</code>) les défauts permanents, ceux qu&rsquo;aucun redémarrage n&rsquo;efface : cellule ouverte, fusible grillé, déséquilibre irrécupérable. Tout était à zéro.</p>
</details>
<h2 id="dix-sept-mille-lignes-de-manuel-et-un-faux-espoir">Dix-sept mille lignes de manuel, et un faux espoir</h2>
<p>La question devient : <em>pourquoi</em> la jauge refuse-t-elle la charge ? Le manuel TI liste précisément les cas où <code>ChargingVoltage()</code> tombe à zéro : transistor de charge coupé par une protection, température hors plage, défaut permanent, pack déclaré « retiré », surtension du chargeur détectée. On les a tous vérifiés, registre par registre. Aucun n&rsquo;était actif. Température 26 °C, région de température « recommandée », région de tension « haute », tout au vert.</p>
<p>On a aussi exploré une piste séduisante : le bq40z50 possède une fonction de <em>dégradation par compteur de cycles</em>, qui réduit volontairement la tension et le courant de charge à mesure que le pack vieillit — une obsolescence programmée au sens littéral, activable par un bit de configuration. On a lu ce bit dans la mémoire flash. <strong>Il était à zéro.</strong> Neato ne l&rsquo;avait pas activée. La table de charge disait 4,2 V par cellule et 1,5 A dans toutes les plages de température. Sur le papier, la jauge devait annoncer 16,8 V et 1500 mA. Elle annonçait 0 et 0.</p>
<p>Avant d&rsquo;aller plus loin, on a fait ce qu&rsquo;il faut toujours faire avant de toucher à une mémoire qu&rsquo;on ne pourra pas racheter : <strong>une sauvegarde complète.</strong> 8 Ko, 256 blocs de 32 octets (un octet, c&rsquo;est huit bits, la plus petite unité de mémoire), lus un par un et rangés dans un fichier (<a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-df-backup-neato-blueway-20260829.txt">le voici</a>, si le vôtre est le même pack). Si une écriture tourne mal, on peut tout remettre.</p>
<p>Puis on a tenté la chose la plus bête du monde. Le manuel documente une commande <code>0x0041 : Reset</code> — redémarrage de la puce : sa mémoire vive (la mémoire de travail, effacée à chaque redémarrage) est reconstruite depuis la flash, rien n&rsquo;est écrit. L&rsquo;équivalent de « tu as essayé de l&rsquo;éteindre et de le rallumer ? ». Une lettre <code>r</code> envoyée sur le moniteur série, trois secondes d&rsquo;attente :</p>
<pre><code>&gt;&gt;&gt; Envoi MAC 0x0041 Reset
ChargingCurrent    : 1500 mA
ChargingVoltage    : 16800 mV
RSOC               : 97 %
FET DSG ON, FET CHG ON, PF inactif
</code></pre>
<p>Victoire, a-t-on cru. Pack remonté, robot posé sur sa base : plus d&rsquo;erreur, il charge, il annonce qu&rsquo;il est prêt. J&rsquo;ai écrit une première version de ce billet le soir même, avec une conclusion triomphante sur le compteur de cycles dont « le robot ne s&rsquo;était jamais soucié ».</p>
<p><strong>Le lendemain matin, voyant rouge, erreur 4202.</strong></p>
<h2 id="le-symptome-qui-disparait-quand-on-le-regarde">Le symptôme qui disparaît quand on le regarde</h2>
<p>Pack rebranché sur l&rsquo;ESP32. <code>ChargingCurrent : 0 mA</code>, à nouveau. Redémarrage : 1500 mA. Et là, au lieu de crier victoire, on a laissé tourner et on a regardé l&rsquo;horloge.</p>
<p>À 3 secondes : 1500 mA. À 20 secondes : 1500 mA. À 31 secondes : <strong>0 mA</strong> — et dans le même relevé, un drapeau qui n&rsquo;y était pas dix secondes plus tôt : <code>SLEEP</code>. Deux essais, deux relevés complets comparés ligne à ligne : entre 20 et 31 secondes, la <em>seule</em> chose qui change, c&rsquo;est ce drapeau.</p>
<p>La jauge <strong>s&rsquo;endort</strong>. Dès qu&rsquo;il ne circule presque aucun courant (moins de 10 mA, seuil réglé dans sa configuration), elle passe en veille pour économiser ses cellules, et dans cet état elle annonce « courant de charge : 0 ». Le redémarrage ne réparait rien : il la <em>réveillait</em> trente secondes. Sur l&rsquo;établi, avec un ESP32 qui ne consomme rien, elle se rendormait aussitôt. Dans le robot, qui tire quelques centaines de milliampères, elle est éveillée et annonce 1500 mA. Le « ne me charge pas » n&rsquo;a jamais été le problème. C&rsquo;était un mirage de laboratoire.</p>
<p><img alt="Le laboratoire du lendemain : sur un canapé, le pack Neato sous ruban kapton jaune relié par trois fils à un ESP32-C3, lui-même branché en USB à un ordinateur portable dont l'écran affiche les relevés de la jauge" src="https://pf.olibrio.fr/images/neato/labo-canape-esp32-pack.jpg" /></p>
<p><em>Le laboratoire du lendemain matin : un canapé, le pack sous kapton (le ruban adhésif jaune qui isole et résiste à la chaleur), l&rsquo;ESP32 au bout de trois fils, et un terminal qui compare les relevés à dix secondes d&rsquo;intervalle.</em></p>
<p>C&rsquo;est une leçon que je connaissais et que j&rsquo;ai quand même dû réapprendre : quand un symptôme disparaît <em>au moment où on l&rsquo;observe</em>, c&rsquo;est probablement l&rsquo;observation qui l&rsquo;a fait disparaître. Il faut regarder ce qui revient, pas ce qui part.</p>
<details>
<summary>Pour aller au fond : la configuration de veille, et une doc imprécise</summary>
<p>Dans la flash, <code>DA Configuration</code> (<code>0x4A7D</code>) vaut <code>0x001F</code> : quatre cellules, <strong>NR = 1</strong> (pack déclaré non amovible), <strong>IN_SYSTEM_SLEEP = 1</strong> et <strong>SLEEP = 1</strong>. <code>Sleep Current</code> (<code>0x48A3</code>) = 10 mA, <code>Bus Timeout</code> = 5 s. Le TRM (§ 4.12, table des conditions de <code>ChargingVoltage() = 0</code>) ne prévoit la mise à zéro en veille que si <code>FET Options[SLEEPCHG] = 0</code> ; ici <code>FET Options</code> (<code>0x4887</code>) vaut <code>0x7D</code>, donc SLEEPCHG = 1, et le transistor de charge reste d&rsquo;ailleurs bien passant en veille. La mise à zéro de <code>ChargingCurrent()</code> / <code>ChargingVoltage()</code> se produit quand même. Le comportement réel a le dernier mot sur la doc — raison de plus pour mesurer.</p>
<p>Cette configuration est celle d&rsquo;usine, elle n&rsquo;a pas bougé : le robot a toujours vécu avec une jauge qui s&rsquo;endort à la moindre pause. Le Neato la réveille simplement en consommant.</p>
</details>
<h2 id="le-compteur">Le compteur</h2>
<p>Restait le suspect initial, celui que l&rsquo;application avait nommé : <strong>1547 cycles</strong>. La jauge, elle, s&rsquo;en moque — la dégradation par cycles est désactivée, on l&rsquo;a vérifié. Mais le robot lit ce nombre (<code>CycleCount</code>, commande <code>0x17</code>), et un logiciel embarqué (un <strong>firmware</strong> : le programme gravé dans le robot) qui affiche « compteur de charge dépassé » a forcément un seuil quelque part.</p>
<p>Le compteur est une simple valeur sur deux octets en flash, à l&rsquo;adresse <code>0x4340</code>. En Full Access, on l&rsquo;écrit comme on l&rsquo;a lue : une commande de bloc, l&rsquo;adresse, deux octets. On a écrit zéro.</p>
<pre><code>&gt;&gt;&gt; CycleCount SBS avant = 1547 ; écriture DF 0x4340 = 0
&gt;&gt;&gt; relecture 0x4340 : 00 00  (OK)
&gt;&gt;&gt; CycleCount SBS après écriture = 0
</code></pre>
<p>Immédiat, sans redémarrage, aucun drapeau de sécurité levé. Une batterie neuve, aux yeux de qui ne regarde que ce nombre.</p>
<details>
<summary>Pour aller au fond : écrire dans la data-flash</summary>
<p>TRM § 14.1.67 : une écriture flash est un <em>SMBus block write</em> (l&rsquo;envoi d&rsquo;un paquet d&rsquo;octets d&rsquo;un coup) sur la commande <code>0x44</code>, dont le bloc est l&rsquo;adresse de départ (petit-boutiste : l&rsquo;octet de poids faible d&rsquo;abord) suivie de 1 à 32 octets de données. Pour <code>CycleCount = 0</code> : <code>0x44</code>, longueur 4, <code>0x40 0x43 0x00 0x00</code>. On relit ensuite le bloc (block write de l&rsquo;adresse seule, puis block read de <code>0x44</code>, qui renvoie l&rsquo;adresse et 32 octets) pour vérifier. La valeur SBS <code>0x17</code> a suivi sans redémarrage. La commande <code>C</code> du sketch remet <code>0x0B 0x06</code> (1547) si l&rsquo;on veut revenir en arrière.</p>
<p>Ce qu&rsquo;on n&rsquo;a <strong>pas</strong> touché, et pourquoi : <code>Qmax</code> (la capacité chimique des cellules telle que la jauge l&rsquo;a apprise, <code>0x4306…0x430E</code>, cinq fois 2650 mAh) et la table de résistances internes datent des cellules d&rsquo;origine ; <code>Design Capacity</code> (<code>0x48E5</code>) vaut 2500 mAh ; l&rsquo;état de santé que la jauge annonce (<code>FullChargeCapacity / DesignCapacity</code>) oscille donc entre 73 % et 92 % selon l&rsquo;heure. On pourrait tricher en baissant <code>Design Capacity</code>, ou forcer <code>Qmax</code>. On a préféré laisser la jauge réapprendre honnêtement sur des cycles complets — voir ci-dessous. La carte complète de la flash, décodée, est <a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-df-map-neato.md">ici</a>.</p>
</details>
<h2 id="rebondissement">Le rebondissement</h2>
<p>Le 1er septembre au soir, voyant rouge. Erreur 4202. Le robot avait tenu une journée.</p>
<p>Troisième fois que le scénario se joue : on touche au pack, on le rebranche, le robot repart, et le lendemain il s&rsquo;arrête. Le redémarrage de la jauge avait « marché » un soir ; le compteur à zéro, un jour et quelques cycles. Vu de près, ces deux « victoires » ont un point commun qui n&rsquo;est pas la correction : à chaque fois, on a <strong>débranché puis rebranché le pack</strong>. Le robot redémarre, oublie son état « batterie déchargée », réessaie — et retombe sur la même cause, qu&rsquo;on n&rsquo;avait pas trouvée.</p>
<p>Cette fois, avant tout redémarrage, pack sur l&rsquo;ESP32 tel quel. Compteur de cycles : toujours 0. Aucune protection active, aucun défaut permanent, jauge en pleine forme — le même relevé rassurant que le premier soir. Sauf qu&rsquo;on avait appris à se méfier des relevés rassurants, et on est allé lire une zone de la flash qu&rsquo;on n&rsquo;avait jamais décodée : les <strong>données de vie</strong> (<em>Lifetimes</em>), le journal que la jauge tient sur elle-même depuis sa sortie d&rsquo;usine — tensions extrêmes vues par chaque cellule, nombre de fois où chaque protection s&rsquo;est déclenchée, et à quel cycle pour la dernière.</p>
<p>Comparée à la sauvegarde du 29 août, elle disait ceci :</p>
<pre><code>                          29 août      1er septembre
COV (surtension cellule)  6            246   (+240 en trois jours)
Vmax à vie, cellule 4     4213 mV      4293 mV   (seuil COV : 4225)
Fins de charge valides    21813        21813 (aucune depuis le recellage)
Cellules au repos         —            3986 / 3986 / 3995 / 3939 mV
</code></pre>
<p>Deux cent quarante déclenchements de la protection de <strong>surtension</strong> en trois jours, tous sur la cellule 4 — et pas une seule charge menée à son terme. Le pack d&rsquo;origine en avait connu six en quatre ans.</p>
<p>L&rsquo;explication tient en une image. Quatre cellules en série, c&rsquo;est quatre seaux qu&rsquo;on remplit par le même tuyau : si l&rsquo;un est plus petit, il déborde le premier. La cellule 4 de mon jeu de récupération a moins de capacité que les trois autres — au repos elle est la plus basse (3,94 V contre 3,99), et en charge elle est la première à franchir 4,225 V. La jauge fait alors son travail : elle coupe le transistor de charge, attend que la cellule redescende à 4,1 V, rouvre, recoupe une seconde plus tard. Deux cent quarante fois. Le chargeur du robot, lui, voit une charge qui ne se termine jamais ; au bout d&rsquo;un moment, son firmware en tire la seule conclusion qu&rsquo;il connaît : « batterie déchargée », 4202.</p>
<p>Le compteur de cycles n&rsquo;y était pour rien — ou pas pour tout. Pour le pack d&rsquo;origine, on ne le saura pas : j&rsquo;ai changé deux choses à la fois. Ses données de vie, elles, montrent 67 sous-tensions, la dernière au 1547ᵉ cycle ; la cellule à 41 mΩ qui s&rsquo;affaissait en pleine aspiration est une explication au moins aussi bonne que le compteur. Le code 4202 est un fourre-tout.</p>
<p><strong>La nouvelle tentative.</strong> La solution propre, c&rsquo;est de passer les quatre cellules de récupération au testeur, comme les originales, et de remonter un pack avec les quatre cellules les mieux appariées parmi les huit. En attendant, la jauge permet un palliatif sans fer à souder, toujours par les trois fils — et c&rsquo;est ce qu&rsquo;on a fait le soir même :</p>
<ul>
<li><strong>tension de charge abaissée de 4200 à 4100 mV par cellule</strong> : le pack s&rsquo;arrête à 16,4 V au lieu de 16,8 ; la cellule 4 reste sous le seuil de surtension, et on perd environ 10 % d&rsquo;autonomie ;</li>
<li><strong>capacité de référence ramenée à 2100 mAh</strong> (elle était restée à 2500, celle du pack neuf), capacité chimique des cellules alignée dessus ;</li>
<li><strong>jauge remise en mode apprentissage</strong> : ses valeurs apprises (capacité chimique, table de résistances) dataient des cellules de 2022 ; un bit lui dit de tout réapprendre sur les prochains cycles.</li>
</ul>
<p>Redémarrage : la jauge annonce 16 400 mV et 1500 mA, une capacité à pleine charge estimée à 1792 mAh, aucun défaut. Pack refermé, robot sur sa base. Cette fois, on ne crie pas victoire : on attend quelques jours, et on rouvrira le journal de la jauge. Si le compteur de surtensions est toujours à 246, c&rsquo;était ça.</p>
<details>
<summary>Pour aller au fond : les données de vie, et ce qu'on a écrit</summary>
<p>La zone <em>Lifetimes</em> occupe la flash de <code>0x4380</code> à <code>0x43F7</code> (TRM ch. 18) : tensions min/max de chaque cellule (<code>0x4380</code>), puis pour chaque protection un compteur d&rsquo;événements et le compteur de cycles au dernier événement — COV en <code>0x43A0</code>/<code>0x43A2</code>, CUV en <code>0x43A4</code>/<code>0x43A6</code>, etc. —, puis les fins de charge valides (<code>0x43D0</code>), les mises à jour Qmax/Ra (<code>0x43D4</code>…), le temps de fonctionnement. Le seuil COV est en <code>0x494E</code> (4225 mV ici, délai 1 s, recovery 4100 mV en <code>0x4959</code>).</p>
<p>Écritures du 1er septembre, toutes relues après coup : tension de charge par cellule dans les cinq régions de température de l&rsquo;algorithme de charge (<code>0x4A19</code>, <code>0x4A21</code>, <code>0x4A29</code>, <code>0x4A31</code>, <code>0x4A39</code> : 4200 → 4100) ; <em>Design Capacity</em> <code>0x48E5</code> = 2100 mAh et <code>0x48E7</code> = 3024 cWh ; <em>Qmax</em> cellules 1–4 et pack <code>0x4306</code>–<code>0x430E</code> = 2100 ; <em>Qmax Cycle Count</em> <code>0x4310</code> = 0 ; <em>Update Status</em> <code>0x4312</code> = 0x04 (Impedance Track actif, « pas encore appris » : la jauge refera Qmax puis la table Ra sur les prochains cycles, TRM 15.13.8.2 et 6.4.6) ; puis reset <code>0x0041</code>. Vérifié avant d&rsquo;écrire : les drapeaux « pleine charge » (FC/TC) sont posés ici par la terminaison de charge valide (courant sous 130 mA, cellule à moins de 75 mV de la tension de charge), pas par un seuil fixe à 4200 mV — baisser la tension ne les casse pas. Marge sur la cellule 4 : une trentaine de millivolts sous le seuil ; le sketch a une commande pour descendre à 4050 si ça ne suffit pas. Commandes : <code>v</code>/<code>w</code>/<code>V</code> (tension 4100 / 4050 / 4200), <code>d</code>/<code>D</code> (capacité et apprentissage / valeurs d&rsquo;usine).</p>
</details>
<h2 id="ou-on-en-est">Où on en est</h2>
<div class="status">
<p><strong>État au 1er septembre 2026 : en observation.</strong> L&rsquo;erreur 4202 est revenue le 1er septembre après une journée de fonctionnement ; la cause réelle est une cellule de récupération plus faible qui déclenchait la protection de surtension à chaque charge, 240 fois en trois jours (voir <a href="#rebondissement">Le rebondissement</a>). Palliatif appliqué le soir même par les trois fils : tension de charge 4100 mV par cellule, capacité de référence 2100 mAh, jauge en réapprentissage. Le robot est sur sa base ; verdict dans quelques jours, en rouvrant le journal de la jauge — si le compteur de surtensions n&rsquo;a pas bougé, c&rsquo;était ça. Toujours aucune pièce achetée.</p>
</div>
<p>Et puis il y a l&rsquo;épilogue que je n&rsquo;avais pas vu venir. Les quatre cellules <em>d&rsquo;origine</em>, celles que j&rsquo;avais dessoudées au début parce que « la batterie était morte », traînaient sur l&rsquo;établi. Par acquit de conscience, je les ai mesurées : <strong>3,6 V chacune.</strong> Aucune n&rsquo;est en dessous du seuil où une cellule lithium se condamne. Je les ai donc passées au testeur de capacité — un Liitokala Lii-500, un chargeur-analyseur d&rsquo;une trentaine d&rsquo;euros, en mode « NOR TEST » : il charge la cellule à fond, la décharge ensuite à courant constant en comptant les milliampères-heures qui sortent, puis la recharge. C&rsquo;est la seule façon honnête de savoir ce que vaut une cellule : la vider en la chronométrant.</p>
<p>Verdict, sur des cellules données pour <strong>2500 mAh</strong> neuves :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Cellule</th>
<th>Capacité mesurée</th>
<th>Part du nominal</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>1916 mAh</td>
<td>77 %</td>
</tr>
<tr>
<td>B</td>
<td>1912 mAh</td>
<td>76 %</td>
</tr>
<tr>
<td>C</td>
<td>1855 mAh</td>
<td>74 %</td>
</tr>
<tr>
<td>D</td>
<td>1819 mAh</td>
<td>73 %</td>
</tr>
</tbody>
</table></div>
<p>Le testeur donne aussi la <strong>résistance interne</strong> de chaque cellule — la « friction » électrique du chimique, en milliohms (mΩ) : plus elle est élevée, plus la tension s&rsquo;effondre quand le robot tire du courant, et plus la cellule chauffe au lieu de fournir. Trois cellules oscillent entre <strong>16 et 19 mΩ</strong>, ce qui est bon pour des 18650 de cet âge. La quatrième est à <strong>41 mΩ</strong> : plus du double. C&rsquo;est le maillon faible du pack — celui qui s&rsquo;affaisse le premier en pleine aspiration, entraîne les autres vers le seuil de coupure et donc écourte l&rsquo;autonomie bien plus que ses 1819 mAh ne le laissent croire.</p>
<p>Mais aucune n&rsquo;est morte. Après quelque chose comme 1547 cycles, ces cellules rendent encore les trois quarts de leur capacité d&rsquo;origine : une perte normale, celle qu&rsquo;on attend d&rsquo;un lithium arrivé au bout de sa vie annoncée. Concrètement, l&rsquo;autonomie serait passée de la pleine heure et demie à un peu plus d&rsquo;une heure. Un aspirateur un peu moins endurant — pas un aspirateur mort.</p>
<p>C&rsquo;est là que l&rsquo;histoire prend son sens. Le pack qui a déclenché tout ça n&rsquo;était pas défaillant : il était <strong>usé de 25 %</strong>, et quelque chose — un compteur, ou plus probablement sa cellule à 41 mΩ qui s&rsquo;affaissait en pleine aspiration — a décidé que c&rsquo;était fini. Le recellage que j&rsquo;ai fait au premier réflexe n&rsquo;était probablement pas nécessaire, et fait avec des cellules de récupération jamais mesurées, il a ajouté un problème (voir <a href="#rebondissement">Le rebondissement</a>) ; il m&rsquo;aura au moins laissé quatre cellules d&rsquo;origine en état de marche, mesurées, tracées, prêtes à servir de rechange le jour où celles de récupération lâcheront.</p>
<h2 id="ce-que-ca-maurait-coute-il-y-a-trois-ans">Ce que ça m&rsquo;aurait coûté il y a trois ans</h2>
<p>Soyons honnêtes sur la marche que j&rsquo;ai franchie sans la voir.</p>
<p>Il y a trois ans, cette histoire se serait arrêtée au paragraphe « Premier réflexe : les cellules ». Cellules changées, erreur toujours là, multimètre formel : la batterie est bonne. Et ensuite ? Ensuite, un <strong>cul-de-sac</strong>. J&rsquo;aurais cherché sur les forums, trouvé les mêmes fils que tout le monde — « il faut un EV2400 et bqStudio », « la puce est verrouillée », « achetez une batterie » — et j&rsquo;aurais soit acheté, soit rangé le robot dans un placard en attendant un courage qui ne vient jamais.</p>
<p>Car la suite de la démarche, qui tient ici en quelques paragraphes, représente un travail que je n&rsquo;aurais pas pu fournir en soirées de bricoleur. Mettons-le à plat :</p>
<ol>
<li><strong>Identifier la puce</strong> et trouver son manuel : facile.</li>
<li><strong>Lire le manuel</strong> : 250 pages, 17 000 lignes en anglais technique dense, écrites pour des ingénieurs batterie qui en connaissent déjà le vocabulaire. Il ne s&rsquo;agit pas de le survoler : il faut y trouver <em>les</em> trois tables qui disent quand le courant de charge tombe à zéro, la procédure d&rsquo;écriture de la flash, la carte des 400 adresses de configuration, la signification de chaque bit d&rsquo;une dizaine de registres d&rsquo;état.</li>
<li><strong>Apprendre le SMBus</strong> au niveau du protocole (le <em>block read</em>, le <em>block write</em>, la commande <code>0x44</code> et son écho, l&rsquo;auto-incrément d&rsquo;adresse) et écrire un programme qui le parle sans erreur.</li>
<li><strong>Interpréter</strong> un relevé de quarante drapeaux et 8 Ko d&rsquo;octets bruts, en les croisant avec le manuel.</li>
<li><strong>Concevoir les expériences</strong> : le redémarrage, puis — après le faux espoir — l&rsquo;idée de comparer deux relevés complets à dix secondes d&rsquo;intervalle pour isoler <em>la</em> ligne qui change.</li>
<li><strong>Écrire</strong> dans la flash sans rien casser.</li>
</ol>
<p>Pour un développeur compétent qui n&rsquo;est pas ingénieur batterie, c&rsquo;est plusieurs semaines de soirées, avec un vrai risque d&rsquo;abandon au point 2 — et c&rsquo;est exactement là que s&rsquo;arrêtent les fils de forum. Ce n&rsquo;est pas que ce soit <em>difficile</em> au sens intellectuel ; c&rsquo;est que c&rsquo;est <em>long</em>, et que rien ne garantit, au départ, que ces semaines mènent quelque part.</p>
<p>Avec Claude, les points 2 à 6 ont pris deux soirées et une matinée. L&rsquo;IA a absorbé le manuel en quelques secondes, écrit le sketch en une passe, décodé les registres à mesure qu&rsquo;ils arrivaient, proposé le redémarrage, puis — quand le redémarrage a menti — proposé de le refaire en enregistrant tout, et trouvé le drapeau <code>SLEEP</code> dans la comparaison. Ce que je gardais, moi : le fer à souder, le multimètre, les photos, les décisions (« on ne touche pas à Qmax, on laisse apprendre »), et surtout le doute : c&rsquo;est le test d&rsquo;une nuit dans le vrai robot qui a démenti la victoire, pas une lecture de plus.</p>
<p>Deux nuances, pour ne pas en faire un conte. D&rsquo;abord, l&rsquo;IA a co-signé le faux espoir : elle avait la même fausse conclusion que moi le premier soir, parce qu&rsquo;on avait les mêmes données incomplètes. Elle lit vite, elle ne mesure pas à ma place. Ensuite, elle a trouvé une erreur dans le manuel lui-même (la veille qui met le courant à zéro alors que la doc dit le contraire) uniquement parce qu&rsquo;on a <em>mesuré</em> le contraire ; sans l&rsquo;ESP32 branché, elle aurait défendu la doc.</p>
<p>Mais le déplacement est réel, et il me semble important pour la réparation en général : <strong>un savoir qui était enfermé dans un manuel de 250 pages, donc réservé aux professionnels, devient accessible à quelqu&rsquo;un qui sait tenir un fer à souder et poser une question.</strong> Les fabricants comptent, sans le dire, sur le fait que personne ne lira le manuel. Cette hypothèse vient de tomber.</p>
<h2 id="focus-le-bq40z50-la-puce-qui-gere-votre-batterie">Focus : le bq40z50, la puce qui gère votre batterie</h2>
<p>Puisqu&rsquo;on a passé deux jours avec elle, présentons-la. Le bq40z50-R2 est ce que Texas Instruments appelle un <em>battery pack manager</em> : une seule puce, de la taille d&rsquo;un ongle (boîtier QFN de 32 broches, les contacts sont sous le boîtier), qui fait tout ce qu&rsquo;un pack lithium de 1 à 4 cellules en série a besoin de faire. On la trouve dans une grande partie des batteries d&rsquo;ordinateurs portables des dix dernières années, dans des outils électroportatifs, des robots, des drones, des batteries médicales.</p>
<h3 id="ce-quelle-fait">Ce qu&rsquo;elle fait</h3>
<ul>
<li><strong>Jauger</strong> : elle mesure le courant à travers une résistance de mesure (un <em>shunt</em>, quelques milliohms) et la tension de chaque cellule, et en déduit l&rsquo;état de charge par un algorithme maison, <em>Impedance Track</em> : au lieu de simplement compter ce qui entre et sort (ce qui dérive avec le temps), elle <strong>apprend</strong> la capacité chimique réelle des cellules (Qmax) et leur résistance interne à chaque cycle, et corrige en permanence. C&rsquo;est ce qui donne les pourcentages précis des portables récents.</li>
<li><strong>Protéger</strong> : elle intègre l&rsquo;<em>AFE</em> (<em>analog front-end</em> : la partie analogique qui surveille les tensions et les courants en temps réel, indépendamment du logiciel) et pilote directement les transistors de charge et de décharge. Surtension et sous-tension par cellule, surintensité en charge et en décharge, court-circuit, surchauffe et sous-température, chacune avec ses seuils, ses délais et ses conditions de retour à la normale.</li>
<li><strong>Se condamner</strong> : une seconde famille de protections, les <em>défauts permanents</em> (PF), coupe définitivement le pack — au besoin en faisant fondre un <strong>fusible chimique</strong> irréversible — en cas de cellule ouverte, de déséquilibre incorrigible, de transistor grillé ou de trop de surtensions répétées.</li>
<li><strong>Équilibrer</strong> : pendant la charge, elle décharge légèrement les cellules en avance pour que toutes arrivent pleines ensemble.</li>
<li><strong>Se souvenir</strong> : compteur de cycles, températures et tensions extrêmes vues au cours de sa vie (<em>lifetime data</em>), et une <strong>boîte noire</strong> qui enregistre les derniers événements de sécurité avant un défaut permanent — de quoi faire l&rsquo;autopsie d&rsquo;un pack mort.</li>
<li><strong>Parler</strong> : SMBus, tout le standard SBS, plus les commandes du fabricant. Et <strong>s&rsquo;authentifier</strong> : un mécanisme cryptographique (SHA-1 avec une clé secrète) permet à l&rsquo;appareil de vérifier que le pack est d&rsquo;origine. C&rsquo;est ce qui bloque les batteries compatibles sur certains appareils.</li>
</ul>
<h3 id="ses-points-forts">Ses points forts</h3>
<ul>
<li><strong>Complète et documentée.</strong> Tout est dans un seul boîtier, et le manuel décrit tout : c&rsquo;est ce qui a rendu cette enquête possible. Beaucoup de puces concurrentes sont documentées sous accord de confidentialité, ou pas du tout.</li>
<li><strong>Précise.</strong> Impedance Track reste la référence en jauge grand public ; l&rsquo;erreur d&rsquo;estimation descend à 1 % sur un pack bien configuré.</li>
<li><strong>Sûre par construction.</strong> L&rsquo;AFE protège même si le logiciel plante ; les défauts permanents ne se négocient pas.</li>
<li><strong>Ubiquitaire.</strong> Des dizaines de millions d&rsquo;exemplaires dans des packs de portables : les cartes, les fichiers de configuration et les retours d&rsquo;expérience abondent.</li>
<li><strong>Ouvrable.</strong> Le logiciel officiel bqStudio et l&rsquo;adaptateur EV2400 existent, mais comme on l&rsquo;a vu, un microcontrôleur à deux euros suffit à lire, et souvent à écrire.</li>
</ul>
<h3 id="ses-points-faibles">Ses points faibles</h3>
<ul>
<li><strong>Complexe à configurer.</strong> Plus de 400 paramètres en flash. Faire fonctionner correctement Impedance Track demande une « image de référence » (<em>golden image</em>) construite en laboratoire : identification de la chimie des cellules, calibration, cycle d&rsquo;apprentissage complet. Un pack DIY mal configuré jauge mal, et l&rsquo;<em>apprentissage</em> que nous avons choisi prend plusieurs cycles.</li>
<li><strong>La sécurité dépend du fabricant du pack.</strong> TI fournit les serrures ; c&rsquo;est l&rsquo;assembleur qui choisit de les fermer. Le pack Neato a été livré en Full Access. Une batterie de portable de marque, elle, est presque toujours scellée, et sans les clés on ne lit que les registres standards.</li>
<li><strong>La sécurité, à l&rsquo;inverse, peut être un mur.</strong> L&rsquo;authentification SHA-1 et le scellement sont précisément ce qui rend certains packs irréparables : un défaut permanent sur un pack scellé, c&rsquo;est une poubelle, quel que soit l&rsquo;état des cellules.</li>
<li><strong>Pas plus de 4 cellules en série.</strong> Pour un vélo électrique (10 à 13 cellules en série) il faut son grand frère bq40z80 (jusqu&rsquo;à 7 en série) ou une autre architecture.</li>
<li><strong>Difficile à câbler soi-même.</strong> Le boîtier QFN se soude au four ou à l&rsquo;air chaud, pas au fer ; les cartes de développement TI coûtent une centaine d&rsquo;euros. En pratique, le DIY passe par des cartes récupérées.</li>
</ul>
<h3 id="ce-quon-peut-en-faire-hors-neato">Ce qu&rsquo;on peut en faire, hors Neato</h3>
<ul>
<li><strong>Diagnostiquer une batterie de portable avant de la jeter.</strong> Un pack Dell, HP ou Lenovo « mort » contient très souvent un bq40z50 (ou un cousin : bq30z55, bq40z80) et six cellules dont trois vont bien. L&rsquo;ESP32 et le sketch de ce billet lisent l&rsquo;état de santé, le compteur, les défauts, et disent si ce sont les cellules ou la puce. Sur un pack scellé on lit moins, mais on lit.</li>
<li><strong>Réarmer un pack après recellage.</strong> Exactement ce billet : compteur, éventuellement défaut permanent (<code>PFStatus</code> se remet à zéro par commande, en Full Access ou avec la clé), puis cycle d&rsquo;apprentissage.</li>
<li><strong>Construire une « batterie intelligente » pour ses propres projets.</strong> Une carte BMS de récupération avec son bq40z50, quatre cellules 18650 neuves, et l&rsquo;on obtient un pack 14,4 V qui s&rsquo;auto-protège, s&rsquo;équilibre et annonce son pourcentage : pour un robot DIY, une radio de terrain, un onduleur de secours pour un serveur domestique, une lampe de chantier.</li>
<li><strong>Surveiller une batterie à distance.</strong> L&rsquo;ESP32 a le Wi-Fi : le même sketch peut publier tension, courant, température et état de charge en MQTT (un protocole de messages léger, le standard de la domotique) vers Home Assistant ou une base de données. Un pack qui prévient avant de lâcher.</li>
<li><strong>Apprendre.</strong> Le bq40z50 est un cours complet de gestion de batterie lithium, avec un manuel gratuit et une puce qu&rsquo;on trouve dans les poubelles. Tout ce que fait un BMS de voiture électrique, il le fait en petit, et il se laisse regarder faire.</li>
</ul>
<p>Une réserve : tout ceci suppose un pack <strong>ouvert</strong> (non scellé) ou dont on a les clés. Les fabricants de portables scellent ; les fabricants de packs pour robots, outils et jouets, souvent, oublient. Vérifiez avant de vous lancer — c&rsquo;est la première lecture, et elle ne coûte rien.</p>
<h2 id="ce-que-ca-raconte">Ce que ça raconte</h2>
<p>Je ne crois pas que quelqu&rsquo;un, chez Neato ou chez son fournisseur de batteries, ait <em>décidé</em> que ce robot mourrait en 2026. Je crois pire : personne n&rsquo;a décidé qu&rsquo;il <em>vivrait</em>.</p>
<p>Regardez les couches.</p>
<p><strong>Le cloud.</strong> Le robot a été conçu pour ne rien faire sans un serveur. Quand le serveur s&rsquo;éteint, il ne reste que le bouton. Sur les D3 à D7, une communauté a réussi à brancher un ESP32 sur le port série de la carte mère et à rendre aux robots leur autonomie (<a href="https://github.com/vacuula/fang">vacuula/fang</a>, <a href="https://github.com/renjfk/OpenNeato">OpenNeato</a>). Sur les D8 à D10, ce port est <em>verrouillé par mot de passe</em>. Une génération plus tard, la porte a été fermée à clé. Pas pour la sécurité de l&rsquo;utilisateur — pour rien, apparemment, sinon pour qu&rsquo;il n&rsquo;y touche pas.</p>
<p><strong>La batterie authentifiée.</strong> Le robot vérifie l&rsquo;identité du pack. Les forums sont pleins de D5 bloqués après qu&rsquo;on y a inséré une batterie compatible. Le fabricant appelle ça de la sécurité ; c&rsquo;est aussi, très concrètement, un péage sur la pièce d&rsquo;usure numéro un.</p>
<p><strong>Le compteur.</strong> 1547 cycles, et une application qui dit « à remplacer ». Non pas parce que la batterie serait hors d&rsquo;usage — la jauge elle-même la donnait chargée à 97 %, et les cellules d&rsquo;origine, mesurées depuis, rendent encore 73 à 77 % de leur capacité neuve — mais parce qu&rsquo;un nombre a franchi un seuil que personne ne vous montre. Le robot a été mis à l&rsquo;arrêt pour un quart d&rsquo;autonomie en moins.</p>
<p><strong>Et l&rsquo;absence de chemin.</strong> Une puce parfaitement documentée, laissée en accès total, dont le compteur se remet à zéro en une commande. Aucun chemin, dans le produit, ne mène à cette commande. Le diagnostic livré à l&rsquo;utilisateur est « batterie déchargée », qui est faux, et la solution proposée est « acheter », qui est chère.</p>
<p>L&rsquo;obsolescence, ici, n&rsquo;est pas une bombe à retardement programmée par un ingénieur cynique. C&rsquo;est une somme de non-décisions : personne n&rsquo;a budgété la fonction « réinitialiser la batterie », personne n&rsquo;a écrit le message d&rsquo;erreur honnête, personne n&rsquo;a laissé un port ouvert. Chaque choix se justifie individuellement. Leur somme fabrique un déchet de 600 € avec une batterie chargée dedans.</p>
<p>La bonne nouvelle, c&rsquo;est que les mêmes non-décisions laissent des failles. La puce n&rsquo;a pas été verrouillée. Le fabricant du pack a laissé ses pastilles de test. TI publie son manuel. Et un microcontrôleur à deux euros, plus une IA qui accepte de lire 17 000 lignes de documentation sans se plaindre, suffisent à s&rsquo;engouffrer dedans.</p>
<p>À partir du 18 février 2027, l&rsquo;article 11 du <a href="https://eur-lex.europa.eu/eli/reg/2023/1542/oj">règlement européen sur les batteries</a> (<a href="https://pf.olibrio.fr/assets/neato/refs/eu-regulation-2023-1542-article-11.md">extrait local</a>) imposera que les batteries portables des appareils soient « <em>readily removable and replaceable by the end-user</em> ». C&rsquo;est un progrès. Mais cette histoire montre que « remplaçable » ne suffit pas : ma batterie <em>était</em> remplaçable, et c&rsquo;est précisément le remplacement qu&rsquo;on me vendait comme seule issue. Ce qu&rsquo;il faudrait exiger, c&rsquo;est que les objets <strong>disent la vérité sur leur état</strong>, et qu&rsquo;ils laissent un chemin pour le corriger. Un bouton « réinitialiser la batterie » dans une application, ça coûte une après-midi de développement. Le silence, lui, coûte une batterie à chaque client.</p>
<h2 id="pour-reproduire">Pour reproduire</h2>
<p><strong>Matériel</strong> : un ESP32-C3 Super Mini (ou n&rsquo;importe quel ESP32/Arduino avec I²C), trois fils, un fer à souder, éventuellement deux résistances de 4,7 kΩ. Le pack doit être ouvert au niveau de sa carte électronique — la gaine est collée, un cutter la fend sans forcer.</p>
<p><strong>Sécurité</strong> : les cellules restent connectées pendant toute l&rsquo;opération. <strong>Pas d&rsquo;outil métallique près des pastilles C+ et C−</strong>, qui portent 16 V et plusieurs dizaines d&rsquo;ampères de court-circuit possible. Pas de bracelet, pas de bague. Les pastilles DA et CL, elles, sont à 3,3 V et ne risquent rien.</p>
<p><img alt="L'autre face de la carte du pack : les pastilles de test T1, T3, T6, T7 et HEAT, le fil rouge du plus et le fil noir du moins" src="https://pf.olibrio.fr/images/neato/pack-bplus-bminus.jpg" /></p>
<p><em>L&rsquo;autre face de la carte : on n&rsquo;y touche pas, mais elle montre que le fabricant a prévu bien plus de points de test que les deux qui nous intéressent.</em></p>
<p><strong>Câblage</strong> :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Pack (carte BMS)</th>
<th>ESP32-C3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pastille <strong>DA</strong></td>
<td>GPIO 4 (SDA)</td>
</tr>
<tr>
<td>Pastille <strong>CL</strong></td>
<td>GPIO 5 (SCL)</td>
</tr>
<tr>
<td>Fil noir (− cellules)</td>
<td>G (GND)</td>
</tr>
</tbody>
</table></div>
<p><strong>Logiciel</strong> : <a href="https://pf.olibrio.fr/assets/neato/bq40z50-reader.cpp"><code>bq40z50-reader.cpp</code></a> et <a href="https://pf.olibrio.fr/assets/neato/platformio.ini"><code>platformio.ini</code></a> (PlatformIO est l&rsquo;outil qui compile et téléverse le programme ; cadre Arduino, cible <code>esp32-c3-devkitm-1</code>). Moniteur série à 115200 bauds. Les registres essentiels, à l&rsquo;adresse SMBus <code>0x0B</code> :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Registre</th>
<th>Contenu</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0x09</code> / <code>0x0A</code></td>
<td>tension / courant du pack</td>
</tr>
<tr>
<td><code>0x0D</code></td>
<td>état de charge (RSOC, %)</td>
</tr>
<tr>
<td><code>0x10</code> / <code>0x18</code></td>
<td>capacité à pleine charge / capacité nominale</td>
</tr>
<tr>
<td><code>0x14</code> / <code>0x15</code></td>
<td>courant / tension de charge demandés (0 en veille : normal)</td>
</tr>
<tr>
<td><code>0x17</code></td>
<td>compteur de cycles</td>
</tr>
<tr>
<td><code>0x3C</code>–<code>0x3F</code></td>
<td>tensions des cellules 4 à 1</td>
</tr>
<tr>
<td><code>0x44</code> + <code>0x0054</code></td>
<td>OperationStatus (sécurité, FETs, PF, SLEEP)</td>
</tr>
<tr>
<td><code>0x44</code> + <code>0x0053</code></td>
<td>PFStatus (défauts permanents)</td>
</tr>
<tr>
<td><code>0x00</code> ← <code>0x0041</code></td>
<td>redémarrage de la jauge</td>
</tr>
<tr>
<td><code>0x44</code> ← <code>0x40 0x43</code> + 2 octets</td>
<td>écriture du compteur de cycles (flash <code>0x4340</code>)</td>
</tr>
<tr>
<td><code>0x44</code> ← <code>0x80 0x43</code> … <code>0xE0 0x43</code></td>
<td>lecture des données de vie (flash <code>0x4380</code>–<code>0x43FF</code>) : compteurs COV/CUV, fins de charge</td>
</tr>
<tr>
<td><code>0x44</code> ← <code>0x19 0x4A</code> + 2 octets (×5)</td>
<td>tension de charge par cellule (flash <code>0x4A19</code>…<code>0x4A39</code>)</td>
</tr>
</tbody>
</table></div>
<p><strong>Dans l&rsquo;ordre</strong> : (1) brancher, lire, vérifier que <code>DeviceType</code> répond <code>0x4500</code> et que le niveau de sécurité est Full Access — sinon il faudra les clés du fabricant, et ce billet ne les a pas ; (2) sauvegarder la flash (le sketch le fait au démarrage) et mettre le fichier à l&rsquo;abri ; (3) lire <code>PFStatus</code> et <code>SafetyStatus</code> — un défaut permanent est une autre histoire ; (4) lire les données de vie (<code>0x4380</code>…) et les comparer à la sauvegarde après quelques jours dans le robot : un compteur COV ou CUV qui grimpe désigne une cellule, pas un compteur ; (5) seulement alors, taper <code>c</code> — et attendre plusieurs jours avant de conclure.</p>
<p>Trois règles, si vous vous y mettez : lire d&rsquo;abord, tout sauvegarder ensuite, n&rsquo;écrire qu&rsquo;en dernier. Une jauge en <em>Full Access</em> se laisse aussi bien réparer que détruire.</p>
<h2 id="questions-frequentes">Questions fréquentes</h2>
<h3 id="que-signifie-lerreur-4202-sur-un-neato">Que signifie l&rsquo;erreur 4202 sur un Neato ?</h3>
<p>C&rsquo;est l&rsquo;erreur « batterie déchargée » des D8, D9, D10 et D800. L&rsquo;application (quand elle fonctionnait) précisait que le compteur de charge de la batterie était dépassé et qu&rsquo;il fallait la remplacer. Elle apparaît même avec des cellules en parfait état : ce qui la déclenche, c&rsquo;est ce que la puce du pack raconte au robot — en particulier, d&rsquo;après ce que nous avons observé, un compteur de cycles trop élevé.</p>
<h3 id="changer-les-cellules-du-pack-regle-t-il-lerreur-4202">Changer les cellules du pack règle-t-il l&rsquo;erreur 4202 ?</h3>
<p>Pas à lui seul. Le compteur de cycles et l&rsquo;état de santé vivent dans la puce bq40z50 du pack, pas dans les cellules. Après recellage, l&rsquo;erreur persistait chez moi avec des cellules à 4,1 V.</p>
<h3 id="faut-il-un-ev2300ev2400-et-bqstudio-pour-parler-a-la-jauge">Faut-il un EV2300/EV2400 et bqStudio pour parler à la jauge ?</h3>
<p>Non. Un ESP32 (ou un Arduino) avec deux broches I²C, trois fils et le manuel TI suffisent : la puce est documentée, et sur les packs Neato que j&rsquo;ai vus elle est laissée en Full Access, sans mot de passe. bqStudio est plus confortable, pas nécessaire.</p>
<h3 id="une-batterie-compatible-du-commerce-resout-elle-le-probleme">Une batterie compatible du commerce résout-elle le problème ?</h3>
<p>Parfois, et parfois le robot la refuse — les forums documentent des D5 bloqués après l&rsquo;insertion d&rsquo;un pack compatible. Avant d&rsquo;acheter, il coûte une soirée de vérifier que la batterie d&rsquo;origine n&rsquo;est pas simplement passée un seuil de cycles.</p>
<h3 id="est-ce-dangereux">Est-ce dangereux ?</h3>
<p>Les lignes DA et CL sont à 3,3 V et sans risque. Le danger est ailleurs : les pastilles C+/C− et B+/B− à 16 V, capables de dizaines d&rsquo;ampères en court-circuit. Un seul outil métallique à la fois, pas de bijoux, et on ne touche à rien d&rsquo;autre que DA, CL et le moins.</p>
<h3 id="pourquoi-la-jauge-annonce-t-elle-0-ma-de-courant-de-charge">Pourquoi la jauge annonce-t-elle 0 mA de courant de charge ?</h3>
<p>Parce qu&rsquo;elle dort. Dès que le courant passe sous 10 mA pendant une trentaine de secondes, elle entre en veille et met ChargingCurrent et ChargingVoltage à zéro. Dans le robot, qui consomme en permanence, elle reste éveillée. Ce n&rsquo;est pas une panne, et un redémarrage ne « répare » rien : il la réveille trente secondes.</p>
<h3 id="est-ce-que-ca-marche-sur-un-d3-d4-d5-d6-ou-d7">Est-ce que ça marche sur un D3, D4, D5, D6 ou D7 ?</h3>
<p>Les packs de ces générations utilisent une puce différente, verrouillée, et les recherches communautaires n&rsquo;ont pas abouti. En revanche, leur port série est ouvert, et vacuula/fang ou OpenNeato rendent à ces robots leur autonomie sans le cloud.</p>
<h3 id="peut-on-reutiliser-la-puce-bq40z50-dune-vieille-batterie-dans-un-autre-projet">Peut-on réutiliser la puce bq40z50 d&rsquo;une vieille batterie dans un autre projet ?</h3>
<p>Oui, si le pack n&rsquo;est pas scellé ou si l&rsquo;on a ses clés. Une carte BMS de récupération avec ses cellules remplacées fait une batterie intelligente 1S à 4S pour un robot, une radio ou un onduleur DIY ; un ESP32 branché dessus peut publier son état en MQTT vers la domotique. Voir la section « Focus : le bq40z50 ».</p>
<h3 id="qua-fait-lia-exactement-et-qua-fait-lhumain">Qu&rsquo;a fait l&rsquo;IA exactement, et qu&rsquo;a fait l&rsquo;humain ?</h3>
<p>Claude a lu le manuel de 250 pages, écrit le programme de lecture, décodé les registres, proposé le redémarrage puis l&rsquo;expérience de comparaison qui a révélé le mode veille, et rédigé ce billet avec moi. J&rsquo;ai soudé, mesuré, photographié, décidé de ne pas toucher à Qmax, et laissé le robot passer une nuit sur sa base — ce qui a démenti la première conclusion, la sienne comme la mienne.</p>
<h3 id="le-robot-est-il-repare">Le robot est-il réparé ?</h3>
<p>Pas encore de façon certaine. La remise à zéro du compteur (30 août) lui a rendu une journée, puis l&rsquo;erreur 4202 est revenue : la cause réelle était une cellule de récupération plus faible qui déclenchait la protection de surtension à chaque charge. Correctif appliqué le 1er septembre (tension de charge 4100 mV par cellule, réapprentissage de la jauge), en observation. Toujours aucune pièce achetée. Voir <a href="#ou-on-en-est">Où on en est</a>.</p>
<h2 id="petit-glossaire">Petit glossaire</h2>
<ul>
<li><strong>Cellule</strong> : l&rsquo;accumulateur élémentaire, ici au format 18650 (18 mm × 65 mm). Un pack en assemble plusieurs.</li>
<li><strong>BMS</strong> (<em>battery management system</em>) : la carte électronique du pack, qui protège, équilibre et jauge les cellules. Ici, elle est construite autour du bq40z50.</li>
<li><strong>Jauge (gas gauge)</strong> : la puce qui compte ce qui entre et sort de la batterie et en déduit l&rsquo;état de charge.</li>
<li><strong>Puce / circuit intégré</strong> : un ordinateur ou un circuit complet gravé sur quelques millimètres de silicium.</li>
<li><strong>Microcontrôleur</strong> : un petit ordinateur complet sur une puce, programmable ; l&rsquo;ESP32-C3 en est un.</li>
<li><strong>Bus série / SMBus / I²C</strong> : deux fils (données et horloge) sur lesquels des puces échangent des messages numériques ; SMBus est la variante utilisée par les batteries.</li>
<li><strong>Adresse, registre, commande</strong> : le numéro d&rsquo;une puce sur le bus, une case de mémoire qu&rsquo;on peut lire, le numéro qui la désigne. <code>0x…</code> : nombre écrit en hexadécimal.</li>
<li><strong>Bit, octet</strong> : la case élémentaire (0 ou 1) et le groupe de huit ; un <strong>drapeau</strong> est un bit qui signale un état.</li>
<li><strong>Firmware</strong> : le programme gravé dans un appareil. <strong>Flash</strong> : la mémoire qui survit à l&rsquo;extinction ; <strong>mémoire vive</strong> : celle de travail, effacée au redémarrage.</li>
<li><strong>Cycle</strong> : une décharge cumulée équivalant à 90 % de la capacité (seuil réglable). Le compteur ne fait qu&rsquo;additionner.</li>
<li><strong>RSOC</strong> : état de charge relatif, le « pourcentage de batterie » ; <strong>FCC</strong> : capacité à pleine charge, telle que la jauge l&rsquo;estime ; <strong>Qmax</strong> : capacité chimique apprise des cellules ; <strong>mAh</strong> : milliampère-heure, unité de quantité d&rsquo;énergie stockée.</li>
<li><strong>Résistance interne</strong> : la « friction » électrique d&rsquo;une cellule, en milliohms (mΩ). Plus elle est haute, plus la tension chute sous charge et plus la cellule chauffe ; elle monte avec l&rsquo;âge et trahit une cellule fatiguée avant que sa capacité ne s&rsquo;effondre.</li>
<li><strong>FET / transistor</strong> : interrupteur électronique par lequel la jauge autorise ou coupe la charge et la décharge.</li>
<li><strong>Pull-up</strong> : résistance qui maintient une ligne de bus à 3,3 V quand personne ne parle.</li>
<li><strong>PF (Permanent Failure)</strong> : un défaut que la jauge juge irrécupérable ; elle se condamne et rien ne l&rsquo;efface. Il n&rsquo;y en avait pas.</li>
<li><strong>COV / CUV (Cell Over-/Under-Voltage)</strong> : protections de surtension et de sous-tension par cellule. La jauge coupe la charge (COV) ou la décharge (CUV), rouvre quand la tension revient dans la plage, et compte chaque déclenchement dans ses données de vie.</li>
<li><strong>Impedance Track</strong> : l&rsquo;algorithme de TI qui apprend la capacité et la résistance des cellules pour jauger précisément.</li>
<li><strong>Full Access / Unsealed / Sealed</strong> : les trois niveaux d&rsquo;accès à la puce, du plus ouvert au plus fermé.</li>
</ul>
<hr />
<h2 id="references-et-copies-locales">Références et copies locales</h2>
<p>Pour que ce billet reste utile quand les liens auront disparu, les documents cités sont hébergés ici, avec leur source d&rsquo;origine.</p>
<ul>
<li><strong>TI bq40z50-R2 Technical Reference Manual</strong>, SLUUBK0B (juin 2017, rév. octobre 2018) — <a href="https://www.ti.com/lit/pdf/sluubk0">source</a> · <a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-r2-trm-sluubk0b.pdf">copie locale (PDF, 1,6 Mo)</a>.</li>
<li><strong>Carte de la data-flash du pack Neato, décodée</strong> — <a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-df-map-neato.md">bq40z50-df-map-neato.md</a> · <strong>sauvegarde brute</strong> du 29 août 2026 — <a href="https://pf.olibrio.fr/assets/neato/refs/bq40z50-df-backup-neato-blueway-20260829.txt">bq40z50-df-backup-neato-blueway-20260829.txt</a>.</li>
<li><strong>Le sketch et sa configuration</strong> — <a href="https://pf.olibrio.fr/assets/neato/bq40z50-reader.cpp">bq40z50-reader.cpp</a> · <a href="https://pf.olibrio.fr/assets/neato/platformio.ini">platformio.ini</a>.</li>
<li><strong>Neato Robotics, « Announcement – 6th Oct 2025 »</strong> (fin des services cloud) — <a href="https://support.neatorobotics.com/support/solutions/articles/204000073686-announcement-6th-oct-2025">source</a> · <a href="https://pf.olibrio.fr/assets/neato/refs/neato-announcement-2025-10-06.md">copie texte</a>.</li>
<li><strong>Règlement (UE) 2023/1542 sur les batteries</strong>, article 11 (applicable au 18 février 2027) — <a href="https://eur-lex.europa.eu/eli/reg/2023/1542/oj">source EUR-Lex</a> · <a href="https://pf.olibrio.fr/assets/neato/refs/eu-regulation-2023-1542-article-11.md">extrait local</a>.</li>
<li><strong>vacuula/fang</strong> (firmware ESP32 libérant les Neato D3–D7 du cloud) — <a href="https://github.com/vacuula/fang">source</a> · <a href="https://pf.olibrio.fr/assets/neato/refs/vacuula-fang-README-20260830.md">README du 30 août 2026</a>.</li>
<li><strong>renjfk/OpenNeato</strong> — <a href="https://github.com/renjfk/OpenNeato">source</a> · <a href="https://pf.olibrio.fr/assets/neato/refs/renjfk-OpenNeato-README-20260830.md">README du 30 août 2026</a>.</li>
<li><strong>Fil laptopu.ro sur les puces des packs Neato</strong> (accès Full Access via bqStudio) — <a href="https://www.laptopu.ro/community/laptop-battery-chip-reset-and-repair/robot-neato-battery-nlba-reads-it-but-can-not-recognize-chip/">source</a> (pas de copie : le site refuse l&rsquo;archivage).</li>
</ul>
<p><em>Photos et mesures : les miennes. Lecture du manuel, code et rédaction : avec Claude. Ce billet est aussi disponible en <a href="https://pf.olibrio.fr/posts/erreur-4202-neato-obsolescence.md">Markdown brut</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Le feu, le modèle, et ce qu’une autre politique aurait changé</title>
      <link>https://pf.olibrio.fr/posts/ce-quune-autre-politique-aurait-change.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/ce-quune-autre-politique-aurait-change.html</guid>
      <pubDate>Tue, 28 Jul 2026 12:00:00 +0000</pubDate>
      <description>Six jours de mégafeu en Gironde et dans les Landes, un modèle qui apprend à représenter la lutte, et une question qui fâche : qu’aurait changé une autre politique ?</description>
      <category>incendie</category>
      <category>gironde</category>
      <category>landes</category>
      <category>simulation</category>
      <category>lutte</category>
      <category>politique</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/kokusho/boucle-25-juillet.png" alt="Le feu, le modèle, et ce qu’une autre politique aurait changé"></p>
<p>Le <a href="https://pf.olibrio.fr/posts/mon-modele-faisait-bruler-latlantique.html">premier billet</a> racontait la construction de l&rsquo;outil et se terminait sur son enseignement le plus inconfortable : le modèle ne prévoit pas ce que l&rsquo;incendie va faire, il prévoit ce qu&rsquo;il ferait <em>si personne ne s&rsquo;y opposait</em>. L&rsquo;écart entre les deux &mdash; un facteur 1,7 le jour où le feu courait librement, un facteur 12 le jour où les secours tenaient le front &mdash; c&rsquo;est la lutte, et le modèle ne la représentait pas du tout.</p>
<p>Ce billet raconte quatre choses : ce que le feu a fait depuis, ce que le modèle a appris en essayant de représenter les secours, ce que la lutte réelle doit à une armée que personne ne budgète &mdash; les habitants et les agriculteurs &mdash;, et ce que ce modèle permet de dire &mdash; prudemment &mdash; sur une question politique qu&rsquo;on m&rsquo;a posée : <strong>si le programme de l&rsquo;Avenir en commun avait été appliqué depuis deux mandats, qu&rsquo;est-ce que ça aurait changé sur un épisode comme celui-là ?</strong></p>
<p><strong>Comment on note un modèle sur le passé</strong> &mdash; trois termes qui reviendront tout du long. Le <strong>rejeu rétrospectif</strong> : on se replace à un instant passé, on ne donne au modèle que ce qui était connu à ce moment-là, on simule vers l&rsquo;avant, et on compare au réel. Le <strong>biais de surface</strong> : le rapport entre la surface prédite et la surface observée &mdash; un biais de 7,5 veut dire que le modèle fait brûler sept fois et demie trop. L&rsquo;<strong>AUC</strong> : tirez au hasard une cellule qui a brûlé et une qui n&rsquo;a pas brûlé ; l&rsquo;AUC est la probabilité que le modèle ait donné un score plus élevé à la première. À 0,95, il se trompe rarement sur le <em>où</em> &mdash; même quand il se trompe lourdement sur le <em>combien</em>.</p>
<hr />
<h3 id="six-jours-quarante-cinq-mille-hectares">Six jours, quarante-cinq mille hectares</h3>
<p>D&rsquo;abord les faits, parce qu&rsquo;ils donnent l&rsquo;échelle. Le feu principal n&rsquo;est pas parti de Biscarrosse : il est parti le <strong>22 juillet</strong> à Saumos, en Gironde, d&rsquo;un chantier de débroussaillage &mdash; 1 400 hectares le soir même. Celui de Biscarrosse, une camionnette en feu, a suivi le lendemain. À partir de là, les journées se comptent en dizaines de milliers d&rsquo;hectares :</p>
<ul>
<li><strong>24 juillet</strong> &mdash; 19 000 ha en Gironde, 110 000 personnes évacuées, dont la presqu&rsquo;île du Cap Ferret par la terre <em>et par la mer</em> ;</li>
<li><strong>25 juillet</strong> &mdash; plus de 32 000 ha, 167 000 évacués, premier largage de retardant &mdash; un produit qui ne s&rsquo;évapore pas comme l&rsquo;eau mais tapisse la végétation pour la rendre ininflammable &mdash; par un A400M de l&rsquo;armée de l&rsquo;air ;</li>
<li><strong>26 juillet</strong> &mdash; 42 000 ha, cinq communes aux portes de Bordeaux évacuées par FR-Alert : environ <strong>220 000 personnes déplacées au total</strong>, une des plus grandes évacuations françaises en temps de paix ;</li>
<li><strong>27-28 juillet</strong> &mdash; accalmie, pare-feux élargis au bulldozer, feu « contenu mais pas fixé », puis « stabilisé »&hellip; et une nouvelle vague de chaleur annoncée par Météo-France.</li>
</ul>
<p><a href="https://pf.olibrio.fr/images/kokusho/chronologie-2026.svg" title="Ouvrir le graphique en grand"><img alt="Graphique en barres de la surface totale parcourue, jour par jour du 22 au 28 juillet 2026 : 1 400 hectares le 22, 4 800 le 23, 21 600 le 24 avec l'évacuation du Cap Ferret par terre et mer, 35 500 le 25 avec le premier largage d'A400M, 45 500 le 26 avec FR-Alert et environ 220 000 évacués au total, puis stabilisation les 27 et 28, sous l'annonce d'une nouvelle canicule" src="https://pf.olibrio.fr/images/kokusho/chronologie-2026.svg" /></a></p>
<p>Cliquez sur les figures pour les ouvrir en grand.</p>
<p>Au dernier bilan que j&rsquo;ai pu sourcer : 42 000 ha en Gironde, 3 500 dans les Landes, 88 sapeurs-pompiers blessés, plus de 2 750 pompiers et près de 3 000 gendarmes et militaires engagés, des renforts européens (Canadairs croates, Air Tractors portugais, hélicoptères lourds tchèque et slovaque), un drone Reaper pour la cartographie thermique. EDF a indiqué que le Blayais, à une cinquantaine de kilomètres des flammes, n&rsquo;est pas menacé &mdash; la question qui avait lancé tout ce projet a donc, pour l&rsquo;instant, une réponse rassurante. Le Laser Mégajoule du CEA, lui, a vu des pare-feux creusés en urgence autour de son site.</p>
<p>📡 Côté outil : la carte <a href="https://kokusho.ss2i.ca">kokusho.ss2i.ca</a> suit toujours les deux foyers. Ce matin, le modèle a fait passer la base aérienne de Cazaux en vigilance renforcée face au foyer secondaire &mdash; le front observé est à 7,3 km et un tiers des scénarios <em>sans lutte</em> atteignent la zone des 6 km sous 48 h. Précision d&rsquo;honnêteté : aucune source de presse ne documente de menace sur Cazaux ; c&rsquo;est une sortie de modèle, et une sortie <em>contrefactuelle</em>. C&rsquo;est exactement la nuance que ce billet va passer son temps à faire.</p>
<hr />
<h3 id="ce-qui-a-marche-dans-le-modele">Ce qui a marché dans le modèle</h3>
<p>Depuis le premier billet, le modèle a passé deux épreuves et gagné un étage.</p>
<p><strong>Première épreuve : l&rsquo;hypothèse du manque de combustible.</strong> La sur-prédiction du 25 juillet (facteur 12) avait une explication concurrente de la lutte : le feu était peut-être simplement coincé entre l&rsquo;océan, les étangs et sa propre cicatrice, sans plus rien à brûler. Le test est simple et je le recommande à tous les modélisateurs : regarder <em>où</em> le modèle fait brûler ses hectares excédentaires. Verdict sans appel &mdash; <strong>94 % de la surface prédite tombe sur de la pinède intacte</strong> que le vrai feu n&rsquo;a jamais touchée. Le combustible était là. Le feu ne l&rsquo;a pas pris. Ce qui l&rsquo;en a empêché, c&rsquo;est bien la lutte, et il fallait la modéliser.</p>
<p><strong>Deuxième épreuve : deux tentatives de modèle de lutte, deux échecs instructifs.</strong> La première tirait au sort, cellule par cellule, si les secours tenaient : il aurait fallu gagner 93 % des escarmouches, on en gagnait 15 %. La seconde tenait des tronçons de piste entiers &mdash; une trentaine de kilomètres tenus&hellip; que le feu contournait tranquillement. La leçon vaut la peine d&rsquo;être écrite en gras : <strong>on ne contient pas un incendie en tenant beaucoup de ligne, on le contient en tenant une boucle fermée</strong>, ancrée sur des barrières que le feu ne franchit pas. Le confinement est un problème de topologie, pas de physique locale.</p>
<p><strong>L&rsquo;étage gagné : modéliser le raisonnement du commandant.</strong> Trouver la meilleure boucle fermée autour d&rsquo;un feu, en s&rsquo;appuyant au maximum sur l&rsquo;eau, les zones déjà brûlées et les routes existantes, est un problème que les mathématiques savent résoudre exactement, et l&rsquo;idée se raconte sans équation. Tout chemin qui mène du feu à l&rsquo;extérieur doit traverser la ligne de défense &mdash; sinon la boucle n&rsquo;est pas fermée, et le feu trouvera le trou. Chercher la meilleure boucle, c&rsquo;est donc chercher l&rsquo;ensemble de cellules <em>le moins cher à tenir</em> qui coupe <em>tous</em> les chemins : c&rsquo;est ce qu&rsquo;on appelle une <strong>coupe minimale</strong>. Un théorème classique &mdash; <a href="https://doi.org/10.4153/CJM-1956-045-5">Ford et Fulkerson, 1956</a> &mdash; dit que cette coupe se calcule en résolvant un problème d&rsquo;écoulement : imaginez qu&rsquo;on essaie de pousser un fluide du feu vers l&rsquo;extérieur, chaque cellule laissant passer un débit égal à son coût de défense ; le débit maximal qui parvient à s&rsquo;écouler est <em>exactement</em> le prix de la meilleure barrière, et les cellules qui saturent <em>sont</em> la barrière. C&rsquo;est ce que calcule l&rsquo;algorithme de Dinitz, implémenté dans <a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csgraph.maximum_flow.html">SciPy</a>. L&rsquo;eau est gratuite, une piste coûte moitié prix, la pinède ouverte coûte plein tarif &mdash; et chaque kilomètre est facturé selon la probabilité qu&rsquo;une équipe puisse réellement le tenir, d&rsquo;après les seuils opérationnels documentés : en dessous de 2 000 kW par mètre de front, l&rsquo;attaque directe est possible ; au-delà de 10 000, <em>rien ne tient</em>, aérien compris.</p>
<p><strong>Intensité de Byram</strong> (Byram, 1959) : la puissance dégagée par mètre linéaire de front, en kW/m &mdash; le produit du pouvoir calorifique du végétal, de la masse consumée par mètre carré et de la vitesse d&rsquo;avancée du front. C&rsquo;est la grandeur qui décide de tout : une pinède landaise qui court à 600 m/h dégage environ 6 000 kW/m &mdash; déjà hors de portée d&rsquo;une attaque directe au sol. La hauteur des flammes s&rsquo;en déduit presque directement (environ 4 m ici).</p>
<p><strong>Deux détails de mise en œuvre</strong>, pour qui voudrait refaire le calcul. D&rsquo;abord, les algorithmes de flot font porter les capacités par les <em>liaisons</em> entre cases, alors qu&rsquo;ici c&rsquo;est la case elle-même qu&rsquo;on achète : on dédouble donc chaque case en une « entrée » et une « sortie » reliées par un arc interne au prix de la case &mdash; la technique dite du <em>node splitting</em> (Ahuja, Magnanti &amp; Orlin, <em>Network Flows</em>, 1993, § 2.4). Ensuite, la coupe doit séparer les cases en comptant leurs <em>huit</em> voisines, diagonales comprises &mdash; le « voisinage de Moore » des automates cellulaires &mdash; parce que le feu se propage aussi en diagonale : une barrière qui ne bloque que les quatre voisines cardinales laisse le feu se faufiler entre deux cases posées en quinconce.</p>
<p><a href="https://pf.olibrio.fr/images/kokusho/coupe-minimale.svg" title="Ouvrir le schéma en grand"><img alt="Schéma de principe du confinement comme coupe minimale. Au centre, la cicatrice déjà parcourue et le front actif, entourés d'une bande de retrait concédée d'avance. La boucle de défense s'appuie sur un étang à l'ouest, coût nul, suit une piste DFCI au sud, moitié prix, et traverse la pinède ailleurs, plein tarif. Au nord-est, une brèche : un arc perdu ou jamais financé, par lequel une langue de feu s'échappe" src="https://pf.olibrio.fr/images/kokusho/coupe-minimale.svg" /></a></p>
<p>La boucle du commandant, en principe : chaque nature de terrain a son prix, et la coupe la moins chère qui ferme le tour <em>est</em> la stratégie.</p>
<p>La mise au point a été une leçon d&rsquo;humilité par itérations, chacune payée d&rsquo;un rejeu rétrospectif d&rsquo;une vingtaine de minutes :</p>
<ul>
<li>sans prix de la surface concédée, la coupe « optimale » allait chercher les étangs à trente kilomètres et abandonnait 150 000 hectares &mdash; mathématiquement minimal, opérationnellement absurde ;</li>
<li>une ligne tenue à 3 h du matin n&rsquo;est pas tenue à 15 h : il a fallu ajouter le <em>débordement</em>, la ré-épreuve des lignes quand le front s&rsquo;intensifie nettement &mdash; c&rsquo;est le sursaut de mi-journée qui fait céder les lignes établies de nuit ;</li>
<li>et les moyens sont finis : la défense est toujours tentée, mais les unités s&rsquo;épuisent arc par arc, et les trous de financement deviennent les brèches par lesquelles les grands feux débordent.</li>
</ul>
<p><a href="https://pf.olibrio.fr/images/kokusho/boucle-25-juillet.png" title="Ouvrir la carte en grand"><img alt="Carte générée par le modèle : la boucle de confinement calculée par la coupe minimale sur le rejeu du 25 juillet à 4 heures. Sur fond d'occupation du sol OpenStreetMap, la grande cicatrice gris-brun du feu s'étend entre l'océan à l'ouest et les étangs ; la boucle orange des arcs à tenir, 187 kilomètres pour 159 unités, l'entoure au plus près, complétée de segments noirs là où l'océan, les étangs et la cicatrice ferment le tour gratuitement. À l'est, plusieurs petits anneaux ceinturent les foyers satellites" src="https://pf.olibrio.fr/images/kokusho/boucle-25-juillet.png" /></a></p>
<p>Et la même boucle en vrai : le plan calculé par la coupe minimale sur le feu du 25 juillet, ancré sur l&rsquo;océan, les étangs et la cicatrice. Chaque îlot orange à l&rsquo;est ceinture un foyer secondaire repéré à l&rsquo;écart du feu principal.</p>
<p>Le résultat, sur les deux journées de référence : le jour contenu, le biais tombe de 12 à 7,5 &mdash; mieux, pas bien ; le reste se partage entre les recoins de la cicatrice que le satellite n&rsquo;a pas vus brûler, les sautes de feu que le modèle ne combat pas encore, et l&rsquo;humidité des combustibles, toujours calculée par une formule instantanée sans mémoire (Simard, 1968) : elle ne regarde que la température et l&rsquo;humidité de l&rsquo;heure, si bien qu&rsquo;un après-midi à 39,8 °C peut paraître <em>plus humide</em> que la veille. Le remède connu est l&rsquo;indice forêt-météo canadien (Van Wagner, 1987) et ses composantes cumulatives DMC et DC &mdash; deux « réservoirs » qui se remplissent à chaque pluie et se vident jour après jour avec la chaleur, gardant ainsi la mémoire des semaines de sécheresse accumulée. C&rsquo;est le prochain chantier. Le jour où le feu a échappé, en revanche, le modèle prédit désormais une surface moyenne à <strong>14 % près</strong> de l&rsquo;observé, en sachant <em>pourquoi</em> : les lignes tenues du matin cèdent au pic thermique. Dans les deux cas, l&rsquo;AUC reste au-dessus de 0,95 &mdash; le modèle sait toujours où le feu va.</p>
<hr />
<h3 id="lexperience-quun-modele-permet-faire-varier-les-moyens">L&rsquo;expérience qu&rsquo;un modèle permet : faire varier les moyens</h3>
<p>Et c&rsquo;est ici que la modélisation devient un instrument politique &mdash; au sens noble. La v3 paramètre la lutte en « unités engagées », une unité tenant environ un kilomètre de ligne, l&rsquo;effectif étant tiré au sort autour d&rsquo;une moyenne calée sur les mobilisations réelles (2 000 à 2 750 pompiers sur les grands feux girondins de 2022 et 2026). Rien n&rsquo;empêche alors de tourner le bouton : <strong>que se passe-t-il avec 30 % de moyens en moins ? Avec 50 % de plus ?</strong></p>
<p>J&rsquo;ai rejoué les deux journées de référence à trois niveaux d&rsquo;engagement, vingt tirages chacun :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Moyens engagés</th>
<th>25 juillet (front tenable) &mdash; surface nouvelle médiane</th>
<th>24 juillet (front intenable) &mdash; surface nouvelle médiane</th>
</tr>
</thead>
<tbody>
<tr>
<td>−70 % (« trois mégafeux en même temps »)</td>
<td>22 067 ha</td>
<td>8 244 ha</td>
</tr>
<tr>
<td>−30 % (« l&rsquo;austérité continue »)</td>
<td>18 352 ha</td>
<td>6 154 ha</td>
</tr>
<tr>
<td>Nominal (mobilisation réelle)</td>
<td>18 324 ha</td>
<td>6 154 ha</td>
</tr>
<tr>
<td>+50 % (« le service public reconstruit »)</td>
<td>18 324 ha</td>
<td>6 154 ha</td>
</tr>
</tbody>
</table></div>
<p>Rejeux rétrospectifs +12 h, 20 tirages par niveau d&rsquo;engagement. « Médiane » : la moitié des tirages brûlent plus, l&rsquo;autre moitié moins &mdash; plus robuste qu&rsquo;une moyenne face aux tirages extrêmes. Observé : 1 645 ha le 25, 4 642 ha le 24. Ordres de grandeur d&rsquo;un modèle expérimental, pas des prévisions.</p>
<p>Je m&rsquo;attendais à une belle courbe décroissante &mdash; plus de moyens, moins d&rsquo;hectares. Le modèle m&rsquo;a répondu autre chose, et c&rsquo;est le résultat le plus intéressant de la semaine : <strong>les moyens n&rsquo;achètent pas des hectares, ils achètent une boucle</strong>. En dessous du seuil où la boucle cesse d&rsquo;être finançable &mdash; ici, autour de −70 %, l&rsquo;équivalent d&rsquo;un dispositif dispersé sur trois mégafeux simultanés, ce qui est exactement la crainte des étés à venir &mdash; on perd des milliers d&rsquo;hectares d&rsquo;un coup. Au-dessus du seuil, le rendement marginal s&rsquo;effondre : entre le nominal et +50 %, <em>pas un hectare de différence</em>. Et le 24 juillet, la colonne entière le dit : qu&rsquo;on aligne 34 ou 168 unités, le feu passe &mdash; les lignes cèdent à l&rsquo;intensité, pas au nombre.</p>
<p><a href="https://pf.olibrio.fr/images/kokusho/sensibilite-moyens.svg" title="Ouvrir le graphique en grand"><img alt="Deux courbes côte à côte, à la même échelle, de la surface nouvelle brûlée en douze heures selon les moyens engagés. Le 25 juillet, front tenable : 22 067 hectares à moins 70 pour cent, puis un plateau à environ 18 300 dès moins 30 pour cent --- le seuil où la boucle devient finançable, puis la saturation. Le 24 juillet, front intenable : 8 244 puis 6 154 hectares, la courbe ne bouge plus quel que soit le niveau de moyens. En bleu tireté, l'observé : 1 645 et 4 642 hectares" src="https://pf.olibrio.fr/images/kokusho/sensibilite-moyens.svg" /></a></p>
<p>La forme de la courbe est le résultat : un seuil, puis une saturation &mdash; et le 24 juillet, une courbe que les moyens ne font plus bouger.</p>
<p>Une réserve d&rsquo;importance avant d&rsquo;en tirer des conclusions politiques : ce tableau minore l&rsquo;effet réel des moyens, parce que le modèle ne représente ni l&rsquo;<em>attaque des feux naissants</em> &mdash; étouffer un départ dans la première heure, là où chaque Canadair disponible compte double &mdash; ni la rapidité des rotations aériennes, ni le partage du dispositif entre plusieurs feux. Ce qu&rsquo;il établit, c&rsquo;est la forme de la courbe : un seuil, puis une saturation. Pas l&rsquo;inutilité des moyens.</p>
<hr />
<h3 id="lautre-armee-la-logistique-qui-craque-et-ceux-qui-la-portent">L&rsquo;autre armée : la logistique qui craque, et ceux qui la portent</h3>
<p>Il y a une chose que ni le tableau ni la courbe ne montrent, et qui saute aux yeux dès qu&rsquo;on lit les points de situation et la presse locale : <strong>la question n&rsquo;était pas seulement combien d&rsquo;unités, mais comment elles tenaient debout</strong>. La logistique &mdash; l&rsquo;eau, les véhicules, les avions, le ravitaillement des hommes &mdash; a été le maillon faible de bout en bout, et elle craquait avant même l&rsquo;épisode.</p>
<p>Les faits, datés. Pendant les feux, <strong>sept Canadairs sur douze</strong> étaient opérationnels, les autres immobilisés par la maintenance d&rsquo;appareils trentenaires &mdash; et la commande de deux appareils supplémentaires avait été annulée en 2024, avant d&rsquo;être repassée en juin 2026 pour livraison&hellip; en 2032. Le parc national de camions-citernes feux de forêts est passé de <strong>5 117 en 2002 à 3 845 en 2020</strong>, avec un taux de vétusté monté de 51 à 61 % ; la fédération des sapeurs-pompiers estime qu&rsquo;il en faudrait 10 000. Trois semaines avant l&rsquo;épisode, le 6 juillet, un syndicat de pompiers professionnels alertait qu&rsquo;il manquait <strong>plus de 300 véhicules</strong> pour couvrir les besoins d&rsquo;une saison déjà à 7 000 départs de feux. Sur le terrain, un chef de bataillon demandait un camion de 13 000 litres pour « maintenir une permanence d&rsquo;eau », les colonnes de renfort arrivaient d&rsquo;Île-de-France, et un sapeur-pompier volontaire des Bouches-du-Rhône est mort sur la route &mdash; <em>en mission de ravitaillement</em>. Un adjudant-chef le dit sans détour dans la presse : « on n&rsquo;a pas suffisamment de moyens, ni humains, ni matériels, pour répondre à des catastrophes d&rsquo;une dimension si importante ». Ce ne sont pas des accidents : la Cour des comptes (2022) parlait de « défaut d&rsquo;anticipation » sur la flotte aérienne, le Sénat (2022) de « sous-investissement chronique » dans les camions, et les fédérations de pompiers d&rsquo;un « modèle à bout de souffle ». Quatre ans plus tard, l&rsquo;épisode de 2026 s&rsquo;est joué avec ces défaillances-là, connues, écrites, et non corrigées.</p>
<p>Et pourtant les lignes ont tenu les jours tenables. En partie parce qu&rsquo;une seconde armée s&rsquo;est levée, que personne ne budgète. Le 24 juillet à 7 h du matin, la préfecture des Landes lance officiellement « un appel à la solidarité auprès des agriculteurs pour apporter des tonnes à eau » &mdash; ces citernes de dizaines de milliers de litres qu&rsquo;on remorque derrière un tracteur, et qui réalimentent les camions au plus près du front. En quelques heures, la chambre d&rsquo;agriculture de la Gironde enregistre <strong>plus de 500 volontaires</strong> &mdash; vignerons du Médoc, négociants avec leurs camions-citernes, entreprises de travaux publics avec déchaumeurs, lames et bulldozers &mdash; dont une centaine interviendront effectivement sur le feu de Saumos, au point que l&rsquo;appel est <em>suspendu</em> le 27, débordé par l&rsquo;afflux. La filière bois a couché <strong>22 kilomètres de pins en vingt-quatre heures</strong> pour ouvrir des pare-feux &mdash; 103 km de pare-feux et de pistes d&rsquo;accès créés au total, dit le point préfectoral du 27. Derrière le front : des bénévoles qui tiennent les centres de ravitaillement des 2 750 pompiers, des restaurateurs qui préparent des milliers de repas, des vétérinaires qui soignent gratuitement les animaux évacués, le parc des expositions de Bordeaux-Lac ouvert pour 10 000 personnes. Rien de tout cela n&rsquo;est improvisé de zéro : en 2022 déjà, à Landiras, les tonnes à lisier des agriculteurs avaient fait gagner « jusqu&rsquo;à trois heures par jour » aux pompiers selon la chambre d&rsquo;agriculture &mdash; et c&rsquo;est précisément cette expérience que la Gironde avait commencé à formaliser, un mois avant l&rsquo;épisode, en recensant le matériel agricole mobilisable.</p>
<p>Relisons cela avec les lunettes du modèle, parce que ça éclaire les deux. Le modèle compte des « unités qui tiennent un kilomètre » sans demander qui les arme : en réalité, une partie de ces unités-là étaient des tracteurs. La réalimentation en eau, les trois heures par jour de 2022, les pare-feux labourés &mdash; dans le vocabulaire du modèle, c&rsquo;est de l&rsquo;<em>endurance</em> : des arcs qui restent tenus au lieu de céder faute d&rsquo;eau, des unités qui restent sur la ligne au lieu de faire la navette. Autrement dit, <strong>la marge sous le seuil, cette marge dont la courbe montre qu&rsquo;elle décide de tout, a été en partie fournie par la société elle-même</strong> &mdash; au moment où l&rsquo;État, qui avait sur son bureau depuis quatre ans les rapports chiffrant ce qui manquait, ne l&rsquo;avait pas. Il faut dire les deux moitiés de cette phrase : l&rsquo;entraide a été magnifique, et elle est le symptôme d&rsquo;un manque. Une tonne à lisier ne remplace pas un Canadair en maintenance ; cinq cents volontaires en vingt-quatre heures ne se commandent pas, ne se planifient pas, et se suspendent quand l&rsquo;afflux déborde la coordination ; et un système qui a structurellement besoin des tracteurs de ses voisins pour tenir ses lignes n&rsquo;est pas un système dimensionné &mdash; c&rsquo;est exactement ce que le rapport parlementaire sur la « valeur du sauvé », présenté dix jours avant l&rsquo;épisode, essayait de dire en langage budgétaire.</p>
<hr />
<h3 id="et-si-lavenir-en-commun-avait-ete-applique-depuis-deux-mandats">Et si l&rsquo;Avenir en commun avait été appliqué depuis deux mandats ?</h3>
<p>Venons-y. La question m&rsquo;a été posée ainsi : les mesures proposées par La France insoumise, appliquées depuis 2017, auraient-elles changé quelque chose à un épisode comme celui-ci ? L&rsquo;exercice est un contrefactuel : il ne se vérifie pas, il s&rsquo;argumente. Je vais donc commencer par ce que le programme contient <em>vraiment</em>, parce que la première surprise est là.</p>
<p><strong>Ce que le programme contient &mdash; et ne contient pas.</strong> J&rsquo;ai cherché. Ni l&rsquo;édition 2017 ni l&rsquo;édition 2022 de l&rsquo;Avenir en commun ne comportent de chapitre sécurité civile. Pas de nombre de sapeurs-pompiers à recruter, pas de budget SDIS, pas de nombre de Canadairs. Les mesures qui touchent notre sujet sont ailleurs :</p>
<ul>
<li>la <strong>section 27</strong> (« Défendre la forêt ») : renforcer les moyens et les effectifs de l&rsquo;ONF, interdire les coupes rases &mdash; l&rsquo;abattage d&rsquo;une parcelle entière d&rsquo;un seul coup &mdash;, promouvoir des forêts <em>diversifiées en essences et en âges</em> contre les monocultures, et « renforcer les moyens de prévention et de lutte contre les incendies » &mdash; formulation sans chiffre ;</li>
<li>le <strong>livret thématique Forêt</strong> : doublement des effectifs de l&rsquo;ONF (environ 8 400 agents aujourd&rsquo;hui, 16 000 au milieu des années 1980), acquisition publique de 100 000 ha, moyens anti-incendie jugés « notoirement insuffisants » ;</li>
<li>la <strong>section 79</strong> : une force méditerranéenne d&rsquo;intervention et de sécurité civile contre les incendies &mdash; la mesure la plus directement « feu » du programme ;</li>
<li>la <strong>section 68</strong> : une conscription citoyenne de neuf mois incluant des missions de sécurité civile, et une garde nationale sous commandement civil.</li>
</ul>
<p><strong>Au Parlement, en revanche, les chiffres existent.</strong> J&rsquo;ai dépouillé les archives des deux dernières législatures (2022-2026), et le tableau est plus précis &mdash; et plus modeste &mdash; que ne le laisserait croire un slogan dans un sens ou dans l&rsquo;autre :</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Proposition</th>
<th>Chiffre</th>
<th>Sort</th>
</tr>
</thead>
<tbody>
<tr>
<td>Investissement structurant des SDIS (amendement II-CF1334, PLF 2023, F. Chauche, rapporteur spécial)</td>
<td>15 M€/an pendant 5 ans, soit 75 M€</td>
<td>Rejeté en commission, octobre 2022</td>
</tr>
<tr>
<td>Ressources pérennes des SDIS par la taxe sur les conventions d&rsquo;assurance (I-CF594, PLF 2025)</td>
<td>≈ +10 % du budget total des SDIS</td>
<td>Non adopté</td>
</tr>
<tr>
<td>Part « sécurité civile » de la taxe de séjour affectée aux SDIS (PLF 2026)</td>
<td>0,10 à 0,50 €/nuitée</td>
<td>Non adopté</td>
</tr>
<tr>
<td>Financement des deux Canadairs prévus à 100 % par l&rsquo;UE au lieu de 90 % (CL265, LOPMI 2022)</td>
<td>2 appareils, 10 % du coût</td>
<td>Non adopté</td>
</tr>
<tr>
<td>Flotte de seize Canadairs &mdash; <em>objectif gouvernemental de 2022, dont LFI réclame l&rsquo;exécution</em> (question écrite C. Lejeune, juillet 2025)</td>
<td>12 → 16 appareils</td>
<td>Non réalisé (livraisons 2028-2033)</td>
</tr>
<tr>
<td>Bombardiers d&rsquo;eau alternatifs français en attendant les DHC-515 (travaux Maudet, PLF 2026)</td>
<td>≈ 30 M€ l&rsquo;unité</td>
<td>Exploratoire</td>
</tr>
</tbody>
</table></div>
<p>Amendements et questions du groupe LFI, XVIᵉ et XVIIᵉ législatures. Liens en fin d&rsquo;article. Le chiffre de 220 000 pompiers volontaires en 2027 qu&rsquo;on croise parfois est un objectif <em>gouvernemental</em>, que LFI a soutenu et interrogé &mdash; pas une proposition LFI.</p>
<p>Deux observations d&rsquo;honnêteté sur ce tableau. La première : la formule « LFI proposait tant de pompiers et tant de Canadairs » serait <strong>trompeuse</strong> &mdash; les archives montrent des mécanismes de financement (75 M€ d&rsquo;investissement, ~+10 % de ressources pérennes, la « valeur du sauvé » du rapport Maudet&ndash;Pantel présenté dix jours avant l&rsquo;épisode) et l&rsquo;exigence de tenir des objectifs gouvernementaux existants, pas de cibles d&rsquo;effectifs ou de flotte propres. La seconde : tout a été rejeté, retiré ou laissé sans suite, les budgets passant ensuite par 49.3. Face à cela, le réel : les effectifs de l&rsquo;ONF ont fondu de <strong>40 % en vingt ans</strong>, la flotte française compte douze Canadairs de plus de trente ans, la Cour des comptes dénonçait dès juillet 2022 un « défaut d&rsquo;anticipation » de leur renouvellement &mdash; et les deux appareils commandés en juin 2026 seront livrés <em>en 2032</em>.</p>
<p><strong>Maintenant, faisons travailler le modèle.</strong> Dans kokusho, une politique publique ne peut agir que par trois canaux, et ils n&rsquo;ont pas du tout le même poids :</p>
<p><em>Canal 1 &mdash; les unités disponibles.</em> Plus de pompiers, plus d&rsquo;engins, une flotte aérienne à seize appareils au lieu de douze : dans le modèle, c&rsquo;est la moyenne d&rsquo;engagement qui monte. Et là, le rapprochement des deux tableaux de ce billet est instructif : les propositions parlementaires réelles &mdash; +10 % de budget des SDIS, 75 M€ d&rsquo;investissement &mdash; sont d&rsquo;un ordre de grandeur qui, rapporté à ma courbe de sensibilité, tombe <em>dans la zone de saturation</em>. Sur une journée tenable, avec tout le dispositif national massé sur un seul feu, +10 % n&rsquo;aurait pas changé la surface brûlée. Leur valeur est ailleurs, et elle est double : de la <strong>marge sous le seuil</strong> pour le jour où les moyens sont dispersés &mdash; trois départs simultanés, une flotte à moitié clouée au sol, des colonnes à huit heures de route &mdash; et du <strong>matériel qui part plus vite</strong> sur les feux naissants, le canal que mon modèle ne représente pas encore et où chaque appareil disponible compte double. C&rsquo;est très exactement le terrain des seize Canadairs et des avions de complément à 30 M€ : pas gagner la bataille du 24 juillet, faire qu&rsquo;elle n&rsquo;ait pas lieu.</p>
<p><em>Canal 2 &mdash; la largeur des coupures.</em> La DFCI &mdash; défense de la forêt contre l&rsquo;incendie &mdash; c&rsquo;est ce réseau de pistes sablonneuses, de pare-feux et de points d&rsquo;eau qui quadrille le massif landais précisément pour offrir aux secours des lignes d&rsquo;appui toutes prêtes. Entretenue, débroussaillée, élargie &mdash; du travail d&rsquo;ONF et de collectivités financées &mdash; c&rsquo;est, dans le modèle, des coupures plus larges, donc des probabilités de tenue plus hautes à intensité égale. C&rsquo;est le canal des 40 % d&rsquo;effectifs ONF perdus : l&rsquo;entretien du réseau est précisément le travail qui a été déshabillé. Difficile à chiffrer, mais le mécanisme est le bon.</p>
<p><em>Canal 3 &mdash; le combustible lui-même.</em> Et c&rsquo;est le canal décisif, parce que c&rsquo;est le seul qui agit sur l&rsquo;<strong>intensité</strong>. Le massif landais est une monoculture de pin maritime d&rsquo;un million d&rsquo;hectares &mdash; notre carte de combustible est monochrome, et cette monochromie est une politique publique vieille de cent soixante-dix ans. Une forêt diversifiée en essences et en âges, morcelée de feuillus moins inflammables, c&rsquo;est une intensité de front plus basse ; et l&rsquo;intensité est la seule grandeur qui décide si une ligne est tenable. En dessous de 2 000 kW/m, tout le monde tient. Au-dessus de 10 000, personne. <strong>Les mesures lentes sont les seules qui déplacent les seuils.</strong> Mais soyons honnêtes sur l&rsquo;horizon : deux mandats ne transforment pas une pinède industrielle &mdash; dix ans de diversification, ce sont des lisières, des parcelles-test, des interfaces mieux tenues. L&rsquo;effet en 2026 aurait été marginal ; l&rsquo;effet en 2046 serait structurel.</p>
<p><strong>Et le 24 juillet ?</strong> C&rsquo;est la question qui départage l&rsquo;honnêteté d&rsquo;un contrefactuel. Réponse du modèle : ce jour-là, rien de ce qui précède ne suffisait. Avec 50 % de moyens en plus, la surface simulée du 24 ne bouge pas d&rsquo;un hectare : les lignes cèdent à l&rsquo;intensité, pas au nombre. Quand le front dépasse 10 000 kW/m, l&rsquo;arithmétique des moyens ne s&rsquo;applique plus &mdash; on ne bulldoze pas face à une tempête de feu. La seule victoire possible le 24 était <em>en amont</em> : que le feu n&rsquo;ait jamais atteint cette taille. Attaque des feux naissants dans la première heure &mdash; ce que la flotte aérienne vieillissante fait de moins en moins vite &mdash; et prévention pour que le départ de feu accidentel d&rsquo;un chantier de débroussaillage ne trouve pas 40 °C, un vent d&rsquo;est et une pinède continue. Autrement dit : sur les journées extrêmes, seule la politique <em>d&rsquo;avant l&rsquo;incendie</em> existe. Et les journées extrêmes sont précisément celles qui fabriquent les mégafeux.</p>
<p><strong>Les limites de l&rsquo;exercice, sans lesquelles il ne vaut rien :</strong> le programme lui-même ne chiffre ni pompiers ni avions, et les chiffres parlementaires réels (75 M€, +10 %) sont bien plus modestes que les ±50 % de mon tableau, qui restent une hypothèse de lecture ; le modèle est expérimental et son biais résiduel est documenté ; la canicule, le vent et un siècle et demi de monoculture ne se gouvernent pas en deux mandats ; et un contrefactuel ne se vérifie jamais. Ce que l&rsquo;exercice établit est plus modeste et plus solide : <em>par quels canaux</em> une politique agit sur un mégafeu, et lesquels de ces canaux étaient saturés le 24 juillet.</p>
<hr />
<h3 id="ce-que-jen-retiens">Ce que j&rsquo;en retiens</h3>
<p>Le premier billet se terminait sur une leçon de modélisation : le modèle ne répondait pas à la question que je croyais lui poser. Celui-ci se termine sur la leçon symétrique, côté politique : <strong>« plus de moyens » n&rsquo;est pas une réponse unique, parce que « le feu » n&rsquo;est pas un problème unique.</strong> Il y a les journées tenables, où chaque unité supplémentaire achète des hectares &mdash; là, les Canadairs de 2032 commandés en 2026 sont un scandale d&rsquo;arithmétique budgétaire. Et il y a les journées intenables, où la seule politique qui existe encore s&rsquo;est jouée dix ans plus tôt, dans la composition de la forêt, l&rsquo;entretien des coupures, et la vitesse d&rsquo;attaque des feux naissants.</p>
<p>Un programme politique qui veut peser sur les mégafeux se juge donc à l&rsquo;aune de ces deux régimes à la fois. Sur le premier, le programme donne la direction et c&rsquo;est au Parlement qu&rsquo;on trouve les chiffres : modestes &mdash; 75 millions, +10 % &mdash;, systématiquement rejetés ou passés sous 49.3, mais posés aux deux endroits que le modèle désigne comme les vrais leviers du régime tenable, le financement pérenne des SDIS et la flotte d&rsquo;attaque initiale. Sur le second &mdash; la forêt, ses effectifs, sa diversité &mdash; l&rsquo;Avenir en commun pose le problème à l&rsquo;endroit où les seuils se déplacent. Et il faut inscrire au bilan ce que ni les programmes ni mon modèle ne comptent : la marge fournie par la société elle-même &mdash; les tonnes à eau des agriculteurs, les bénévoles des centres de ravitaillement &mdash; qui a tenu cette fois encore, et qu&rsquo;aucun État sérieusement dimensionné ne devrait inscrire à son budget comme un acquis.</p>
<p>Il faut finir en le disant sans détour : ce qui vient de se passer n&rsquo;est pas une anomalie, c&rsquo;est un aperçu. Le rapport sénatorial de 2022 &mdash; celui-là même qui chiffrait le sous-investissement &mdash; l&rsquo;écrivait noir sur blanc : d&rsquo;ici 2050, les surfaces brûlées pourraient augmenter de 80 %, et près de la moitié des landes et forêts métropolitaines être exposées à un risque incendie élevé. Quatre ans après Landiras, la même forêt a rebrûlé &mdash; plus grand, plus vite, plus près de Bordeaux. Deux « feux du siècle » en quatre ans ne font pas une exception : ils font un régime. <strong>C&rsquo;est le nouveau normal</strong>, et sa signature est précisément la plus inquiétante des deux colonnes de ma courbe : les journées intenables du type 24 juillet, celles où l&rsquo;arithmétique des moyens ne s&rsquo;applique plus, seront chaque été plus nombreuses.</p>
<p>Vous connaissez la scène : le chat au bord de la table, la patte sur le verre, les yeux plantés dans les vôtres &mdash; et il pousse. On rit du chat. On devrait regarder l&rsquo;observateur : celui qui voit le verre glisser et ne bouge pas n&rsquo;est pas un témoin, il est coauteur de la casse. Voilà quatre ans que ce verre glisse sous nos yeux à tous. Les rapports étaient sur la table &mdash; la Cour des comptes en 2022, le Sénat en 2022, les fédérations de pompiers année après année. Les amendements étaient déposés &mdash; 75 millions pour les camions en 2022, <em>rejetés</em> ; les crédits Canadair, <em>rejetés puis passés sous 49.3</em> ; la commande d&rsquo;appareils, <em>annulée en 2024</em> pour être repassée en 2026, livraison 2032. Les suppressions de postes à l&rsquo;ONF <em>continuent en 2026</em>, l&rsquo;été même où la forêt brûle. À ce stade, le mot « défaillances » est trop doux : ce sont des choix, faits en connaissance de cause, par des gens qui avaient les chiffres. Et ce billet a passé assez de temps à mesurer pour gagner le droit de le dire : je ne serai pas l&rsquo;observateur qui ne dit rien au chat.</p>
<p>Et ne me croyez pas sur parole : au cœur de l&rsquo;épisode, le média indépendant <a href="https://bonpote.com/quels-partis-politiques-ont-vote-pour-la-lutte-anti-incendie/">Bon Pote a refait le compte, scrutin par scrutin</a>, des votes de l&rsquo;Assemblée sur la lutte anti-incendie. Le tableau est sans ambiguïté : deux blocs. D&rsquo;un côté communistes, insoumis, écologistes et socialistes, qui votent les moyens et la prévention ; de l&rsquo;autre, du parti présidentiel au Rassemblement national, qui votent l&rsquo;inverse &mdash; la taxe de séjour pour les SDIS, rejetée deux fois ; la contribution des assureurs, rejetée quand l&rsquo;amendement en attendait « au moins 800 millions d&rsquo;euros » ; le programme de recrutement de pompiers professionnels, voté par la seule gauche avec LIOT ; et le décret signé Gabriel Attal en 2024 qui annule 50 millions de crédits de sécurité civile, emportant la commande de deux Canadairs. La seule unanimité du dossier : 3 millions pour la DFCI &mdash; on mesure l&rsquo;ordre de grandeur des consensus. Et la mesure qui ressemble trait pour trait au canal combustible de mon modèle &mdash; des pare-feux de <em>feuillus</em> entre les parcelles de résineux, pour casser la continuité de la pinède &mdash; n&rsquo;a été votée que par les insoumis, les socialistes et les écologistes. Les seuils dont parle ce billet ont une couleur politique au Parlement, et elle est vérifiable vote par vote.</p>
<p>Alors oui, ce billet prend parti. De tout ce que j&rsquo;ai lu et recoupé, l&rsquo;Avenir en commun est aujourd&rsquo;hui le <strong>seul</strong> programme national qui réponde aux deux régimes à la fois &mdash; et les scrutins ci-dessus montrent que lorsque ces mesures arrivent en séance, c&rsquo;est la gauche entière qui les vote : le combustible et la forêt &mdash; diversification des essences, fin des coupes rases, effectifs de l&rsquo;ONF doublés, là où se déplacent les seuils qui décident qu&rsquo;une ligne est tenable &mdash; et le dimensionnement de la sécurité civile &mdash; financement pérenne des SDIS par la « valeur du sauvé », flotte d&rsquo;attaque initiale maintenant et pas en 2033. Qu&rsquo;on ne me réponde pas que ses chiffres manquent : ils ont été déposés, amendement après amendement, sous les numéros que cite ce billet &mdash; et c&rsquo;est ceux qui les ont rejetés qui doivent aujourd&rsquo;hui des comptes. Le reste de l&rsquo;offre politique, quand elle parle du feu, ne parle que d&rsquo;avions &mdash; le régime tenable &mdash; et jamais du combustible &mdash; le régime qui tue. Or les Canadairs de 2033 ne changeront rien aux journées où rien ne vole, et ces journées-là sont celles qui font les mégafeux. <strong>Un programme qui ne parle pas de la forêt ne parle pas du problème.</strong> Les tracteurs des agriculteurs ont tenu la ligne cette fois. La prochaine fois &mdash; et le nouveau normal garantit qu&rsquo;il y en aura une &mdash; j&rsquo;aimerais que la République y soit avant eux.</p>
<p>Le feu, lui, n&rsquo;attend pas la fin du débat : Météo-France annonce une nouvelle vague de chaleur. La carte continue de tourner.</p>
<hr />
<p>🔥 <strong><a href="https://kokusho.ss2i.ca">Voir l&rsquo;outil en ligne &mdash; kokusho.ss2i.ca</a></strong></p>
<p>Expérimental, sans valeur officielle. En cas d&rsquo;incendie, la seule source qui fait foi est la préfecture : <a href="https://www.landes.gouv.fr/">landes.gouv.fr</a> · <a href="https://www.gironde.gouv.fr/">gironde.gouv.fr</a>.</p>
<h3 id="sources">Sources</h3>
<ul>
<li>Chronologie et bilan : <a href="https://fr.wikipedia.org/wiki/Feux_de_for%C3%AAt_de_2026_en_Gironde_et_dans_les_Landes">Wikipédia, Feux de forêt de 2026 en Gironde et dans les Landes</a> ; communiqués <a href="https://www.gironde.gouv.fr/Actualites/Communiques-de-presse/Communiques-de-presse-2026/Juillet-2026/Incendie-en-Gironde-declenchement-de-FR-Alert-pour-l-evacuation-des-nouvelles-communes">préfecture de la Gironde</a> et <a href="https://www.landes.gouv.fr/Actualites/Salle-de-presse/Communiques-de-presse/2026/Incendie-en-cours-a-Biscarrosse-point-de-situation-a-07h">préfecture des Landes</a> ; points de situation <a href="https://www.franceinfo.fr/environnement/evenements-meteorologiques-extremes/incendies-et-feux-de-foret/incendies-en-gironde/incendies-en-gironde-et-dans-les-landes-le-point-sur-la-journee-du-lundi-27-juillet_8124539.html">franceinfo (27 juillet)</a> et <a href="https://www.franceinfo.fr/replay-jt/france-2/20-heures/incendie-en-gironde-des-prochaines-heures-decisives_8124449.html">France 2 (28 juillet)</a>.</li>
<li>Blayais : <a href="https://montelnews.com/fr/news/964487e1-b5d4-4dc1-a05c-134cc576314b/feux-en-gironde-pas-d-impact-sur-les-re-acteurs-du-blayais">Montel News, 27 juillet 2026</a>. Sites stratégiques : <a href="https://armees.com/incendie-gironde-sites-surveillance/">armees.com</a>.</li>
<li>Programme : <a href="https://laec.fr/section/27/defendre-la-foret-poumon-de-la-planete">l&rsquo;Avenir en commun, section 27</a> ; <a href="https://melenchon2027.fr/livrets-2022/foret/">livret Forêt</a> ; sections 68 et 79 sur <a href="https://laec.fr/">laec.fr</a>.</li>
<li>Les votes de l&rsquo;Assemblée, scrutin par scrutin : <a href="https://bonpote.com/quels-partis-politiques-ont-vote-pour-la-lutte-anti-incendie/">Bon Pote, « Quels partis politiques ont voté pour la lutte anti-incendie ? », Sophie Kloetzli, 27 juillet 2026</a> &mdash; taxe de séjour SDIS (scrutins 302 et 4074, XVIIᵉ lég.), contribution des assureurs (4076), recrutement de pompiers professionnels (133, XVIᵉ lég.), plan d&rsquo;adaptation de la forêt (1509), pare-feux de feuillus entre résineux (1556), décret d&rsquo;annulation de 50 M€ de crédits de sécurité civile (2024).</li>
<li>Parlement et budget : amendements <a href="https://www.assemblee-nationale.fr/dyn/16/amendements/0273C/CION_FIN/CF1334">II-CF1334 (PLF 2023, 75 M€ SDIS)</a>, <a href="https://www.assemblee-nationale.fr/dyn/17/amendements/0324A/CION_FIN/CF594">I-CF594 (PLF 2025, TSCA ≈ +10 % SDIS)</a>, <a href="https://www.assemblee-nationale.fr/dyn/17/amendements/AMANR5L17PO838901B1906P1D1N003166">I-3166 (PLF 2026, taxe de séjour)</a>, <a href="https://www.assemblee-nationale.fr/dyn/16/amendements/0343/CION_LOIS/CL265">CL265 (LOPMI 2022, Canadairs 100 % UE)</a>, <a href="https://www.assemblee-nationale.fr/dyn/17/amendements/1906C/CION_FIN/CF2221">II-CF2221 (PLF 2026, avions de complément ≈ 30 M€)</a> ; questions écrites <a href="https://questions.assemblee-nationale.fr/q16/16-2391QE.htm">n° 2391 (F. Chauche, volontaires)</a> et <a href="https://questions.assemblee-nationale.fr/q17/17-9156QE.htm">n° 9156 (C. Lejeune, seize Canadairs)</a> ; <a href="https://nosparlementaires.fr/actualites/canadair-securite-civile-ce-que-le-parlement-a-vote">nosparlementaires.fr, « Canadair : ce que le Parlement a voté »</a> ; <a href="https://www.lagazettedescommunes.com/club-prevention-securite/securite-civile/sapeurs-pompiers-et-sdis/budget-des-sdis-la-valeur-du-sauve-fait-recette-a-lassemblee-nationale.MNCLJM6YOFHRZEW765AU42AXUE.html">La Gazette des communes, rapport « valeur du sauvé »</a>.</li>
<li>Contexte : <a href="https://basta.media/face-aux-incendies-l-onf-en-premiere-ligne-malgre-la-baisse-des-effectifs">Basta!, effectifs de l&rsquo;ONF</a> ; <a href="https://www.ccomptes.fr/fr/publications/la-flotte-aerienne-de-la-securite-civile">Cour des comptes, référé du 26 juillet 2022</a> ; <a href="https://www.usinenouvelle.com/aero-spatial/aeronautique/aviation-civile/en-attendant-un-modele-made-in-france-letat-rachete-deux-canadair-supplementaires-au-canadien-de-havilland-pour-200-millions-deuros.TAX5FDHQOZGURDPUXWS7BRRU6E.html">L&rsquo;Usine nouvelle, commande de Canadairs (juin 2026)</a> ; <a href="https://www.senat.fr/rap/r21-856/r21-856_mono.html">Sénat, rapport n° 856 (2022)</a>.</li>
<li>Logistique et entraide, épisode 2026 : <a href="https://fr.wikipedia.org/wiki/Feux_de_for%C3%AAt_de_2026_en_Gironde_et_dans_les_Landes">sept Canadairs sur douze opérationnels (Le Monde, via Wikipédia)</a> ; <a href="https://www.landes.gouv.fr/Actualites/Salle-de-presse/Communiques-de-presse/2026/Incendie-en-cours-a-Biscarrosse-point-de-situation-a-07h">appel préfectoral aux tonnes à eau (Landes, 24 juillet, 7 h)</a> ; <a href="https://www.vitisphere.com/actualite-107124-100-agriculteurs-intervenus-contre-lincendie-500-volontaires-au-total-la-chambre-dagriculture-suspend-son-appel.html">Vitisphere : 100 agriculteurs intervenus, 500 volontaires, appel suspendu</a> ; <a href="https://gironde.chambres-agriculture.fr/actualites-33/detail-de-lactualite/feux-en-gironde">coordination par la chambre d&rsquo;agriculture de la Gironde</a> ; <a href="https://www.gironde.gouv.fr/Actualites/Communiques-de-presse/Communiques-de-presse-2026/Juillet-2026/Incendie-de-Saumos-point-de-situation-a-22h30-ce-lundi-27-juillet">point préfectoral du 27 juillet : bilan, 103 km de pare-feux</a> ; <a href="https://www.franceinfo.fr/faits-divers/incendies-en-gironde/en-gironde-le-ravitaillement-des-pompiers-s-organise_8122952.html">franceinfo : le ravitaillement tenu par des bénévoles</a> ; <a href="https://www.franceinfo.fr/environnement/evenements-meteorologiques-extremes/incendies-et-feux-de-foret/on-n-a-pas-suffisamment-de-moyens-ni-humains-ni-materiels-secouristes-et-sinistres-en-colere-face-au-niveau-bilan-des-incendies-en-gironde_8123675.html">franceinfo : « on n&rsquo;a pas suffisamment de moyens »</a> ; <a href="https://france3-regions.franceinfo.fr/nouvelle-aquitaine/gironde/arcachon/je-voulais-etre-utile-le-bel-elan-de-solidarite-face-a-l-incendie-en-gironde-et-dans-les-landes-3391921.html">France 3 : « Je voulais être utile »</a> ; <a href="https://www.bordeaux-metropole.fr/actualites/incendies-en-gironde-accueil-personnes-evacuees-collecte-dons">Bordeaux Métropole : accueil à Bordeaux-Lac, collecte de dons</a> ; <a href="https://cnews.fr/france/2026-07-27/incendies-les-pompiers-recensent-beaucoup-de-points-chauds-en-gironde-une-reprise">CNEWS : un pompier volontaire mort en mission de ravitaillement</a> ; <a href="https://snspp-pats.com/feux-despaces-naturels-le-snspp-pats-alerte-une-nouvelle-fois/">SNSPP-PATS, 6 juillet 2026 : plus de 300 véhicules manquants</a> ; <a href="https://viralmag.fr/incendies-en-gironde-pompiers-en-course-contre-un-feu-imprevisible/">reportage : « on court après le feu », le camion de 13 000 litres</a> ; <a href="https://mesinfos.fr/ile-de-france/incendie-en-gironde-la-colonne-de-renfort-commandee-par-un-essonnien-335962.html">la colonne de renfort francilienne, les 22 km de pins coupés en 24 h</a>.</li>
<li>Le précédent de 2022 et les constats structurels : <a href="https://www.reussir.fr/feux-en-gironde-les-agriculteurs-apportent-leur-aide-aux-pompiers">Réussir : les tonnes à lisier de Landiras (50 000 litres apportés)</a> ; <a href="https://www.reussir.fr/face-aux-incendies-comment-la-precieuse-aide-des-agriculteurs-sorganise">Réussir : plus de 100 tracteurs et tonnes recensés en Gironde (août 2022)</a> ; <a href="https://www.pleinchamp.com/actualite/les-agriculteurs-un-peu-plus-que-des-porteurs-d-eau-dans-la-lutte-contre-les-incendies-de-foret">Pleinchamp : « jusqu&rsquo;à trois heures par jour » gagnées, et la formalisation de 2026</a> ; <a href="https://agriculture.gouv.fr/incendies-en-gironde-le-monde-agricole-se-mobilise-aux-cotes-des-services-de-secours">ministère de l&rsquo;Agriculture, 2022</a> ; <a href="https://www.europe1.fr/societe/un-elan-de-solidarite-que-jai-rarement-vu-en-gironde-les-habitants-ravitaillent-les-pompiers-4123813">Europe 1 : la population ravitaille les pompiers (La Teste, 2022)</a> ; <a href="https://www.assemblee-nationale.fr/dyn/16/amendements/0273C/CION_FIN/CF1327.pdf">parc de camions-citernes : 5 117 (2002) → 3 845 (2020), vétusté 61 %, objectif FNSPF de 10 000 (données DGSCGC citées en annexe budgétaire)</a> ; <a href="https://www.senat.fr/rap/l22-115-329-2/l22-115-329-24.html">Sénat, PLF 2023 : « sous-investissement chronique », et les pactes capacitaires</a> ; <a href="https://www.fosis.org/index.php/2022/08/16/un-modele-de-securite-civile-a-bout-de-souffle/">FO-SIS : « un modèle de sécurité civile à bout de souffle »</a>.</li>
<li>Physique du feu : Byram G.M. (1959), « Combustion of forest fuels », dans K.P. Davis (dir.), <em>Forest Fire: Control and Use</em>, McGraw-Hill &mdash; l&rsquo;intensité de front <em>I = H·w·R</em> et la relation de longueur de flamme <em>L = 0,0775·I^(0,46)</em> ; <a href="https://www.fs.usda.gov/rm/pubs_int/int_rp115.pdf">Rothermel R.C. (1972), <em>A Mathematical Model for Predicting Fire Spread in Wildland Fuels</em>, USDA Forest Service INT-115</a> &mdash; l&rsquo;amortissement par l&rsquo;humidité des combustibles fins ; Simard A.J. (1968), <em>The Estimation of Moisture Content of Fine Fuels</em>, Forest Fire Research Institute, Ottawa, FF-X-14 &mdash; la formule d&rsquo;humidité instantanée utilisée (et critiquée) ici ; <a href="https://ostrnrcan-dostrncan.canada.ca/entities/publication/9505b1a8-2b34-40f2-a67a-42d1cf2f2b7d">Van Wagner C.E. (1987), <em>Development and Structure of the Canadian Forest Fire Weather Index System</em>, Service canadien des forêts, rapport technique 35</a> &mdash; les indices à mémoire DMC/DC.</li>
<li>Seuils opérationnels de tenue : <a href="https://doi.org/10.1071/WF9960199">Hirsch K.G. &amp; Martell D.L. (1996), « A Review of Initial Attack Fire Crew Productivity and Effectiveness », <em>International Journal of Wildland Fire</em> 6(4)</a> ; <a href="https://doi.org/10.1007/978-3-319-51727-8_52-1">Alexander M.E. &amp; Cruz M.G. (2019), « Fireline Intensity », dans <em>Encyclopedia of Wildfires and Wildland-Urban Interface (WUI) Fires</em>, Springer</a> &mdash; attaque directe possible sous 2 000 kW/m, engins jusqu&rsquo;à ~4 000, rien ne tient au-delà de 10 000 ; la règle « une coupure tient à partir de deux longueurs de flamme » est une règle de l&rsquo;art d&rsquo;aménagement DFCI, traitée ici en transition douce plutôt qu&rsquo;en seuil net.</li>
<li>Algorithmique du confinement : <a href="https://doi.org/10.4153/CJM-1956-045-5">Ford L.R. &amp; Fulkerson D.R. (1956), « Maximal Flow Through a Network », <em>Canadian Journal of Mathematics</em> 8</a> &mdash; le théorème coupe-min/flot-max ; <a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csgraph.maximum_flow.html">scipy.sparse.csgraph.maximum_flow</a> (algorithme de Dinitz) ; le passage des capacités de nœuds aux capacités d&rsquo;arêtes (<em>node splitting</em>) est décrit dans Ahuja R.K., Magnanti T.L. &amp; Orlin J.B. (1993), <em>Network Flows</em>, Prentice Hall, § 2.4 ; panorama des modèles de propagation (automates cellulaires compris) : <a href="https://doi.org/10.1071/WF06144">Sullivan A.L. (2009), « Wildland surface fire spread modelling, 1990&ndash;2007 », <em>IJWF</em> 18, trois parties</a>.</li>
<li>Scores de validation : Brier G.W. (1950), « Verification of Forecasts Expressed in Terms of Probability », <em>Monthly Weather Review</em> 78 ; AUC calculée par la statistique de Mann-Whitney ; diagrammes de fiabilité et scores spatiaux (Sørensen-Dice, Jaccard) : Wilks D.S. (2019), <em>Statistical Methods in the Atmospheric Sciences</em>, 4ᵉ éd., Elsevier. La comparaison à la persistance comme référence nulle est la garde-fou classique de la prévision.</li>
<li>Données du modèle : <a href="https://firms.modaps.eosdis.nasa.gov/">NASA FIRMS</a>, détections actives VIIRS 375 m (<a href="https://doi.org/10.1016/j.rse.2013.12.008">Schroeder W. et al. (2014), <em>Remote Sensing of Environment</em> 143</a>) ; <a href="https://open-meteo.com/">Open-Meteo</a> (modèles Météo-France, et altimétrie Copernicus DEM GLO-90) ; occupation du sol et voirie : <a href="https://www.openstreetmap.org/copyright">© contributeurs OpenStreetMap (ODbL)</a> via l&rsquo;API Overpass. Charges de combustible et vitesses de base par classe : ordres de grandeur assumés, documentés dans le code, pas un inventaire mesuré.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Mon modèle faisait brûler l’Atlantique</title>
      <link>https://pf.olibrio.fr/posts/mon-modele-faisait-bruler-latlantique.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/mon-modele-faisait-bruler-latlantique.html</guid>
      <pubDate>Mon, 27 Jul 2026 12:00:00 +0000</pubDate>
      <description>Un incendie dans les Landes, et si ça allait vers la centrale du Blayais ? Deux jours pour bricoler un outil qui répond — et tout ce qu’il avait faux.</description>
      <category>incendie</category>
      <category>landes</category>
      <category>simulation</category>
      <category>validation</category>
      <category>ia</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/kokusho/carte-kokusho-grand.jpg" alt="Mon modèle faisait brûler l’Atlantique"></p>
<p>Jeudi 23 juillet, un fourgon prend feu sur une départementale à Biscarrosse. À 15 h 45 les flammes passent au massif forestier, et en trois jours 30 000 personnes sont évacuées. Comme tout le monde, je suis ça sur des cartes de points rouges, et une question s&rsquo;installe &mdash; le genre de question qu&rsquo;on n&rsquo;ose pas vraiment formuler tant qu&rsquo;on ne sait pas y répondre : <strong>et si ça allait vers le Blayais ?</strong></p>
<p>Le Blayais, c&rsquo;est la centrale nucléaire posée sur la rive droite de la Gironde, à une cinquantaine de kilomètres au nord de Bordeaux. Une carte de points rouges ne répond pas à cette question. Elle montre où le feu <em>est</em>. Jamais où il <em>va</em>.</p>
<p>Entre les deux, il faut un modèle. J&rsquo;ai voulu voir jusqu&rsquo;où on pouvait en bricoler un honnête en deux jours. Le résultat existe, il tourne, et il est consultable ici :</p>
<p>👉 <strong><a href="https://kokusho.ss2i.ca">kokusho.ss2i.ca</a></strong> &mdash; la carte est publique et se met à jour à chaque nouveau calcul.</p>
<p>Outil expérimental, sans aucune valeur officielle. En cas d&rsquo;incendie, la seule source qui fait foi est la préfecture.</p>
<p>Mais ce n&rsquo;est pas la partie intéressante de l&rsquo;histoire. La partie intéressante, c&rsquo;est la liste de tout ce qu&rsquo;il a eu faux &mdash; et surtout, par quoi chaque erreur s&rsquo;est fait attraper.</p>
<hr />
<h3 id="la-premiere-decision-est-morale-pas-technique">La première décision est morale, pas technique</h3>
<p>Un outil comme celui-là peut afficher deux choses très différentes. La première :</p>
<p><em>« Le feu atteindra la centrale dans 17 heures. »</em></p>
<p>C&rsquo;est net. C&rsquo;est actionnable. Et c&rsquo;est une escroquerie. Pour écrire une phrase pareille, il faudrait connaître la position exacte du front, le vent des dix-sept prochaines heures, la sécheresse réelle des combustibles et l&rsquo;efficacité des secours. Je ne connais aucun de ces quatre éléments. Personne ne les connaît.</p>
<p>La seconde ressemble plutôt à ça :</p>
<p><em>« Sur 200 scénarios simulés, 6 amènent le feu dans la zone élargie autour de la centrale, au plus tôt dans 29 heures. Le vent prévu est transversal à l&rsquo;axe du site. Confiance faible : dernière détection satellite il y a 5 heures. »</em></p>
<p>C&rsquo;est nettement moins satisfaisant à lire. C&rsquo;est vrai.</p>
<p>Tout le reste découle de ce choix. L&rsquo;outil ne trace jamais une trajectoire ; il dessine des <strong>enveloppes</strong> &mdash; le terme consacré pour ces contours qui délimitent la zone atteignable &mdash; à 6, 12, 24 et 48 heures, en trois niveaux de plausibilité décroissante : la zone atteinte dans plus d&rsquo;un scénario sur deux, celle atteinte dans un sur dix, et l&rsquo;enveloppe extrême qui n&rsquo;est franchie que dans un scénario sur cent, celui où tout va de travers en même temps.</p>
<p>Et il refuse de résumer la situation en un chiffre unique. Il en donne trois, séparément : <strong>le niveau de menace</strong>, <strong>la confiance</strong> qu&rsquo;on peut accorder à ce jugement, et <strong>la fraîcheur</strong> de la dernière observation. Parce qu&rsquo;un « vert » calculé sur des données de quatre heures d&rsquo;âge n&rsquo;est pas une bonne nouvelle : c&rsquo;est un trou d&rsquo;information. Un satellite qui ne voit rien ne prouve pas que le feu s&rsquo;est arrêté &mdash; il prouve qu&rsquo;il ne voit rien.</p>
<hr />
<h3 id="les-briques-et-ce-quelles-font-vraiment">Les briques, et ce qu&rsquo;elles font vraiment</h3>
<p><a href="https://pf.olibrio.fr/images/kokusho/pipeline.svg" title="Ouvrir le schéma en grand"><img alt="Schéma de la chaîne de traitement. Les détections thermiques des satellites NASA FIRMS, capteurs VIIRS à 375 mètres, sont regroupées par incendie puis réduites au front actif vu dans les douze dernières heures. La météo AROME de Météo-France, la végétation d'OpenStreetMap et le modèle numérique de terrain alimentent un automate cellulaire, damier de cases de 150 mètres, rejoué deux cents fois par la méthode de Monte-Carlo. Il en sort les enveloppes à 6, 12, 24 et 48 heures, puis un niveau de menace accompagné de la confiance et de la fraîcheur de la donnée" src="https://pf.olibrio.fr/images/kokusho/pipeline.svg" /></a></p>
<p>Cliquez sur les figures pour les ouvrir en grand.</p>
<p><strong>Voir le feu : FIRMS et VIIRS.</strong> La NASA diffuse gratuitement, presque en temps réel, les détections thermiques de ses satellites &mdash; le service s&rsquo;appelle <strong>FIRMS</strong>, et les capteurs que j&rsquo;utilise, <strong>VIIRS</strong>, découpent le sol en pixels de 375 mètres. Je les préfère à MODIS, plus ancien et quatre fois plus grossier.</p>
<p>Il faut bien comprendre ce qu&rsquo;est une détection FIRMS : <strong>un pixel dont la température de surface est anormale</strong>. Pas un contour d&rsquo;incendie. Avec du retard, des trous quand aucun satellite ne passe, et rien du tout quand la fumée ou les nuages bouchent la vue. Cette nuance gouverne tout le reste de l&rsquo;article.</p>
<p><strong>Savoir ce qui le pousse : AROME, OSM, MNT.</strong> Trois ingrédients font avancer un feu. Le vent d&rsquo;abord, qui pèse bien plus que le reste : je le prends dans <strong>AROME</strong>, le modèle à maille fine de Météo-France, et pas en un point unique mais échantillonné sur tout le domaine &mdash; un incendie de cette taille traverse plusieurs mailles, et le vent peut tourner localement. La végétation ensuite, tirée d&rsquo;<strong>OpenStreetMap</strong> : une pinède sèche brûle, un étang non, une vigne à peine. Le relief enfin, via un <strong>modèle numérique de terrain</strong> &mdash; un fichier d&rsquo;altitudes, tout simplement &mdash; parce qu&rsquo;un feu monte une pente bien plus vite qu&rsquo;il ne la descend.</p>
<p><strong>Le faire avancer : l&rsquo;automate cellulaire.</strong> Le cœur du calcul porte un nom savant pour une idée simple.</p>
<p><strong>Automate cellulaire</strong> &mdash; on découpe l&rsquo;espace en cellules régulières, ici des carrés de 150 mètres, et on donne une règle qui dit comment l&rsquo;état d&rsquo;une cellule dépend de ses voisines. On applique la règle partout, on avance d&rsquo;un pas de temps, on recommence. Le <em>Jeu de la vie</em> de Conway en est l&rsquo;exemple le plus connu.</p>
<p>Ma règle : une cellule en feu tente d&rsquo;allumer ses huit voisines, d&rsquo;autant plus vite que la végétation y est inflammable, que la pente y monte, et que le vent pousse dans cette direction. Le front prend spontanément une forme <strong>elliptique</strong> allongée sous le vent &mdash; ce que les pompiers observent sur le terrain, et que les modèles reproduisent depuis les années 1980.</p>
<p><strong>Accepter qu&rsquo;on ne sait pas : Monte-Carlo.</strong> C&rsquo;est le point qui change tout.</p>
<p><strong>Méthode de Monte-Carlo</strong> &mdash; plutôt que de calculer une seule fois avec les meilleures valeurs possibles, on refait le calcul des centaines de fois en tirant au sort, à chaque fois, les paramètres qu&rsquo;on connaît mal. On regarde ensuite la distribution des résultats. Le nom vient du casino, et la méthode de la bombe atomique &mdash; Ulam et von Neumann, 1946.</p>
<p>Je lance donc <strong>200 tirages</strong>. À chaque fois je perturbe ce qui est réellement incertain : l&rsquo;erreur de prévision du vent &mdash; qui croît avec l&rsquo;échéance et reste corrélée dans le temps, parce qu&rsquo;une prévision fausse l&rsquo;est durablement plutôt qu&rsquo;une heure sur deux &mdash; l&rsquo;erreur de mon propre modèle de vitesse, la sécheresse réelle des combustibles, et l&rsquo;occurrence des <strong>sautes de feu</strong>, ces braises projetées en avant du front qui franchissent une route ou un coupe-feu.</p>
<p>Ce qu&rsquo;on affiche ensuite n&rsquo;est plus une prévision mais un décompte : cette cellule a brûlé dans 150 de mes 200 mondes possibles, celle-là dans 3. C&rsquo;est la même logique que le cône d&rsquo;incertitude des trajectoires de cyclone.</p>
<p>Une précision qui compte : ces fréquences ne sont <em>pas</em> des probabilités au sens actuariel. Ce sont des fréquences <strong>conditionnelles à mes hypothèses</strong>. Si mes hypothèses sont mauvaises, mes pourcentages le sont aussi. Gardez ça en tête &mdash; la suite de l&rsquo;article ne parle pratiquement que de ça.</p>
<hr />
<h3 id="premier-resultat-un-feu-parfaitement-immobile">Premier résultat : un feu parfaitement immobile</h3>
<p>Premier lancement sur les données réelles. Le rapport tombe : surface nouvelle brûlée au bout de 6 heures, 103,5 hectares. Au bout de 12 heures : 103,5 hectares. Au dixième d&rsquo;hectare près.</p>
<p>Un feu qui ne gagne pas un mètre en six heures sous 17 km/h de vent, c&rsquo;est faux. Et mes 200 tirages, censés explorer des mondes différents, donnaient tous rigoureusement le même résultat &mdash; ce qui est encore plus louche.</p>
<p>La cause tenait à un choix d&rsquo;indice. Quand je calculais la vitesse de passage d&rsquo;une cellule à sa voisine, je prenais la vitesse de la cellule <strong>source</strong>, celle qui brûle déjà. Or je marque toute la surface déjà parcourue comme « cicatrice », avec une vitesse de propagation quasi nulle &mdash; ce qui est correct : une zone déjà brûlée ne rebrûle pas facilement.</p>
<p>Sauf que le feu part forcément de la surface déjà brûlée. Toutes mes cellules sources étaient des cicatrices, donc incapables de transmettre quoi que ce soit. <strong>Le feu était prisonnier de son propre périmètre.</strong></p>
<p>La correction tient en un mot : prendre la vitesse de la cellule <strong>cible</strong>, celle dont le combustible est sur le point d&rsquo;être consommé. C&rsquo;est d&rsquo;ailleurs plus juste physiquement &mdash; un feu avance à la vitesse que lui permet ce qu&rsquo;il attaque, pas ce qu&rsquo;il a déjà brûlé. Bonus inattendu : ça corrige aussi la traversée des plans d&rsquo;eau, qu&rsquo;une cellule source combustible pouvait franchir.</p>
<hr />
<h3 id="puis-jai-regarde-la-carte-de-plus-pres">Puis j&rsquo;ai regardé la carte de plus près</h3>
<p>L&rsquo;outil tournait, les enveloppes s&rsquo;étalaient joliment, les chiffres semblaient plausibles. Je les ai regardés un moment avant de faire ce que j&rsquo;aurais dû faire d&rsquo;emblée : ouvrir la carte d&rsquo;entrée, celle que le modèle utilise, et la regarder vraiment.</p>
<p>Il y avait un problème. <strong>Le modèle faisait brûler la mer.</strong></p>
<p>Et c&rsquo;était vrai. Voici la <strong>carte de combustible</strong> &mdash; l&rsquo;image qui dit à l&rsquo;automate, pour chaque cellule, à quelle vitesse le feu peut y avancer. À gauche ce que voyait mon programme, à droite la réalité :</p>
<p><a href="https://pf.olibrio.fr/images/kokusho/mer-avant-apres.png" title="Ouvrir la comparaison en grand"><img alt="Deux cartes de combustible côte à côte, sur la même zone autour de Biscarrosse. À gauche, l'océan Atlantique est entièrement rendu en vert foncé, la couleur de la pinède : le modèle le traite comme un combustible. À droite, après correction, l'océan apparaît en bleu, nettement séparé du littoral, et l'on distingue les grands étangs de Cazaux-Sanguinet et de Biscarrosse-Parentis" src="https://pf.olibrio.fr/images/kokusho/mer-avant-apres.png" /></a></p>
<p>Toute la masse vert foncé à gauche, c&rsquo;est l&rsquo;Atlantique. Classé pinède.</p>
<p>La raison est presque amusante. <strong>OpenStreetMap ne cartographie pas l&rsquo;océan comme une surface.</strong> Il n&rsquo;existe aucun polygone « Atlantique » : les contributeurs ont tracé le <strong>trait de côte</strong> &mdash; dans le jargon OSM, un chemin étiqueté <code>natural=coastline</code> &mdash; c&rsquo;est-à-dire une ligne, pas une surface. Ma requête, elle, cherchait des surfaces. Elle récupérait consciencieusement les lacs, les étangs et les rivières, tous des polygones, et le large ne correspondait à rien.</p>
<p>Or hors polygone reconnu, mon programme suppose de la pinède. C&rsquo;était un choix délibéré : dans le massif landais le pin maritime domine, et se tromper du côté « ça brûle » biaise le modèle du côté prudent. Sauf qu&rsquo;appliquer cette prudence à 40 % du domaine de calcul, ça ne s&rsquo;appelle plus de la prudence. Sur cette carte, l&rsquo;eau passe de 3,4 % à 40,7 % une fois corrigé : <strong>plus du tiers de ma zone de travail était de l&rsquo;océan inflammable</strong>.</p>
<p>Ma première correction récupérait le trait de côte et découpait le domaine avec &mdash; parfait sur mon test isolé. En conditions réelles, échec : trois requêtes sur douze au serveur OpenStreetMap sont revenues en erreur, le trait s&rsquo;est retrouvé troué, et un trait troué ne découpe rien. La mer est redevenue combustible.</p>
<p>La bonne solution était ailleurs, et elle exploite une convention d&rsquo;OpenStreetMap : quand on trace une côte, <strong>la terre est toujours à gauche du sens de tracé</strong>. Il suffit donc, pour chaque cellule, de trouver le segment de côte le plus proche et de regarder de quel côté on tombe &mdash; un simple produit vectoriel. À gauche la terre, à droite la mer. Un trou dans la donnée ne coûte plus que la précision locale autour du trou.</p>
<p>Je n&rsquo;ai su que ma première correction avait échoué que parce que j&rsquo;avais pris soin de faire crier le programme. Quand il n&rsquo;arrivait pas à reconstituer la mer, il écrivait noir sur blanc dans son rapport : <em>« trait de côte présent mais impossible d&rsquo;en déduire l&rsquo;emprise de la mer : le large risque d&rsquo;être traité en combustible »</em>. Un modèle qui échoue en silence ment. Un modèle qui échoue bruyamment se laisse réparer.</p>
<hr />
<h3 id="la-question-qui-fache-est-ce-que-ca-marche">La question qui fâche : est-ce que ça marche ?</h3>
<p>À ce stade, l&rsquo;outil produisait de jolies cartes. Une jolie carte n&rsquo;a jamais rien prouvé.</p>
<p>Et j&rsquo;avais sous la main de quoi le prendre en défaut : l&rsquo;incendie durait depuis plusieurs jours, donc son propre passé était disponible. Plutôt que d&rsquo;attendre de voir si les prochaines prévisions tombaient juste, autant rejouer celles qu&rsquo;on aurait pu faire l&rsquo;avant-veille et regarder ce qu&rsquo;elles valaient. C&rsquo;est une méthode connue, elle porte un nom : la <strong>rétro-prévision</strong>.</p>
<p><strong>Rétro-prévision</strong> (ou <em>hindcast</em>) &mdash; on se replace à un instant du passé, on ne garde que les données disponibles à cette date, on simule vers l&rsquo;avant, puis on compare à ce qui s&rsquo;est réellement produit. C&rsquo;est la façon standard d&rsquo;évaluer un modèle de prévision quand on ne peut pas se permettre d&rsquo;attendre.</p>
<p>Je me replace donc au 24 juillet au matin, je jette tout ce qui a été observé après, je simule douze heures, je compare à ce qui a réellement brûlé. Puis je recommence le 25. Deux exécutions, une poignée de minutes de calcul &mdash; et de très loin le meilleur rapport entre l&rsquo;effort fourni et ce que ça m&rsquo;a appris.</p>
<p><a href="https://pf.olibrio.fr/images/kokusho/validation.svg" title="Ouvrir le graphique en grand"><img alt="Graphique en barres comparant, à la même échelle, la surface réellement brûlée en douze heures et celle produite par le modèle. Le 24 juillet, alors que le feu courait librement, 4 642 hectares observés contre 10 008 simulés, soit un biais de surface de 1,7. Le 25 juillet, alors que les secours tenaient le front, 1 645 hectares observés contre 22 758 simulés, soit un biais de 12,3" src="https://pf.olibrio.fr/images/kokusho/validation.svg" /></a></p>
<p>Le 24 au matin, quand le feu courait librement, le modèle sur-prédit d&rsquo;un facteur 1,7. Pour un modèle de propagation, c&rsquo;est honorable &mdash; on est dans le bon ordre de grandeur. Le 25, alors que les secours reprenaient le front en main : facteur 12,3.</p>
<p>Ce qui est intéressant, ce n&rsquo;est pas que le modèle se trompe. C&rsquo;est <strong>où passe la différence entre les deux journées</strong>. Le modèle n&rsquo;est pas devenu mauvais du jour au lendemain : même code, même vent, même forêt. Ce qui a changé entre le 24 et le 25, ce sont les moyens de lutte.</p>
<p>Mon programme ne les voit pas. Il ne sait rien des effectifs engagés, ni des <strong>lignes d&rsquo;appui</strong> &mdash; ces coupures que les pompiers ouvrent au bulldozer pour arrêter le front &mdash; ni des largages. Il calcule donc, sans que je l&rsquo;aie décidé explicitement, <strong>un contrefactuel sans lutte</strong> : ce que ferait l&rsquo;incendie si personne ne s&rsquo;y opposait. Le 25, la physique seule donnait 22 758 hectares ; le feu n&rsquo;en a parcouru que 1 645, parce que des gens l&rsquo;en ont empêché.</p>
<p>Il y a une consolation dans ces chiffres, et elle est importante. Elle tient dans une mesure qui s&rsquo;appelle l&rsquo;<strong>AUC</strong>.</p>
<p><strong>AUC</strong>, pour <em>aire sous la courbe ROC</em> &mdash; mesure la qualité d&rsquo;un <em>classement</em>, indépendamment des valeurs absolues. Si je prends au hasard une cellule qui a brûlé et une qui n&rsquo;a pas brûlé, l&rsquo;AUC est la probabilité que le modèle ait mieux classé la première. 0,5 = tirage à pile ou face, 1 = classement parfait.</p>
<p>Mon AUC vaut <strong>0,96 à 0,98</strong> dans les deux cas &mdash; pendant que le biais de surface, lui, varie d&rsquo;un facteur sept. Autrement dit : <strong>le modèle sait très bien où le feu va, et se trompe lourdement sur combien</strong>. C&rsquo;est le meilleur mode d&rsquo;échec possible, parce qu&rsquo;une erreur d&rsquo;échelle se calibre, alors qu&rsquo;une erreur de direction condamne l&rsquo;outil.</p>
<p>Ce qui m&rsquo;amène à la décision la moins intuitive de tout ce bricolage. J&rsquo;avais un facteur de calage tout prêt : ralentir la propagation de ce qu&rsquo;il fallait pour retomber sur le 25 juillet. <strong>Je ne l&rsquo;ai pas appliqué.</strong> Ce serait graver dans le modèle l&rsquo;hypothèse « la lutte réussit toujours » &mdash; précisément celle à laquelle il ne faut pas se fier devant une centrale nucléaire. L&rsquo;outil refuse d&rsquo;ailleurs de lui-même de publier un facteur global quand ses cas de validation sont trop hétérogènes, et explique pourquoi plutôt que de moyenner deux régimes incomparables.</p>
<hr />
<h3 id="ce-quil-ne-fait-pas-et-cest-le-plus-grave">Ce qu&rsquo;il ne fait pas &mdash; et c&rsquo;est le plus grave</h3>
<p>La pire limite n&rsquo;est aucune de celles que je viens de raconter. Elle tient en un mot : <strong>le couplage est à sens unique</strong>. La météo pilote le feu ; le feu ne modifie jamais l&rsquo;atmosphère.</p>
<p>Or un grand incendie fabrique sa propre météo. C&rsquo;est la <strong>pyroconvection</strong> : la colonne d&rsquo;air surchauffé qu&rsquo;il envoie vers le ciel peut monter à plusieurs kilomètres et former un <strong>pyrocumulonimbus</strong>, un véritable nuage d&rsquo;orage né du feu lui-même. Il produit de la foudre sèche qui allume des départs à des dizaines de kilomètres, et il peut s&rsquo;effondrer d&rsquo;un coup en rabattant au sol une rafale violente, dans une direction quelconque.</p>
<p>C&rsquo;est exactement ce qui fait échapper les feux qu&rsquo;on croyait tenus, et c&rsquo;est <em>indépendant du vent synoptique</em> &mdash; le vent de grande échelle, celui que prévoit AROME. Donc invisible pour mon modèle. Un vrai couplage feu-atmosphère existe, il porte des noms comme Meso-NH/ForeFire ou WRF-SFIRE, et il demande des moyens de calcul de laboratoire. Hors de portée.</p>
<p>Le compromis : ne pas simuler le phénomène, mais en évaluer le <em>potentiel</em>. Il existe pour ça un indicateur, l&rsquo;<strong>indice de Haines continu</strong>, qui combine l&rsquo;instabilité de l&rsquo;air en altitude et sa sécheresse &mdash; en somme, il dit si le ciel « fait cheminée » ce jour-là. Croisé avec la puissance radiative du feu, il me donne un score. Une fraction de mes 200 tirages, égale à ce score, bascule alors en <strong>régime pyroconvectif</strong> : direction bien plus incertaine, propagation majorée, sautes de feu plus nombreuses et plus lointaines. Ces tirages-là nourrissent naturellement l&rsquo;enveloppe extrême.</p>
<p>Un potentiel élevé se lit donc « les enveloppes larges deviennent crédibles », jamais « il va se produire ceci ».</p>
<p>Autre angle mort, découvert en regardant arriver la canicule de cette semaine. Mon humidité des combustibles fins vient d&rsquo;une formule classique de danger météorologique, celle de Simard, qui ne regarde que la température et l&rsquo;humidité relative <em>instantanées</em>. Elle n&rsquo;a aucune mémoire. Or trois jours à 38 °C assèchent la litière en profondeur et le sol avec. D&rsquo;où ce résultat absurde : mon modèle affiche une humidité des combustibles qui <em>remonte</em> le jour où il fera 39,8 °C. Il sous-estime donc l&rsquo;effet d&rsquo;une canicule. Il faudrait des indices à mémoire, du type DMC et DC de l&rsquo;<strong>indice forêt-météo canadien</strong>, qui cumulent le déficit hydrique sur des jours et des semaines. C&rsquo;est le prochain chantier.</p>
<hr />
<h3 id="alors-le-blayais">Alors, le Blayais ?</h3>
<p><a href="https://pf.olibrio.fr/images/kokusho/carte-kokusho-grand.jpg" title="Ouvrir la capture en grand"><img alt="Capture de l'outil en ligne. À gauche une carte du littoral aquitain : la surface déjà parcourue en gris, le front actif en orange, et les enveloppes à 48 heures en contours jaunes autour de deux foyers. À droite un panneau qui donne pour chaque site sensible le niveau de menace, la confiance, la distance au front et les distances minimales simulées" src="https://pf.olibrio.fr/images/kokusho/carte-kokusho.jpg" /></a></p>
<p>Cliquez pour agrandir &mdash; ou allez voir la version vivante sur <a href="https://kokusho.ss2i.ca">kokusho.ss2i.ca</a>.</p>
<p>La réponse est restée la même du premier au dernier calcul : <strong>front observé à 36 kilomètres, aucun des 200 scénarios n&rsquo;approchant à moins de 10 kilomètres, vent poussant à l&rsquo;opposé</strong>. La centrale n&rsquo;a jamais été menacée. Et l&rsquo;outil le dit avec ses motifs, pas avec un verdict.</p>
<p>Le site réellement exposé était ailleurs : la base aérienne de Cazaux, à 7 kilomètres du foyer de Biscarrosse, avec jusqu&rsquo;à 6,7 % des scénarios atteignant sa zone élargie.</p>
<p>Et puis il y a eu ce dernier matin où Cazaux est brusquement passé en orange, avec 96,7 % des scénarios atteignant cette même zone. Spectaculaire. Et faux.</p>
<p>Le satellite n&rsquo;avait rien vu depuis quinze heures. Mon programme s&rsquo;était rabattu sur son hypothèse de repli : faute de savoir où se trouve le front actif, considérer que <em>tout</em> le périmètre parcouru est actif. L&rsquo;incendie se propageait donc dans toutes les directions à la fois, et mes 96,7 % ne mesuraient plus une convergence vers Cazaux &mdash; ils mesuraient mon ignorance. La vitesse de rapprochement réellement observée, elle, était nulle.</p>
<p>Désormais, dans ce cas précis, le niveau retombe sur « incertitude élevée, aucun rapprochement observé » au lieu de crier au feu &mdash; sauf si un rapprochement est réellement mesuré, auquel cas l&rsquo;alerte tient. C&rsquo;est peut-être la correction dont je suis le plus content : elle empêche l&rsquo;outil de transformer une absence d&rsquo;information en alerte.</p>
<hr />
<h3 id="ce-que-jen-retiens">Ce que j&rsquo;en retiens</h3>
<p>Tout ça a été bricolé en deux jours, et le code, je ne l&rsquo;ai pas tapé : je l&rsquo;ai fait écrire par une IA. Même méthode que pour le convertible tchèque il y a trois semaines, mais cette fois sur un sujet où se tromper n&rsquo;est pas anodin.</p>
<p>Ce qui ne se délègue pas, en revanche, c&rsquo;est le reste : décider qu&rsquo;on afficherait des enveloppes et jamais une trajectoire, choisir les sources, exiger que le modèle soit éprouvé sur le passé de l&rsquo;incendie plutôt que sur des tests de laboratoire, et rouvrir la carte d&rsquo;entrée quand un résultat sentait le faux. La machine écrit vite et bien. Elle ne sait pas ce qu&rsquo;il faut vérifier.</p>
<p>Cinq erreurs de fond ont été trouvées dans le modèle. Ce qui m&rsquo;a le plus surpris, c&rsquo;est de regarder <em>par quoi</em> :</p>
<ul>
<li>le feu prisonnier de sa cicatrice : par un chiffre invraisemblable dans un rapport ;</li>
<li>la rastérisation qui s&rsquo;enlisait : par un calcul qui ne rendait plus la main ;</li>
<li>la mer combustible : <strong>parce que j&rsquo;ai fini par regarder la carte d&rsquo;entrée</strong>, celle que personne ne pense à ouvrir ;</li>
<li>la reconstruction du littoral qui ne tenait pas en réel : par un avertissement que j&rsquo;avais pris la peine d&rsquo;écrire pour ce cas précis ;</li>
<li>la fausse alerte orange : en confrontant ce que disait la simulation à ce que disait l&rsquo;observation.</li>
</ul>
<p>Aucune n&rsquo;a été trouvée par les tests automatiques. J&rsquo;en ai soixante-quatre, et chacun de ces bugs a désormais le sien &mdash; ils empêcheront la régression. Mais aucun test ne pouvait deviner qu&rsquo;OpenStreetMap ne cartographie pas l&rsquo;océan. <strong>Les tests vérifient ce à quoi on a déjà pensé. Ils sont muets sur le reste.</strong></p>
<p>Ce qui a marché, c&rsquo;est le frottement avec le réel : les vraies données, la vraie carte, le vrai passé de l&rsquo;incendie. La rétro-prévision m&rsquo;a appris davantage en deux exécutions que deux jours de développement.</p>
<p>Et son enseignement principal n&rsquo;était pas « le modèle se trompe de tant ». C&rsquo;était : <strong>le modèle ne répond pas à la question que je croyais lui poser</strong>. Je lui demandais ce que cet incendie allait faire. Il me répondait ce qu&rsquo;il ferait si personne ne s&rsquo;y opposait.</p>
<p>C&rsquo;est une information utile &mdash; c&rsquo;est même exactement celle qu&rsquo;il faut pour savoir de quoi un incendie est capable. Mais ce n&rsquo;est pas celle qu&rsquo;on croit lire sur une carte.</p>
<hr />
<p>🔥 <strong><a href="https://kokusho.ss2i.ca">Voir l&rsquo;outil en ligne &mdash; kokusho.ss2i.ca</a></strong></p>
<p>Expérimental, sans valeur officielle. En cas d&rsquo;incendie, la seule source qui fait foi est la préfecture : <a href="https://www.landes.gouv.fr/">landes.gouv.fr</a> · <a href="https://www.gironde.gouv.fr/">gironde.gouv.fr</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>La nuit travaille pour nous</title>
      <link>https://pf.olibrio.fr/posts/la-nuit-travaille-pour-nous.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/la-nuit-travaille-pour-nous.html</guid>
      <pubDate>Mon, 13 Jul 2026 12:00:00 +0000</pubDate>
      <description>37,7 °C dehors, 30 °C dans la salle de bain, et la VMC n’a pas tourné de la semaine. Comment une maison instrumentée apprend à évacuer sa chaleur la nuit.</description>
      <category>canicule</category>
      <category>free cooling</category>
      <category>vmc</category>
      <category>capteurs</category>
      <category>isolant</category>
      <category>dérèglement</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/nuit/semaine-canicule.png" alt="La nuit travaille pour nous"></p>
<p>Il est 16 h, il fait 37,7 °C dehors au plus chaud de ces dernières vingt-quatre heures, et ma salle de bain affiche 30 °C. Pas la salle de bain après une douche : la salle de bain à vide, volets tirés, personne dedans. C&rsquo;est ce que fait une canicule à une maison &mdash; elle la remplit lentement, degré par degré, par le toit, par les murs, par chaque vitre, et le soir venu la maison est devenue un radiateur qui vous restitue la journée pendant que vous essayez de dormir.</p>
<p>Contre ça, on ne peut pas grand-chose sur le moment. Mais la canicule a un défaut : <strong>la nuit</strong>. Vers 4 h du matin, l&rsquo;air extérieur descend à 20 °C, parfois moins. Pendant quelques heures, il y a dehors un stock de fraîcheur gratuit, immense, renouvelé chaque nuit &mdash; et la seule question qui vaille est : comment le faire entrer ?</p>
<hr />
<h3 id="une-vmc-de-salle-de-bain-comme-cheval-de-trait">Une VMC de salle de bain comme cheval de trait</h3>
<p>La maison avait déjà tout ce qu&rsquo;il fallait, en fait. Il suffisait de le regarder autrement.</p>
<p>En bas, une amenée d&rsquo;air frais, installée à l&rsquo;origine pour nourrir le poêle à bois. En haut, à l&rsquo;étage, la salle de bain &mdash; le point le plus chaud de la maison, physique élémentaire. Et entre les deux, une modeste VMC qui, depuis des années, ne s&rsquo;occupe que d&rsquo;humidité : elle s&rsquo;allume quand la douche embue, s&rsquo;éteint quand c&rsquo;est sec.</p>
<p>Or si l&rsquo;on fait tourner cet extracteur la nuit, quelque chose de plus intéressant se produit : il aspire l&rsquo;air chaud accumulé en haut, le jette dehors, et la dépression tire l&rsquo;air frais de la nuit par l&rsquo;amenée d&rsquo;air du bas. Toute la maison devient un circuit : l&rsquo;air frais entre par le rez-de-chaussée, traverse, monte, ressort par le haut en emportant la chaleur de la journée. Le bénéfice n&rsquo;est pas local à la salle de bain &mdash; c&rsquo;est un <strong>tirage thermique à l&rsquo;échelle de la maison</strong>, avec un ventilateur de quelques dizaines de watts comme seul moteur.</p>
<p>Les anglophones appellent ça du <em>free cooling</em>. J&rsquo;aime bien la version française : la nuit travaille pour nous.</p>
<hr />
<h3 id="la-regle-et-les-pieges-quelle-evite">La règle, et les pièges qu&rsquo;elle évite</h3>
<p>Restait à écrire la règle de décision. Le petit ordinateur qui pilote la VMC interroge désormais la météo et n&rsquo;allume l&rsquo;extraction que si <strong>quatre conditions</strong> sont réunies en même temps :</p>
<ol>
<li>le <strong>maximum extérieur des dernières 24 heures</strong> dépasse 22 °C &mdash; on est bien en saison chaude ;</li>
<li>la salle de bain dépasse 24 °C &mdash; il fait réellement chaud en haut ;</li>
<li>le salon dépasse 20 °C &mdash; la maison n&rsquo;est pas déjà rafraîchie ;</li>
<li>l&rsquo;air extérieur est <strong>au moins 3 °C plus frais</strong> que l&rsquo;intérieur &mdash; sinon on brasserait pour rien.</li>
</ol>
<p>La subtilité, c&rsquo;est la première condition. On pourrait croire qu&rsquo;il suffit de comparer dedans et dehors. Erreur &mdash; et une erreur qui coûterait cher en janvier : une maison chauffée au poêle à 24 °C par 5 °C dehors montre un écart de 19 °C, largement de quoi déclencher une règle naïve&hellip; qui jetterait alors la chaleur du bois par la fenêtre, en aspirant de l&rsquo;air glacial par l&rsquo;amenée d&rsquo;air. Celle-là même qui nourrit le poêle. Le système se saboterait lui-même.</p>
<p>D&rsquo;où le critère de <em>saison</em> : le <strong>max extérieur sur 24 h glissantes</strong>. Mes relevés de janvier plafonnent à 14,6 °C ; ceux de l&rsquo;été ne descendent jamais sous 22 °C. Entre les deux, un fossé &mdash; le garde-fou est infranchissable par accident. Et surtout, il ne regarde pas la température de l&rsquo;instant : une nuit à 13 °C après une journée à 32 °C est précisément le moment d&rsquo;extraire, et un seuil instantané l&rsquo;aurait interdit.</p>
<hr />
<h3 id="ce-que-disent-les-chiffres">Ce que disent les chiffres</h3>
<p>Avant de brancher quoi que ce soit, j&rsquo;ai rejoué la règle sur les données réelles de la semaine écoulée &mdash; la maison enregistre tout depuis des années, autant que ça serve.</p>
<p><img alt="Une semaine de canicule : la température extérieure oscille entre 20 et 38 °C pendant que la salle de bain s'installe autour de 28-30 °C ; tout à droite, la commande du ventilateur passe à ON" src="https://pf.olibrio.fr/images/nuit/semaine-canicule.png" /></p>
<p><em>La semaine en une image : l&rsquo;extérieur (bleu) respire de 20 à 38 °C, la salle de bain (rose) encaisse et s&rsquo;installe autour de 28-30 °C. Et tout à droite, ce trait qui monte : la commande du ventilateur qui passe à ON &mdash; le système vient d&rsquo;être armé, à quelques heures de sa première nuit.</em></p>
<p>Verdict : sur la semaine du 6 au 13 juillet, la règle aurait déclenché <strong>48 heures d&rsquo;extraction</strong>. Écart moyen entre dedans et dehors au moment des déclenchements : <strong>4,9 °C</strong>. Créneaux : concentrés entre <strong>1 h et 9 h du matin</strong>, jamais l&rsquo;après-midi &mdash; la règle a d&rsquo;elle-même trouvé le rythme des nuits.</p>
<p>Et le chiffre qui m&rsquo;a le plus amusé : pendant cette même semaine de canicule, la VMC n&rsquo;a pas tourné <strong>une seule minute</strong>. L&rsquo;air était si sec (29 à 37 % d&rsquo;humidité dans la salle de bain, pour un seuil de déclenchement à 60 %) que sa mission historique ne l&rsquo;a jamais réveillée. Un moteur parfaitement fonctionnel, installé, câblé, alimenté &mdash; et 100 % dormant, pile pendant la semaine où il avait le plus à offrir. C&rsquo;est exactement le genre de gisement que j&rsquo;aime : zéro matériel à acheter, juste une règle à écrire.</p>
<p>Cette nuit est la première en conditions réelles. L&rsquo;inconnue est franche : l&rsquo;amenée d&rsquo;air a été dimensionnée pour la combustion d&rsquo;un poêle, pas pour ventiler une maison. Si sa section est trop juste, le ventilateur tirera surtout sur les défauts d&rsquo;étanchéité et le débit réel sera décevant. C&rsquo;est la courbe de demain matin qui tranchera &mdash; si la salle de bain décroche nettement par rapport aux nuits précédentes, c&rsquo;est gagné.</p>
<hr />
<h3 id="evenements-remarquables-7-c-et-417-c-la-meme-annee">Événements remarquables : −7 °C et +41,7 °C, la même année</h3>
<p>Une maison qui enregistre tout accumule sa petite mythologie. Le tableau des records extérieurs de 2026, lui, se passe presque de commentaire :</p>
<ul>
<li><strong>6 janvier 2026 : −7,0 °C.</strong> La journée la plus froide jamais consignée par la station. Le poêle a tourné sans discontinuer, l&rsquo;amenée d&rsquo;air du bas aspirait du gel.</li>
<li><strong>23 juin 2026 : 41,7 °C.</strong> La plus chaude &mdash; avant même l&rsquo;été officiel. Trois heures d&rsquo;affilée au-dessus de 41 °C.</li>
</ul>
<p><img alt="Plaine couverte de neige au soleil rasant, ciel dégagé, lors de l'épisode de froid de janvier 2026" src="https://pf.olibrio.fr/images/nuit/janvier-neige.jpg" /></p>
<p><em>Le matin du record : la plaine sous la neige, ciel limpide &mdash; le même ciel dégagé qui, six mois plus tard, laissera le soleil pousser le thermomètre à 41,7 °C.</em></p>
<p><strong>48,7 degrés d&rsquo;amplitude en moins de six mois</strong>, au même endroit, mesurés par la même chaîne de capteurs. La moyenne, elle, glisse sans bruit &mdash; et c&rsquo;est bien le piège.</p>
<p>Ça m&rsquo;a rappelé Mélenchon, lors de sa première campagne présidentielle, qui s&rsquo;agaçait déjà du mot « réchauffement » : un mot trop doux, presque une promesse de printemps précoce, deux degrés de plus sur une moyenne, qui s&rsquo;en apercevrait ? Et qui lui préférait, avec insistance, « <strong>dérèglement climatique</strong> ». La nuance n&rsquo;est pas cosmétique, elle est toute la question : ce qui abîme les maisons, les récoltes et les gens, ce n&rsquo;est pas la moyenne qui glisse &mdash; ce sont <strong>les extrêmes qui s&rsquo;écartent dans les deux sens</strong>. Les gelées plus mordantes <em>et</em> les canicules plus précoces. Une machine climatique qui n&rsquo;a pas simplement pris un degré : qui a perdu son thermostat.</p>
<p><img alt="Tendance climatique du 13 juillet à Puilboreau depuis 1970 : minimales, moyennes et maximales sur ±7 jours, avec une pente de +0,32 °C par décennie" src="https://pf.olibrio.fr/images/nuit/tendance-13-juillet.png" /></p>
<p><em>Le 13 juillet au fil des années, depuis 1970 (agrégats Open-Meteo pour chez moi). La moyenne monte de </em><em>+0,32 °C par décennie</em><em> &mdash; 19,5 °C dans les premières années de la série, 21,5 °C sur les dix dernières. Deux degrés en un demi-siècle : c&rsquo;est le « réchauffement », et sur ce graphe il a l&rsquo;air inoffensif. Ce qui ne se voit qu&rsquo;en plissant les yeux, c&rsquo;est la courbe rose des maximales qui se déchaîne &mdash; les pointes récentes crèvent le plafond des années 70. Le dérèglement, c&rsquo;est elle.</em></p>
<p>Mes deux records de 2026 tiennent la démonstration à eux seuls. Et c&rsquo;est exactement pour ça qu&rsquo;on outille une maison : on ne se prépare pas à une moyenne, on se prépare à des extrêmes &mdash; dans les deux sens.</p>
<hr />
<h3 id="sous-le-capot-pour-ceux-qui-voudraient-le-construire">Sous le capot, pour ceux qui voudraient le construire</h3>
<p>Tout ce qui précède tient avec du matériel de fond de tiroir &mdash; c&rsquo;est le point important, et la raison d&rsquo;être de ce billet : n&rsquo;importe qui peut monter ça un dimanche.</p>
<ul>
<li><strong>Dans la salle de bain : un Raspberry Pi Zero W</strong> (~15 €), un capteur température/humidité <strong>DHT11</strong> à 2 € sur un GPIO, et un <strong>émetteur radio 433 MHz</strong> à 2 € sur un autre.</li>
<li><strong>La VMC n&rsquo;est pas modifiée d&rsquo;un fil.</strong> Elle est branchée sur une <strong>prise télécommandée 433 MHz</strong> de supermarché (~10 €) : le Pi rejoue simplement les codes ON/OFF de la télécommande d&rsquo;origine (bibliothèque <code>rpi-rf</code>, protocole 1, pulse 350 µs &mdash; les valeurs se capturent en écoutant la télécommande avec un récepteur à 1 €). Aucun câblage 230 V, réversible en trente secondes.</li>
<li><strong>Un petit serveur quelque part</strong> &mdash; ici un VPS à quelques euros, mais un NAS ou un second Pi feraient exactement pareil : une page PHP, une base <strong>SQLite</strong>, et c&rsquo;est tout.</li>
</ul>
<p><img alt="Raspberry Pi Model B Revision 2, la carte de 2012" src="https://pf.olibrio.fr/images/nuit/pi-model-b.jpg" /> <img alt="Raspberry Pi Zero, la carte minuscule qui pilote la VMC" src="https://pf.olibrio.fr/images/nuit/pi-zero.jpg" /> <img alt="Capteur de température et d'humidité DHT11, le petit boîtier bleu strié" src="https://pf.olibrio.fr/images/nuit/dht11.jpg" /></p>
<p><em>Les ouvriers de la maison. En haut, le vétéran : un Raspberry Pi Model B de 2012 &mdash; 14 ans de service, il pilote le chauffage du salon en Ruby. Au milieu, le Pi Zero de la salle de bain, qui vient d&rsquo;apprendre le free cooling. En bas, leurs yeux : le DHT11, le capteur température/humidité à 2 € &mdash; le petit boîtier bleu strié que tout bricoleur a déjà croisé. (Photos : Gareth Halfacree CC BY-SA 2.0 ; Evan-Amos, domaine public ; Crackopl CC BY-SA 3.0.)</em></p>
<p><strong>La chasse aux watts</strong> fait partie du jeu, pour des machines qui tournent 24 h/24. Le Pi Zero consomme ~0,6 W. Le vieux Model B en tire ~2,5 &mdash; la faute à ses régulateurs linéaires de 2012, qui brûlent l&rsquo;excédent de tension en chaleur pure, et à sa puce USB/Ethernet alimentée en permanence. On ne peut rien à l&rsquo;architecture, mais on peut tailler dans le gras logiciel : en fouillant le vétéran cette semaine, j&rsquo;y ai trouvé un MySQL et un Apache de 2017 qui tournaient pour rien depuis neuf ans, une sortie HDMI active en NTSC sans écran au bout, un Bluetooth jamais appairé, et un démon qui attendait les raccourcis d&rsquo;un clavier fantôme. Tout coupé : deux degrés de moins au processeur en pleine canicule, 38 Mo de RAM rendus, et surtout plus d&rsquo;écritures inutiles sur la carte SD &mdash; c&rsquo;est elle, la vraie mortelle. À l&rsquo;échelle de la facture c&rsquo;est anecdotique (2,5 W ≈ 22 kWh/an ≈ 5 €), mais un système qu&rsquo;on veut voir durer dix ans se doit d&rsquo;être maigre.</p>
<p>Les choix d&rsquo;architecture sont tous dictés par la même obsession : survivre aux pannes, aux reboots de box et aux années.</p>
<ul>
<li><strong>Pas de démon, un cron.</strong> Le contrôleur se lance toutes les 5 minutes, vit vingt secondes, mesure, décide, envoie son code radio, s&rsquo;éteint. Un process qui ne tourne pas ne peut ni fuir ni se bloquer &mdash; le Pi en est à 267 jours d&rsquo;uptime sans y penser.</li>
<li><strong>C&rsquo;est toujours le Pi qui tire, jamais le serveur qui pousse.</strong> Le Pi retélécharge sa configuration (un YAML) chaque minute d&rsquo;un simple <code>curl</code>, et interroge la météo au moment de décider. Derrière n&rsquo;importe quelle box, NAT ou changement d&rsquo;IP, ça fonctionne &mdash; et la case « Activer » cochée sur la page web est effective sur le terrain la minute suivante.</li>
<li><strong>La météo vient d&rsquo;Open-Meteo</strong> (open-meteo.com) : API gratuite, sans clé, avec l&rsquo;historique. Un cron horaire l&rsquo;archive côté serveur, et le Pi reçoit un JSON minimal : température actuelle, max sur 24 h glissantes, température du salon. Ne servir que de l&rsquo;observé &mdash; jamais la prévision &mdash; a son importance : la ligne de 23 h annonçait 24 °C pendant qu&rsquo;il en faisait 35 dehors, et une règle nourrie de prévisions aurait aspiré l&rsquo;air de la fournaise.</li>
<li><strong>Une table unique pour tout</strong> : <code>observations (source, metric, value, unit, metadata)</code>. Capteurs, consignes, commandes, météo &mdash; tout entre dans le même moule. Ajouter un capteur, c&rsquo;est ajouter une <em>source</em>, zéro migration. C&rsquo;est cette table qui a permis de rejouer la règle sur les archives avant de la brancher.</li>
<li><strong>Échec fermé.</strong> Serveur injoignable ou météo vieille de plus de deux heures → le Pi retombe sur sa logique humidité d&rsquo;origine. Pas de max 24 h → pas d&rsquo;extraction (le garde-fou de saison ne se contourne pas par accident). Le pire scénario d&rsquo;une panne, c&rsquo;est le comportement d&rsquo;avant.</li>
<li>Les courbes de la page sont tracées par <strong>uPlot</strong>, une bibliothèque de ~50 Ko qui encaisse des dizaines de milliers de points sans broncher.</li>
</ul>
<p>Et un mot sur ce qui, à mes yeux, n&rsquo;est pas négociable : <strong>ces données ne quittent jamais mon périmètre</strong>. Ce que mesurent ces capteurs, c&rsquo;est l&rsquo;intérieur d&rsquo;une maison &mdash; quand on s&rsquo;y douche, quand on la chauffe, quand elle est vide. Les Pis poussent leurs relevés en SSH vers un serveur <em>que j&rsquo;administre</em>, la page qui les affiche demande un mot de passe, et la boucle s&rsquo;arrête là. Pas de cloud constructeur, pas de « skill » Alexa, pas de SaaS domotique qui ferme dans trois ans en emportant l&rsquo;historique, pas un octet dans les analytics de qui que ce soit. La seule dépendance extérieure est dans l&rsquo;autre sens : la maison <em>télécharge</em> la météo publique d&rsquo;Open-Meteo, elle n&rsquo;envoie rien. Le jour où le serveur change &mdash; un NAS, un autre VPS, une boîte à chaussures &mdash; on déplace un fichier SQLite et tout repart.</p>
<p>Budget total par pièce instrumentée : <strong>moins de 30 €</strong>. Le luxe n&rsquo;est pas dans le matériel &mdash; il est dans les années de données qu&rsquo;on accumule, qu&rsquo;on peut interroger le jour où on a une idée, et qui n&rsquo;appartiennent qu&rsquo;à vous.</p>
<hr />
<h3 id="la-suite-entrer-dans-lepaisseur-des-choses">La suite : entrer dans l&rsquo;épaisseur des choses</h3>
<p>Jusqu&rsquo;ici, tous mes capteurs mesurent des <em>pièces</em>. La prochaine étape est plus intime : entrer <strong>dans l&rsquo;isolant</strong>.</p>
<p>Le projet : une tige plantée verticalement dans l&rsquo;isolant des combles, avec quatre sondes de température étagées &mdash; surface, un tiers, deux tiers, fond contre le placo. Au-dessus, une cinquième sonde dans l&rsquo;air sous tuiles, qui monte à 60-70 °C en ce moment. En dessous, le thermostat du salon, déjà en place. Une colonne de mesure complète, du soleil à la pièce à vivre.</p>
<p>Ce que ça racontera, jour après jour :</p>
<ul>
<li><strong>Le déphasage réel</strong> : combien d&rsquo;heures met le pic de chaleur sous tuiles à traverser l&rsquo;isolant ? Le fabricant annonce une valeur théorique ; l&rsquo;isolant tassé et vieilli en fait ce qu&rsquo;il veut. Je veux le chiffre vrai, chez moi.</li>
<li><strong>L&rsquo;amortissement</strong> : de combien l&rsquo;amplitude jour/nuit est-elle écrasée entre la surface et le fond ?</li>
<li><strong>L&rsquo;effet des cheminées de tirage</strong> que j&rsquo;ai posées sur le toit pour évacuer la chaleur sous tuiles : à météo comparable, la surface de l&rsquo;isolant doit être plus fraîche si le tirage fait son travail. Deux colonnes de sondes &mdash; une proche des cheminées, une éloignée &mdash; et la réponse tombera d&rsquo;elle-même.</li>
<li>Et à long terme, un <strong>détecteur de vieillissement</strong> : un déphasage qui raccourcit d&rsquo;année en année, c&rsquo;est un isolant qui se dégrade. Autant le savoir avant que la facture de chauffage ne le dise.</li>
</ul>
<p>Côté matériel, rien d&rsquo;héroïque : des sondes étanches à quelques euros sur un bus une-paire-de-fils, un microcontrôleur qui dort 99,9 % du temps sur deux accus de récupération &mdash; de quoi tenir environ deux ans sans changer les piles. L&rsquo;électronique reste au frais en bas des combles ; seules les sondes montent au front.</p>
<hr />
<h3 id="et-lhiver-on-inverse-tout">Et l&rsquo;hiver, on inverse tout</h3>
<p>La canicule finira. Et la même tuyauterie intellectuelle resservira, retournée comme un gant.</p>
<p>Le prochain chantier qui me trotte dans la tête : des <strong>panneaux thermiques à air sur la façade extérieure</strong> &mdash; des capteurs solaires tout bêtes, une boîte noire vitrée dans laquelle l&rsquo;air se réchauffe au soleil d&rsquo;hiver. Même par 5 °C dehors, un panneau bien exposé sort de l&rsquo;air à 30 ou 40 °C en milieu de journée. Branché sur l&rsquo;amenée d&rsquo;air de la maison, ça devient du <strong>préchauffage gratuit</strong> : au lieu d&rsquo;aspirer de l&rsquo;air à 5 °C pour alimenter le poêle et compenser l&rsquo;extraction, on aspire de l&rsquo;air déjà tiédi par le soleil.</p>
<p>Et la boucle se referme élégamment : c&rsquo;est la même logique de décision que le free cooling, inversée. L&rsquo;été, on extrait la nuit quand <em>dehors \&lt; dedans</em>. L&rsquo;hiver, on injectera le jour quand <em>panneau &gt; dedans</em>. Les mêmes capteurs, la même météo, la même règle à quatre conditions avec ses garde-fous &mdash; seul le signe change. Les sondes dans l&rsquo;isolant diront même si le préchauffage se voit dans le gradient des combles.</p>
<p>Une maison, au fond, c&rsquo;est un système thermique qui s&rsquo;ignore. La mienne commence tout juste à se connaître &mdash; et cette nuit, pour la première fois, elle va essayer de se rafraîchir toute seule pendant que je dors. Je vous raconte demain si elle a réussi.</p>
<hr />
<h3 id="post-scriptum-au-matin-du-14-juillet">Post-scriptum, au matin du 14 juillet</h3>
<p>La première nuit a eu lieu. Le ventilateur a extrait pendant près de <strong>douze heures</strong>, de 19 h à 8 h, avec une pause d&rsquo;une heure vers 1 h du matin &mdash; l&rsquo;écart était retombé sous le seuil d&rsquo;arrêt, la règle a fait exactement ce qu&rsquo;on lui a appris.</p>
<p>Résultat brut : salle de bain de <strong>31 °C au coucher à 26 °C au lever</strong>. La meilleure nuit de la semaine. Mais le chiffre qui me plaît est ailleurs. Les nuits précédentes, l&rsquo;extérieur descendait à 23-24 °C et la salle de bain restait scotchée à 28 : quatre à cinq degrés d&rsquo;écart au lever, la signature d&rsquo;une maison qui n&rsquo;échange rien avec la nuit. Cette fois, le contrôleur a maintenu l&rsquo;écart entre <strong>1,4 et 2,4 °C jusqu&rsquo;au matin</strong> &mdash; l&rsquo;intérieur a <em>suivi</em> l&rsquo;extérieur dans sa descente, heure après heure. Le renouvellement d&rsquo;air est bien là, et l&rsquo;inconnue de l&rsquo;amenée d&rsquo;air est levée : elle débite.</p>
<p>Transparence de rigueur : les fenêtres étaient ouvertes cette nuit-là, canicule oblige &mdash; impossible de séparer leur part de celle du ventilateur. La nuit prochaine se fera <strong>fenêtres fermées, VMC seule</strong>. Si la salle de bain colle encore l&rsquo;extérieur à deux degrés près au matin, la démonstration sera complète. La science domestique avance une nuit à la fois.</p>
<hr />
<p><em>Épisode suivant : les courbes de la première nuit fenêtres fermées, et ce que 48 heures de tirage nocturne changent (ou pas) à une canicule.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Rétro-ingénierie d&#x27;un convertible de 1970, avec une IA aux commandes de Blender</title>
      <link>https://pf.olibrio.fr/posts/retro-ingenierie-convertible-1970.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/retro-ingenierie-convertible-1970.html</guid>
      <pubDate>Sun, 05 Jul 2026 12:00:00 +0000</pubDate>
      <description>Un canapé-lit tchécoslovaque repéré en ligne, une IA qui pilote Blender, et trois théories fausses avant la bonne. Récit d’une rétro-conception paramétrique.</description>
      <category>blender</category>
      <category>ia</category>
      <category>meuble</category>
      <category>mid-century</category>
      <category>paramétrique</category>
      <category>mécanique</category>
      <content:encoded><![CDATA[<p><img src="https://pf.olibrio.fr/images/sofa/00-illustration-manga.png" alt="Rétro-ingénierie d&#x27;un convertible de 1970, avec une IA aux commandes de Blender"></p>
<p><img alt="Le convertible OPP Drevovyroba, en version encre et trames" src="https://pf.olibrio.fr/images/sofa/00-illustration-manga.png" /></p>
<p><em>Illustration : réinterprétation façon manga d&rsquo;une photo du vendeur &mdash; l&rsquo;original est sur <a href="https://justchairs.eu/products/mid-century-convertible-sofa-by-opp-drevovyroba-1970s">justchairs.eu</a>.</em></p>
<p>J&rsquo;ai croisé en ligne un canapé convertible tchécoslovaque des années 70, signé OPP Drevovyroba, <a href="https://justchairs.eu/products/mid-century-convertible-sofa-by-opp-drevovyroba-1970s">en vente chez un revendeur de Budapest</a>. Ligne basse, accoudoirs sculpturaux en contreplaqué de teck cintré, et un mécanisme annoncé d&rsquo;une phrase : « le canapé se transforme en lit d&rsquo;un seul geste ». 1 550 €, à 1 500 km de chez moi, et des dimensions qui ne collent pas à mon salon. La conclusion s&rsquo;imposait : plutôt que de l&rsquo;acheter, le redessiner &mdash; et en profiter pour le comprendre.</p>
<p>Ce billet raconte l&rsquo;exercice, mené avec une IA (Claude) qui pilote Blender en direct. Spoiler : l&rsquo;IA s&rsquo;est trompée trois fois sur le mécanisme, et c&rsquo;est précisément ce qui rend l&rsquo;histoire intéressante.</p>
<h2 id="le-dispositif">Le dispositif</h2>
<p>Côté outillage, c&rsquo;est devenu presque banal : Blender, un petit addon qui ouvre un serveur sur la machine (<a href="https://github.com/ahujasid/blender-mcp">BlenderMCP</a>), et l&rsquo;IA qui s&rsquo;y connecte. Dix minutes d&rsquo;installation. À partir de là, elle écrit du Python dans Blender, construit de la géométrie, prend des captures du viewport pour vérifier son travail, et recommence. Moi, je regarde le modèle tourner en direct sur mon écran et je commente.</p>
<p>Le parti pris dès le départ : un modèle <strong>paramétrique</strong>. Pas de la sculpture à la souris, mais un script avec un bloc de paramètres en tête &mdash; largeur, hauteur d&rsquo;assise, épaisseur des coussins, inclinaison du dossier &mdash; et toute la géométrie, mécanisme compris, qui se recalcule quand on change une valeur. On verra que ce choix a sauvé la mise plusieurs fois.</p>
<p><img alt="Le modèle en position canapé" src="https://pf.olibrio.fr/images/sofa/04-canape-34.png" /></p>
<h2 id="trois-theories-pour-un-mecanisme">Trois théories pour un mécanisme</h2>
<p>Le vendeur fournit une quinzaine de photos, aucune du mécanisme en action. Il a donc fallu déduire.</p>
<p><strong>Théorie n° 1 : la charnière simple.</strong> Première interprétation de l&rsquo;IA : le dossier bascule vers l&rsquo;arrière sur une charnière, comme un clic-clac. Modélisé, animé&hellip; et démoli en regardant mieux les photos : en position lit, la bande avant du couchage est <em>devant</em> l&rsquo;assise, pas derrière. Le dossier passe donc par-dessus l&rsquo;assise. Exit la charnière.</p>
<p><strong>Théorie n° 2 : la cinématique à quatre barres.</strong> Si le dossier doit survoler l&rsquo;assise sans la percuter, me disais-je, il faut qu&rsquo;il tourne <em>et</em> se translate &mdash; donc deux pivots et des biellettes. L&rsquo;IA a pris l&rsquo;idée au sérieux, très au sérieux même : elle a écrit un solveur qui place les pivots par recherche numérique le long des médiatrices des deux poses, en maximisant la garde entre dossier et assise pendant la bascule. Résultat : un mécanisme à quatre barres parfaitement fonctionnel, garde de 17 mm vérifiée sur toute la course. Élégant. Et complètement faux.</p>
<p><strong>Théorie n° 3 : le pivot unique.</strong> C&rsquo;est un gros plan sur l&rsquo;accoudoir qui a tranché : les vis qui attachent le bras au dossier sont une fixation <em>rigide</em>, pas un pivot. Le bras et le dossier ne forment qu&rsquo;une seule pièce mobile, qui tourne autour du tourillon rond visible sur le flanc du caisson. Un seul pivot par côté. Et là, tout s&rsquo;éclaire : comme le pivot est bas et central, l&rsquo;arc de rotation <em>monte</em> au-dessus de l&rsquo;assise. Il n&rsquo;y a jamais eu de problème de collision à résoudre. Les concepteurs tchèques n&rsquo;avaient pas besoin de biellettes &mdash; ils avaient juste bien placé un axe.</p>
<p>La leçon vaut d&rsquo;être encadrée : <strong>quand l&rsquo;IA comprend mal le réel, elle ne se trompe pas timidement &mdash; elle sur-ingénie.</strong> Le mécanisme à quatre barres était la réponse brillante à un problème qui n&rsquo;existait pas.</p>
<p><img alt="Mi-bascule : le dossier survole l'assise" src="https://pf.olibrio.fr/images/sofa/02-mi-bascule.png" /></p>
<p>Le beau geste mathématique a survécu au naufrage de la théorie n° 2 : deux poses d&rsquo;un solide dans le plan déterminent un centre de rotation unique &mdash; l&rsquo;intersection des médiatrices. Plus besoin de recherche numérique : le pivot se <em>calcule</em>, exactement. Et quand on lui donne la bonne géométrie d&rsquo;entrée, il tombe à quelques millimètres de l&rsquo;emplacement du tourillon d&rsquo;origine. Une jolie validation croisée, cinquante ans plus tard.</p>
<h2 id="laccoudoir-qui-devient-pied">L&rsquo;accoudoir qui devient pied</h2>
<p>Autre trouvaille des photos en position lit : le dossier déborde de 46 cm en porte-à-faux devant le caisson, et c&rsquo;est <em>l&rsquo;accoudoir</em> qui le soutient &mdash; en basculant, la branche d&rsquo;accoudoir pointe vers le sol et son extrémité s&rsquo;y pose, jambe de force improvisée. Le petit plateau où on posait son coude devient un patin.</p>
<p>Dans le modèle paramétrique, on a inversé la logique : plutôt que de dessiner l&rsquo;accoudoir puis constater où il atterrit, l&rsquo;IA calcule ses points d&rsquo;appui <strong>par rotation inverse depuis leur cible au sol</strong>. La pointe de l&rsquo;accoudoir est définie comme « le point qui, après une rotation de 110°, touche le sol à y = -47 cm ». Vérification à la frame finale : z = 0,0 mm. Du coup on comprend aussi <em>pourquoi</em> l&rsquo;accoudoir original est si court et placé en retrait : sa position n&rsquo;est pas un choix esthétique, c&rsquo;est la contrainte d&rsquo;atterrissage. La forme suit le mécanisme.</p>
<p><img alt="Position lit : porte-à-faux soutenu par l'accoudoir" src="https://pf.olibrio.fr/images/sofa/03-lit-profil.png" /></p>
<h2 id="la-ou-on-depasse-loriginal">Là où on dépasse l&rsquo;original</h2>
<p>Comprendre, c&rsquo;est bien ; améliorer, c&rsquo;est mieux. Trois défauts du meuble d&rsquo;origine sont passés à la moulinette.</p>
<p><strong>Le couchage à deux fermetés.</strong> Sur l&rsquo;original, assise épaisse et dossier plus mince donnent un lit à deux zones. Correction : épaisseur commune de 14,5 cm partout, couchage de 126 × 200 cm parfaitement uniforme.</p>
<p><strong>L&rsquo;assise de 65 cm de profondeur.</strong> Impossible de s&rsquo;adosser en gardant les pieds au sol. En regardant mieux, l&rsquo;original triche déjà : son dossier n&rsquo;est pas au bord arrière mais <em>avancé</em> sur la plateforme, et la zone morte derrière lui devient du couchage au dépliage. On a paramétré ça proprement : <code>prof_utile = 50 cm</code>, et le pivot se recalcule tout seul.</p>
<p><strong>La face moelleuse du mauvais côté.</strong> Le vrai casse-tête. La bascule avant expose le <em>dos</em> du dossier comme surface de couchage : si la face avant est moelleuse pour s&rsquo;asseoir, on dort sur la face ferme. L&rsquo;original a tranché et tant pis pour l&rsquo;assise. Notre solution : un <strong>axe central</strong> qui traverse le dossier en son milieu. Pendant la bascule, le dossier fait un demi-tour sur lui-même &mdash; et la même face moelleuse sert au dossier le jour et au couchage la nuit. Conséquence en cascade : le bras s&rsquo;arrête désormais à mi-hauteur du dossier pour porter ce palier&hellip; pile à la hauteur de l&rsquo;accoudoir. L&rsquo;accoudoir <em>est</em> le palier.</p>
<p>Restait à empêcher le dossier de tournicoter librement. Première idée : une targette. Deuxième idée, bien meilleure : un <strong>téton courant dans une gorge semi-circulaire de 180°</strong>, concentrique à l&rsquo;axe, fraisée dans la face intérieure du bras. Les extrémités de la gorge sont les butées des deux positions &mdash; la course de la gorge <em>est</em> la course du demi-tour. Zéro verrou à manipuler, indexation automatique, et dans les deux poses les charges plaquent le téton contre sa butée. Vérifié dans le modèle : le téton est exactement en bout de gorge aux deux positions.</p>
<p><img alt="La gorge de 180° et son téton, sur la face intérieure du bras" src="https://pf.olibrio.fr/images/sofa/06-gorge-teton.png" /></p>
<p><img alt="Position lit : la face moelleuse est dessus" src="https://pf.olibrio.fr/images/sofa/05-lit-34-face-moelleuse.png" /></p>
<h2 id="ce-que-jen-retiens">Ce que j&rsquo;en retiens</h2>
<p><strong>Une photo vaut mille tokens.</strong> Les trois corrections décisives sont venues de gros plans que j&rsquo;ai envoyés à l&rsquo;IA : les vis rigides, l&rsquo;accoudoir-pied, le dossier avancé. Elle raisonne remarquablement bien &mdash; mais sur ce qu&rsquo;on lui montre.</p>
<p><strong>L&rsquo;IA sur-ingénie quand elle comprend mal.</strong> Le solveur à quatre barres était magnifique et inutile. Méfiez-vous des solutions brillantes : vérifiez d&rsquo;abord le problème.</p>
<p><strong>Le paramétrique rend les erreurs bon marché.</strong> Trois refontes complètes du mécanisme, et à chaque fois quelques minutes de recalcul plutôt que des heures de remodelage. Les points d&rsquo;ancrage (pivot, appuis au sol, palier) étant calculés et non posés à la main, tout suit.</p>
<p><strong>La collaboration a un sens.</strong> Elle calcule des intersections de médiatrices et vérifie des gardes au millimètre ; je vois qu&rsquo;un dossier de 65 cm de profondeur est invivable et qu&rsquo;une vis n&rsquo;est pas un pivot. Aucun des deux n&rsquo;aurait produit ce design seul.</p>
<p>La suite au prochain épisode : plans 2D cotés, détail du palier et de la gorge, et fabrication en contreplaqué de 18. Le script et le modèle tournent déjà &mdash; il ne manque que les dimensions de mon salon.</p>
<h2 id="les-fichiers">Les fichiers</h2>
<p>Tout est téléchargeable, servez-vous :</p>
<ul>
<li><a href="https://pf.olibrio.fr/assets/sofa/sofa_parametrique.py"><code>sofa_parametrique.py</code></a> &mdash; le script complet : paramètres, calcul du pivot, construction, animation. À ouvrir dans Blender (onglet Scripting) et relancer après avoir changé les <code>PARAMS</code>.</li>
<li><a href="https://pf.olibrio.fr/assets/sofa/canape_convertible.blend"><code>canape_convertible.blend</code></a> &mdash; la scène Blender avec l&rsquo;animation de bascule (frame 1 = canapé, frame 61 = lit).</li>
<li><a href="https://pf.olibrio.fr/assets/sofa/canape_convertible.glb"><code>canape_convertible.glb</code></a> &mdash; le modèle au format glTF, animation comprise, lisible partout (viewers 3D en ligne, moteurs de jeu, AR).</li>
</ul>
<hr />
<p><em>Photos du canapé original : <a href="https://justchairs.eu/products/mid-century-convertible-sofa-by-opp-drevovyroba-1970s">justchairs.eu</a>. Modèle 3D : Blender 5.1 + <a href="https://github.com/ahujasid/blender-mcp">BlenderMCP</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Mon fils, le brainrot et moi : enquête d&#x27;un père dans la machine à dopamine</title>
      <link>https://pf.olibrio.fr/posts/brainrot-machine-a-dopamine.html</link>
      <guid isPermaLink="true">https://pf.olibrio.fr/posts/brainrot-machine-a-dopamine.html</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 +0000</pubDate>
      <description>Mon fils devenait irritable après ses vidéos Roblox. Au lieu de spéculer, j’ai analysé les transcripts de ses 10 vidéos préférées. Ce que les données disent.</description>
      <category>parentalité</category>
      <category>écrans</category>
      <category>dopamine</category>
      <category>roblox</category>
      <category>brainrot</category>
      <category>attention</category>
      <content:encoded><![CDATA[<h3 id="acte-i-le-symptome">Acte I &mdash; Le symptôme</h3>
<p>Tout a commencé par une dispute idiote.</p>
<p>« Coupe, c&rsquo;est l&rsquo;heure. » Une phrase banale. Sauf que ce soir-là, la réponse n&rsquo;a pas été un soupir d&rsquo;ado normal. C&rsquo;était sec, à fleur de peau, presque hostile &mdash; comme si je venais de lui arracher quelque chose. Dix minutes plus tard, il était de nouveau lui-même. Mais entre les deux, il y avait eu ce <strong>moment</strong> : un gamin que je ne reconnaissais pas, irritable, fermé, ailleurs.</p>
<p>Et ce n&rsquo;était pas la première fois. Le motif revenait : il regardait des vidéos Roblox &mdash; un youtubeur nommé <strong>Kevko</strong>, du <em>Steal a Brainrot</em>, du <em>Lucky Block</em> &mdash; et quand je l&rsquo;interrompais en plein milieu, ça partait en vrille. Pas après. <strong>En plein milieu.</strong></p>
<p>J&rsquo;aurais pu en rester là. Décréter « les écrans, c&rsquo;est mal », poser une règle, et m&rsquo;épuiser à la faire respecter. Mais j&rsquo;avais une intuition plus précise, et un fils trop intelligent pour avaler une interdiction sans explication. Il me fallait comprendre <em>exactement</em> ce qui se passait dans sa tête. Et pour ça, il me fallait des <strong>données</strong>, pas des impressions.</p>
<hr />
<h3 id="acte-ii-lenquete">Acte II &mdash; L&rsquo;enquête</h3>
<p>Première hypothèse, la plus inquiétante : et si le contenu lui-même était le problème ? Beaucoup de vidéos Roblox tournent autour de <em>voler, battre, piéger, troller, gagner contre les autres</em>. Est-ce que mon fils passait ses après-midi à intérioriser une logique de compétition et de domination ?</p>
<p>Le problème, c&rsquo;est que je n&rsquo;en savais rien. Je <em>ressentais</em>. Et le ressenti, en matière d&rsquo;éducation, c&rsquo;est le plus court chemin vers l&rsquo;injustice.</p>
<p>Alors j&rsquo;ai décidé de faire ce qu&rsquo;un journaliste ferait : <strong>lire les sources</strong>. Pas regarder distraitement deux vidéos &mdash; récupérer les <strong>transcriptions complètes</strong> des plus grosses vidéos de la chaîne et les analyser, mot par mot.</p>
<p>J&rsquo;ai identifié ses <strong>10 vidéos les plus vues</strong> (de 426 000 à 786 000 vues), extrait les sous-titres automatiques français, nettoyé le tout : <strong>48 437 mots</strong> de transcript. Puis j&rsquo;ai compté. J&rsquo;ai classé le vocabulaire en grandes familles &mdash; urgence, compétition, récompense, accumulation, conflit, moquerie &mdash; et mesuré leur fréquence pour 1 000 mots.</p>
<p>Là, les chiffres ont commencé à parler. Et ils n&rsquo;ont pas dit ce que je croyais.</p>
<div class="table-scroll"><table>
<thead>
<tr>
<th>Thème (sur 10 vidéos, 48 000 mots)</th>
<th>Fréquence /1000 mots</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Rareté / accumulation</strong> (<code>encore</code>, <code>obtenir</code>, <code>débloquer</code>, <code>rare</code>)</td>
<td><strong>11,4</strong></td>
</tr>
<tr>
<td><strong>Urgence / rapidité</strong> (<code>vite</code>, <code>vitesse</code>, <code>allez</code>, <code>go</code>)</td>
<td><strong>10,1</strong></td>
</tr>
<tr>
<td>Récompense / argent (<code>robux</code>, <code>million</code>, <code>argent</code>)</td>
<td>6,3</td>
</tr>
<tr>
<td>Compétition / gain</td>
<td>5,0</td>
</tr>
<tr>
<td>Excitation / superlatifs</td>
<td>3,3</td>
</tr>
<tr>
<td>Vol (« steal »)</td>
<td>2,3</td>
</tr>
<tr>
<td><strong>Conflit / domination</strong></td>
<td><strong>0,4</strong></td>
</tr>
<tr>
<td><strong>Moquerie / troll</strong></td>
<td><strong>0,5</strong></td>
</tr>
</tbody>
</table></div>
<p>Le contenu agressif que je redoutais &mdash; la domination, la moquerie, le troll &mdash; était <strong>quasi inexistant</strong> : 0,4 et 0,5 pour 1 000 mots, en gros du bruit statistique. Mon fils n&rsquo;apprenait pas à écraser les autres.</p>
<p>Ce qui dominait, c&rsquo;était tout autre chose : <strong>l&rsquo;accumulation et l&rsquo;urgence.</strong> <em>Toujours un objet de plus. Toujours plus vite.</em> Les deux mots-thèmes les plus fréquents de toute la chaîne étaient « encore » et « vite ». Et en mesurant les interjections et les rires &mdash; un indice de l&rsquo;intensité &mdash; certaines vidéos grimpaient à <strong>23 marqueurs d&rsquo;excitation pour 1 000 mots</strong>, sans le moindre temps mort.</p>
<p>Je m&rsquo;étais trompé de coupable. Le danger n&rsquo;était pas <em>idéologique</em>. Il était <strong>physiologique</strong>.</p>
<hr />
<h3 id="acte-iii-ce-quon-a-trouve">Acte III &mdash; Ce qu&rsquo;on a trouvé</h3>
<p>Restait à confronter mes chiffres à la science. Et là, tout s&rsquo;est emboîté.</p>
<p><strong>1. La machine à récompense imprévisible.</strong> Le cœur de <em>Steal a Brainrot</em>, c&rsquo;est le hasard : le Lucky Block qui <em>peut</em> lâcher un brainrot rare, le revenu passif qui tourne en permanence et pousse à se reconnecter. C&rsquo;est exactement le <strong>renforcement à ratio variable</strong> &mdash; le mécanisme que les casinos exploitent depuis un siècle parce que c&rsquo;est le plus addictif qui soit. Le cerveau libère de la dopamine <strong>en anticipant</strong> la récompense, pas en la recevant. On reste en tension permanente : <em>et si le prochain était le bon ?</em></p>
<p><strong>2. Ce n&rsquo;est pas la violence, c&rsquo;est le rythme.</strong> La pièce maîtresse, je l&rsquo;ai trouvée dans une étude publiée dans la revue <em>Pediatrics</em> en 2011. Des chercheuses ont montré à des enfants <strong>9 minutes</strong> d&rsquo;un dessin animé simplement <em>rapide</em> &mdash; des coupes toutes les onze secondes &mdash; sans aucune violence. Juste après, leur capacité de concentration et de patience était <strong>mesurablement dégradée</strong>, comparée à des enfants ayant regardé un dessin animé lent. Neuf minutes. Le format Kevko, c&rsquo;est précisément ça : débit saturé, montage haché, zéro respiration. <strong>Ce n&rsquo;est pas ce qu&rsquo;il raconte qui agit sur mon fils. C&rsquo;est la vitesse.</strong></p>
<p><strong>3. Et voilà pourquoi ça explosait à la maison.</strong> Quand je coupais en plein milieu, le cerveau de mon fils était encore « en haut ». Et l&rsquo;Académie américaine de pédiatrie le dit explicitement : à l&rsquo;arrêt de l&rsquo;écran, <strong>la dopamine chute, et cette chute nous laisse grognons et irritables.</strong> L&rsquo;irritabilité que je prenais en pleine figure n&rsquo;était pas de l&rsquo;insolence. C&rsquo;était un <strong>état chimique prévisible</strong> &mdash; le contrecoup d&rsquo;un état d&rsquo;excitation qu&rsquo;on n&rsquo;avait pas laissé redescendre.</p>
<p>Le plus cruel, c&rsquo;est l&rsquo;effet relationnel. Le contenu le mettait dans un état où il <strong>repoussait, sans le vouloir, les gens présents dans la même pièce.</strong> Et le piège du <em>« toujours un de plus »</em>, c&rsquo;est qu&rsquo;il n&rsquo;y a jamais de bon moment pour s&rsquo;arrêter &mdash; donc jamais vraiment de moment où il était <em>présent</em> avec nous. Le vrai coût n&rsquo;était pas le temps d&rsquo;écran. C&rsquo;étaient les moments réels, avec des gens réels, qui disparaissaient.</p>
<p><strong>La nuance, parce qu&rsquo;il faut rester honnête.</strong> Non, le brainrot ne « fait pas pourrir le cerveau » au sens littéral &mdash; c&rsquo;est devenu le mot de l&rsquo;année du dictionnaire Oxford en 2024, mais c&rsquo;est un marqueur culturel, pas un diagnostic. Non, la fameuse « détox dopamine » n&rsquo;est pas un vrai concept scientifique : on ne « réinitialise » pas sa dopamine en coupant les écrans. Et oui, le brainrot, c&rsquo;est aussi de l&rsquo;humour de gamins, un langage de génération. Mon fils n&rsquo;est pas en danger. Mais il est, par construction, <strong>manipulé</strong> &mdash; et ça, ça se règle.</p>
<hr />
<h3 id="acte-iv-ce-quon-essaie-dy-faire">Acte IV &mdash; Ce qu&rsquo;on essaie d&rsquo;y faire</h3>
<p>J&rsquo;ai décidé de faire un pari : celui de son intelligence.</p>
<p>Pas d&rsquo;interdiction frontale &mdash; un gamin malin la contourne et t&rsquo;en veut. À la place, j&rsquo;ai changé de camp. Le message n&rsquo;était plus <em>« papa t&rsquo;interdit »</em> mais <em>« des ingénieurs payés des millions sont en train de jouer avec ton cerveau, et moi je suis dans ton équipe contre eux »</em>. Rien n&rsquo;agace plus un ado que d&rsquo;être manipulé. C&rsquo;était mon meilleur levier.</p>
<p>Puis je lui ai proposé une <strong>expérience</strong>, parce qu&rsquo;il aime la science :</p>
<blockquote>
<p>« Pendant une semaine, observe juste ton humeur dans les 10 minutes après avoir coupé. Note-la sur 10. Et compare : quand on te coupe en plein milieu, vs quand <em>toi</em> tu choisis le moment d&rsquo;arrêter. Si je me trompe, je le reconnaîtrai. Mais regarde les données toi-même. »</p>
</blockquote>
<p>Lui rendre le contrôle, c&rsquo;est précisément ce que la recherche identifie comme le facteur qui réduit le plus les crises de fin d&rsquo;écran. Et transformer une dispute récurrente en <strong>enquête commune</strong>, c&rsquo;est le sortir de la position défensive.</p>
<p>Enfin, on a regardé des vidéos <strong>ensemble</strong> &mdash; pas des sermons, des décryptages faits par des gens qu&rsquo;un ado respecte :</p>
<ul>
<li><strong>Série « Dopamine » &mdash; ARTE, épisode TikTok</strong> (~9 min) : décortique, technique par technique, l&rsquo;application qu&rsquo;il connaît. Ton clinique, zéro morale, le déclic « ils me manipulent ». → https://www.youtube.com/watch?v=-pOWdBpVR3s</li>
<li><strong>« Et tout le monde s&rsquo;en fout » &mdash; #59 Les algorithmes</strong> (~7 min) : drôle, complice, jamais donneur de leçon. → https://www.youtube.com/watch?v=5NiVg4DBJrI</li>
<li><strong>Tracks ARTE &mdash; « Brainrot : est-ce qu&rsquo;internet fait pourrir nos cerveaux ? »</strong> : traite frontalement son univers. <em>(À prévisionner d&rsquo;abord.)</em> → https://www.youtube.com/watch?v=ubT8hS0lAlg</li>
<li><strong>Stupid Economics &mdash; « L&rsquo;économie de l&rsquo;attention »</strong> : l&rsquo;angle « ton attention est le produit qu&rsquo;on vend ». → https://www.youtube.com/watch?v=rMV1WaWGb3I</li>
<li><strong>Tristan Harris &mdash; TED Talk (sous-titres FR)</strong> : l&rsquo;ex-ingénieur de Google qui a alerté le premier. Crédibilité maximale. → https://www.ted.com/talks/tristan_harris_how_a_handful_of_tech_companies_control_billions_of_minds_every_day?language=fr</li>
</ul>
<p>Le plan : commencer par la première (9 minutes, il reconnaît son appli), le laisser commenter, ne pas conclure à sa place. Le format court et factuel fait le travail tout seul.</p>
<hr />
<h3 id="epilogue">Épilogue</h3>
<p>Je n&rsquo;ai pas « gagné ». Ce n&rsquo;est pas une bataille qui se gagne en un soir, et ce n&rsquo;était jamais le but. Mais quelque chose a changé : mon fils a cessé de voir un père qui confisque, et a commencé à voir un mécanisme qui le manipule. Il a un vocabulaire pour le nommer, maintenant. Et entre nous, la conversation a remplacé la dispute.</p>
<p>Le contenu qu&rsquo;il regarde n&rsquo;est pas le mal. Ce n&rsquo;est même pas idéologique &mdash; mes propres données me l&rsquo;ont prouvé. C&rsquo;est juste une machine, très bien conçue, pour maintenir un cerveau d&rsquo;enfant en état d&rsquo;excitation maximale et le faire revenir. Comprendre la machine, c&rsquo;est déjà à moitié s&rsquo;en libérer.</p>
<p>Et ça, c&rsquo;est un pari que je suis prêt à faire sur l&rsquo;intelligence de mon fils.</p>
<hr />
<h2 id="sources-references">Sources &amp; références</h2>
<p><strong>Sur la dopamine et l&rsquo;irritabilité après l&rsquo;écran</strong> - American Academy of Pediatrics &mdash; <em>Screen Time and Temper Tantrums</em> (la chute de dopamine à l&rsquo;arrêt rend irritable) : https://www.healthychildren.org/English/family-life/Media/Pages/screen-time-and-temper-tantrums-helpful-tips-for-parents.aspx</p>
<p><strong>Sur le rythme/montage qui dégrade l&rsquo;attention</strong> - Lillard, A. S., &amp; Peterson, J. (2011). <em>The Immediate Impact of Different Types of Television on Young Children&rsquo;s Executive Function.</em> <strong>Pediatrics</strong>, 128(4), 644-649. (L&rsquo;étude « SpongeBob ».) Résumé accessible (NPR) : https://www.npr.org/sections/health-shots/2011/09/12/140401099/spongebob-may-be-too-speedy-for-preschool-brains - Méta-analyse récente sur les effets à court terme des médias sur l&rsquo;attention et les fonctions exécutives des enfants (PMC, 2024) : https://pmc.ncbi.nlm.nih.gov/articles/PMC12412071/</p>
<p><strong>Sur les boucles de récompense et le design addictif</strong> - <em>The Vegas Effect of Our Screens</em> &mdash; Psychology Today (renforcement à ratio variable) : https://www.psychologytoday.com/us/blog/tech-happy-life/201901/the-vegas-effect-of-our-screens - <em>Why We Can&rsquo;t Stop</em> &mdash; Communication Research / Taylor &amp; Francis (éléments récompensants des jeux et jeu problématique chez les ados) : https://www.tandfonline.com/doi/full/10.1080/15213269.2023.2242260 - <em>Debunking the Dopamine Detox Trend</em> &mdash; The Scientist (la « détox dopamine » est un mythe) : https://www.the-scientist.com/debunking-the-dopamine-detox-trend-72036</p>
<p><strong>Sur le « brainrot » et <em>Steal a Brainrot</em></strong> - <em>« Brain rot » named Oxford Word of the Year 2024</em> &mdash; Oxford University Press : https://corp.oup.com/news/brain-rot-named-oxford-word-of-the-year-2024/ - <em>Steal a Brainrot</em> &mdash; fiche encyclopédique (revenu passif, boucle de jeu, monétisation) : https://en.wikipedia.org/wiki/Steal_a_Brainrot</p>
<p><strong>Sur l&rsquo;usage des écrans comme régulateur émotionnel</strong> - <em>Using screens to calm kids may hurt their emotional regulation</em> &mdash; CNN (relai d&rsquo;une étude parue dans JAMA Pediatrics) : https://edition.cnn.com/2022/12/12/health/tantrum-distraction-screens-parenting-wellness</p>
<p><strong>Ressources vidéo de vulgarisation (citées dans l&rsquo;article)</strong> - Série <em>Dopamine</em> &mdash; ARTE (playlist) : https://www.youtube.com/playlist?list=PL8Ax_z5vzflwdvoTnARE5FiYl42Sg-fYb - <em>Et tout le monde s&rsquo;en fout</em> &mdash; #59 Les algorithmes : https://www.youtube.com/watch?v=5NiVg4DBJrI - <em>Brainrot : est-ce qu&rsquo;internet fait pourrir nos cerveaux ?</em> &mdash; Tracks / ARTE : https://www.youtube.com/watch?v=ubT8hS0lAlg - <em>L&rsquo;économie de l&rsquo;attention</em> &mdash; Stupid Economics : https://www.youtube.com/watch?v=rMV1WaWGb3I - Tristan Harris &mdash; TED (sous-titres FR) : https://www.ted.com/talks/tristan_harris_how_a_handful_of_tech_companies_control_billions_of_minds_every_day?language=fr</p>
<hr />
<p><em>Note méthodologique : l&rsquo;analyse lexicale porte sur les transcriptions automatiques (sous-titres YouTube FR) des 10 vidéos les plus vues de la chaîne, soit ~48 000 mots. Limite assumée : un transcript mesure les mots, pas le volume sonore ni le rythme de montage &mdash; or c&rsquo;est précisément ce rythme que la science identifie comme le facteur le plus déterminant. Les chiffres sont donc un indice convergent, pas une mesure directe de la surstimulation.</em></p>]]></content:encoded>
    </item>
  </channel>
</rss>
