Autor: Luiz Nobre

  • Assistentes de IA de Bancada — Movimento: cabeça robótica do assistente com servos e driver PCA9685 via I2C

    Assistentes de IA de Bancada — Movimento: cabeça robótica do assistente com servos e driver PCA9685 via I2C

    (a) Conceito e Arquitetura

    Um assistente de bancada que apenas fala e escreve na tela é um terminal com voz. O movimento é o que transforma o conjunto em presença: o usuário entende “estou te ouvindo”, “não entendi” ou “preciso da sua atenção” antes de ler qualquer palavra. Este post cobre a camada de atuação desse assistente — o pescoço pan/tilt e, opcionalmente, braços, orelhas e antenas — usando servos de modelismo comandados por um driver PCA9685 via barramento I2C.

    A arquitetura tem três camadas bem separadas: percepção (microfone I2S e câmera — assunto do próximo post), decisão (ESP32-S3 ou um host na rede) e atuação (PWM). O ponto central é que o microcontrolador não gera os 50 Hz de cada servo em software. Ele envia comandos de 12 bits para o PCA9685, que mantém 16 canais PWM estáveis de forma autônoma enquanto o firmware cuida de áudio, rede e inferência. Um único barramento de dois fios (SDA/SCL) endereça até 62 dessas placas (0x40 a 0x7F, selecionados pelos jumpers A0–A5), o que permite escalar de um pescoço de dois eixos para um torso completo sem consumir mais GPIOs.

    Fluxo elétrico: uma fonte de 5–6 V alimenta exclusivamente a trilha V+ do driver; a lógica da placa (VCC) fica nos 3,3 V do MCU; o terra é único e comum a tudo. Cada canal entrega o pulso que o servo espera — em geral 500 a 2500 µs a 50 Hz, com o curso mecânico real entre 1 ms e 2 ms para 0°–180°, variando por modelo. Comando por I2C leva cerca de 1 ms para 16 canais a 400 kHz, então atualizar 60 vezes por segundo o pescoço inteiro é perfeitamente viável.

    (b) BOM — Lista de Materiais

    Os itens marcados como “crítico” são os que aparecem em 90% dos projetos que falham por alimentação.

    Item Qtd Especificação Observação
    MCU 1 ESP32-S3 DevKit (N16R8) ou ESP32 clássico 3,3 V de lógica; I2C em 400 kHz
    Driver PWM 1 Módulo PCA9685, 16 canais, 12 bits Endereço padrão 0x40; VCC 3,3 V
    Servo pan 1 MG996R (metal) ou DS3218 (20 kg·cm) Maior curso e torque no eixo horizontal
    Servo tilt 1 MG90S ou SG90 (metal/plástico) Carga menor, mais rápido
    Servos extras 0–4 SG90 para orelhas, braços, antenas Movimento secundário, baixo torque
    Fonte 1 Chaveada 5 V / 10 A (ou 6 V / 8 A) CRÍTICO: não use USB do PC
    Capacitor 1 Eletrolítico 1000 µF / 16 V + 100 nF cerâmico CRÍTICO: junto ao V+ do driver
    Fios — AWG 20–22 para V+ e GND; AWG 24–26 para sinal CRÍTICO: fio fino causa queda de tensão
    Barramento de terra 1 Borne ou placa de distribuição Ponto estrela único
    Mecânica — Suporte 3D, rolamentos 608ZZ no eixo pan Evita folga e esforço do servo
    Proteção 1 Fusível rearmável 5 A na linha V+ Trava mecânica pode virar curto

    (c) Wiring & Esquemático

    O PCA9685 tem quatro grupos de pinos: alimentação lógica, barramento I2C, saídas PWM e o pino OE (output enable, ativo em nível baixo). A pinagem abaixo é a que funciona sem surpresas no ESP32-S3; no ESP32 clássico, os pinos I2C padrão são GPIO21 (SDA) e GPIO22 (SCL).

    Pino (PCA9685) Destino Função / Observação
    VCC 3V3 do ESP32-S3 Lógica da placa. Nunca 5 V: o I2C subiria para 5 V e queimaria o GPIO
    GND Terra comum (ponto estrela) Obrigatório unir GND do MCU e GND da fonte de servos
    SDA GPIO8 (S3) / GPIO21 (ESP32) Pull-up 4,7 kΩ para 3V3 se o módulo não tiver
    SCL GPIO9 (S3) / GPIO22 (ESP32) Idem; mantenha o par junto com um fio de GND
    OE GND (ou GPIO livre) Ativo baixo: ligado a GND habilita as saídas; via GPIO permite desligar todos os servos
    V+ +5 V da fonte dedicada Trilha de potência. Não compartilhe com o USB nem com o VCC
    Canal 0–15 Sinal do servo (fio laranja/branco) Cada servo vai à sua própria fonte: SIG no canal, +V e GND no borne da fonte

    Alimentação separada dos servos. O rail V+ deve vir da fonte chaveada, não do regulador da placa. O servo MG996R pode puxar 2,5 A no stall e o DS3218 passa de 3 A; quatro servos mal comportados somam mais de 10 A por alguns milissegundos. O regulador do DevKit entrega, no melhor caso, 1 A e o USB do PC, 500 mA.

    Pico de corrente. Coloque o eletrolítico de 1000 µF o mais perto possível dos bornes V+ e GND do driver, e um cerâmico de 100 nF em paralelo para ruído de alta frequência. O capacitor não “aumenta” a fonte: ele absorve o transiente de partida e impede que a tensão caia abaixo do limiar do brownout.

    Terra comum. Um único ponto de terra (estrela), com o fio de potência e o de lógica convergindo nele. Ligar o GND do servo em cascata por outro servo cria diferença de potencial e jitter.

    Cuidados mecânicos. Antes de energizar, mova o pescoço à mão em todo o curso e confirme que não há batente mecânico dentro da faixa que o software vai usar. Travar um servo contra o próprio limite é a forma mais rápida de queimar o driver.

    (d) Código — varredura, easing e limites de curso

    A biblioteca oficial da Adafruit traz setPWM(canal, 0, ticks), em que ticks é o valor de 12 bits (0–4095) dentro do período de 50 Hz. A conversão de microssegundos para ticks é us × 4096 / 20000.

    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
    
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
    
    const uint16_t TICKS   = 4096;    // resolucao de 12 bits
    const uint16_t PERIODO = 20000;   // 20 ms @ 50 Hz
    const uint16_t US_MIN  = 500;     // pulso minimo do servo
    const uint16_t US_MAX  = 2500;    // pulso maximo do servo
    
    uint16_t usParaTicks(uint16_t us) {
      return (uint32_t)us * TICKS / PERIODO;
    }
    
    uint16_t anguloParaUs(float graus, float gMin, float gMax) {
      graus = constrain(graus, gMin, gMax);
      return US_MIN + (US_MAX - US_MIN) * (graus - gMin) / (gMax - gMin);
    }
    
    void setup() {
      Wire.begin(8, 9);                        // SDA, SCL no ESP32-S3
      Wire.setClock(400000);                   // 400 kHz
      pwm.begin();
      pwm.setOscillatorFrequency(27000000.0);  // calibre com a sua placa
      pwm.setPWMFreq(50);                      // 50 Hz para servo analogico
    }
    
    // interpola com easing cubico respeitando os limites mecanicos
    void moveEixo(uint8_t ch, float &atual, float destino,
                  int16_t gMin, int16_t gMax,
                  uint16_t passoMs, uint16_t duracaoMs) {
      destino = constrain(destino, (float)gMin, (float)gMax);
      uint16_t passos = max(1, (int)(duracaoMs / passoMs));
      float inicio = atual;
    
      for (uint16_t i = 1; i <= passos; i++) {
        float t = (float)i / passos;
        float e = (t < 0.5) ? 4*t*t*t : 1 - pow(-2*t + 2, 3) / 2;
        atual = inicio + (destino - inicio) * e;
        pwm.setPWM(ch, 0, usParaTicks(anguloParaUs(atual, gMin, gMax)));
        delay(passoMs);
      }
    }
    
    void loop() {
      static float pan = 90, tilt = 90;
    
      moveEixo(0, pan,  130, 20, 160, 15, 700);   // olha para a direita
      moveEixo(1, tilt, 110, 35, 145, 15, 500);
      delay(400);
      moveEixo(0, pan,   50, 20, 160, 15, 700);   // varredura de bancada
      moveEixo(1, tilt,  80, 35, 145, 15, 500);
      delay(400);
      moveEixo(0, pan,   90, 20, 160, 15, 600);   // retorna ao centro
      moveEixo(1, tilt,  90, 35, 145, 15, 600);
      delay(1500);
    }

    Três decisões importam mais que o resto. Limites de curso: os parâmetros gMin/gMax (20°–160° no pan, 35°–145° no tilt) impedem que o firmware mande o servo além do batente — o constrain é a última linha de defesa, não a primeira. Suavização: interpolar em passos de 15 ms com curva easeInOutCubic elimina o tranco que aparece quando se escreve o ângulo final direto; é isso que faz o movimento parecer “intencional” em vez de mecânico. Não bloqueante: o delay() acima serve para ilustrar; em produção, troque por agendamento com micros() e mova os eixos em paralelo, para que o assistente continue respondendo enquanto se move.

    (e) Troubleshooting

    Sintoma Causa provável Correção
    ESP32 reinicia quando o servo arranca Brownout: rail compartilhado com o MCU e queda de tensão Fonte separada para V+, terra comum, 1000 µF no driver, fio AWG 20
    Reinício persiste só com um servo Servo em stall puxando pico alto Alivie a carga mecânica ou troque por servo de maior torque
    Jitter / tremor contínuo Rampa de I2C longa, falta de pull-up, servo barato Cabo I2C curto (<30 cm) e trançado, pull-up 4,7 kΩ, cerâmico 100 nF
    Servo esquenta parado Pulso fora do range do modelo Ajuste US_MIN/US_MAX e calibre o oscilador do PCA9685
    Torque insuficiente / engasga Queda de tensão no fio ou servo subdimensionado AWG 20, fonte 5 A+, 6 V se o servo suportar, rolamento no eixo
    Endereço I2C não encontrado Jumpers A0–A5 ou VCC errado Rode um scanner I2C e confira o endereço esperado (0x40)

    O reset por brownout é o sintoma mais comum e o mais mal diagnosticado. Desabilitar o detector (WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0)) só esconde o problema: a tensão ainda está caindo e o comportamento dos servos vai ficar errático. Corrija a alimentação. Já o jitter de alguns graus normalmente não vem do servo, e sim do barramento: I2C e PWM convivem mal quando o terra é compartilhado em série. Por fim, torque insuficiente quase nunca é culpa do servo antes de ser culpa do fio de 1 mm² que faz 0,4 V de queda em 3 A.

    (f) Aplicações reais — o que o movimento comunica

    Movimento é linguagem. Um assistente que inclina a cabeça quando está processando, faz um “não” curto ao rejeitar um comando e varre a bancada quando está em idle comunica estado sem gastar uma palavra. Na prática, os padrões que funcionam melhor são poucos: idle scan (varredura lenta de 30° a 60° com pausas), gaze (pan/tilt apontando para a pessoa detectada pela câmera), acknowledge (inclinação de 5° e retorno), negação (dois movimentos curtos no eixo pan) e alerta (subida rápida do tilt, seguida de congelamento).

    Além da interação, a mesma arquitetura serve para funções utilitárias: gimbal do sensor de visão (fechando o loop com o post da câmera), posicionamento de uma câmera de inspeção em bancada de eletrônica, animatrônica e vitrines, telepresença com espelhamento de gestos e dispositivos de acessibilidade em que a cabeça robótica sinaliza para pessoas com baixa visão. Em todos os casos, o gargalo não é o servo: é a fonte e o terra.

  • Miles Davis: O Homem Que Inventou o Cool (e Depois o Destruiu)

    Miles Davis: O Homem Que Inventou o Cool (e Depois o Destruiu)

    Poucos artistas na história da música tiveram a coragem de matar o próprio estilo três vezes. Miles Davis fez isso — e ainda teve tempo de criar mais dois gêneros no processo. Nascido em 26 de maio de 1926 em Alton, Illinois, Miles Dewey Davis III não foi um músico que evoluiu gradualmente. Ele deu saltos. Rupturas. Rompimentos. E em cada virada, deixou para trás legiões de fãs perplexos e uma nova geração de músicos querendo imitá-lo. O trompete de Miles não era o mais técnico — Dizzy Gillespie tocava mais notas, Louis Armstrong tinha mais potência. Mas ninguém, absolutamente ninguém, extraía mais significado de cada nota.

    Birth of the Cool: O Jazz de Terno e Gravata

    No final dos anos 1940, o jazz era dominado pelo bebop frenético de Charlie Parker e Dizzy Gillespie — rápido, virtuosístico, às vezes agressivo. Miles, que havia tocado com Parker aos 19 anos, decidiu ir na direção oposta. Reuniu um noneto inusitado — com trompa francesa, tuba, sax barítono — e arranjos sofisticados de Gil Evans e Gerry Mulligan. O resultado foi o Birth of the Cool: sessões gravadas entre 1949 e 1950 que praticamente inventaram o cool jazz.

    O cool jazz não era só uma estética sonora — era uma atitude. Enquanto o bebop suava, o cool jazz acendia um cigarro e olhava pela janela. O fraseado de Miles era econômico, quase minimalista. ‘Eu toco o que está entre as notas’, dizia. A influência se estenderia por décadas, do jazz da Costa Oeste de Chet Baker e Gerry Mulligan ao trip-hop dos anos 1990 e até à música ambiente contemporânea.

    Kind of Blue: A Obra-Prima Absoluta

    Em março e abril de 1959, Miles reuniu um sexteto dos sonhos — John Coltrane no sax tenor, Cannonball Adderley no sax alto, Bill Evans e Wynton Kelly no piano, Paul Chambers no baixo e Jimmy Cobb na bateria — no estúdio da Columbia Records em Nova York. Em duas sessões, gravaram Kind of Blue. O conceito era radical: em vez de improvisar sobre progressões de acordes complexas (como todo mundo fazia), os músicos improvisariam sobre escalas modais. Miles entregou esboços, não partituras. ‘Toquem isso’, ele dizia, e o que saiu foi o álbum de jazz mais vendido da história — mais de 5 milhões de cópias.

    ‘So What’ abre o disco com uma simplicidade desconcertante: duas notas de baixo, um acorde suspenso. ‘Blue in Green’ é uma pintura em som — provavelmente coescrita por Bill Evans, embora o crédito seja de Miles. ‘Flamenco Sketches’ são cinco takes de pura meditação modal. Kind of Blue é o tipo de álbum que não envelhece porque nunca foi ‘jovem’ — nasceu atemporal.

    Bitches Brew: O Dia em Que o Jazz Eletrificou

    Depois de definir o cool e levar o modal ao nirvana, Miles fez o impensável: plugou o trompete em pedais de efeito, contratou três tecladistas elétricos, dois baixistas, dois bateristas e criou Bitches Brew (1970). O álbum duplo fundiu jazz com rock psicodélico, funk e música africana. Foi chamado de heresia pelos puristas — um crítico escreveu que Miles havia ‘traído o jazz’. Foi, na verdade, o nascimento do jazz fusion.

    As sessões de gravação foram caóticas: Miles dava instruções mínimas e deixava os músicos improvisarem por horas. O produtor Teo Macero depois editava as fitas como um arquiteto sonoro — cortando, colando, sobrepondo. O resultado é hipnótico, denso, às vezes assustador. Bitches Brew vendeu meio milhão de cópias na época, ganhou disco de ouro, e abriu caminho para Weather Report, Return to Forever e Mahavishnu Orchestra. Em 2025, foi incluído no National Recording Registry da Biblioteca do Congresso americano.

    Miles Davis nunca olhou para trás. Até sua morte em 28 de setembro de 1991, continuou experimentando — do jazz elétrico psicodélico de On the Corner ao pop sintetizado de Tutu. Morreu fazendo o que sempre fez: recusando-se a ser o que os outros esperavam que ele fosse. ‘Não tenha medo dos erros’, dizia. ‘Não existem erros.’ Existem apenas descobertas que ninguém mais teve coragem de fazer.

    Miles tambem foi um catalisador de carreiras genial — talvez o maior da historia do jazz. A lista de musicos que passaram por suas bandas e depois se tornaram lendas e inacreditavel: John Coltrane, Herbie Hancock, Wayne Shorter, Ron Carter, Tony Williams, Chick Corea, Keith Jarrett, John McLaughlin, Joe Zawinul. Miles nao apenas tocava com genios: ele os identificava ainda jovens, os colocava sob pressao maxima e os transformava em versoes melhores de si mesmos. ‘Eu pago para eles ensaiarem no palco’, dizia. Quando um jovem musico hesitava, Miles rosnava: ‘Toque como se voce soubesse o que esta fazendo.’ Funcionava.

    Seu legado nao esta apenas nos sons que criou, mas nos musicos que formou e na atitude que encarnou: a recusa absoluta de se repetir. Em 1985, quando um jornalista perguntou por que ele nao tocava mais as musicas de Kind of Blue, Miles respondeu com seu caracteristico desprezo: ‘Porque eu ja toquei. Quer ouvir, compra o disco.’

  • ‘Quem Vem Lá Sou Eu’

    ‘Quem Vem Lá Sou Eu’

    Na capoeira, a entrada na roda é um momento de grande significado. O capoeirista não entra de qualquer jeito: ele se apresenta, se anuncia e, muitas vezes, se desafia. A cantiga “Quem Vem Lá Sou Eu” captura esse instante, funcionando como um canto de chegada e de afirmação, que marca a presença de quem chega para jogar.

    A chegada na roda

    A roda de capoeira tem seus rituais. O jogador espera o momento certo, aproxima-se do pé do berimbau e, com o corpo, pede licença para entrar. A cantiga acompanha esse ritual, e “Quem Vem Lá Sou Eu” é uma das que melhor expressam o sentido da chegada: uma declaração de presença, de identidade e de prontidão.

    O verso “quem vem lá sou eu” é, ao mesmo tempo, um anúncio e um desafio. Quem canta se apresenta à roda, mas também convida ao confronto, deixando claro que chegou para jogar. É a voz do capoeirista que não se esconde, que assume seu lugar e se coloca à disposição do jogo.

    Presença e afirmação

    A cantiga de chegada tem um forte componente de afirmação. Para o capoeirista, anunciar-se na roda é reivindicar seu espaço e sua história. É dizer: “eu existo, eu faço parte, e estou aqui para jogar”. Essa afirmação de identidade é um dos pilares da capoeira, arte nascida da resistência de um povo que precisou afirmar-se para sobreviver.

    Na roda, essa presença se manifesta também no corpo. A ginga, o olhar e a postura comunicam tanto quanto as palavras, e a cantiga vem reforçar essa linguagem. O capoeirista que entra cantando sua chegada entra com outra força, mais inteiro, mais dono de si.

    Estrutura e energia

    Como a maioria dos corridos, “Quem Vem Lá Sou Eu” tem estrutura de pergunta e resposta. O cantador puxa e o coro responde, num diálogo que cresce em energia. O ritmo acompanha o toque do berimbau, e a cantiga costuma ser puxada em momentos de movimentação da roda, quando jogadores se preparam para entrar.

    A repetição do verso cria um efeito de afirmação coletiva. Quando o coro inteiro responde, a cantiga deixa de ser individual e se torna um grito da comunidade, celebrando cada chegada e cada presença. É a capoeira em sua dimensão coletiva, em que o individual e o grupal se encontram.

    O corpo que fala antes da voz

    Na tradição da capoeira, a entrada na roda é precedida por um diálogo silencioso com o berimbau. O jogador aguarda o sinal do instrumento, abaixa-se diante do pé do berimbau e só então entra no jogo. Esse gesto de reverência marca o respeito à bateria e ao mestre, e a cantiga de chegada é a tradução sonora desse ritual de passagem.

    O anúncio, portanto, não é vaidade: é reconhecimento de uma ordem. Ao cantar “quem vem lá sou eu”, o capoeirista se insere conscientemente na roda, aceitando suas regras e sua hierarquia. É a afirmação de quem chega para somar, e não para se impor de qualquer maneira.

    Variações e usos da cantiga

    Como acontece com muitas cantigas de capoeira, “Quem Vem Lá Sou Eu” admite variações de letra e de melodia conforme a região e o grupo. Alguns mestres acrescentam versos, outros ajustam o andamento ao toque do berimbau. Essa flexibilidade é parte da natureza viva do cancioneiro da capoeira, que se renova a cada roda sem perder sua essência.

    A cantiga também é usada em momentos distintos da roda. Além da entrada de jogadores, ela pode aparecer em jogos de saudação, em homenagens a mestres ou em celebrações. Em todos esses usos, mantém-se o sentido central: anunciar a presença e afirmar o pertencimento de quem chega.

    Para os iniciantes, acompanhar o coro de “Quem Vem Lá Sou Eu” costuma ser uma das primeiras experiências de integração na roda. A simplicidade da letra permite que todos participem, criando um sentimento de comunidade que marca a iniciação de muitos capoeiristas.

    A tradição do anúncio

    O hábito de anunciar a chegada é antigo na cultura popular brasileira. Nas feiras, nos terreiros e nas festas, quem chegava se anunciava, e a comunidade respondia. A capoeira preservou essa tradição, transformando-a em cantiga, e “Quem Vem Lá Sou Eu” é uma das expressões mais vivas desse costume.

    Quando essa cantiga ecoa na roda, todos se reconhecem nela. Porque, em última instância, todos nós, ao entrarmos na roda da vida, anunciamos a nossa chegada. E a capoeira, com sua música, nos ensina a fazê-lo com presença, coragem e alegria.

    Assim como outras cantigas de chegada, esta carrega a sabedoria da tradição oral, transmitida de mestre para aluno sem registros escritos. Cada roda em que ela é cantada renova esse elo entre passado e presente, lembrando que a capoeira é uma arte de encontro. É, enfim, um convite a que cada um ocupe seu lugar com orgulho, respeito e alegria, como manda a tradição.

  • A Cidade Que Foi Apagada do Céu

    A Cidade Que Foi Apagada do Céu

    A Cidade Que Foi Apagada do Céu

    Antes do amanhecer, dois visitantes tomaram Lot pelos braços e o tiraram da cidade. ‘Foge por tua vida’, disseram. ‘Não olhes para trás.’ Lot hesitou; os visitantes o arrastaram para fora dos muros; e então o céu, que até aquele momento havia sido apenas céu, tornou-se outra coisa. O relato de Gênesis 19 diz apenas: ‘Então o Senhor fez chover do céu enxofre e fogo sobre Sodoma e Gomorra’. A frase é curta. A destruição, segundo o texto, foi total: as cidades da planície, a vegetação, os habitantes — ‘e a fumaça subia da terra como a fumaça de uma fornalha’.

    Há um detalhe na narrativa que a torna diferente de qualquer outra destruição bíblica: a seletividade. Os visitantes sabiam o que viria; avisaram; delimitaram a zona de fuga; a mulher de Lot, que olhou para trás, foi transformada em estátua de sal. Não foi um castigo genérico: foi uma operação com alvo, com protocolo e com testemunhas. Os antigos a chamaram de juízo divino. Nós, que vivemos depois de Tunguska e de Cheliabinsk, temos outra palavra para fogo que cai do céu: impacto.

    O que sabemos

    Sabemos o que a arqueologia encontrou — e o que ela não consegue calar. Nas margens do Mar Morto, onde a tradição localiza as cidades da planície, existe uma montanha de sal com formações que os antigos chamavam de ‘a mulher de Lot’. A tradição da mulher de Lot é antiga o suficiente para ser registrada por autores clássicos e peregrinos. Mas é o sítio de Tall el-Hammam, no vale do Jordão, que reacendeu o debate: uma cidade da Idade do Bronze destruída por volta de 1650 antes da era comum, com evidências de temperaturas acima de dois mil graus — tijolos vitrificados, cerâmica derretida, quartzo chocado, anomalias de platina e irídio.

    Sabemos, também, o que a ciência propôs. Em 2021, uma equipe publicou na revista Scientific Reports a hipótese de que Tall el-Hammam foi devastada por uma explosão aérea cósmica — um meteoro que detonou no ar, como Tunguska, incinerando a cidade e deixando-a abandonada por séculos. O estudo, assinado por geólogos e arqueólogos, cita explicitamente o relato bíblico como possível memória do evento: enxofre e fogo do céu, fumaça como de fornalha, sal. A hipótese é contestada — a identificação de Tall el-Hammam com Sodoma é disputada, e a datação, debatida —, mas o fenômeno físico que ela descreve não é: céus que caem existem, e o monitoramento de objetos próximos da Terra existe porque sabemos disso.

    E sabemos, por fim, o que o texto insiste em marcar: a destruição foi atribuída a visitantes enviados. Os dois anjos que jantaram com Abraão, intercederam com ele sobre o número de justos — se houver cinquenta? quarenta? dez? — e desceram para inspecionar. A destruição não veio de dentro; veio do alto, por intermédio de mensageiros. É a estrutura de um relatório: quem veio, o que viu, o que fez.

    O que não sabemos

    Não sabemos se a cidade destruída era Sodoma. A arqueologia bíblica é um campo minado: cada sítio tem seus advogados e seus detratores, e a camada de destruição de Tall el-Hammam é real, mas seu nome antigo é desconhecido. Não sabemos, tampouco, o que exatamente aconteceu com a mulher de Lot. O sal do Mar Morto forma pilares naturais; a tradição escolheu um deles e lhe deu um nome. Mas o texto é específico: olhou para trás e tornou-se uma coluna de sal. Uma metáfora de nostalgia? Um fenômeno real — fulminação por onda de calor, vitrificação, cristalização? O relato não explica; apenas registra.

    Não sabemos, também, por que a destruição foi seletiva. Zoar, a cidade de refúgio, permaneceu; a planície inteira ardeu. Visões de um impacto aéreo explicam a seletividade — o raio de destruição, a zona de fuga, a onda de choque — melhor do que qualquer outra hipótese. E explicam, sobretudo, a instrução: não olhes para trás. Quem já viu o clarão de uma detonação sabe por que se olha — e sabe por que não se deve.

    O que está em jogo

    O que está em jogo é a leitura do desastre. Se Sodoma e Gomorra foram julgamento divino, a história é sobre moral: o que se fez, o que se pagou. Se foram um evento cósmico, a história é sobre física: o que caiu, o que sobrou. Mas há uma terceira leitura, a mais inquietante: a de que o texto registra as duas coisas ao mesmo tempo — um evento real, lido por testemunhas como linguagem divina. Os visitantes que avisaram Lot poderiam ser anjos; poderiam ser homens; poderiam ser o que quer que seja que sabe, antes, o que vai cair do céu. O relato não decide. E é exatamente essa indecisão que o torna eterno.

    A fumaça subiu da planície como a fumaça de uma fornalha, e Abraão, de longe, viu. A mulher de Lot ficou para trás, na fronteira entre a cidade e o deserto, entre o que foi salvo e o que foi apagado — e a tradição a manteve ali, de sal, durante três mil anos, como um aviso. Nós, que hoje vigiamos o céu com radares e telescópios, sabemos que o fogo que cai existe. A pergunta que resta não é se o céu pode apagar uma cidade; é por que os antigos insistiram em dizer que, antes do fogo, vieram visitantes — e por que, em todas as versões, alguém foi avisado para não olhar para trás.

  • Assistentes de IA de Bancada — Parte 2: memória e contexto do assistente — histórico em NVS/littlefs, resumo de contexto enxuto e RAG leve sobre notas locais

    Assistentes de IA de Bancada — Parte 2: memória e contexto do assistente — histórico em NVS/littlefs, resumo de contexto enxuto e RAG leve sobre notas locais

    (a) Conceito e Arquitetura

    Se a Parte 1 desta série ensinou o assistente a falar (rede, TLS, JSON), esta parte ensina a lembrar. Um assistente de bancada sem memória repete perguntas, esquece o nome do projeto e trata cada turno como se fosse o primeiro. Em um microcontrolador, “memória” não é uma coisa só: é uma hierarquia de camadas com custo e velocidade diferentes.

    A camada mais rápida é a RAM, onde vive a janela de contexto ativa — pequena e volátil. Abaixo dela, o NVS (Non-Volatile Storage) guarda pares chave-valor persistentes: configurações, identificadores e um histórico curto de conversa. O littlefs é o sistema de arquivos em flash, ideal para logs maiores, notas e material que alimenta o RAG. E, no topo, a nuvem guarda o modelo. O ESP32 é o bibliotecário que decide o que sobe de camada a cada chamada.

    O conceito central é orçamento de contexto. Cada token enviado custa dinheiro e latência, então o histórico não pode crescer indefinidamente. A técnica padrão é uma janela deslizante (mantém os últimos K turnos) combinada com um resumo enxuto dos turnos antigos. Sobre isso, plugamos uma camada leve de RAG: em vez de um banco vetorial, o MCU busca palavras-chave nas notas locais e injeta os trechos relevantes no prompt.

    Vale quantificar para não trabalhar no escuro. Em modelos com janela de 128 k tokens, um assistente de bancada raramente precisa passar de 1 k a 2 k tokens por chamada: algumas centenas para o system prompt, o resumo em 1–2 frases, os últimos seis a oito turnos e três trechos de nota. Esse teto mantém a latência previsível e evita que uma conversa longa vire uma fatura surpresa. A regra de ouro é: o MCU decide o que entra na janela, nunca o modelo.

    (b) BOM e camadas de armazenamento

    Nenhum hardware novo é necessário em relação à Parte 1 — o mesmo ESP32-S3 (N16R8) com display e áudio serve. O que muda é o uso da flash interna.

    Camada Chave / caminho Uso Observação
    RAM buffer de contexto Janela ativa do prompt Volátil; limitada por heap/PSRAM
    NVS namespace chat, chaves t0..t19 Histórico curto (ring de 20 turnos) Wear leveling interno do NVS
    NVS namespace cfg API keys, modelo, preferências Nunca em texto puro em produto
    littlefs /littlefs/notes/*.txt Notas locais para o RAG Leitura por streaming
    littlefs /littlefs/log/ Logs técnicos e telemetria Rotacionar para não esgotar flash

    (c) Flash e particionamento

    Antes do código, é preciso reservar espaço na flash. Uma tabela de partições típica para esse assistente com 16 MB fica assim (recorte de partitions.csv):

    Nome Tipo Tamanho Função
    nvs data/nvs 0x6000 Config e histórico curto
    otadata data/ota 0x2000 Seleção de slot OTA
    phy_init data/phy 0x1000 Calibração de RF
    factory app/factory 0x400000 Firmware principal
    storage data/littlefs 0x100000 Notas e logs (littlefs)

    Ampliar storage permite mais notas para o RAG; ampliar nvs permite histórico maior. Lembre que a NVS já faz wear leveling internamente, então gravações frequentes de turno são aceitáveis — desde que você evite reescrever a flash a cada token.

    (d) Código — NVS, littlefs, resumo de contexto, RAG e montagem do prompt

    Começamos pelo histórico curto em NVS, usando um anel de 20 chaves para não crescer sem limite.

    #include "nvs_flash.h"
    #include "nvs.h"
    
    #define NS "chat"
    
    // Grava o histórico curto como um blob/string JSON por turno (ring de N itens)
    esp_err_t hist_put(int turno, const char *json_turno) {
        nvs_handle_t h;
        esp_err_t err = nvs_open(NS, NVS_READWRITE, &h);
        if (err != ESP_OK) return err;
        char key[16];
        snprintf(key, sizeof(key), "t%d", turno % 20); // ate 20 turnos
        err = nvs_set_str(h, key, json_turno);
        if (err == ESP_OK) err = nvs_commit(h);
        nvs_close(h);
        return err;
    }
    
    // Le um turno; retorna ESP_ERR_NVS_NOT_FOUND se nao existir
    esp_err_t hist_get(int turno, char *out, size_t *len) {
        nvs_handle_t h;
        esp_err_t err = nvs_open(NS, NVS_READONLY, &h);
        if (err != ESP_OK) return err;
        char key[16];
        snprintf(key, sizeof(key), "t%d", turno % 20);
        err = nvs_get_str(h, key, out, len);
        nvs_close(h);
        return err;
    }

    As notas que alimentam o RAG moram no littlefs, montado a partir da partição storage:

    #include "esp_littlefs.h"
    
    void monta_fs(void) {
        esp_vfs_littlefs_conf_t conf = {};
        conf.base_path = "/littlefs";
        conf.partition_label = "storage";
        conf.format_if_mount_failed = true;
        esp_vfs_littlefs_register(&conf);
    }
    
    // Guarda uma nota de bancada para o RAG local
    void nota_salvar(const char *titulo, const char *texto) {
        char path[96];
        snprintf(path, sizeof(path), "/littlefs/notes/%s.txt", titulo);
        FILE *f = fopen(path, "w");
        if (f) { fputs(texto, f); fclose(f); }
    }

    Para montar o prompt, combinamos três pedaços: um resumo curto dos turnos antigos, os últimos turnos literais e os trechos trazidos pelo RAG. Um único snprintf monta o JSON final sem fragmentar a heap:

    // Monta o prompt com contexto: system + resumo + ultimos K turnos + RAG
    void monta_prompt(char *out, size_t out_sz,
                      const char *system, const char *resumo,
                      const char *rag, const char *user) {
        snprintf(out, out_sz,
            "{\"messages\":["
            "{\"role\":\"system\",\"content\":\"%s%s%s\"},"
            "{\"role\":\"user\",\"content\":\"%s\"}]}",
            system,
            (resumo && resumo[0]) ? " Contexto anterior: " : "",
            (rag && rag[0]) ? rag : "",
            user);
    }

    O RAG local é deliberadamente simples: sem embeddings nem banco vetorial no MCU. A busca por termos nas notas já resolve a maioria dos casos de bancada e cabe em poucos KB de código:

    // RAG leve: busca por termos (sem embeddings) nas notas locais
    int rag_buscar(const char *consulta, char *out, size_t out_sz) {
        const char *dir = "/littlefs/notes";
        DIR *d = opendir(dir);
        if (!d) return 0;
        struct dirent *e;
        int achados = 0;
        out[0] = 0;
        while ((e = readdir(d)) && achados < 3) {
            char path[160];
            snprintf(path, sizeof(path), "%s/%s", dir, e->d_name);
            FILE *f = fopen(path, "r");
            if (!f) continue;
            char buf[512];
            size_t n = fread(buf, 1, sizeof(buf) - 1, f);
            buf[n] = 0;
            fclose(f);
            if (strcasestr(buf, consulta)) {           // match simples
                strncat(out, buf, out_sz - strlen(out) - 1);
                achados++;
            }
        }
        closedir(d);
        return achados;
    }

    O truque para o resumo é periódico: a cada N turnos, o próprio modelo recebe os turnos antigos e devolve 1–2 frases de resumo, que substituem os originais no envio seguinte. Assim o contexto enviado fica estável em tamanho, com custo previsível. Como o resumo também é um texto que vai e volta pela rede, ele deve ser curto por design — duas frases no máximo. Guarde-o na NVS sob a chave resumo para sobreviver a reinicializações, e invalide-o quando o usuário mudar de assunto de forma explícita, evitando que um resumo obsoleto contamine as próximas respostas.

    (e) Troubleshooting

    • NVS cheia: partição pequena demais gera ESP_ERR_NVS_NO_FREE_PAGES. Aumente a partição nvs ou use um anel menor de chaves.
    • Corrupção da NVS: apagões durante a escrita podem deixar a NVS inválida. Trate o erro na inicialização com nvs_flash_erase() + reinit, e limpe a chave com nvs_erase_key.
    • littlefs não monta: verifique o rótulo da partição e use format_if_mount_failed apenas em desenvolvimento; em produção, prefira recuperar os dados.
    • Contexto grande demais: sintomas são latência alta, custo explodindo e estouro de buffer. Trunque por turno, resuma com mais frequência e limite o RAG a um top-3.
    • Corte de UTF-8 no meio: truncar por bytes pode partir um caractere acentuado. Corte sempre em fronteira de caractere e valide antes de enviar.

    (f) Aplicações reais

    Com memória e contexto, o assistente deixa de ser um oráculo sem estado e passa a ser um companheiro de bancada: ele lembra que o projeto atual usa um sensor BMP280, recorda o estilo de código preferido e retoma o assunto de ontem. Em aplicações reais, isso viabiliza um diário técnico por voz que grava notas no littlefs e depois as consulta; um tutor de bancada que busca trechos de datasheets locais via RAG antes de responder; e um painel doméstico que mantém preferências de cada morador. Combinada com o 78/xiaozhi-esp32 como firmware de referência e um proxy ollama/ollama para reduzir custo, a arquitetura vira uma base sólida para assistentes embarcados persistentes.

  • Meia-Lua Presa

    Meia-Lua Presa

    A meia-lua de compasso é um dos golpes mais icônicos da capoeira, conhecido por sua potência e pela beleza de sua rotação. Mas poucos conhecem uma de suas variações mais refinadas: a meia-lua presa, uma versão de controle que exige ainda mais técnica e precisão. Entender essa variação é aprofundar-se na sofisticação do jogo de capoeira.

    A meia-lua de compasso

    Antes de falar da versão presa, é preciso compreender a meia-lua de compasso original. Nesse golpe, o capoeirista apoia as mãos no chão, gira o corpo e desfere um chute circular com a perna estendida, usando a rotação para gerar potência. É um movimento amplo e devastador, que combina força e elasticidade.

    A meia-lua de compasso é um golpe de ataque, mas também pode ser usada como transição ou esquiva. Sua versatilidade a tornou um dos movimentos mais ensinados e reconhecidos da capoeira, presente em todas as linhagens e em rodas do mundo inteiro.

    O que é a meia-lua presa

    A meia-lua presa é uma variação em que o chute não é totalmente estendido ou em que o movimento é interrompido e redirecionado de forma controlada. Em vez do giro amplo e solto, o capoeirista mantém o controle do movimento, “prendendo” a perna ou o giro para encaixar o golpe com mais precisão.

    Essa variação é especialmente útil em jogos mais fechados, nos quais o espaço é limitado ou o oponente está muito próximo. A meia-lua presa permite ajustar o alcance e a trajetória do chute, transformando um golpe de área em um golpe cirúrgico, capaz de atingir pontos específicos.

    Controle e precisão

    A principal diferença entre a meia-lua de compasso e a versão presa está no controle. Enquanto a primeira valoriza a potência e a amplitude, a segunda valoriza a precisão e a capacidade de adaptação. O capoeirista que domina a meia-lua presa consegue mudar a direção do golpe no meio do movimento, surpreendendo o oponente.

    Esse controle exige um trabalho intenso de core e de equilíbrio. O praticante precisa sustentar o corpo em rotação enquanto ajusta a perna, o que demanda força abdominal, coordenação e consciência corporal apuradas. É um movimento de alto nível, que revela a maturidade técnica de quem o executa.

    A mecânica do golpe

    Na meia-lua presa, o capoeirista inicia a rotação como faria na meia-lua de compasso, mas interrompe a extensão total da perna no momento certo. Em vez de completar o arco amplo, ele retém a perna, mantendo o joelho flexionado ou controlando a altura do chute. Essa retenção permite redirecionar o golpe, encurtando ou alongando a distância conforme a necessidade do jogo.

    O domínio dessa mecânica depende de uma base sólida de equilíbrio sobre as mãos e o pé de apoio. O corpo precisa permanecer estável durante a rotação, mesmo com a perna sendo recolhida ou ajustada. Por isso, o fortalecimento dos braços, dos ombros e do tronco é pré-requisito para executar o movimento com segurança.

    Erros comuns e como evitá-los

    Como todo movimento de alta exigência técnica, a meia-lua presa apresenta erros comuns, sobretudo entre iniciantes. Um dos mais frequentes é perder o equilíbrio ao recolher a perna, o que costuma acontecer por falta de força no tronco e nos braços. Nesses casos, o capoeirista desaba ou interrompe o giro de forma brusca, comprometendo a fluidez.

    Outro erro recorrente é estender demais o chute, transformando a meia-lua presa numa meia-lua comum. Para evitá-lo, o praticante deve treinar a retenção da perna de forma consciente, marcando pontos de interrupção durante o giro. A repetição orientada ajuda a internalizar o controle e a reconhecer o momento exato de frear o movimento.

    A pressa também é inimiga do aprendizado. Tentar executar a meia-lua presa antes de dominar a versão básica costuma gerar movimentos desajeitados e aumentar o risco de lesão. O caminho seguro é a progressão gradual, com o acompanhamento de um professor, até que o controle do movimento se torne natural.

    Treino e aplicação

    Para aprender a meia-lua presa, o capoeirista deve primeiro dominar a meia-lua de compasso básica. A partir daí, o treino evolui para o controle do movimento: reduzir a amplitude, variar a altura do chute e interromper o giro em diferentes pontos. O trabalho em dupla, com o professor orientando, é essencial para desenvolver a noção de distância e tempo.

    Na roda, a meia-lua presa é uma arma valiosa. Ela permite ao capoeirista manter a pressão sobre o oponente sem se expor, combinando a potência da meia-lua com a malícia do jogo de controle. É um exemplo perfeito de como, na capoeira, a técnica refinada pode superar a força bruta.

    Vale destacar que a meia-lua presa não é um golpe isolado, mas parte de uma família de variações da meia-lua de compasso. Junto com outras adaptações, ela compõe um repertório de controle que os capoeiristas mais experientes utilizam para ditar o ritmo do jogo. Dominar essa família de movimentos é sinal de maturidade e de compreensão profunda da arte.

  • Os Vigilantes Que Desceram no Monte Hermon

    Os Vigilantes Que Desceram no Monte Hermon

    Os Vigilantes Que Desceram no Monte Hermon

    No alto do Monte Hermon, onde a neve resiste ao verão e três países se dissolvem na bruma, um livro que o cânon preferiu esquecer diz que duzentos anjos pousaram. Não vieram anunciar nada: vieram ficar. Juraram, uns aos outros, que não voltariam atrás — e o nome da montanha, segundo os antigos, guardaria para sempre a memória desse juramento. Herem, em hebraico, pode significar tanto consagração quanto maldição. O Monte Hermon carrega os dois sentidos.

    O relato está no Livro de Enoque, o texto apócrifo mais influente que a Bíblia não incluiu. Escrito entre os séculos III e I antes da era comum, encontrado em fragmentos aramaicos entre os Manuscritos do Mar Morto — o que prova que era lido e respeitado no tempo de Jesus —, o livro conta a história que Gênesis 6 resume em quatro versículos enigmáticos: ‘os filhos de Deus viram que as filhas dos homens eram formosas e tomaram para si mulheres’. Enoque conta o resto. E o resto é aterrorizante.

    O que sabemos

    Sabemos, pelo texto, o essencial. Duzentos Vigilantes — anjos que deveriam velar e escolheram descer — dirigiram-se ao Monte Hermon nos dias de Jarede, sob o comando de Semjaza. Tomaram esposas humanas, e dessas uniões nasceram os gigantes, os Nefilim, que devoraram o sustento dos homens e depois os próprios homens. E, mais grave, ensinaram. Azazel ensinou a fabricação de espadas, facas, escudos e couraças — o segredo dos metais; ensinou também as pedras preciosas e as tinturas, e a arte de embelezar as pálpebras: a cosmética como contrabando celeste. Barakel ensinou a astrologia; Kokabel, as constelações; Ezeqeel, o conhecimento das nuvens; Araqiel, os sinais da terra; Shamsiel, os sinais do sol; Sariel, o curso da lua.

    Sabemos, ainda, a punição. Deus envia Uriel a Noé para anunciar o dilúvio; envia Rafael para amarrar Azazel sob as rochas do deserto de Dudael, coberto de escuridão até o grande dia do juízo; envia Gabriel para lançar os gigantes uns contra os outros; e envia Miguel para prender Semjaza e seus companheiros nas depressões da terra, por setenta gerações, até o julgamento final. O dilúvio, nessa leitura, não é apenas um castigo da humanidade: é uma operação de limpeza de algo que contaminou a Terra — um protocolo de contenção de conhecimento.

    E sabemos que a memória disso vazou para o cânon. A carta de Judas, no Novo Testamento, cita Enoque por nome; a segunda carta de Pedro fala dos anjos que não guardaram o seu principado; Gênesis 6 registra os Nefilim. O cânon silenciou o relato completo, mas deixou as cicatrizes — como quem apaga um nome, mas não consegue apagar o que o nome fez.

    O que não sabemos

    Não sabemos por que o relato foi excluído. O Livro de Enoque sobreviveu inteiro apenas na tradição da Igreja Ortodoxa Etíope; o judaísmo e a maior parte do cristianismo o deixaram de fora do cânon. As razões teológicas são conhecidas — o texto era incômodo, atribuía a anjos a origem do conhecimento humano e complicava a narrativa da Queda. Mas a pergunta incômoda permanece: excluiu-se a história porque era falsa, ou porque era verdadeira demais?

    Não sabemos, tampouco, o que fazer com o conteúdo do ensinamento. Metais, cosméticos, astrologia: a lista dos conhecimentos proibidos de Enoque é, precisamente, a lista das bases da civilização. A fundição do bronze, a estética, a leitura dos céus — tudo o que chamamos de progresso aparece no texto como contrabando caído do céu, não como conquista humana. É uma inversão absoluta da narrativa do progresso: não subimos até o conhecimento; o conhecimento desceu até nós.

    O que está em jogo

    O que está em jogo é a origem do saber. Se Enoque está errado, a civilização é uma escalada: o homem inventou, conquistou, construiu. Se Enoque está certo — ou apenas menos errado do que gostaríamos —, então tudo o que construímos carrega uma assinatura que não é nossa: as espadas, os espelhos, os telescópios, as redes, os algoritmos seriam ecos de um ensinamento recebido, e a nossa autonomia intelectual, uma ilusão confortável. E a pergunta que o texto deixa no ar é a mais dura de todas: se os Vigilantes desceram para ensinar, quem desceu para ensinar a nós — e o que nos foi dito, nas entrelinhas, sobre o preço do conhecimento?

    A tradição guardou o nome da montanha como se guarda um local de crime. Duzentos anjos juraram ali, desceram, e o mundo nunca mais foi o mesmo — nem pela técnica que recebeu, nem pelo sangue que ela custou. Vinte séculos depois, continuamos a subir montanhas, a jurar alianças, a ensinar segredos. Resta uma pergunta que nenhum cânon conseguiu responder: se o conhecimento proibido veio do alto, o que estamos fazendo aqui embaixo — e o que mais, vindo do céu, ainda espera, no alto de alguma montanha, o nosso juramento?

  • Assistentes de IA de Bancada — Parte 1: integração das APIs comerciais (OpenAI / Gemini / Claude) direto no microcontrolador via HTTPS

    Assistentes de IA de Bancada — Parte 1: integração das APIs comerciais (OpenAI / Gemini / Claude) direto no microcontrolador via HTTPS

    (a) Conceito e Arquitetura

    Um assistente de IA de bancada feito com ESP32 não roda o modelo: ele é o corpo do assistente, enquanto o cérebro fica atrás de uma API HTTPS. O microcontrolador captura áudio ou texto, monta uma requisição JSON, envia por TLS e renderiza a resposta em um display, fala por um amplificador I2S ou aciona uma GPIO. Esse desenho é o oposto do “LLM local” em hardware próprio — aqui a inferência é remota e o ESP32-S3 atua como orquestrador de rede.

    O fluxo típico de uma rodada é: microfone I2S → (opcional) transcrição por API → LLM (OpenAI, Gemini ou Claude) → (opcional) síntese de voz → amplificador I2S. Texto puro pelo display/botão também é perfeitamente válido e elimina duas chamadas de rede, o que reduz custo e latência.

    Existem três topologias. (1) Direto do MCU para a API comercial: menos peças, menor latência, mas expõe a chave de API no dispositivo — só é aceitável em bancada, nunca em produto em campo. (2) Proxy/gateway local: um serviço em Raspberry Pi ou PC (por exemplo, o endpoint compatível com OpenAI exposto pelo ollama/ollama) guarda a chave, aplica rate limit, cache e logging. (3) Híbrida: comandos de bancada vão para o proxy local e consultas abertas vão para a nuvem. Este artigo cobre a topologia 1 do ponto de vista de TLS e JSON, deixando a topologia 2 como recomendação de produção.

    Requisitos mínimos: TLS 1.2+, heap livre confortável (o handshake TLS sozinho consome dezenas de KB), PSRAM recomendada para buffers de resposta e um relógio confiável — sem hora correta o certificado é rejeitado.

    (b) BOM (Bill of Materials)

    Componente Modelo sugerido Função Observação
    Placa MCU ESP32-S3-DevKitC-1 (N16R8) CPU, Wi-Fi, TLS, I2S 16 MB flash + 8 MB PSRAM para buffers
    Display ST7789 240×240 SPI Status e resposta textual Barramento SPI compartilhado, CS dedicado
    Microfone INMP441 (I2S digital) Entrada de voz I2S0, sem ADC externo
    Amplificador MAX98357A (I2S) Saída de áudio Alto-falante 4 Ω / 3 W
    Regulador Buck/Linear 3,3 V ≥ 1 A Alimentação estável Picos de TX Wi-Fi ~500 mA
    Capacitores 470 µF eletrolítico + 100 nF cerâmico Filtro/desacoplamento Colocar perto do pino 3V3
    Botão Push momentary Push-to-talk / reset Pull-up interno + RC antirruído
    Resistores 10 kΩ, 100 Ω (série I2S) Pull-up e casamento Opcional para integridade de sinal

    (c) Wiring e Esquemático (alimentação e estabilidade)

    O ponto que mais derruba projetos de assistente é a alimentação. O rádio Wi-Fi do ESP32 puxa correntes de pico entre 350 e 500 mA durante as transmissões, e um regulador fraco ou fiação fina provocam o clássico brownout reset — sintoma típico de “cai justamente na hora de chamar a API”. Diretrizes práticas:

    • Use regulador de 3,3 V com capacidade ≥ 1 A e boa resposta a transientes.
    • Coloque um capacitor bulk de 470 µF em paralelo com um cerâmico de 100 nF o mais próximo possível do pino 3V3 do módulo.
    • Evite alimentar o ESP32 pelo USB e por fonte externa ao mesmo tempo; se necessário, use um diodo de isolamento.
    • Adote ground em estrela e mantenha as trilhas de clock I2S curtas para não injetar ruído no áudio.
    • Pino EN com circuito RC (10 kΩ + 1 µF) garante reset limpo na energização.
    Sinal GPIO (sugerido) Periférico
    I2S0 BCLK / WS / DIN GPIO 4 / 5 / 6 Microfone INMP441
    I2S1 BCLK / WS / DOUT GPIO 15 / 16 / 7 Amplificador MAX98357A
    SPI MOSI / SCLK / CS / DC / RST GPIO 11 / 12 / 10 / 9 / 8 Display ST7789

    (d) Código — TLS, certificados, POST JSON, streaming e parse

    O primeiro passo é sincronizar o relógio. Sem isso a validação de certificado falha porque a CA parece “do futuro”.

    #include "esp_sntp.h"
    #include <time.h>
    
    // Obrigatorio antes de qualquer handshake TLS valido:
    // certificados sao checados contra o relogio do sistema.
    static void sync_time(void) {
        setenv("TZ", "<-03>3", 1);        // America/Sao_Paulo
        tzset();
        esp_sntp_setoperatingmode(ESP_SNTP_OPMODE_POLL);
        esp_sntp_setservername(0, "pool.ntp.org");
        esp_sntp_init();
    
        time_t now = 0;
        while (time(&now) < 1700000000) {  // espera o relogio passar de ~2023
            vTaskDelay(pdMS_TO_TICKS(500));
        }
    }

    Com o relógio certo, o cliente HTTPS usa o bundle de CAs do ESP-IDF (esp_crt_bundle_attach), evitando embutir certificados PEM manualmente. O mesmo esqueleto vale para OpenAI, Gemini e Claude — muda só a URL, o cabeçalho de autenticação e o nome dos campos JSON.

    #include "esp_http_client.h"
    #include "esp_crt_bundle.h"   // bundle de CAs do ESP-IDF
    
    static char s_buf[4096];
    
    static esp_err_t on_data(esp_http_client_event_t *e) {
        if (e->event_id == HTTP_EVENT_ON_DATA) {
            // streaming: cada chunk da resposta (SSE) chega aqui
            int n = e->data_len < (int)sizeof(s_buf) - 1 ? e->data_len : (int)sizeof(s_buf) - 1;
            memcpy(s_buf, e->data, n);
            s_buf[n] = 0;
            // aqui voce pode fazer parse incremental do campo "delta"
        }
        return ESP_OK;
    }
    
    esp_err_t chat_post(const char *bearer, const char *body_json) {
        esp_http_client_config_t cfg = {};
        cfg.url = "https://api.openai.com/v1/chat/completions";
        cfg.method = HTTP_METHOD_POST;
        cfg.crt_bundle_attach = esp_crt_bundle_attach; // valida a cadeia de CAs
        cfg.event_handler = on_data;
        cfg.timeout_ms = 20000;
    
        esp_http_client_handle_t c = esp_http_client_init(&cfg);
        esp_http_client_set_header(c, "Content-Type", "application/json");
        esp_http_client_set_header(c, "Authorization", bearer); // "Bearer sk-..."
    
        esp_http_client_open(c, strlen(body_json));
        esp_http_client_write(c, body_json, strlen(body_json));
        esp_http_client_fetch_headers(c);
        int status = esp_http_client_get_status_code(c);
        while (esp_http_client_read(c, s_buf, sizeof(s_buf)) > 0) { /* drena SSE */ }
        esp_http_client_close(c);
        esp_http_client_cleanup(c);
        return status == 200 ? ESP_OK : ESP_FAIL;
    }

    O streaming é importante para a sensação de tempo real: em vez de esperar a resposta inteira, cada chunk (formato Server-Sent Events, data: {...}) é tratado dentro do event handler e o texto pode ser exibido progressivamente no display. Por fim, o parse com ArduinoJson, usando um filtro para carregar só os campos úteis e diminuir o consumo de RAM.

    #include <ArduinoJson.h>
    
    // Filtro: mantem apenas os campos usados -> economiza RAM
    const char *filter =
      "{\"choices\":[{\"message\":{\"content\":true}}],"
      " \"usage\":{\"total_tokens\":true}}";
    
    StaticJsonDocument<768> doc;              // doc pequeno, sem heap frag
    auto err = deserializeJson(doc, s_buf,
                               DeserializationOption::Filter(filter));
    if (!err) {
        const char *txt = doc["choices"][0]["message"]["content"] | "";
        Serial.printf("resposta: %s\n", txt);
        int tokens = doc["usage"]["total_tokens"] | 0;   // custo da interacao
        Serial.printf("tokens: %d\n", tokens);
    }

    (e) Troubleshooting

    • Handshake TLS falha: na maioria dos casos o relógio está errado. Sincronize por SNTP antes da primeira chamada. Verifique também o bundle de CAs atualizado e a URL exata do endpoint.
    • Memória: o handshake TLS pode precisar de 40–60 KB de heap; respostas JSON longas fragmentam a heap. Habilite PSRAM, aumente o buffer e use filtros no ArduinoJson.
    • Timeouts: ajuste timeout_ms (20 s é um bom começo) e implemente retry com backoff. Requisições que passam do limite devem ser canceladas e repetidas.
    • Custo por interação: tokens de entrada e saída contam; o modo streaming não reduz preço. Leia usage.total_tokens para telemetria e considere modelos “mini” para tarefas de bancada. Cacheie respostas repetidas.
    • Limites de cota: erros 429 exigem respeitar o cabeçalho Retry-After. Um proxy local (topologia 2) centraliza esse controle.

    (f) Aplicações reais

    Com a base de TLS e JSON funcionando, as aplicações aparecem rápido: um terminal de voz sobre a bancada que mostra a resposta no ST7789; um painel doméstico que resume leituras de sensores via LLM; um tutor de código que responde por alto-falante; e um monitor que narra alertas de telemetria. O projeto 78/xiaozhi-esp32 é a melhor referência pública de firmware completo (voz + display + MCP) para ESP32-S3 e serve de ponto de partida para quem não quer começar do zero. No próximo artigo da série, o foco sai da rede e vai para a memória: como dar contexto e continuidade ao assistente usando NVS, littlefs e uma camada leve de RAG local.

  • Capoeira e a Abolição

    Capoeira e a Abolição

    A abolição da escravidão, em 13 de maio de 1888, foi um marco na história do Brasil, mas a liberdade não chegou de repente: foi conquistada por séculos de resistência. A capoeira esteve presente nesse processo, como forma de luta, de identidade e de afirmação de um povo que se recusou a aceitar o cativeiro. Entender a relação entre a capoeira e a abolição é compreender a própria alma da arte.

    A capoeira no período da escravidão

    Durante os séculos de escravidão, a capoeira se desenvolveu como uma prática de resistência. Disfarçada de dança, escondia uma luta eficiente, que permitia aos escravizados se defenderem e se prepararem para a fuga. Nas senzalas, nos portos e nas ruas, a capoeira era um espaço de liberdade dentro do cativeiro.

    Mais do que luta, a capoeira era cultura. Nela se encontravam a música, a dança, a religiosidade e a memória dos povos africanos, mantidas vivas apesar da brutalidade da escravidão. A roda de capoeira era um território de resistência simbólica, onde a identidade africana se afirmava e se renovava.

    Os quilombos e a luta pela liberdade

    A resistência à escravidão teve nos quilombos seu símbolo mais forte. O Quilombo dos Palmares, que resistiu por quase um século, inspirou gerações de africanos e afrodescendentes a lutarem pela liberdade. A capoeira, associada à memória quilombola, carrega em si essa herança de luta e de recusa à submissão.

    Relatos e estudos indicam que a capoeira circulava entre os quilombos e as cidades, conectando as comunidades livres aos escravizados que ainda viviam sob o jugo. Era uma rede de resistência, na qual a capoeira funcionava como linguagem comum e como instrumento de organização.

    A caminho da abolição

    Nas décadas que antecederam a abolição, a luta contra a escravidão ganhou força. O movimento abolicionista cresceu, e a pressão interna e externa tornou a manutenção do sistema escravista insustentável. Nesse contexto, a capoeira seguiu presente nas ruas, como expressão da população negra que reivindicava seu lugar na sociedade.

    Os capoeiristas, muitos deles libertos ou livres, participaram ativamente do cotidiano urbano, e a capoeira continuou sendo um símbolo de resistência e de identidade. A libertação formal, em 1888, não resolveu as desigualdades, mas abriu um novo capítulo na história da população negra e da própria capoeira.

    As leis abolicionistas e o papel da resistência

    A abolição não foi um ato isolado, mas o desfecho de um longo processo marcado por leis e pressões sucessivas. Medidas como a Lei do Ventre Livre, de 1871, e a Lei dos Sexagenários, de 1885, resultaram de décadas de luta. Em todas essas etapas, a mobilização dos próprios escravizados e de seus aliados foi decisiva, e a capoeira acompanhou esse movimento como expressão de uma população que não aceitava passivamente a opressão.

    É importante destacar que a abolição foi, em grande medida, uma conquista negra. Muitos historiadores ressaltam que a pressão exercida pelos escravizados — por meio de fugas, rebeliões e quilombos — foi um dos fatores centrais para o fim do sistema. A capoeira, como prática nascida nesse contexto, é parte viva dessa memória de luta.

    A vida após a abolição

    O 13 de maio de 1888 libertou formalmente os escravizados, mas não lhes garantiu terra, trabalho digno ou direitos. A população negra liberta foi lançada a uma realidade de exclusão, e a capoeira continuou sendo, para muitos, meio de sobrevivência e de pertencimento. Nas cidades, os capoeiristas formavam redes de apoio mútuo que amenizavam, em parte, o abandono do Estado.

    Essa continuidade da luta após a abolição é um ponto frequentemente esquecido. A liberdade conquistada precisou ser defendida dia após dia, e a capoeira seguiu cumprindo seu papel de instrumento de resistência e de afirmação cultural para as gerações seguintes.

    A memória da abolição na roda

    A memória da abolição e da resistência negra permanece viva nas cantigas e nos rituais da capoeira. Muitas ladainhas e corridos evocam a luta pela liberdade, os quilombos e as figuras históricas ligadas à resistência. Ao cantá-las, os capoeiristas mantêm acesa a lembrança de um passado que não pode ser esquecido.

    Nas rodas contemporâneas, sobretudo em datas como o 13 de maio e o 20 de novembro, essa memória é reafirmada com força. A capoeira se apresenta, então, não apenas como arte ou esporte, mas como testemunho vivo de uma história de dor e de superação, que segue ensinando a importância da liberdade e da igualdade.

    Da abolição à criminalização

    Paradoxalmente, a abolição foi seguida, dois anos depois, pela criminalização da capoeira no Código Penal de 1890. A liberdade conquistada não se traduziu em direitos, e a população negra liberta foi empurrada para as margens. A capoeira, símbolo dessa população, tornou-se alvo da repressão republicana.

    Ainda assim, a capoeira sobreviveu. E é justamente essa sobrevivência que a torna um testemunho vivo da resistência negra. Da senzala à roda contemporânea, a capoeira atravessou a escravidão, a abolição e a perseguição, provando que a luta pela liberdade é uma chama que não se apaga.

  • Os Anjos Que Soavam Como Máquinas

    Os Anjos Que Soavam Como Máquinas

    Os Anjos Que Soavam Como Máquinas

    Há um instante, no capítulo sexto de Isaías, em que o templo se comporta como um mecanismo. As colunas das portas tremem até o umbral; a casa inteira se enche de fumaça; e uma voz, vinda de algum lugar acima dos seres alados, pergunta: ‘A quem enviarei?’ Como se o edifício sagrado fosse, naquele momento, a caixa acústica de algo maior — ou o casco de uma máquina que acabara de ligar.

    Os seres que cercam o trono chamam-se serafins. Têm seis asas: com duas cobrem o rosto, com duas cobrem os pés, com duas voam. E gritam, uns aos outros, sem parar: ‘Santo, santo, santo é o Senhor dos Exércitos’. A palavra serafim vem de uma raiz que significa queimar — são os ardentes, parentes das serpentes de fogo do deserto. Mas a cena não é de fogo apenas: é de movimento preciso, coordenado, quase mecânico, como o de um motor em marcha lenta.

    O que sabemos

    Sabemos que a descrição dos seres celestes, na Bíblia, é consistentemente construída com o vocabulário da engenharia de seu tempo — e de nenhum outro. Os querubins que Salomão mandou esculpir para o Santo dos Santos, narrados em 1 Reis 6, eram duas figuras de madeira de oliveira, dez côvados de altura, revestidas de ouro, com asas de cinco côvados que se tocavam no centro do santuário: uma máquina de vigília instalada na sala mais vedada do reino, no Templo de Salomão.

    Sabemos, também, o que os textos dizem sobre o som. Em Ezequiel 1, o ruído das asas é como o ruído de muitas águas, como a voz do Todo-Poderoso, como o tumulto de um exército; em Ezequiel 10, o som dos querubins ouvia-se até o pátio exterior, como a voz do Deus Todo-Poderoso quando ele fala. E em Daniel 7, o trono do Ancião de Dias é chamas de fogo, com rodas de fogo ardente — a imagem reaparece: trono, fogo, rodas, som. A iconografia celeste da Bíblia não é estática: ela zune.

    E sabemos que a tradição tratou os serafins e querubins como ordem e hierarquia — anjos, não máquinas. Mas a pergunta que o texto não responde é por que a hierarquia angélica, em seus momentos mais altos, é descrita com detalhes que não se encontram em nenhum outro anjo: asas que cobrem, rodas que giram, metal que reluz, som que abala estruturas.

    O que não sabemos

    Não sabemos o que eram, materialmente, essas criaturas. As leituras modernas, de Erich von Däniken e seus herdeiros, enxergam aeronaves nas asas que cobrem — trens de pouso?, no metal polido — fuselagem? — e nos ruídos de exército, motores. A leitura litúrgica enxerga vestes, posturas e cânticos: asas que cobrem o rosto seriam humildade; asas que cobrem os pés, reverência; asas que voam, prontidão. Ambas as leituras são coerentes; nenhuma é verificável. O texto, como um bom oráculo, sustenta as duas.

    Não sabemos, tampouco, por que a acústica aparece com tanto relevo. Um templo não treme por causa de um coral. A fumaça que enche a casa, as colunas que se movem, a voz que pergunta — há nessa cena um excesso de fenômenos físicos para uma simples teofania literária. É como se Isaías estivesse, sem saber, descrevendo a vibração de uma estrutura submetida a algo que não tinha nome em sua língua.

    O que está em jogo

    O que está em jogo é a nossa definição de anjo. Se os seres celestes são apenas mensageiros espirituais, a cena de Isaías 6 é um poema extraordinário. Mas se as descrições são testemunho — se aquelas asas, aquelas rodas, aquele som de exército eram fenômenos reais —, então a distinção entre anjo e máquina, entre liturgia e tecnologia, desmorona. E a pergunta de Isaías ganha um peso novo: quem enviaremos para falar do que vimos?

    Há, ainda, o detalhe do carvão aceso: um dos serafins voa até o altar, toma uma brasa com uma tenaz e toca os lábios do profeta — ‘a tua iniquidade foi tirada, e o teu pecado, expiado’. Rito de purificação, dizem os teólogos. Procedimento de descontaminação, poderiam dizer os engenheiros. A mesma cena, duas linguagens, nenhum ponto de contato — e um único objeto: fogo que toca a boca e transforma quem fala.

    Quando o templo tremeu e a fumaça subiu, Isaías não perguntou o que eram aquelas criaturas. Perguntou quem enviaria. Talvez a pergunta certa, para nós, seja a mesma, com uma inversão: se os anjos soavam como máquinas, o que isso diz sobre as máquinas que hoje nos cercam — e sobre o que estamos, sem saber, tentando construir à imagem do que foi visto no templo? E quando o nosso próprio mundo tremer até os umbrais, haverá entre nós alguém disposto a responder: ‘Eis-me aqui, envia-me a mim’?