Une montre de 2020, un firmware complet, trois jours
Une T-Watch de 2020 dormait dans un coin : développer dessus demandait trop d'efforts. En trois jours, avec un agent, elle a reçu un firmware écrit de zéro, publié sous licence MIT.
J’ai acheté une LilyGO T-Watch 2020 il y a six ans, parce qu’elle était bon marché et idéale pour tester et bricoler. Développer dessus demandait en revanche un vrai investissement : du C/C++, un framework à apprendre, des notions d’embarqué. Elle a fini dans un coin, avec d’autres side projects inachevés.
Avec l’IA, tous ces freins sautent : en quelques minutes, j’avais un firmware complet, écrit de zéro. Sans l’IA, je ne l’aurais pas ressortie du tiroir : y créer quelque chose demandait trop d’efforts.
Quels appareils dorment chez vous ? Imaginez ce que vous pourriez en faire, en un temps record.
Le billet sur les quatre jours a déjà raconté le premier flash. Ici, je reste sur la montre.
# Ce que je voulais
Un cadran de chronographe d’aviation et des afficheurs 7 segments façon « circuits temporels ». Puis la météo, les bus et les notifications de l’iPhone. La liste complète des applications est dans le README du dépôt.
Ma méthode tient en deux gestes. J’expose simplement les fonctions que je veux. Puis je demande tout de suite de concevoir une première version de bout en bout, pour avoir une boucle de retour courte. Le résultat devient convaincant très vite.
J’ai piloté le développement en langage naturel, en exprimant des intentions. En lisant le code généré, j’ai aussi beaucoup appris, tant sur le langage que sur les frameworks et les concepts d’embarqué. La portée pédagogique est immense !
# Le commencement
Premier commit à 3 h 22. Le prompt de mission imposait deux règles : sauvegarder les 16 Mo de flash d’origine avant toute écriture, et ne jamais toucher aux eFuses ni à la tension du cœur.
La sauvegarde a failli échouer. À 921 600 bauds, le port USB a disparu en pleine lecture. L’agent a recommencé à 230 400 bauds, par blocs de 1 Mo vérifiés un par un, parce qu’au-delà le câble introduisait des erreurs. À 3 h 46, la sauvegarde complète était vérifiée et son empreinte SHA-256 consignée. À 3 h 48, premier flash vérifié sur la montre.
J’ai eu un peu peur de bricker la montre. Je ne savais pas d’où venait la panne ; probablement du câble. L’agent a tout pris en charge, jusqu’à essayer un flash lent et fractionné pour composer avec ce câble défectueux (!). Ses questions et ses méthodes étaient pertinentes et précises, et c’est ce qui me donnait confiance.
À 4 h 09, le cadran d’aviateur s’affichait, avec une trotteuse à 8 Hz.

Le cadran d’aviateur, capturé sur la vraie montre par le port série. Capture déjà publiée dans le billet précédent.
# Le moment où ça a cassé
Branchée en USB, la montre tenait. Sur batterie, elle plantait systématiquement au bout de quelques secondes. Dans la matinée, je craignais qu’elle soit brickée, et je pressais l’agent d’aller vite avant le plantage suivant. J’ai dû l’éteindre et la rallumer trois fois.
Il y avait deux causes, trouvées l’une après l’autre. D’abord, le chien de garde du processeur restait armé pendant le sommeil léger. Il est maintenant suspendu avant la mise en veille et réarmé au réveil. Ensuite, un appui sur le bouton figeait la montre. La ligne d’interruption de la puce d’alimentation reste à l’état bas tant qu’on ne la lit pas, et l’interruption se redéclenchait sans fin. Les interruptions GPIO sont désormais désactivées pendant le sommeil, et j’ai constaté que la montre tenait très bien.
# Une décision : ne plus dépendre du câble
Les coupures USB revenaient pendant les flashs. Il y avait deux options : attendre que le port revienne, ou rendre le câble accessoire. L’agent a proposé le « mode atelier » : quand la montre est alimentée par USB et que le Wi-Fi est configuré, elle reste connectée, accepte les mises à jour par Wi-Fi (OTA) et expose une console TCP. Un Wi-Fi allumé en permanence est normalement un anti-pattern. Sur secteur, la batterie n’est pas en jeu, et l’option se désactive.
Comme le câble lâchait, l’agent est passé de lui-même aux mises à jour par Wi-Fi (OTA). Magique ! Plus tard, les coupures sont aussi apparues pendant que le processeur était dans son chargeur de démarrage en ROM : le problème est donc matériel, pas logiciel. Un mode sans échec a suivi : après trois plantages d’affilée dans la première minute, le Bluetooth ne démarre pas, pour qu’on puisse toujours réparer la montre à distance.

La vraie montre sur l’écran de diagnostic, le premier écran flashé. Photo déjà publiée dans le billet précédent.
# Où j’en suis
Le problème de câble (B2 dans BLOCKERS.md) reste ouvert : la connexion micro-USB est toujours fragile. Le double tapotement qui réveille l’écran reste un peu aléatoire, mais il fonctionne. Le geste du poignet pour réveiller la montre est encore à régler. L’autonomie sur une journée n’est pas encore mesurée.
Ce qui m’a le plus impressionné, c’est la rapidité avec laquelle l’agent a flashé la montre en autonomie et m’a montré des résultats concrets. J’ai hâte de l’essayer sur d’autres appareils. Je vais d’ailleurs bientôt ressortir mes micro:bits : j’ai une idée de projet !