{"id":788,"date":"2026-11-10T10:35:04","date_gmt":"2026-11-10T10:35:04","guid":{"rendered":"https:\/\/build-mode-ak.com\/esp32-self-balancing-robot-2\/"},"modified":"2026-11-11T16:02:59","modified_gmt":"2026-11-11T16:02:59","slug":"esp32-self-balancing-robot","status":"publish","type":"post","link":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/","title":{"rendered":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation"},"content":{"rendered":"<section class=\"sws-page-title alignfull wp-block-sws-theme-page-title\">\n\t<div class=\"sws-page-title__inner\">\n\t\t\n\t\t\t\t\t<nav class=\"sws-page-title__nav\" aria-label=\"Fil d\u2019Ariane\">\n\t\t\t\t<ol class=\"sws-page-title__trail\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<li class=\"sws-page-title__crumb\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a class=\"sws-page-title__link\" href=\"https:\/\/build-mode-ak.com\/fr\/\">Accueil<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/ol>\n\t\t\t<\/nav>\n\t\t\t<\/div><!-- .sws-page-title__inner -->\n\n\t\t\t<div class=\"sws-page-title__shapes\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<span class=\"sws-page-title__shape sws-page-title__shape--accent\">\n\t\t\t\t\t<svg class=\"sws-page-title__icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M7 32h10l4-10 6 20 6-20 6 20 6-20 4 10h8\"\/>\n<\/svg>\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"sws-page-title__shape sws-page-title__shape--secondary\">\n\t\t\t\t\t<svg class=\"sws-page-title__icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M8 32h17M25 15v34M39 15v34M39 32h17\"\/>\n<\/svg>\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"sws-page-title__shape sws-page-title__shape--tertiary\">\n\t\t\t\t\t<svg class=\"sws-page-title__icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\">\n  <path d=\"M7 32h50M46 16v32\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n  <path d=\"M21.5 18.5c-.7-.4-1.5.1-1.5 1v25c0 .9.8 1.4 1.5 1l21.7-12.4c.8-.5.8-1.7 0-2.2z\" fill=\"currentColor\"\/>\n<\/svg>\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"sws-page-title__shape sws-page-title__shape--accent\">\n\t\t\t\t\t<svg class=\"sws-page-title__icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M7 40h9C16 18 24 18 24 40C24 18 32 18 32 40C32 18 40 18 40 40C40 18 48 18 48 40h9\"\/>\n<\/svg>\t\t\t\t<\/span>\n\t\t\t\t\t<\/div>\n\t<\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Ce robot vient de sauter d&rsquo;un p\u00e8se-personne, et il est rest\u00e9 debout. Cinq jours plus t\u00f4t, il n&rsquo;arrivait m\u00eame pas \u00e0 rester sur place. Entre-temps, rien n&rsquo;a chang\u00e9 dans son mat\u00e9riel&nbsp;: le m\u00eame ch\u00e2ssis, les m\u00eames moteurs, le m\u00eame capteur. Seul le programme a chang\u00e9. Une boucle de r\u00e9gulation est devenue deux, puis trois, et chaque nouvelle boucle a corrig\u00e9 ce que la pr\u00e9c\u00e9dente ne savait pas faire.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c1-jump-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c1-jump.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Le premier des deux sauts depuis le p\u00e8se-personne, le 8 novembre&nbsp;: la mont\u00e9e par la planche, le bord franchi, un atterrissage brutal, et il garde l&rsquo;\u00e9quilibre.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est un robot auto-\u00e9quilibr\u00e9 \u00e0 deux roues&nbsp;: un ch\u00e2ssis \u00e0 trois \u00e9tages imprim\u00e9 en 3D, pos\u00e9 sur deux motor\u00e9ducteurs \u00e0 courant continu, une carte ESP32 et un capteur de mouvement. Nous l&rsquo;avons construit pour comparer, sur le m\u00eame mat\u00e9riel, diff\u00e9rentes fa\u00e7ons de maintenir un robot debout, en commen\u00e7ant par la m\u00e9thode classique, le PID. Cet article suit les dix jours qui s\u00e9parent le premier test du saut, dans l&rsquo;ordre o\u00f9 ils se sont d\u00e9roul\u00e9s&nbsp;: ce qu&rsquo;il y a \u00e0 l&rsquo;int\u00e9rieur, comment le robot sait o\u00f9 est le haut, les trois boucles une par une, et ce que nous a appris son pilotage par Wi-Fi. Les chiffres viennent des journaux du robot lui-m\u00eame.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg\" alt=\"Le robot debout sur le plateau d'une imprimante 3D Creality noire : un ch\u00e2ssis orange \u00e0 trois \u00e9tages avec une batterie de cellules 18650 en haut, un petit \u00e9cran allum\u00e9 et des c\u00e2bles au milieu, deux drivers de moteur \u00e0 dissipateurs noirs en bas, et deux roues noires aux jantes bleues.\" class=\"wp-image-734\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg 2560w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-300x188.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-1024x640.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-768x480.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-1536x960.jpg 1536w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-2048x1280.jpg 2048w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover-1920x1200.jpg 1920w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><figcaption class=\"wp-element-caption\">Le robot sur l&rsquo;imprimante qui a fabriqu\u00e9 son ch\u00e2ssis.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Le robot<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le ch\u00e2ssis se compose de trois \u00e9tages imprim\u00e9s, empil\u00e9s les uns sur les autres, chacun \u00e9tant une pi\u00e8ce distincte. Nous l&rsquo;avons dessin\u00e9 dans Fusion 360 en y int\u00e9grant les composants achet\u00e9s, si bien que les moteurs et les drivers avaient leur place avant que la moindre pi\u00e8ce soit imprim\u00e9e.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c2-fusion-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c2-fusion.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Le mod\u00e8le Fusion 360 en vue \u00e9clat\u00e9e&nbsp;: trois \u00e9tages imprim\u00e9s, deux drivers de moteur, deux moteurs et le module 5&nbsp;V. Le support noir tient le robot sur l&rsquo;\u00e9tabli et n&rsquo;en fait pas partie.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De bas en haut&nbsp;: les moteurs sont suspendus sous l&rsquo;\u00e9tage inf\u00e9rieur, sur les \u00e9querres fournies dans leur kit. Le premier \u00e9tage porte les deux drivers de moteur, dissipateurs vers le bas. Le deuxi\u00e8me \u00e9tage est le cerveau&nbsp;: la carte ESP32 avec son petit \u00e9cran sur une plaque \u00e0 trous, le capteur de mouvement et un buzzer. L&rsquo;\u00e9tage du haut porte une batterie \u00e0 trois cellules avec sa carte de protection, un interrupteur et un module abaisseur 5&nbsp;V. Le corps mesure 164&nbsp;\u00d7&nbsp;128&nbsp;\u00d7&nbsp;60&nbsp;mm, 235&nbsp;mm de large avec les roues, et le robot complet p\u00e8se 1025&nbsp;g.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9l\u00e9ment<\/th><th>Ce que nous avons utilis\u00e9<\/th><th>Son r\u00f4le<\/th><\/tr><\/thead><tbody><tr><td>Contr\u00f4leur<\/td><td><a href=\"https:\/\/build-mode-ak.com\/fr\/lilygo-ttgo-t-display\/\">LILYGO TTGO T-Display<\/a>&nbsp;: ESP32, deux c\u0153urs \u00e0 240&nbsp;MHz, \u00e9cran de 1,14\u2033<\/td><td>Un c\u0153ur ex\u00e9cute la boucle de r\u00e9gulation, l&rsquo;autre le Wi-Fi&nbsp;; l&rsquo;\u00e9cran affiche les gains<\/td><\/tr><tr><td>Capteur de mouvement<\/td><td>MPU-6500 sur une carte MPU-9250\/6500\/9255, I\u00b2C \u00e0 400&nbsp;kHz<\/td><td>Gyroscope et acc\u00e9l\u00e9rom\u00e8tre, 500 \u00e9chantillons par seconde<\/td><\/tr><tr><td>Drivers de moteur<\/td><td>2&nbsp;\u00d7&nbsp;module BTS7960 (HW-039, IBT-2)<\/td><td>Un pont en H par moteur, PWM \u00e0 8&nbsp;kHz<\/td><\/tr><tr><td>Moteurs<\/td><td>2&nbsp;\u00d7&nbsp;JGB37-520, 12&nbsp;V, 333&nbsp;tr\/min, r\u00e9ducteur m\u00e9tallique \u00e0 engrenages droits, encodeur \u00e0 effet Hall<\/td><td>1320 impulsions d&rsquo;encodeur par tour de roue, 0,16&nbsp;mm de d\u00e9placement par impulsion<\/td><\/tr><tr><td>Roues<\/td><td>67&nbsp;mm, fournies avec les moteurs<\/td><td>Environ 210&nbsp;mm de d\u00e9placement par tour<\/td><\/tr><tr><td>Batterie<\/td><td>Batterie 3S de cellules 18650, 11,1&nbsp;V, 12,6&nbsp;V \u00e0 pleine charge, avec un BMS et un interrupteur<\/td><td>Alimente directement les moteurs&nbsp;; l&rsquo;interrupteur coupe tout<\/td><\/tr><tr><td>Alimentation 5&nbsp;V<\/td><td>Module abaisseur LM2596<\/td><td>Alimente la carte \u00e0 partir de la batterie<\/td><\/tr><tr><td>Buzzer<\/td><td>Buzzer actif<\/td><td>Trois bips quand le robot s&rsquo;arme<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"840\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring.jpg\" alt=\"Sch\u00e9ma fonctionnel sur un panneau sombre \u00e0 c\u00f4t\u00e9 du robot sur son support : la batterie 12 V alimente le LM2596, qui produit 5 V pour l'ESP32 ; un pont diviseur permet \u00e0 l'ESP32 de lire la tension de la batterie par l'ADC ; le MPU-6500 communique avec lui en I2C ; l'ESP32 envoie du PWM \u00e0 8 kHz \u00e0 deux drivers BTS7960, qui pilotent deux moteurs ; les encodeurs renvoient la distance parcourue par les roues.\" class=\"wp-image-735\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring.jpg 1600w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring-300x158.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring-1024x538.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring-768x403.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-02-wiring-1536x806.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><figcaption class=\"wp-element-caption\">Le c\u00e2blage, sur une image de notre vid\u00e9o. La batterie alimente directement les moteurs, le convertisseur alimente la carte, et la fl\u00e8che qui revient des encodeurs est tout le sujet de ce projet.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Deux particularit\u00e9s de la transmission ont d\u00e9termin\u00e9 tout ce qui a suivi. La premi\u00e8re est le retard. Le capteur fournit un nouvel \u00e9chantillon toutes les 2&nbsp;ms, et la commande qui en d\u00e9coule atteint les drivers en moins d&rsquo;une milliseconde, mais une roue a besoin d&rsquo;environ un dixi\u00e8me de seconde pour r\u00e9pondre \u00e0 un changement de commande. La seconde est le r\u00e9ducteur&nbsp;: il a du jeu, si bien qu&rsquo;apr\u00e8s chaque inversion de sens, le moteur tourne un instant avant que la roue ne suive.<\/p>\n\n\n\n<figure class=\"wp-block-gallery alignwide has-nested-images columns-4 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1500\" data-id=\"736\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers.jpg\" alt=\"Deux cartes de driver BTS7960 bleues c\u00f4te \u00e0 c\u00f4te, marqu\u00e9es HW-039 et IBT_2, chacune avec un bornier vert \u00e0 quatre vis, un condensateur de 330 \u00b5F et deux puces de puissance.\" class=\"wp-image-736\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers.jpg 1200w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers-240x300.jpg 240w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers-819x1024.jpg 819w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-03-drivers-768x960.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1500\" data-id=\"737\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu.jpg\" alt=\"Deux cartes capteur MPU-9250\/6500\/9255 bleues, l'une \u00e0 l'endroit, avec la puce et les fl\u00e8ches des axes X et Y, l'autre \u00e0 l'envers, chacune avec dix broches \u00e9tiquet\u00e9es : VCC, GND, SCL, SDA, EDA, ECL, AD0, INT, NCS, FSYNC.\" class=\"wp-image-737\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu.jpg 1200w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu-240x300.jpg 240w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu-819x1024.jpg 819w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-04-imu-768x960.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1500\" data-id=\"738\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor.jpg\" alt=\"Un motor\u00e9ducteur JGB37-520 argent\u00e9 sur une \u00e9querre noire en L, avec sur son arbre un pneu noir crant\u00e9 mont\u00e9 sur une jante bleue, et six fils de couleur qui sortent \u00e0 l'arri\u00e8re.\" class=\"wp-image-738\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor.jpg 1200w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor-240x300.jpg 240w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor-819x1024.jpg 819w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-05-motor-768x960.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"1500\" data-id=\"739\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder.jpg\" alt=\"Gros plan sur la carte d'encodeur ronde et noire \u00e0 l'arri\u00e8re d'un moteur : un disque aimant\u00e9 sur l'arbre au centre, deux capteurs \u00e0 effet Hall sur son pourtour, un connecteur blanc \u00e0 six broches et les inscriptions M1, GND et LED1.\" class=\"wp-image-739\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder.jpg 1200w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder-240x300.jpg 240w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder-819x1024.jpg 819w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-06-encoder-768x960.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\">Les pi\u00e8ces avant le montage&nbsp;: les deux drivers de moteur, la carte du capteur de mouvement recto et verso, un moteur avec sa roue et son \u00e9querre, et l&rsquo;encodeur \u00e0 l&rsquo;arri\u00e8re du moteur.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Et les deux moteurs ne sont pas jumeaux. Sur des images film\u00e9es au ras du sol, une seule et m\u00eame commande PWM a fait bouger la roue la plus \u00e9loign\u00e9e de 18&nbsp;mm et la plus proche de 8&nbsp;mm. La commande \u00e9tait identique&nbsp;; pourquoi la r\u00e9ponse ne l&rsquo;est pas, nous ne l&rsquo;avons pas \u00e9tabli. Livr\u00e9e \u00e0 elle-m\u00eame, cette diff\u00e9rence fait lentement tourner le robot sur place pendant qu&rsquo;il garde l&rsquo;\u00e9quilibre, et une petite correction de cap, d\u00e9crite dans la partie sur le pilotage, s&rsquo;en charge.<\/p>\n\n\n\n<figure class=\"wp-block-gallery alignwide has-nested-images columns-2 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"900\" data-id=\"740\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor.jpg\" alt=\"Le robot tenu sur un bureau, vu de face et d'en haut : la batterie sous un collier de serrage \u00e0 l'\u00e9tage du haut, la T-Display \u00e0 l'\u00e9cran allum\u00e9 sur une plaque \u00e0 trous au deuxi\u00e8me \u00e9tage, le buzzer \u00e0 c\u00f4t\u00e9, et des fils de connexion color\u00e9s qui descendent vers les drivers.\" class=\"wp-image-740\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor.jpg 1600w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor-300x169.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor-1024x576.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor-768x432.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-07-middle-floor-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"900\" data-id=\"741\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside.jpg\" alt=\"Le robot couch\u00e9 sur le c\u00f4t\u00e9 dans une main, dessous visible : les deux moteurs argent\u00e9s mont\u00e9s bout \u00e0 bout sous l'\u00e9tage inf\u00e9rieur, une carte d'encodeur avec une LED verte \u00e0 l'extr\u00e9mit\u00e9 int\u00e9rieure de chacun, et une roue \u00e0 chaque extr\u00e9mit\u00e9 ext\u00e9rieure.\" class=\"wp-image-741\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside.jpg 1600w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside-300x169.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside-1024x576.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside-768x432.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-08-underside-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/figure>\n<figcaption class=\"blocks-gallery-caption wp-element-caption\">Le robot termin\u00e9&nbsp;: le cerveau au deuxi\u00e8me \u00e9tage, et les moteurs avec leurs encodeurs en dessous.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">O\u00f9 est le haut<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tout ce que fait un robot auto-\u00e9quilibr\u00e9 d\u00e9pend d&rsquo;un seul nombre&nbsp;: son inclinaison. Le MPU-6500 offre deux fa\u00e7ons de l&rsquo;obtenir, et aucune ne fonctionne seule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le gyroscope mesure la vitesse \u00e0 laquelle le corps tourne. Additionnez ses mesures toutes les 2&nbsp;ms et vous obtenez un angle lisse et rapide, mais qui d\u00e9rive&nbsp;: sans correction du d\u00e9calage propre du gyroscope, nous avons mesur\u00e9 environ 15\u00b0 par minute. L&rsquo;acc\u00e9l\u00e9rom\u00e8tre sait o\u00f9 est la gravit\u00e9, si bien que son angle ne peut pas d\u00e9river, mais il ressent aussi chaque secousse. Moteurs en marche, son angle sautait en tous sens sur une plage de 18,7\u00b0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un filtre compl\u00e9mentaire prend la bonne moiti\u00e9 de chacun. \u00c0 chaque pas, le gyroscope fait avancer l&rsquo;angle, puis l&rsquo;angle est tir\u00e9 vers la mesure de l&rsquo;acc\u00e9l\u00e9rom\u00e8tre d&rsquo;une infime part de l&rsquo;\u00e9cart, un milli\u00e8me. Autrement dit&nbsp;: 99,9&nbsp;% de gyroscope, 0,1&nbsp;% d&rsquo;acc\u00e9l\u00e9rom\u00e8tre, ce qui correspond \u00e0 une constante de temps de deux secondes. Sur le banc, l&rsquo;angle filtr\u00e9 n&rsquo;a pas vari\u00e9 de plus de six centi\u00e8mes de degr\u00e9.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"840\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter.jpg\" alt=\"Panneau de notre vid\u00e9o \u00e0 c\u00f4t\u00e9 du robot sur son support. En haut : l'angle du gyroscope seul sur 39 secondes, une droite qui descend d'environ \u221215\u00b0 par minute. Au milieu : l'angle de l'acc\u00e9l\u00e9rom\u00e8tre, une bande bruit\u00e9e large de 18,7\u00b0. En bas : les deux formules du filtre, \u03c4 = 2 s, et la plage filtr\u00e9e de 0,06\u00b0.\" class=\"wp-image-742\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter.jpg 1600w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter-300x158.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter-1024x538.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter-768x403.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-09-filter-1536x806.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><figcaption class=\"wp-element-caption\">Le gyroscope seul d\u00e9rive, l&rsquo;acc\u00e9l\u00e9rom\u00e8tre seul tremble, le filtre tient l&rsquo;angle \u00e0 0,06\u00b0 pr\u00e8s.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le firmware, cela tient en quelques lignes. La carte du capteur est mont\u00e9e sur la tranche, avec un roulis de 1,4\u00b0, si bien qu&rsquo;avant toute chose le code s\u00e9pare la vitesse de tangage, dont le filtre a besoin, de la vitesse de lacet, dont le code des virages se sert plus loin&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Leaning forward, the forward axis dips below the horizontal:\n\/\/ its reading is -sin(theta).\natt.thetaAcc = atan2f(-(float)s.accel&#91;1], (float)s.accel&#91;0])\n               * DEG_PER_RAD;\n\n\/\/ The board is rolled by 1.4 deg: take pitch and yaw rates apart.\nconst float gx = s.gyro&#91;0] \/ GYRO_LSB_PER_DPS - att.gyroBiasDps&#91;0];\nconst float gz = s.gyro&#91;2] \/ GYRO_LSB_PER_DPS - att.gyroBiasDps&#91;2];\natt.omegaPitch = gz * rollCos - gx * rollSin;\natt.omegaYaw = gx * rollCos + gz * rollSin;\n\n\/\/ Complementary filter: the gyroscope carries the angle from\n\/\/ sample to sample, the accelerometer pulls it back to gravity.\n\/\/ FILTER_K = dt \/ (tau + dt) = 0.002 \/ 2.002, about 0.1 %.\natt.theta = wrapDeg(att.theta + att.omegaPitch * IMU_DT);\natt.theta = wrapDeg(att.theta\n                    + FILTER_K * wrapDeg(att.thetaAcc - att.theta));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le pas de calcul suit l&rsquo;horloge propre du capteur. Un timer mat\u00e9riel r\u00e9veille la t\u00e2che de commande juste avant chaque \u00e9chantillon attendu, la t\u00e2che le lit et ex\u00e9cute tout le r\u00e9gulateur, tandis que l&rsquo;\u00e9cran et le journal d&rsquo;essai attendent leur tour avec une priorit\u00e9 plus basse. Le Wi-Fi tourne sur l&rsquo;autre c\u0153ur. Cette organisation vient de notre pr\u00e9c\u00e9dent <a href=\"https:\/\/build-mode-ak.com\/fr\/videos\/esp32-propeller-balancer\/\">balancier \u00e0 h\u00e9lice<\/a>, construit sur la m\u00eame carte et le m\u00eame capteur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Premi\u00e8re boucle&nbsp;: l&rsquo;angle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re exp\u00e9rience utilise une seule boucle, qui ne surveille que l&rsquo;angle. C&rsquo;est un r\u00e9gulateur PID qui tourne 500 fois par seconde, une fois par \u00e9chantillon du capteur, et sa sortie est la puissance des deux moteurs, en pourcentage&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>P<\/strong>, le terme proportionnel&nbsp;: kp = 30, donc un degr\u00e9 d&rsquo;erreur demande 30&nbsp;% de la pleine puissance.<\/li>\n\n\n\n<li><strong>I<\/strong>, le terme int\u00e9gral&nbsp;: ki = 30 cumule l&rsquo;erreur dans le temps et continue de pousser tant qu&rsquo;elle dure.<\/li>\n\n\n\n<li><strong>D<\/strong>, le terme d\u00e9riv\u00e9&nbsp;: kd = 0,3 calme l&rsquo;oscillation. Il lit la vitesse de rotation directement sur le gyroscope au lieu de d\u00e9river un angle bruit\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La consigne n&rsquo;est pas exactement z\u00e9ro. Le centre de masse ne se trouve pas parfaitement au-dessus de l&rsquo;axe des roues, si bien que le robot s&rsquo;\u00e9quilibre \u00e0 \u03b8_ref = 0,3\u00b0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float pidStep(float theta, float omegaPitch, float thetaRef,\n              const Params &amp;p, float dt, float *raw) {\n    const float error = theta - thetaRef;\n    const float summed = integral + p.ki * error * dt;\n    integral = constrain(summed, -p.uMax, p.uMax);\n    const float u = p.kp * error + integral + p.kd * omegaPitch;\n    *raw = u;\n    return constrain(u, -p.uMax, p.uMax);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le premier essai au sol a \u00e9chou\u00e9 d&rsquo;une fa\u00e7on que le banc n&rsquo;aurait pas pu r\u00e9v\u00e9ler. En l&rsquo;air, toutes les v\u00e9rifications avaient r\u00e9ussi&nbsp;: les roues tournaient, les encodeurs comptaient, le capteur lisait l&rsquo;inclinaison. Au sol, les roues sont parties \u00e0 l&rsquo;oppos\u00e9 de l&rsquo;inclinaison au lieu de passer dessous, et le robot est tomb\u00e9. L&rsquo;angle \u00e9tait juste&nbsp;; ce qui \u00e9tait invers\u00e9, c&rsquo;\u00e9tait le sens \u00ab&nbsp;avant&nbsp;\u00bb des moteurs et des encodeurs. Une fois les deux invers\u00e9s dans la configuration, le robot a tenu debout, et avec ces gains, il est ensuite rest\u00e9 en \u00e9quilibre plus de deux minutes, avec un \u00e9cart type de 0,2\u00b0 sur l&rsquo;angle.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c3-one-loop-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c3-one-loop.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Une boucle, le 3 novembre. Une pouss\u00e9e, et le robot s&rsquo;\u00e9loigne en roulant, le corps toujours droit, puis reste l\u00e0 o\u00f9 il s&rsquo;est arr\u00eat\u00e9.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">C&rsquo;est l\u00e0 qu&rsquo;une seule boucle atteint sa limite. Pendant cette pouss\u00e9e, le corps ne s&rsquo;est jamais inclin\u00e9 de plus d&rsquo;un demi-degr\u00e9, et le robot a roul\u00e9 sur 27&nbsp;cm puis est rest\u00e9 l\u00e0. Pour une boucle d&rsquo;angle, c&rsquo;est une r\u00e9ussite, puisque l&rsquo;angle est bon. Elle ne sait pas distinguer l&rsquo;immobilit\u00e9 d&rsquo;un roulement \u00e0 vitesse constante&nbsp;: sur notre sol, maintenir une vitesse v demande environ 4,5&nbsp;% de puissance plus 78&nbsp;% par m\u00e8tre par seconde, et l&rsquo;int\u00e9grale garde simplement la puissance, quelle qu&rsquo;elle soit, que la pouss\u00e9e lui a laiss\u00e9e. Pour elle, n&rsquo;importe quelle vitesse ressemble \u00e0 l&rsquo;\u00e9quilibre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deuxi\u00e8me boucle&nbsp;: la vitesse<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La deuxi\u00e8me boucle surveille les roues. Elle tourne 100 fois par seconde, lit les deux encodeurs et compare la vitesse du robot \u00e0 celle qu&rsquo;il devrait avoir, z\u00e9ro pour l&rsquo;instant. Elle ne touche pas du tout aux moteurs&nbsp;: sa sortie est l&rsquo;angle que la premi\u00e8re boucle doit tenir. Le robot roule vers l&rsquo;avant&nbsp;? Qu&rsquo;il se penche un peu en arri\u00e8re, et la boucle d&rsquo;angle, en poursuivant le nouvel angle, le freine. C&rsquo;est un r\u00e9gulateur PI, dont l&rsquo;int\u00e9grale est born\u00e9e \u00e0 la m\u00eame plage de quelques degr\u00e9s que la sortie&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float pidSpeed(float vRef, float v, const Params &amp;p, float dt,\n               bool hold) {\n    const float error = vRef - v;\n    const float summed = hold ? speedIntegral\n                              : speedIntegral + p.kvi * error * dt;\n    speedIntegral = constrain(summed, -p.thetaMax, p.thetaMax);\n    return constrain(p.kv * error + speedIntegral,\n                     -p.thetaMax, p.thetaMax);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re tentative tremblait cinq fois par seconde. Son gain venait d&rsquo;un mod\u00e8le qui supposait une boucle d&rsquo;angle trois fois plus faible que la vraie&nbsp;: kv = 10 avait \u00e9t\u00e9 calcul\u00e9 pour kp = 10, alors que le robot fonctionne avec kp = 30. Le mod\u00e8le ignorait aussi le dixi\u00e8me de seconde que mettent les roues \u00e0 r\u00e9pondre. Le rem\u00e8de n&rsquo;a pas \u00e9t\u00e9 un gain plus petit, mais une mesure plus calme&nbsp;: la vitesse est d\u00e9sormais moyenn\u00e9e sur 200&nbsp;ms au lieu de 40&nbsp;ms, et il se trouve qu&rsquo;une moyenne sur 200&nbsp;ms annule compl\u00e8tement une oscillation \u00e0 5&nbsp;Hz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puis le robot s&rsquo;est mis \u00e0 d\u00e9river lentement. Avec une boucle de vitesse purement proportionnelle, kvi = 0, huit essais sur dix se terminaient \u00e0 plus de 10&nbsp;cm de leur point de d\u00e9part. Une petite int\u00e9grale, kvi = 1, a r\u00e9gl\u00e9 le probl\u00e8me&nbsp;: sur les onze essais suivants, aucun n&rsquo;a d\u00e9riv\u00e9 de plus de 2,7&nbsp;cm.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"900\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral.jpg\" alt=\"Panneau de notre vid\u00e9o \u00e0 c\u00f4t\u00e9 du robot sur un parquet : la boucle de vitesse, PI \u00e0 100 Hz, au-dessus de la boucle d'angle, PID \u00e0 500 Hz. Deux courbes de position sur 36 secondes : avec kvi 0, la plupart des essais s'en vont, 8 sur 10 au-del\u00e0 de 10 cm ; avec kvi 1, tous les essais restent \u00e0 plat, 0 sur 11, au plus 2,7 cm.\" class=\"wp-image-743\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral.jpg 1600w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral-300x169.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral-1024x576.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral-768x432.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-10-speed-integral-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><figcaption class=\"wp-element-caption\">Sans l&rsquo;int\u00e9grale de la vitesse, le robot s&rsquo;en va lentement&nbsp;; avec elle, il reste en place.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Et puis il a fait quelque chose que personne ne lui avait demand\u00e9&nbsp;: pouss\u00e9, il est revenu.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c4-two-loops-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c4-two-loops.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Deux boucles, le 5 novembre. Pouss\u00e9, le robot roule sur 37,8&nbsp;cm, s&rsquo;arr\u00eate et revient, \u00e0 2&nbsp;cm de l&rsquo;endroit o\u00f9 il se tenait. Il n&rsquo;y a pas encore de boucle de position.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;explication est dans l&rsquo;int\u00e9grale. L&rsquo;int\u00e9grale de la vitesse, c&rsquo;est simplement la distance parcourue, si bien que pour maintenir \u00e0 vitesse nulle un robot qu&rsquo;on a d\u00e9plac\u00e9, l&rsquo;int\u00e9grale de la vitesse finit par tenir une petite inclinaison, environ un degr\u00e9 par m\u00e8tre d&rsquo;\u00e9cart au point de d\u00e9part. C&rsquo;est un ressort cach\u00e9, et faible, qui tire le robot vers son point de d\u00e9part. Faible, c&rsquo;est bien le mot&nbsp;: le robot revient dans une bande d&rsquo;environ 30&nbsp;cm de large plut\u00f4t qu&rsquo;en un point, et dans cette prise, deux de ses positions de repos \u00e9taient \u00e0 34&nbsp;cm l&rsquo;une de l&rsquo;autre. Nous supposons qu&rsquo;\u00e0 l&rsquo;int\u00e9rieur de la bande, l&rsquo;inclinaison est trop faible pour rattraper le jeu du r\u00e9ducteur, mais c&rsquo;est une supposition, pas une mesure. La prise ci-dessus a \u00e9t\u00e9 faite avec kv = 5&nbsp;; l&rsquo;\u00e9tape s&rsquo;est conclue avec kv = 7.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troisi\u00e8me boucle&nbsp;: la position<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La troisi\u00e8me boucle retient l&rsquo;endroit d&rsquo;o\u00f9 le robot est parti, et nous avons marqu\u00e9 ce point avec un petit bateau imprim\u00e9. Vingt fois par seconde, la boucle mesure la distance au point de d\u00e9part et demande \u00e0 la boucle de vitesse une vitesse pour y revenir. Son gain est kx = 1,5, si bien qu&rsquo;\u00e0 dix centim\u00e8tres du point de d\u00e9part, elle demanderait 15&nbsp;cm\/s, mais elle ne demande jamais plus de 10&nbsp;cm\/s. La position fixe la vitesse, la vitesse fixe l&rsquo;angle, et l&rsquo;angle fixe les moteurs.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c5-dog-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c5-dog.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Le contr\u00f4le qualit\u00e9 arrive pour inspecter le point de r\u00e9f\u00e9rence. Le robot reste debout, et le petit bateau est valid\u00e9.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La distance vient des encodeurs, corrig\u00e9e de l&rsquo;inclinaison&nbsp;: quand le corps penche, les roues roulent sous lui m\u00eame si le robot dans son ensemble reste sur place. Voici la cascade telle qu&rsquo;elle tourne dans le pas \u00e0 500&nbsp;Hz, un peu raccourcie&nbsp;: la branche qui permet au PC de piloter le robot a \u00e9t\u00e9 retir\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Every step runs at 500 Hz: position every 25th, speed every 5th.\nif (positionPhase == 0) {\n    vRefNow = pidPosition(xHold + params.xRef, xNow, params);\n}\npositionPhase = (positionPhase + 1) % POSITION_EVERY;\n\nif (speedPhase == 0) {\n    \/\/ Hold the speed integral while a hand carries the robot away.\n    const bool limited = fabsf(vRefNow) &gt;= params.vMax;\n    const bool carried = (vRefNow &gt; 0) ? (vNow &lt; -AWAY_M_S)\n                                       : (vNow &gt; AWAY_M_S);\n    thetaOffset = pidSpeed(vRefNow, vNow, params,\n                           SPEED_EVERY * IMU_DT, limited &amp;&amp; carried);\n}\nspeedPhase = (speedPhase + 1) % SPEED_EVERY;\n\nthetaRefNow = params.thetaRef + thetaOffset;\npercent = pidStep(a.theta, a.omegaPitch, thetaRefNow, params,\n                  IMU_DT, &amp;uCtl);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La ligne \u00ab&nbsp;carried&nbsp;\u00bb (\u00ab&nbsp;emport\u00e9&nbsp;\u00bb) cache une histoire. Dans la premi\u00e8re version, apr\u00e8s une pouss\u00e9e, le robot revenait \u00e0 une vitesse de 20 \u00e0 46&nbsp;cm\/s et d\u00e9passait sa place de 10 \u00e0 24&nbsp;cm. L&rsquo;int\u00e9grale de la vitesse s&rsquo;\u00e9tait charg\u00e9e tant que la main poussait, et elle se souvenait de la main. Figer l&rsquo;int\u00e9grale chaque fois que la boucle de position demandait la pleine vitesse a r\u00e9duit le d\u00e9passement \u00e0 environ 5&nbsp;cm, mais les grandes pouss\u00e9es se terminaient alors de 12 \u00e0 27&nbsp;cm avant le point de d\u00e9part. La r\u00e8gle retenue ne la fige que lorsque la boucle demande la pleine vitesse de retour et que le robot s&rsquo;\u00e9loigne encore de son point de d\u00e9part \u00e0 plus de 1&nbsp;cm\/s, autrement dit pendant qu&rsquo;une main l&#8217;emporte. Apr\u00e8s cela, des pouss\u00e9es de 68 et 80&nbsp;cm se sont sold\u00e9es par un retour \u00e0 moins de 3&nbsp;cm, sans d\u00e9passement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quant \u00e0 kx, nous l&rsquo;avons choisi en d\u00e9pla\u00e7ant le point cible par Wi-Fi et en regardant le robot le suivre, 36 d\u00e9placements pour chaque r\u00e9glage&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>kx<\/th><th>1<\/th><th>1,5<\/th><th>2<\/th><\/tr><\/thead><tbody><tr><td>Temps pour revenir \u00e0 moins de 3&nbsp;cm, m\u00e9diane<\/td><td>8,1&nbsp;s<\/td><td>4,8&nbsp;s<\/td><td>4,6&nbsp;s<\/td><\/tr><tr><td>Plus grand d\u00e9passement<\/td><td>2,6&nbsp;cm<\/td><td>3,0&nbsp;cm<\/td><td>5,1&nbsp;cm<\/td><\/tr><tr><td>Arr\u00eats en chemin<\/td><td>37<\/td><td>5<\/td><td>18<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">\u00c0 1, le robot se tra\u00eenait par \u00e0-coups jusqu&rsquo;\u00e0 son point de d\u00e9part, \u00e0 2, il le d\u00e9passait&nbsp;; 1,5 se situe entre les deux. Un arr\u00eat est une immobilisation d&rsquo;une demi-seconde \u00e0 deux secondes sur le chemin du retour&nbsp;: le frottement retient le robot jusqu&rsquo;\u00e0 ce que l&rsquo;int\u00e9grale de la vitesse accumule assez d&rsquo;inclinaison pour le remettre en mouvement.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c6-three-loops-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c6-three-loops.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Trois boucles, le 7 novembre. Pouss\u00e9 \u00e0 40,6&nbsp;cm, le robot revient \u00e0 moins de 3&nbsp;cm du petit bateau en 6,1&nbsp;secondes.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il ne revient pas exactement au petit bateau. Il s&rsquo;arr\u00eate deux ou trois centim\u00e8tres en de\u00e7\u00e0 ou au-del\u00e0, retenu par le m\u00eame frottement qui laissait le robot \u00e0 deux boucles s&rsquo;immobiliser n&rsquo;importe o\u00f9 dans sa bande. Apr\u00e8s une pouss\u00e9e de 50&nbsp;cm dans l&rsquo;autre sens, le retour a pris 8,6&nbsp;secondes. Mettez les trois \u00e9tapes c\u00f4te \u00e0 c\u00f4te, et le progr\u00e8s saute aux yeux&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c7-triptych-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c7-triptych.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Le m\u00eame type de pouss\u00e9e avec une, deux et trois boucles.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>Boucles<\/th><th>Ce qu&rsquo;il surveille<\/th><th>Apr\u00e8s une pouss\u00e9e<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Angle, 500&nbsp;Hz<\/td><td>S&rsquo;\u00e9loigne de 27&nbsp;cm en roulant et reste l\u00e0<\/td><\/tr><tr><td>2<\/td><td>Angle et vitesse, 100&nbsp;Hz<\/td><td>Revient dans une bande d&rsquo;environ 30&nbsp;cm de large<\/td><\/tr><tr><td>3<\/td><td>Angle, vitesse et position, 20&nbsp;Hz<\/td><td>Revient \u00e0 moins de 3&nbsp;cm de sa place<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Le piloter par Wi-Fi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">D\u00e8s que le robot sait tenir un point, le piloter revient \u00e0 d\u00e9placer ce point. L&rsquo;ESP32 se connecte au r\u00e9seau Wi-Fi de la maison, et une petite passerelle Python sur le PC sert une page web avec des fl\u00e8ches&nbsp;: clavier, manette ou manette \u00e0 l&rsquo;\u00e9cran. La passerelle transmet au robot la commande la plus r\u00e9cente en UDP vingt fois par seconde, et le robot r\u00e9pond aussit\u00f4t \u00e0 chaque commande avec sa t\u00e9l\u00e9m\u00e9trie&nbsp;: angle, vitesse, position, cap, puissance, tension de la batterie et force du signal. Tant qu&rsquo;une touche est maintenue, une vitesse de d\u00e9placement liss\u00e9e par une rampe prend la place de la sortie de la boucle de position&nbsp;; au rel\u00e2chement, la boucle de position tient l&rsquo;endroit o\u00f9 le robot s&rsquo;est arr\u00eat\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour tourner, il a fallu une boucle de plus, hors de la cascade. Une boucle de cap compare l&rsquo;\u00e9cart entre les encodeurs des deux roues \u00e0 une consigne qui avance \u00e0 la vitesse de rotation demand\u00e9e, puis ajoute sa correction \u00e0 une roue et la retranche de l&rsquo;autre. Cette m\u00eame boucle emp\u00eache le robot de tourner tout seul \u00e0 cause de ses moteurs dissemblables. La r\u00e8gle, c&rsquo;est l&rsquo;\u00e9quilibre d&rsquo;abord&nbsp;: le virage ne re\u00e7oit que la puissance que la boucle d&rsquo;angle laisse disponible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Balance first: the turn gets what is left of the limit, so the\n\/\/ mean of the two wheels stays the angle loop's command.\nstatic void driveApart(float percent, float turn, float limit) {\n    drivePercent = percent;\n    const float room = max(limit - fabsf(percent), 0.0f);\n    uTurnNow = constrain(turn, -room, room);\n    motorDrive(Wheel::Left, percent - uTurnNow);\n    motorDrive(Wheel::Right, percent + uTurnNow);\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-video alignwide is-style-loop\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls loop muted poster=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c8-spin-poster.jpg\" preload=\"none\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-c8-spin.mp4\" playsinline><\/video><button type=\"button\" class=\"sws-video-loop__toggle\" aria-label=\"Mettre la vid\u00e9o en pause\" data-label-pause=\"Mettre la vid\u00e9o en pause\" data-label-play=\"Lire la vid\u00e9o\" hidden><svg class=\"sws-video-loop__icon sws-video-loop__icon--pause\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M19 14h8v36h-8zM37 14h8v36h-8z\" fill=\"currentColor\"\/>\n<\/svg><svg class=\"sws-video-loop__icon sws-video-loop__icon--play\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/button><figcaption class=\"wp-element-caption\">Rotation sur place depuis la page web, tout en gardant l&rsquo;\u00e9quilibre.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les limites de fonctionnement sont de 0,35&nbsp;m\/s et de 75\u00b0 par seconde. Le dernier essai du 8 novembre a dur\u00e9 150&nbsp;secondes&nbsp;: 28&nbsp;m\u00e8tres de trajet avec des pointes jusqu&rsquo;\u00e0 0,57&nbsp;m\/s, deux sauts depuis le p\u00e8se-personne et aucune chute. Au premier atterrissage, le corps a bascul\u00e9 \u00e0 +7\u00b0 pendant un instant, et le robot est rest\u00e9 debout.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tous les sauts ne se sont pas aussi bien pass\u00e9s. Plus t\u00f4t dans la journ\u00e9e, un atterrissage depuis un petit tremplin a fait basculer le robot de 9\u00b0 vers l&rsquo;avant. Pour se rattraper, il est parti \u00e0 environ un m\u00e8tre par seconde et a fonc\u00e9 droit dans le lit. Pour que le robot se penche en arri\u00e8re et freine, ses roues doivent d&rsquo;abord passer devant le corps, et la commande de puissance \u00e9tait d\u00e9j\u00e0 \u00e0 sa limite de 85&nbsp;%&nbsp;: \u00e0 cette vitesse, il ne restait plus rien pour les y amener. La limite a depuis \u00e9t\u00e9 relev\u00e9e \u00e0 100&nbsp;%, ce que nous n&rsquo;avons pas encore essay\u00e9 au sol.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce qui l&#8217;emp\u00eache de s&rsquo;ab\u00eemer<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Il ne d\u00e9marre que sur demande.<\/strong> Un appui sur un bouton l&rsquo;arme avec trois bips, et il s&rsquo;enclenche une fois que son inclinaison est rest\u00e9e \u00e0 moins de 5\u00b0 de la verticale pendant 0,2&nbsp;s.<\/li>\n\n\n\n<li><strong>Il abandonne \u00e0 25\u00b0.<\/strong> Au-del\u00e0 de cette inclinaison, il ne peut plus se rattraper, alors les moteurs se coupent au lieu de faire patiner les roues sur le sol.<\/li>\n\n\n\n<li><strong>Son propre chien de garde.<\/strong> Un timer mat\u00e9riel s\u00e9par\u00e9 coupe la ligne d&rsquo;activation (enable) des drivers si aucun \u00e9chantillon du capteur n&rsquo;est arriv\u00e9 depuis 10&nbsp;ms. Un bus I\u00b2C bloqu\u00e9 peut immobiliser la t\u00e2che de commande pendant environ une seconde, et un robot qui roule \u00e0 l&rsquo;aveugle pendant une seconde, c&rsquo;est un robot dans le mur.<\/li>\n\n\n\n<li><strong>Surveillance de la batterie et du capteur.<\/strong> Il s&rsquo;arr\u00eate quand la batterie est faible et en cas de d\u00e9faut du capteur. Une liaison Wi-Fi perdue n&rsquo;arr\u00eate que le pilotage&nbsp;: le robot s&rsquo;immobilise et continue de garder l&rsquo;\u00e9quilibre.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Toute la construction en vid\u00e9o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La vid\u00e9o raconte la m\u00eame histoire en huit minutes et demie, avec les journaux trac\u00e9s par-dessus les images. Le lecteur ne se charge depuis YouTube que lorsque vous appuyez dessus.<\/p>\n\n\n<div class=\"sws-video-player sws-video-player--related wp-block-sws-theme-video-player\">\n\t<div class=\"sws-video-player__list\">\n\t\t\t\t\t\t\t\t<div class=\"sws-video-player__item sws-video-player__item--long\">\n\t\t\t\t<div class=\"sws-video-player__stage\"\n\t\t\t\t\tdata-embed=\"https:\/\/www.youtube-nocookie.com\/embed\/nDDhm-58iK8?autoplay=1&#038;playsinline=1&#038;rel=0&#038;hl=fr-FR\"\n\t\t\t\t\tdata-title=\"J&rsquo;ai construit un robot auto-\u00e9quilibr\u00e9 : trois boucles de r\u00e9gulation\">\n\t\t\t\t\t<a class=\"sws-video-player__poster\" href=\"https:\/\/www.youtube.com\/watch?v=nDDhm-58iK8\">\n\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/self-balancing-robot-poster-1024x576.jpg\" class=\"sws-video-player__image\" alt=\"\" loading=\"lazy\" sizes=\"auto, (min-width: 1180px) 1116px, 100vw\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/self-balancing-robot-poster-1024x576.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/self-balancing-robot-poster-300x169.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/self-balancing-robot-poster-768x432.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/self-balancing-robot-poster.jpg 1280w\" \/>\t\t\t\t\t\t<span class=\"sws-video-player__play\"><svg class=\"sws-video-player__play-icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <path d=\"M22 14l28 18-28 18z\" fill=\"currentColor\"\/>\n<\/svg><\/span>\n\t\t\t\t\t\t<span class=\"screen-reader-text\">\n\t\t\t\t\t\t\tLire la vid\u00e9o : J&rsquo;ai construit un robot auto-\u00e9quilibr\u00e9 : trois boucles de r\u00e9gulation\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"sws-video-player__length\" aria-hidden=\"true\">8:40<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\n\t\t\t\t\t\t\t\t\t<p class=\"sws-video-player__title\">\n\t\t\t\t\t\t<a class=\"sws-video-player__title-link\" href=\"https:\/\/build-mode-ak.com\/fr\/videos\/self-balancing-robot\/\">J&rsquo;ai construit un robot auto-\u00e9quilibr\u00e9 : trois boucles de r\u00e9gulation<\/a>\n\t\t\t\t\t<\/p>\n\t\t\t\t\n\t\t\t\t<ul class=\"sws-video-player__links\">\n\t\t\t\t\t<li class=\"sws-video-player__links-item\">\n\t\t\t\t\t\t<a class=\"sws-video-player__link\" href=\"https:\/\/www.youtube.com\/watch?v=nDDhm-58iK8\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t\t<svg class=\"sws-video-player__link-icon\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 64 64\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n  <rect x=\"4\" y=\"13\" width=\"56\" height=\"38\" rx=\"11\"\/>\n  <path d=\"M27 22l16 10-16 10z\" fill=\"currentColor\" stroke=\"none\"\/>\n<\/svg>\t\t\t\t\t\t\tRegarder sur YouTube\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t\t<\/ul>\n\t\t\t<\/div>\n\t\t\t<\/div>\n\n\t<p class=\"sws-video-player__notice\">\n\t\tLa vid\u00e9o est charg\u00e9e depuis YouTube lorsque vous lancez la lecture.\t\t\t\t\t<a class=\"sws-video-player__notice-link\" href=\"https:\/\/build-mode-ak.com\/fr\/privacy-policy\/\">Politique de confidentialit\u00e9<\/a>\n\t\t\t<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">La suite<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dix jours, trois boucles, un robot qui tient debout. La cascade PID fonctionne, mais c&rsquo;est un empilement de pi\u00e8ces r\u00e9gl\u00e9es \u00e0 la main, et chaque pi\u00e8ce a \u00e9t\u00e9 ajout\u00e9e pour corriger ce que la pr\u00e9c\u00e9dente ne savait pas faire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, nous voulons remplacer les trois boucles par un seul r\u00e9gulateur LQR, qui calcule ses gains \u00e0 partir d&rsquo;un mod\u00e8le du robot, au lieu qu&rsquo;une personne les r\u00e8gle un par un. Apr\u00e8s cela, nous voulons essayer un petit r\u00e9seau de neurones qui tourne sur l&rsquo;ESP32 lui-m\u00eame. Le robot enregistre d\u00e9j\u00e0 ses essais, en partie pour qu&rsquo;un tel r\u00e9seau ait de quoi apprendre. Ni l&rsquo;un ni l&rsquo;autre n&rsquo;existe encore. Quand ils existeront, ils subiront les m\u00eames pouss\u00e9es que le PID ici, et nous publierons les chiffres.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-large\"><a href=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1600\" src=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose.jpg\" alt=\"Le robot debout sur un parquet \u00e0 c\u00f4t\u00e9 d'un rosier rose dans un pot rose vif, l'\u00e9cran allum\u00e9 et des LED vertes qui brillent sous les moteurs.\" class=\"wp-image-744\" srcset=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose.jpg 2560w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-300x188.jpg 300w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-1024x640.jpg 1024w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-768x480.jpg 768w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-1536x960.jpg 1536w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-2048x1280.jpg 2048w, https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-11-rose-1920x1200.jpg 1920w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><figcaption class=\"wp-element-caption\">Entre deux exp\u00e9riences.<\/figcaption><\/figure>\n\n\n<div class=\"sws-spacer sws-spacer--medium wp-block-sws-theme-spacer\" aria-hidden=\"true\"><\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Dix jours, un robot, trois boucles de r\u00e9gulation. Comment notre robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais a appris \u00e0 tenir debout, \u00e0 revenir apr\u00e8s une pouss\u00e9e, \u00e0 garder sa place et \u00e0 se laisser piloter par Wi-Fi, avec les chiffres de ses journaux et le firmware qui l&rsquo;a fait fonctionner.<\/p>\n","protected":false},"author":1,"featured_media":734,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[4],"tags":[70],"topic":[90,54,79,85],"class_list":["post-788","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classe","tag-esp32-fr","topic-capteurs","topic-esp32-fr","topic-impression-3d","topic-moteurs"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode<\/title>\n<meta name=\"description\" content=\"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode\" \/>\n<meta property=\"og:description\" content=\"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/\" \/>\n<meta property=\"og:site_name\" content=\"Build Mode\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-10T10:35:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-11T16:02:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"q_admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"q_admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/\"},\"author\":{\"name\":\"q_admin\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\"},\"headline\":\"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation\",\"datePublished\":\"2026-11-10T10:35:04+00:00\",\"dateModified\":\"2026-11-11T16:02:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/\"},\"wordCount\":3643,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/build-mode-ak.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-self-balancing-robot-01-cover.jpg\",\"keywords\":[\"ESP32\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/\",\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/\",\"name\":\"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/build-mode-ak.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-self-balancing-robot-01-cover.jpg\",\"datePublished\":\"2026-11-10T10:35:04+00:00\",\"dateModified\":\"2026-11-11T16:02:59+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\"},\"description\":\"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#primaryimage\",\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-self-balancing-robot-01-cover.jpg\",\"contentUrl\":\"https:\\\/\\\/build-mode-ak.com\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/esp32-self-balancing-robot-01-cover.jpg\",\"width\":2560,\"height\":1600,\"caption\":\"The robot standing on the bed of a black Creality 3D printer: an orange three-floor frame with a pack of 18650 cells on top, a small lit screen and wiring in the middle, two motor drivers with black heatsinks below, and two black wheels with blue rims.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/esp32-self-balancing-robot\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/\",\"name\":\"Build Mode\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\",\"name\":\"q_admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g\",\"caption\":\"q_admin\"},\"sameAs\":[\"https:\\\/\\\/build-mode-ak.com\"],\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/fr\\\/author\\\/q_admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode","description":"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/","og_locale":"fr_FR","og_type":"article","og_title":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode","og_description":"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.","og_url":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/","og_site_name":"Build Mode","article_published_time":"2026-11-10T10:35:04+00:00","article_modified_time":"2026-11-11T16:02:59+00:00","og_image":[{"width":2560,"height":1600,"url":"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg","type":"image\/jpeg"}],"author":"q_admin","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"q_admin","Dur\u00e9e de lecture estim\u00e9e":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#article","isPartOf":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/"},"author":{"name":"q_admin","@id":"https:\/\/build-mode-ak.com\/fr\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b"},"headline":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation","datePublished":"2026-11-10T10:35:04+00:00","dateModified":"2026-11-11T16:02:59+00:00","mainEntityOfPage":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/"},"wordCount":3643,"commentCount":0,"image":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#primaryimage"},"thumbnailUrl":"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg","keywords":["ESP32"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/","url":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/","name":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation - Build Mode","isPartOf":{"@id":"https:\/\/build-mode-ak.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#primaryimage"},"image":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#primaryimage"},"thumbnailUrl":"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg","datePublished":"2026-11-10T10:35:04+00:00","dateModified":"2026-11-11T16:02:59+00:00","author":{"@id":"https:\/\/build-mode-ak.com\/fr\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b"},"description":"Robot auto-\u00e9quilibr\u00e9 \u00e0 ESP32 et moteurs \u00e0 balais : filtre compl\u00e9mentaire, trois boucles PID en cascade, extraits du firmware et chiffres de ses journaux.","breadcrumb":{"@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#primaryimage","url":"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg","contentUrl":"https:\/\/build-mode-ak.com\/wp-content\/uploads\/2026\/11\/esp32-self-balancing-robot-01-cover.jpg","width":2560,"height":1600,"caption":"The robot standing on the bed of a black Creality 3D printer: an orange three-floor frame with a pack of 18650 cells on top, a small lit screen and wiring in the middle, two motor drivers with black heatsinks below, and two black wheels with blue rims."},{"@type":"BreadcrumbList","@id":"https:\/\/build-mode-ak.com\/fr\/esp32-self-balancing-robot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/build-mode-ak.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Robot auto-\u00e9quilibr\u00e9 sur ESP32 : trois boucles de r\u00e9gulation"}]},{"@type":"WebSite","@id":"https:\/\/build-mode-ak.com\/fr\/#website","url":"https:\/\/build-mode-ak.com\/fr\/","name":"Build Mode","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/build-mode-ak.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/build-mode-ak.com\/fr\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b","name":"q_admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9b27ab13255ffada0f0f8683c7d2916b3c1c81aa48c6c0d5668f58421dc498bc?s=96&d=mm&r=g","caption":"q_admin"},"sameAs":["https:\/\/build-mode-ak.com"],"url":"https:\/\/build-mode-ak.com\/fr\/author\/q_admin\/"}]}},"_links":{"self":[{"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/posts\/788","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/comments?post=788"}],"version-history":[{"count":1,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/posts\/788\/revisions"}],"predecessor-version":[{"id":790,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/posts\/788\/revisions\/790"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/media\/734"}],"wp:attachment":[{"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/media?parent=788"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/categories?post=788"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/tags?post=788"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/build-mode-ak.com\/fr\/wp-json\/wp\/v2\/topic?post=788"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}