Robótica com C — Bloco 1
Nas aulas 41a e 41b você aprendeu a estrutura do Arduino, o Wokwi, Serial, interrupções e bits. Agora vamos conhecer o ecossistema de hardware — os sensores que permitem ao robô perceber o ambiente.
Cada componente de hardware se comunica com o Arduino de uma de três formas:
| Tipo de interface | Como funciona | Função de leitura | Exemplos |
|---|---|---|---|
| Digital | Retorna HIGH ou LOW — ligado ou desligado | digitalRead(pino) |
Botão, sensor PIR, sensor de toque |
| Analógico | Retorna 0–1023 proporcional à tensão (0–5V) | analogRead(A0) |
Potenciômetro, LDR, LM35, MQ-2, célula de carga |
| Protocolo (I2C/SPI) | Comunicação digital por barramento — biblioteca obrigatória | Métodos do objeto da biblioteca | LCD I2C, RTC DS3231, display OLED, acelerômetro |
Regra prática: se o sensor tem 3 fios (GND, VCC, sinal), provavelmente é analógico ou digital simples — use analogRead() ou digitalRead(). Se tem 4 fios ou mais (GND, VCC, SDA, SCL), é um protocolo I2C e vai precisar de #include <Wire.h> e uma biblioteca específica.
Sensores analógicos produzem uma tensão variável proporcional à grandeza medida. O ADC do Arduino converte essa tensão em um número de 0 a 1023. O esqueleto do código é sempre o mesmo — só muda a fórmula de conversão:
// Padrão universal para qualquer sensor analógico: int bruto = analogRead(PINO_SENSOR); // 0 – 1023 float grandeza = converter(bruto); // fórmula específica do sensor Serial.println(grandeza);
Perceba o padrão: LDR, MQ-2, LM35 e FSR têm exatamente esse mesmo esqueleto. Quando você dominar um sensor analógico, domina o padrão de todos. A única diferença é a fórmula de conversão e o pino.
O LM35 gera 10 mV por grau Celsius — 0°C = 0V, 100°C = 1V. A conversão é direta: converta o valor bruto para tensão e depois multiplique por 100 para obter graus:
// LM35 conectado ao pino A0 // Ligação: VCC → 5V, GND → GND, Saída → A0 const int PINO_LM35 = A0; void setup() { Serial.begin(9600); } void loop() { int bruto = analogRead(PINO_LM35); float volts = bruto * (5.0 / 1023.0); // ADC → tensão (0–5V) float temp = volts * 100.0; // 10mV/°C → ×100 = °C Serial.print("Temperatura: "); Serial.print(temp, 1); // 1 casa decimal Serial.println(" C"); delay(1000); }
Temperatura: 23.4 C
Temperatura: 24.0 C
Temperatura: 24.5 C
Por que 5.0 e não 5? Divisão entre dois int é inteira em C: 5/1023 = 0. O sufixo .0 força float — exatamente o type casting que você aprendeu na Aula 02.
O LDR (Light Dependent Resistor) diminui sua resistência conforme a luz aumenta. Conectado em divisor de tensão com um resistor de 10kΩ, o valor lido é proporcional à luminosidade — quanto mais claro, maior o número:
// LDR em divisor de tensão: 5V → resistor 10kΩ → A0 → LDR → GND const int PINO_LDR = A0; void setup() { Serial.begin(9600); } void loop() { int lum = analogRead(PINO_LDR); // 0 = escuro, 1023 = muito claro Serial.print("Luminosidade: "); Serial.print(lum); if (lum < 300) Serial.println(" [ESCURO]"); else if (lum < 700) Serial.println(" [MEIA LUZ]"); else Serial.println(" [CLARO]"); delay(500); }
Luminosidade: 87 [ESCURO]
Luminosidade: 512 [MEIA LUZ]
Luminosidade: 980 [CLARO]
O MQ-2 detecta gases inflamáveis (GLP, metano, fumaça) produzindo tensão analógica proporcional à concentração. Precisa de ~1 minuto de aquecimento antes de dar leituras estáveis:
// MQ-2 conectado ao pino A0 (saída AO — analógica) // Também tem saída DO (digital) com limiar ajustável por trimpot const int PINO_MQ2 = A0; const int LIMIAR_GAS = 400; // ajuste conforme calibração do ambiente void setup() { Serial.begin(9600); Serial.println("Aquecendo sensor — aguarde 60 segundos..."); delay(60000); Serial.println("Pronto!"); } void loop() { int conc = analogRead(PINO_MQ2); Serial.print("Gas: "); Serial.print(conc); if (conc > LIMIAR_GAS) Serial.println(" *** ALERTA: GAS DETECTADO! ***"); else Serial.println(" [normal]"); delay(1000); }
Aquecendo sensor — aguarde 60 segundos...
Pronto!
Gas: 180 [normal]
Gas: 612 *** ALERTA: GAS DETECTADO! ***
O FSR (Force Sensitive Resistor) diminui sua resistência conforme a pressão aplicada aumenta — análogo ao LDR, mas respondendo à força em vez da luz. Quanto maior a força, maior o valor lido:
// FSR em divisor de tensão: 5V → FSR → A0 → resistor 10kΩ → GND const int PINO_FSR = A0; void setup() { Serial.begin(9600); } void loop() { int forca = analogRead(PINO_FSR); // 0 = sem força, 1023 = força máxima Serial.print("Forca: "); Serial.println(forca); delay(200); }
Uso no robô: FSRs nas solas das patas do cachorro-robô detectam quando cada pata está no chão — informação essencial para a marcha. Isso aparece na Aula 53.
O sensor PIR (Passive Infrared) detecta variações de calor infravermelho geradas por corpos em movimento. Saída digital: LOW quando inativo, HIGH quando detecta movimento. Tem dois trimpots para ajustar sensibilidade e tempo de saída ativa.
// PIR conectado ao pino 2 // Ligação: VCC → 5V, GND → GND, OUT → pino 2 const int PINO_PIR = 2; const int PINO_LED = 8; void setup() { pinMode(PINO_PIR, INPUT); pinMode(PINO_LED, OUTPUT); Serial.begin(9600); Serial.println("Calibrando PIR — aguarde 10 segundos..."); delay(10000); // PIR precisa calibrar com a temperatura do ambiente Serial.println("Monitorando..."); } void loop() { if (digitalRead(PINO_PIR) == HIGH) { digitalWrite(PINO_LED, HIGH); Serial.println("MOVIMENTO DETECTADO!"); } else { digitalWrite(PINO_LED, LOW); } delay(100); }
Calibrando PIR — aguarde 10 segundos...
Monitorando...
MOVIMENTO DETECTADO!
MOVIMENTO DETECTADO!
PIR vs HC-SR04: o PIR detecta movimento (variação térmica), enquanto o HC-SR04 detecta presença/distância (reflexo de ultrassom). No robô, o PIR serve para modo de vigilância; o HC-SR04 serve para desvio de obstáculos. A próxima aula cobre o HC-SR04 em detalhe.
| Sensor | Interface | O que mede | Uso no robô |
|---|---|---|---|
| LM35 | Analógico | Temperatura (°C) | Monitorar temperatura dos motores |
| LDR | Analógico | Luminosidade | Modo diurno/noturno, seguidor de luz |
| MQ-2 | Analógico + Digital | Concentração de gás | Detector de ambiente perigoso |
| FSR | Analógico | Pressão / força | Detecção de contato nas patas |
| PIR | Digital | Movimento (calor IR) | Modo de vigilância, detectar presença |
Teste o que você aprendeu sobre sensores analógicos e o sensor PIR: