Logótipo sheen.bot

Perspetivas

Porque é que acrescentar um segundo sensor bloqueia o seu micro:bit ou Arduino

29/08/2026·Sheen Robotics
Porque é que acrescentar um segundo sensor bloqueia o seu micro:bit ou Arduino

Quando acrescentar um sensor extra paralisa todo o projeto em micro:bit ou Arduino, a causa é quase de certeza um bloqueio do barramento I2C provocado por colisões de endereços, problemas nas resistências de pull-up ou conflitos de tensão.

Se o seu projeto funcionava na perfeição com um ecrã OLED ou um sensor ambiental, mas bloqueou por completo assim que ligou um segundo sensor, o código não se limitou a apanhar um pequeno erro de lógica — o barramento de comunicação ficou fisicamente bloqueado. A placa pára porque o microcontrolador está preso num ciclo infinito à espera de uma confirmação elétrica que nunca vai chegar.

Em plataformas como a BBC micro:bit, o Arduino Uno e o ESP32, as montagens com vários sensores comunicam quase sempre por I2C (Inter-Integrated Circuit). O I2C é popular porque só precisa de dois fios de dados (SDA e SCL), independentemente do número de dispositivos ligados, mas é notoriamente vulnerável a bloqueios de hardware num único ponto.

Porque é que o I2C bloqueia em vez de falhar de forma controlada

Ao contrário da comunicação série normal ou da leitura de pinos digitais, o I2C usa um esquema de ligação em dreno aberto. O microcontrolador e os sensores não colocam as linhas em nível alto por si próprios; resistências de pull-up externas ou internas puxam suavemente o SDA (dados) e o SCL (relógio) até à tensão de funcionamento. Qualquer dispositivo no barramento pode sinalizar puxando a linha para a massa.

Quando o código chama uma função como Wire.endTransmission() ou pede dados através de uma extensão do MakeCode, o microcontrolador envia uma trama de endereço e fica à espera de um bit de confirmação (ACK). Se uma avaria de hardware mantiver o SDA ou o SCL em nível baixo, ou se dois dispositivos baralharem o sinal, a biblioteca de firmware síncrona espera indefinidamente. Para o professor ou para o aluno, a placa parece simplesmente morta.

Os três culpados por trás do bloqueio

Três situações de hardware comuns explicam quase todos os bloqueios de I2C com vários sensores na sala de aula:

1. Endereços predefinidos duplicados

Cada sensor I2C tem um endereço hexadecimal fixo de 7 bits gravado no seu silício. Se ligar dois sensores idênticos (por exemplo, dois acelerómetros MPU6050 ou dois ecrãs OLED normais de 0,96 polegadas), ambos os dispositivos partilham exatamente o mesmo endereço (como 0x68 ou 0x3C).

Quando o microcontrolador difunde esse endereço, os dois chips tentam falar exatamente ao mesmo tempo. As linhas de dados colidem, deturpam os impulsos de relógio e bloqueiam o estado do barramento.

Tipo de sensorEndereço predefinido comumEndereço secundário (pino comutado)
MPU-6050 (giroscópio/acelerómetro)0x680x69 (AD0 a 3,3 V)
OLED SSD1306 (128x64)0x3C0x3D (comutação por ponte de solda)
BME280 (temperatura/pressão)0x760x77 (SDO a VCC ou GND)
DS3231 (relógio de tempo real)0x57 / 0x68Fixo / ponte de solda

2. Resistências de pull-up em falta ou linhas flutuantes

Como o I2C depende de resistências de pull-up para repor as linhas em nível alto, a ausência de pull-ups faz com que as linhas de relógio e de dados flutuem de forma imprevisível. Pelo contrário, ligar quatro ou cinco placas de expansão umas às outras — cada uma com as suas próprias resistências de pull-up internas de 4,7 kΩ ou 10 kΩ — coloca essas resistências em paralelo. Isso faz descer tanto a resistência total do barramento que os transístores fracos dentro dos sensores normais não conseguem puxar a linha até aos 0 V, provocando falhas de transmissão.

3. Incompatibilidades de nível lógico entre 3,3 V e 5 V

A BBC micro:bit e os microcontroladores ESP32 modernos funcionam com lógica de 3,3 V, ao passo que um Arduino Uno clássico ou uma placa de expansão de sensor mais antiga funcionam a 5 V. Se ligar um sensor de 5 V com resistências de pull-up integradas a um barramento partilhado com um sensor de 3,3 V, a linha de 5 V vai puxar as linhas de dados do micro:bit até aos 5 V. Na melhor das hipóteses, isso corrompe o barramento; na pior, danifica o sensor de 3,3 V ou o periférico I2C do microcontrolador.

Uma rotina de diagnóstico em 4 passos para a sala de aula

Quando a montagem multissensor de um aluno bloqueia a placa, siga esta sequência de diagnóstico passo a passo para localizar depressa a falha elétrica:

Passo 1: isolar e analisar

Desligue o sensor novo e confirme que o circuito original ainda arranca. Depois, carregue na placa um script de análise (scanner) de I2C, facilmente disponível nos exemplos normais do Arduino ou através de extensões básicas do MakeCode. O scanner interroga os endereços de 0x01 a 0x7F e comunica pela porta série todos os dispositivos que respondem. Ligue o segundo sensor sozinho e faça a análise. Se ambos os sensores indicarem exatamente o mesmo endereço hexadecimal, encontrou a colisão.

Passo 2: mudar o pino de endereço no hardware

A maioria das placas de expansão tem um pino de seleção de endereço (normalmente identificado como ADDR, AD0 ou SDO) ou uma pequena ponte de solda na parte de trás da placa. Ligar esse pino a 3,3 V ou à GND altera o bit menos significativo do endereço do dispositivo. Depois de reatribuir o pino, atualize o código de inicialização dessa instância de sensor para usar o endereço secundário.

Passo 3: auditar a tensão do barramento e o comprimento das linhas

Garanta que todos os sensores no barramento funcionam com a mesma tensão lógica. Se tiver mesmo de combinar módulos de 5 V com uma micro:bit de 3,3 V, faça passar os sinais por um conversor de nível lógico bidirecional dedicado em vez de os ligar em paralelo. Além disso, mantenha os fios de ligação curtos — cablagem longa e desarrumada na breadboard acrescenta capacidade parasita, que arredonda os impulsos quadrados de relógio e provoca perda de pacotes.

Passo 4: ativar os tempos-limite do controlador

O código antigo do Arduino assenta em funções bloqueantes. No IDE do Arduino, pode impedir que o microcontrolador fique bloqueado para sempre acrescentando um tempo-limite do barramento depois de Wire.begin():

Wire.begin();
Wire.setWireTimeout(3000, true); // tempo-limite de 3 ms, reinicia o barramento em caso de bloqueio

Se o barramento bloquear por causa de um fio solto ou de um pico elétrico, o controlador reinicia automaticamente o periférico de hardware e continua a correr o resto do ciclo, em vez de parar o sistema todo.

Construir circuitos robustos para a sala de aula

Ensinar aos alunos como funciona o I2C por dentro transforma um bloqueio silencioso e frustrante numa lição concreta sobre protocolos de comunicação. Se está a desenhar kits de robótica multissensor para clubes ou para dar currículo, pode explorar placas de expansão modulares e kits de hardware educativo na loja Sheen Robotics, ou planear percursos de aprendizagem completos com as nossas lições estruturadas no Sheen Canvas.

Ao impor ligações curtas, ao verificar os endereços de hardware antes de montar os projetos e ao ensinar os alunos a ler endereços hexadecimais num scanner de I2C, consegue eliminar o temido bloqueio multissensor antes que ele estrague a sua aula.

#microbit#arduino#i2c#eletrónica#resolução de problemas

Mais Perspetivas