{"id":794,"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:03:00","modified_gmt":"2026-11-11T16:03:00","slug":"esp32-self-balancing-robot","status":"publish","type":"post","link":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/","title":{"rendered":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo"},"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=\"Migalhas de p\u00e3o\">\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\/pt-pt\/\">In\u00edcio<\/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\">Este rob\u00f4 acabou de saltar de uma balan\u00e7a de casa de banho e manteve-se de p\u00e9. Cinco dias antes, nem sequer conseguia ficar no mesmo s\u00edtio. Entretanto, nada mudou no seu hardware: a mesma estrutura, os mesmos motores, o mesmo sensor. S\u00f3 mudou o programa. Uma malha de controlo passou a duas, depois a tr\u00eas, e cada nova malha corrigiu o que a anterior n\u00e3o conseguia fazer.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">O primeiro de dois saltos da balan\u00e7a de casa de banho, a 8 de novembro: sobe pela t\u00e1bua, passa a borda, aterra com for\u00e7a e continua a equilibrar-se.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 um rob\u00f4 de duas rodas que se equilibra sozinho: uma estrutura de tr\u00eas andares impressa em 3D, montada sobre dois motorredutores DC, uma placa ESP32 e um sensor de movimento. Constru\u00edmo-lo para comparar formas de manter um rob\u00f4 de p\u00e9 com o mesmo hardware, a come\u00e7ar pela cl\u00e1ssica, o PID. Este artigo acompanha os dez dias entre o primeiro teste e o salto, pela ordem em que aconteceram: o que tem l\u00e1 dentro, como \u00e9 que o rob\u00f4 sabe qual \u00e9 o lado de cima, as tr\u00eas malhas uma a uma e o que nos ensinou conduzi-lo por Wi-Fi. Os n\u00fameros v\u00eam dos registos do pr\u00f3prio rob\u00f4.<\/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=\"O rob\u00f4 de p\u00e9 na mesa de uma impressora 3D Creality preta: uma estrutura laranja de tr\u00eas andares com uma bateria de c\u00e9lulas 18650 no topo, um pequeno ecr\u00e3 aceso e fios ao meio, dois drivers de motor com dissipadores pretos em baixo e duas rodas pretas com jantes azuis.\" 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\">O rob\u00f4 em cima da impressora que lhe imprimiu a estrutura.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">O rob\u00f4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A estrutura \u00e9 feita de tr\u00eas andares impressos, empilhados uns sobre os outros, cada um deles uma pe\u00e7a separada. Desenh\u00e1mo-la no Fusion 360 juntamente com as pe\u00e7as compradas, para que os motores e os drivers j\u00e1 tivessem o seu lugar antes de se imprimir fosse o que fosse.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">O modelo do Fusion 360 a separar-se nas suas pe\u00e7as: tr\u00eas andares impressos, dois drivers de motor, dois motores e o m\u00f3dulo de 5&nbsp;V. O suporte preto segura o rob\u00f4 na bancada e n\u00e3o faz parte dele.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De baixo para cima: os motores est\u00e3o pendurados por baixo do andar inferior, nos suportes que vinham no kit. O primeiro andar tem os dois drivers de motor, com os dissipadores virados para baixo. O segundo andar \u00e9 o c\u00e9rebro: a placa ESP32 com o seu pequeno ecr\u00e3, montada numa placa perfurada, o sensor de movimento e um buzzer. O andar de cima leva uma bateria de tr\u00eas c\u00e9lulas com a sua placa de prote\u00e7\u00e3o, um interruptor e um m\u00f3dulo redutor de 5&nbsp;V. O corpo mede 164&nbsp;\u00d7&nbsp;128&nbsp;\u00d7&nbsp;60&nbsp;mm, 235&nbsp;mm de largura com as rodas, e o rob\u00f4 completo pesa 1025&nbsp;g.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>Pe\u00e7a<\/th><th>O que us\u00e1mos<\/th><th>Para que serve<\/th><\/tr><\/thead><tbody><tr><td>Controlador<\/td><td><a href=\"https:\/\/build-mode-ak.com\/pt-pt\/lilygo-ttgo-t-display\/\">LILYGO TTGO T-Display<\/a>: ESP32, dois n\u00facleos a 240&nbsp;MHz, ecr\u00e3 de 1,14\u2033<\/td><td>Um n\u00facleo executa a malha de controlo, o outro trata do Wi-Fi; o ecr\u00e3 mostra os ganhos<\/td><\/tr><tr><td>Sensor de movimento<\/td><td>MPU-6500 numa placa MPU-9250\/6500\/9255, I\u00b2C a 400&nbsp;kHz<\/td><td>Girosc\u00f3pio e aceler\u00f3metro, 500 amostras por segundo<\/td><\/tr><tr><td>Drivers de motor<\/td><td>2&nbsp;\u00d7&nbsp;m\u00f3dulo BTS7960 (HW-039, IBT-2)<\/td><td>Uma ponte H por motor, PWM a 8&nbsp;kHz<\/td><\/tr><tr><td>Motores<\/td><td>2&nbsp;\u00d7&nbsp;JGB37-520, 12&nbsp;V, 333&nbsp;rpm, caixa redutora met\u00e1lica de engrenagens retas, encoder de efeito Hall<\/td><td>1320 impulsos do encoder por volta da roda, 0,16&nbsp;mm de deslocamento por impulso<\/td><\/tr><tr><td>Rodas<\/td><td>67&nbsp;mm, do kit dos motores<\/td><td>Cerca de 210&nbsp;mm de deslocamento por volta<\/td><\/tr><tr><td>Bateria<\/td><td>Bateria 3S de c\u00e9lulas 18650, 11,1&nbsp;V, 12,6&nbsp;V carregada, com BMS e interruptor<\/td><td>Alimenta diretamente os motores; o interruptor corta tudo<\/td><\/tr><tr><td>Alimenta\u00e7\u00e3o de 5&nbsp;V<\/td><td>M\u00f3dulo redutor LM2596<\/td><td>Alimenta a placa a partir da bateria<\/td><\/tr><tr><td>Buzzer<\/td><td>Buzzer ativo<\/td><td>Tr\u00eas bipes quando o rob\u00f4 se arma<\/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=\"Diagrama de blocos num painel escuro ao lado do rob\u00f4 no seu suporte: a bateria de 12 V alimenta o LM2596, que gera 5 V para o ESP32; um divisor permite ao ESP32 ler a bateria pelo ADC; o MPU-6500 comunica com ele por I2C; o ESP32 envia PWM a 8 kHz a dois drivers BTS7960, que acionam dois motores; os encoders devolvem a dist\u00e2ncia percorrida pelas rodas.\" 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\">Como est\u00e1 ligado, num fotograma do nosso v\u00eddeo. A bateria alimenta diretamente os motores, o conversor alimenta a placa, e a seta que regressa dos encoders \u00e9 a raz\u00e3o de ser de toda esta montagem.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dois pormenores da transmiss\u00e3o determinaram tudo o que veio depois. O primeiro \u00e9 o atraso. O sensor entrega uma nova amostra a cada 2&nbsp;ms, e o comando que dela resulta chega aos drivers em menos de um milissegundo, mas uma roda precisa de cerca de um d\u00e9cimo de segundo para responder a uma mudan\u00e7a de comando. O segundo \u00e9 a caixa redutora: tem folga, por isso, depois de cada invers\u00e3o de sentido, o motor gira durante um instante antes de a roda se mexer.<\/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=\"Duas placas azuis de driver BTS7960 lado a lado, com as marca\u00e7\u00f5es HW-039 e IBT_2, cada uma com um bloco de terminais verde de quatro parafusos, um condensador de 330 \u00b5F e dois chips de pot\u00eancia.\" 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=\"Duas placas de sensor MPU-9250\/6500\/9255 azuis, uma virada para cima, com o chip e as setas dos eixos X e Y, a outra virada para baixo, cada uma com dez pinos identificados: 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=\"Um motorredutor JGB37-520 prateado num suporte preto em forma de L, com um pneu preto com piso numa jante azul encaixado no veio, e seis fios coloridos a sair da parte de tr\u00e1s.\" 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=\"Grande plano da placa redonda e preta do encoder na traseira de um motor: um disco magn\u00e9tico no veio, ao centro, dois sensores Hall junto \u00e0 sua borda, um conector branco de seis pinos e as marca\u00e7\u00f5es M1, GND e 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\">As pe\u00e7as antes da montagem: os dois drivers de motor, a placa do sensor de movimento de frente e de costas, um motor com a sua roda e o suporte, e o encoder na traseira do motor.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">E os dois motores n\u00e3o s\u00e3o g\u00e9meos. Em imagens filmadas ao n\u00edvel do ch\u00e3o, exatamente o mesmo comando PWM fez girar a roda mais afastada 18&nbsp;mm e a mais pr\u00f3xima 8&nbsp;mm. O comando era id\u00eantico; porque \u00e9 que a resposta n\u00e3o o \u00e9, n\u00e3o apur\u00e1mos. Deixada a si pr\u00f3pria, esta diferen\u00e7a faz o rob\u00f4 rodar lentamente no mesmo s\u00edtio enquanto se equilibra, e uma pequena corre\u00e7\u00e3o de rumo, descrita na sec\u00e7\u00e3o sobre a condu\u00e7\u00e3o, trata disso.<\/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=\"O rob\u00f4 seguro sobre uma secret\u00e1ria, visto de cima e de frente: a bateria presa com uma abra\u00e7adeira no andar de cima, a T-Display com o ecr\u00e3 aceso numa placa perfurada no segundo andar, o buzzer ao lado e fios de liga\u00e7\u00e3o coloridos a descer at\u00e9 aos 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=\"O rob\u00f4 deitado de lado numa m\u00e3o, a mostrar a parte de baixo: os dois motores prateados montados topo a topo por baixo do andar inferior, uma placa de encoder com um LED verde na extremidade interior de cada um e uma roda em cada extremidade exterior.\" 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\">O rob\u00f4 acabado: o c\u00e9rebro no segundo andar e, por baixo, os motores com os seus encoders.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Qual \u00e9 o lado de cima<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tudo o que um rob\u00f4 de equil\u00edbrio faz depende de um \u00fanico n\u00famero: a sua inclina\u00e7\u00e3o. O MPU-6500 oferece duas formas de a obter, e nenhuma funciona sozinha.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O girosc\u00f3pio mede a rapidez com que o corpo roda. Ao somar as suas leituras a cada 2&nbsp;ms, obt\u00e9m-se um \u00e2ngulo suave e r\u00e1pido, mas que deriva: sem corre\u00e7\u00e3o do desvio pr\u00f3prio do girosc\u00f3pio, medimos cerca de 15\u00b0 por minuto. O aceler\u00f3metro sabe onde est\u00e1 a gravidade, por isso o seu \u00e2ngulo n\u00e3o pode derivar, mas tamb\u00e9m sente cada solavanco. Com os motores a trabalhar, o seu \u00e2ngulo saltava de um lado para o outro numa faixa de 18,7\u00b0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Um filtro complementar fica com a metade boa de cada um. A cada passo, o girosc\u00f3pio faz avan\u00e7ar o \u00e2ngulo, e depois o \u00e2ngulo \u00e9 puxado em dire\u00e7\u00e3o \u00e0 leitura do aceler\u00f3metro por uma parte \u00ednfima da diferen\u00e7a, um mil\u00e9simo. Dito de outra forma: 99,9&nbsp;% girosc\u00f3pio, 0,1&nbsp;% aceler\u00f3metro, o que d\u00e1 uma constante de tempo de dois segundos. Na bancada, o \u00e2ngulo filtrado manteve-se dentro de seis cent\u00e9simos de grau.<\/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=\"Painel do nosso v\u00eddeo ao lado do rob\u00f4 no seu suporte. Em cima: o \u00e2ngulo s\u00f3 do girosc\u00f3pio ao longo de 39 segundos, uma linha reta a descer a cerca de \u221215\u00b0 por minuto. Ao meio: o \u00e2ngulo do aceler\u00f3metro, uma faixa ruidosa com 18,7\u00b0 de largura. Em baixo: as duas f\u00f3rmulas do filtro, \u03c4 = 2 s, e a amplitude filtrada 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\">Sozinho, o girosc\u00f3pio deriva; sozinho, o aceler\u00f3metro treme; o filtro mant\u00e9m o \u00e2ngulo dentro de 0,06\u00b0.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">No firmware, tudo se resume a umas poucas linhas. A placa do sensor est\u00e1 montada ao alto, sobre uma aresta, e inclinada 1,4\u00b0 para o lado, por isso, antes de mais nada, o c\u00f3digo separa a velocidade de arfagem, de que o filtro precisa, da velocidade de guinada, que o c\u00f3digo das viragens usa mais tarde:<\/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\">O passo segue o rel\u00f3gio do pr\u00f3prio sensor. Um temporizador de hardware acorda a tarefa de controlo pouco antes de cada amostra esperada, a tarefa l\u00ea-a e executa o controlador inteiro, e o ecr\u00e3 e o registo do ensaio esperam a sua vez com uma prioridade mais baixa. O Wi-Fi vive no outro n\u00facleo. Este esquema vem do nosso <a href=\"https:\/\/build-mode-ak.com\/pt-pt\/videos\/esp32-propeller-balancer\/\">balanceador de h\u00e9lice<\/a> anterior, constru\u00eddo com a mesma placa e o mesmo sensor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Primeira malha: o \u00e2ngulo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A primeira experi\u00eancia usa uma \u00fanica malha, que s\u00f3 olha para o \u00e2ngulo. \u00c9 um controlador PID executado 500 vezes por segundo, uma vez por cada amostra do sensor, e a sua sa\u00edda \u00e9 a pot\u00eancia para os dois motores, em percentagem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>P<\/strong>, o termo proporcional: kp = 30, ou seja, um grau de erro pede 30&nbsp;% da pot\u00eancia m\u00e1xima.<\/li>\n\n\n\n<li><strong>I<\/strong>, o integral: ki = 30 acumula o erro ao longo do tempo e continua a empurrar enquanto este durar.<\/li>\n\n\n\n<li><strong>D<\/strong>, o termo derivativo: kd = 0,3 acalma a oscila\u00e7\u00e3o. Vai buscar a velocidade de rota\u00e7\u00e3o diretamente ao girosc\u00f3pio, em vez de derivar um \u00e2ngulo com ru\u00eddo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A refer\u00eancia n\u00e3o \u00e9 exatamente zero. O centro de massa n\u00e3o fica perfeitamente por cima do eixo, por isso o rob\u00f4 equilibra-se em \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\">O primeiro ensaio no ch\u00e3o falhou de uma forma que a bancada n\u00e3o podia ter mostrado. No ar, todas as verifica\u00e7\u00f5es tinham passado: as rodas giravam, os encoders contavam, o sensor lia a inclina\u00e7\u00e3o. No ch\u00e3o, as rodas andavam para o lado oposto ao da inclina\u00e7\u00e3o, em vez de irem para debaixo do corpo, e o rob\u00f4 caiu. O \u00e2ngulo estava certo; o que estava trocado era a \u00abfrente\u00bb dos motores e dos encoders. Com ambos invertidos na configura\u00e7\u00e3o, o rob\u00f4 p\u00f4s-se de p\u00e9 e, com estes ganhos, mais tarde manteve-se de p\u00e9 durante mais de dois minutos, com um desvio-padr\u00e3o do \u00e2ngulo de 0,2\u00b0.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">Uma malha, 3 de novembro. Um empurr\u00e3o, e o rob\u00f4 afasta-se a rolar com o corpo ainda direito e depois fica onde parou.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 aqui que uma \u00fanica malha chega ao limite. Durante esse empurr\u00e3o, o corpo nunca se inclinou mais de meio grau, e o rob\u00f4 rolou 27&nbsp;cm e ficou l\u00e1. Para uma malha de \u00e2ngulo, isso \u00e9 um sucesso, porque o \u00e2ngulo est\u00e1 bem. Ela n\u00e3o consegue distinguir entre estar parado e rolar a velocidade constante: no nosso ch\u00e3o, manter uma velocidade v exige cerca de 4,5&nbsp;% de pot\u00eancia mais 78&nbsp;% por cada metro por segundo, e o integral limita-se a guardar a pot\u00eancia que o empurr\u00e3o lhe deixou. Para ela, qualquer velocidade parece equil\u00edbrio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Segunda malha: velocidade<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A segunda malha vigia as rodas. \u00c9 executada 100 vezes por segundo, l\u00ea os dois encoders e compara a velocidade do rob\u00f4 com a velocidade que ele devia ter, por agora zero. N\u00e3o toca de todo nos motores: a sua sa\u00edda \u00e9 o \u00e2ngulo que a primeira malha deve manter. A rolar para a frente? Inclina-se um pouco para tr\u00e1s, e a malha de \u00e2ngulo, ao perseguir o novo \u00e2ngulo, trava o rob\u00f4. \u00c9 um controlador PI, com um integral limitado aos mesmos poucos graus que a sa\u00edda:<\/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\">A primeira tentativa tremia cinco vezes por segundo. O seu ganho vinha de um modelo que supunha uma malha de \u00e2ngulo tr\u00eas vezes mais fraca do que a real: kv = 10 foi calculado para kp = 10, e o rob\u00f4 funciona com kp = 30. O modelo tamb\u00e9m ignorava o d\u00e9cimo de segundo que as rodas levam a responder. O rem\u00e9dio n\u00e3o foi um ganho mais pequeno, mas uma medi\u00e7\u00e3o mais calma: a velocidade passou a ser uma m\u00e9dia ao longo de 200&nbsp;ms em vez de 40&nbsp;ms, e uma m\u00e9dia de 200&nbsp;ms, por acaso, anula por completo uma oscila\u00e7\u00e3o de 5&nbsp;Hz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depois, o rob\u00f4 come\u00e7ou a fugir aos poucos. Com uma malha de velocidade puramente proporcional, kvi = 0, oito ensaios em dez terminaram a mais de 10&nbsp;cm do s\u00edtio onde tinham come\u00e7ado. Um pequeno integral, kvi = 1, resolveu o problema: nos onze ensaios seguintes, nenhum se afastou mais 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=\"Painel do nosso v\u00eddeo ao lado do rob\u00f4 num ch\u00e3o de madeira: a malha de velocidade, PI a 100 Hz, por cima da malha de \u00e2ngulo, PID a 500 Hz. Dois gr\u00e1ficos da posi\u00e7\u00e3o ao longo de 36 segundos: com kvi 0, a maioria dos ensaios foge, 8 em 10 para l\u00e1 de 10 cm; com kvi 1, todos os ensaios ficam planos, 0 em 11, no m\u00e1ximo 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\">Sem o integral da velocidade, o rob\u00f4 foge aos poucos; com ele, fica no lugar.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">E ent\u00e3o fez uma coisa que ningu\u00e9m lhe tinha pedido: empurrado, voltou.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">Duas malhas, 5 de novembro. Empurrado, o rob\u00f4 rola 37,8&nbsp;cm, det\u00e9m-se e regressa, at\u00e9 2&nbsp;cm do s\u00edtio onde estava. Ainda n\u00e3o h\u00e1 malha de posi\u00e7\u00e3o.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A raz\u00e3o est\u00e1 no integral. O integral da velocidade \u00e9 simplesmente a dist\u00e2ncia percorrida, por isso, para manter a zero a velocidade de um rob\u00f4 deslocado, o integral da velocidade acaba por guardar uma pequena inclina\u00e7\u00e3o, cerca de um grau por cada metro de afastamento do ponto inicial. \u00c9 uma mola escondida e fraca a puxar o rob\u00f4 de volta ao ponto de partida. Fraca \u00e9 a palavra certa: o rob\u00f4 volta para uma faixa com cerca de 30&nbsp;cm de largura, e n\u00e3o para um ponto, e neste take dois dos seus pontos de repouso ficaram a 34&nbsp;cm um do outro. O nosso palpite \u00e9 que, dentro da faixa, a inclina\u00e7\u00e3o \u00e9 demasiado pequena para fazer a caixa redutora vencer a folga, mas \u00e9 um palpite, n\u00e3o uma medi\u00e7\u00e3o. O take acima foi feito com kv = 5; a etapa foi encerrada com kv = 7.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Terceira malha: posi\u00e7\u00e3o<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A terceira malha lembra-se de onde o rob\u00f4 partiu, e marc\u00e1mos esse s\u00edtio com um barquinho impresso. Vinte vezes por segundo, a malha mede a dist\u00e2ncia ao ponto de partida e pede \u00e0 malha de velocidade uma velocidade de regresso. O seu ganho \u00e9 kx = 1,5, por isso, a dez cent\u00edmetros do ponto de partida, pediria 15&nbsp;cm\/s, mas nunca pede mais de 10&nbsp;cm\/s. A posi\u00e7\u00e3o define a velocidade, a velocidade define o \u00e2ngulo, e o \u00e2ngulo define os motores.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">O controlo de qualidade chega para inspecionar o ponto de refer\u00eancia. O rob\u00f4 continua de p\u00e9, e o barquinho \u00e9 aprovado.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A dist\u00e2ncia vem dos encoders, corrigida pela inclina\u00e7\u00e3o: quando o corpo se inclina, as rodas rolam por baixo dele, mesmo que o rob\u00f4, no seu todo, fique no mesmo s\u00edtio. Eis a cascata tal como \u00e9 executada dentro do passo de 500&nbsp;Hz, um pouco encurtada: o ramo que permite ao PC conduzir o rob\u00f4 ficou de fora.<\/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\">A linha \u00abcarried\u00bb tem uma hist\u00f3ria por tr\u00e1s. Na primeira vers\u00e3o, depois de um empurr\u00e3o, o rob\u00f4 regressava a uma velocidade de 20 a 46&nbsp;cm\/s e ultrapassava o seu s\u00edtio em 10 a 24&nbsp;cm. O integral da velocidade tinha estado a acumular-se durante todo o tempo em que a m\u00e3o empurrava, e lembrava-se da m\u00e3o. Congelar o integral sempre que a malha de posi\u00e7\u00e3o pedia a velocidade m\u00e1xima reduziu a ultrapassagem para cerca de 5&nbsp;cm, mas ent\u00e3o os empurr\u00f5es grandes passaram a terminar 12 a 27&nbsp;cm antes do ponto de partida. A regra que ficou s\u00f3 o congela enquanto a malha pede a velocidade m\u00e1xima de regresso e o rob\u00f4 continua a afastar-se do ponto de partida a mais de 1&nbsp;cm\/s, ou seja, enquanto uma m\u00e3o o est\u00e1 a levar. A partir da\u00ed, depois de empurr\u00f5es de 68 e 80&nbsp;cm, o rob\u00f4 regressou a menos de 3&nbsp;cm do seu s\u00edtio, sem ultrapassagem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O pr\u00f3prio kx foi escolhido ao deslocar o ponto de refer\u00eancia por Wi-Fi e ver o rob\u00f4 segui-lo, 36 deslocamentos para cada valor:<\/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>Tempo at\u00e9 ficar a menos de 3&nbsp;cm, mediana<\/td><td>8,1&nbsp;s<\/td><td>4,8&nbsp;s<\/td><td>4,6&nbsp;s<\/td><\/tr><tr><td>Maior ultrapassagem<\/td><td>2,6&nbsp;cm<\/td><td>3,0&nbsp;cm<\/td><td>5,1&nbsp;cm<\/td><\/tr><tr><td>Paragens pelo caminho<\/td><td>37<\/td><td>5<\/td><td>18<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">Com 1, o rob\u00f4 arrastava-se at\u00e9 ao ponto de partida aos solavancos; com 2, ultrapassava-o; 1,5 fica entre os dois. Uma paragem \u00e9 uma pausa de meio segundo a dois segundos no regresso ao ponto de partida: o atrito segura o rob\u00f4 at\u00e9 o integral da velocidade acumular inclina\u00e7\u00e3o suficiente para o voltar a p\u00f4r em movimento.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">Tr\u00eas malhas, 7 de novembro. Empurrado 40,6&nbsp;cm, o rob\u00f4 volta a ficar a menos de 3&nbsp;cm do barquinho em 6,1&nbsp;segundos.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e3o volta exatamente ao barquinho. Det\u00e9m-se dois ou tr\u00eas cent\u00edmetros antes dele ou depois dele, retido pelo mesmo atrito que deixava o rob\u00f4 de duas malhas assentar em qualquer ponto da sua faixa. Um empurr\u00e3o de 50&nbsp;cm no sentido contr\u00e1rio levou 8,6&nbsp;segundos a ser desfeito. Com as tr\u00eas etapas lado a lado, o progresso salta \u00e0 vista:<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">O mesmo tipo de empurr\u00e3o com uma, duas e tr\u00eas malhas.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>Malhas<\/th><th>O que vigia<\/th><th>Depois de um empurr\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>\u00c2ngulo, 500&nbsp;Hz<\/td><td>Afasta-se 27&nbsp;cm a rolar e fica l\u00e1<\/td><\/tr><tr><td>2<\/td><td>\u00c2ngulo e velocidade, 100&nbsp;Hz<\/td><td>Volta para uma faixa com cerca de 30&nbsp;cm de largura<\/td><\/tr><tr><td>3<\/td><td>\u00c2ngulo, velocidade e posi\u00e7\u00e3o, 20&nbsp;Hz<\/td><td>Volta a menos de 3&nbsp;cm do seu lugar<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Condu\u00e7\u00e3o por Wi-Fi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o rob\u00f4 j\u00e1 consegue manter-se num ponto, conduzi-lo \u00e9 uma quest\u00e3o de mover esse ponto. O ESP32 liga-se \u00e0 rede Wi-Fi de casa, e uma pequena ponte em Python no PC serve uma p\u00e1gina web com setas: teclado, comando de jogos ou comando no ecr\u00e3. A ponte reencaminha a ordem mais recente para o rob\u00f4 por UDP vinte vezes por segundo, e o rob\u00f4 responde de imediato a cada ordem com a sua telemetria: \u00e2ngulo, velocidade, posi\u00e7\u00e3o, rumo, pot\u00eancia, tens\u00e3o da bateria e intensidade do sinal. Enquanto um dos controlos est\u00e1 premido, uma velocidade de desloca\u00e7\u00e3o que varia em rampa suave toma o lugar da sa\u00edda da malha de posi\u00e7\u00e3o; quando \u00e9 largado, a malha de posi\u00e7\u00e3o mant\u00e9m o rob\u00f4 no s\u00edtio onde parou.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para virar, foi necess\u00e1ria mais uma malha, fora da cascata. Uma malha de rumo compara a diferen\u00e7a entre os encoders das duas rodas com uma refer\u00eancia que se desloca \u00e0 velocidade de viragem pedida e, depois, soma a sua corre\u00e7\u00e3o a uma roda e subtrai-a \u00e0 outra. A mesma malha impede o rob\u00f4 de virar sozinho por causa dos motores desiguais. A regra \u00e9 primeiro o equil\u00edbrio: a viragem s\u00f3 recebe a pot\u00eancia que a malha de \u00e2ngulo deixa de sobra.<\/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=\"Pausar o v\u00eddeo\" data-label-pause=\"Pausar o v\u00eddeo\" data-label-play=\"Reproduzir o v\u00eddeo\" 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\">A virar no mesmo s\u00edtio, comandado a partir da p\u00e1gina web, sem deixar de se equilibrar.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Os limites de trabalho s\u00e3o 0,35&nbsp;m\/s e 75\u00b0 por segundo. O \u00faltimo ensaio de 8 de novembro durou 150&nbsp;segundos: 28&nbsp;metros de condu\u00e7\u00e3o com picos at\u00e9 0,57&nbsp;m\/s, dois saltos da balan\u00e7a e nenhuma queda. Na primeira aterragem, o corpo inclinou-se por um instante at\u00e9 +7\u00b0, e o rob\u00f4 manteve-se de p\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nem todos os saltos correram t\u00e3o bem. Mais cedo, nesse mesmo dia, ao aterrar depois de saltar de uma pequena rampa, o rob\u00f4 inclinou-se 9\u00b0 para a frente. Para recuperar o equil\u00edbrio, arrancou a cerca de um metro por segundo e foi direito \u00e0 cama. Para o rob\u00f4 se inclinar para tr\u00e1s e travar, as rodas t\u00eam primeiro de passar \u00e0 frente do corpo, e o comando de pot\u00eancia j\u00e1 estava no seu limite de 85&nbsp;%: \u00e0quela velocidade, n\u00e3o sobrava nada para as levar at\u00e9 l\u00e1. Entretanto, o limite foi aumentado para 100&nbsp;%, o que ainda n\u00e3o experiment\u00e1mos no ch\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que o impede de se magoar<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S\u00f3 arranca de prop\u00f3sito.<\/strong> Um toque num bot\u00e3o arma-o com tr\u00eas bipes, e ativa-se depois de a inclina\u00e7\u00e3o se manter a menos de 5\u00b0 da vertical durante 0,2&nbsp;s.<\/li>\n\n\n\n<li><strong>Desiste aos 25\u00b0.<\/strong> Para l\u00e1 dessa inclina\u00e7\u00e3o j\u00e1 n\u00e3o consegue recuperar, por isso os motores desligam-se em vez de porem as rodas a girar contra o ch\u00e3o.<\/li>\n\n\n\n<li><strong>Um watchdog pr\u00f3prio.<\/strong> Um temporizador de hardware separado corta a linha de ativa\u00e7\u00e3o (enable) dos drivers se n\u00e3o chegar nenhuma amostra do sensor durante 10&nbsp;ms. Um barramento I\u00b2C bloqueado pode prender a tarefa de controlo durante cerca de um segundo, e um rob\u00f4 a andar \u00e0s cegas durante um segundo \u00e9 um rob\u00f4 contra a parede.<\/li>\n\n\n\n<li><strong>Verifica\u00e7\u00f5es da bateria e do sensor.<\/strong> Desliga os motores quando a bateria est\u00e1 fraca e quando o sensor falha. A perda da liga\u00e7\u00e3o Wi-Fi s\u00f3 interrompe a condu\u00e7\u00e3o: o rob\u00f4 imobiliza-se e continua a equilibrar-se.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Veja a montagem completa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O v\u00eddeo conta a mesma hist\u00f3ria em oito minutos e meio, com os registos desenhados por cima das imagens. O leitor s\u00f3 se liga ao YouTube quando carrega nele.<\/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=pt-PT\"\n\t\t\t\t\tdata-title=\"Constru\u00ed um rob\u00f4 autoequilibrado: tr\u00eas malhas de controlo\">\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\tReproduzir o v\u00eddeo: Constru\u00ed um rob\u00f4 autoequilibrado: tr\u00eas malhas de controlo\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\/pt-pt\/videos\/self-balancing-robot\/\">Constru\u00ed um rob\u00f4 autoequilibrado: tr\u00eas malhas de controlo<\/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\tVer no 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\tAo premir o bot\u00e3o de reprodu\u00e7\u00e3o, o v\u00eddeo \u00e9 carregado a partir do YouTube.\t\t\t\t\t<a class=\"sws-video-player__notice-link\" href=\"https:\/\/build-mode-ak.com\/pt-pt\/privacy-policy\/\">Pol\u00edtica de privacidade<\/a>\n\t\t\t<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">O que vem a seguir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dez dias, tr\u00eas malhas, um rob\u00f4 que se mant\u00e9m de p\u00e9. A cascata PID funciona, mas \u00e9 uma pilha de pe\u00e7as afinadas \u00e0 m\u00e3o, e cada pe\u00e7a foi acrescentada para corrigir o que a anterior n\u00e3o conseguia fazer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A seguir, queremos substituir as tr\u00eas malhas por um \u00fanico controlador LQR, que calcula os seus ganhos a partir de um modelo do rob\u00f4, em vez de ser uma pessoa a afin\u00e1-los um a um. Depois disso, queremos experimentar uma pequena rede neuronal a correr no pr\u00f3prio ESP32. O rob\u00f4 j\u00e1 guarda registos dos seus ensaios, em parte para que essa rede tenha com que aprender. Nenhum dos dois existe ainda. Quando existirem, v\u00e3o enfrentar os mesmos empurr\u00f5es que o PID enfrentou aqui, e vamos publicar os n\u00fameros.<\/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=\"O rob\u00f4 de p\u00e9 num ch\u00e3o de madeira ao lado de uma roseira cor-de-rosa num vaso cor-de-rosa vivo, com o ecr\u00e3 aceso e LEDs verdes a brilhar por baixo dos motores.\" 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 experi\u00eancias.<\/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>Dez dias, um rob\u00f4, tr\u00eas malhas de controlo. Como o nosso rob\u00f4 de equil\u00edbrio com ESP32 e motores com escovas aprendeu a manter-se de p\u00e9, a voltar depois de um empurr\u00e3o, a ficar no seu lugar e a andar comandado por Wi-Fi, com os n\u00fameros dos seus registos e o firmware que o p\u00f4s a funcionar.<\/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":[6],"tags":[74],"topic":[62,81,87,92],"class_list":["post-794","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sem-categoria","tag-esp32-pt","topic-esp32-pt","topic-impressao-3d","topic-motores-pt","topic-sensores-pt"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode<\/title>\n<meta name=\"description\" content=\"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.\" \/>\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\/pt-pt\/esp32-self-balancing-robot\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode\" \/>\n<meta property=\"og:description\" content=\"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/build-mode-ak.com\/pt-pt\/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:03:00+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=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"q_admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/\"},\"author\":{\"name\":\"q_admin\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\"},\"headline\":\"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo\",\"datePublished\":\"2026-11-10T10:35:04+00:00\",\"dateModified\":\"2026-11-11T16:03:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/\"},\"wordCount\":3416,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/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\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/\",\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/\",\"name\":\"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/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:03:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\"},\"description\":\"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/esp32-self-balancing-robot\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/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\\\/pt-pt\\\/esp32-self-balancing-robot\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/#website\",\"url\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/\",\"name\":\"Build Mode\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/build-mode-ak.com\\\/pt-pt\\\/#\\\/schema\\\/person\\\/776a2342163ad07c23ce7dac33d9cc8b\",\"name\":\"q_admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@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\\\/pt-pt\\\/author\\\/q_admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode","description":"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.","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\/pt-pt\/esp32-self-balancing-robot\/","og_locale":"pt_PT","og_type":"article","og_title":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode","og_description":"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.","og_url":"https:\/\/build-mode-ak.com\/pt-pt\/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:03:00+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":{"Escrito por":"q_admin","Tempo estimado de leitura":"19 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/#article","isPartOf":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/"},"author":{"name":"q_admin","@id":"https:\/\/build-mode-ak.com\/pt-pt\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b"},"headline":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo","datePublished":"2026-11-10T10:35:04+00:00","dateModified":"2026-11-11T16:03:00+00:00","mainEntityOfPage":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/"},"wordCount":3416,"commentCount":0,"image":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/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":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/","url":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/","name":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo - Build Mode","isPartOf":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/#primaryimage"},"image":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/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:03:00+00:00","author":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b"},"description":"Rob\u00f4 autoequilibrado com ESP32 e motores com escovas: filtro complementar, tr\u00eas malhas PID em cascata, excertos do firmware e os n\u00fameros dos registos.","breadcrumb":{"@id":"https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/build-mode-ak.com\/pt-pt\/esp32-self-balancing-robot\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/build-mode-ak.com\/pt-pt\/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\/pt-pt\/esp32-self-balancing-robot\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/build-mode-ak.com\/pt-pt\/"},{"@type":"ListItem","position":2,"name":"Rob\u00f4 autoequilibrado com ESP32: tr\u00eas malhas de controlo"}]},{"@type":"WebSite","@id":"https:\/\/build-mode-ak.com\/pt-pt\/#website","url":"https:\/\/build-mode-ak.com\/pt-pt\/","name":"Build Mode","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/build-mode-ak.com\/pt-pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Person","@id":"https:\/\/build-mode-ak.com\/pt-pt\/#\/schema\/person\/776a2342163ad07c23ce7dac33d9cc8b","name":"q_admin","image":{"@type":"ImageObject","inLanguage":"pt-PT","@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\/pt-pt\/author\/q_admin\/"}]}},"_links":{"self":[{"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/posts\/794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=794"}],"version-history":[{"count":1,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/posts\/794\/revisions"}],"predecessor-version":[{"id":796,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/posts\/794\/revisions\/796"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/media\/734"}],"wp:attachment":[{"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=794"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/build-mode-ak.com\/pt-pt\/wp-json\/wp\/v2\/topic?post=794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}