back to lab notes
iotcompleted2024
Arduino + I2C Sensors & Actuators
Engenharia de controle PD para robótica móvel (seguidor de linha) com multiplexação por shift register 74HC595 e FSM de 7 estados.
ArduinoC++PD Control74HC595Robotics
Specifications
MCU
Arduino UNO (8-bit)
Sensores
9× IR (S0-S8)
Motor Driver
Ponte H + 74HC595
Controlador
PD (Kp + Kd)
FSM
7 estados
PWM Base
160 / Máx 220
Tech Stack
C++ NativoArduino UNO74HC595 Shift RegisterSensores IRPonte H
Overview
Seguidor de linha com malha fechada PD. Arranjo sensorial de 9 infravermelho (S0-S8), onde pinos S3-S8 reutilizam portas analógicas (A0-A5) como digitais. Ponte H dupla gerida por CI 74HC595 multiplexando 3 pinos lógicos (Latch, Clock, Data) em 8 saídas independentes para os motores. FSM com 7 estados: Seguindo, Girando, Cruzamento, Parada, Recuperação, etc.
Key Features
- Controlador PD: Ganho Proporcional (Kp) + Ganho Derivativo (Kd)
- Multiplexação via shift register 74HC595 (3 pinos → 8 saídas)
- Calibração autônoma no boot: giro de 3s processando reflectância do piso
- Algoritmo de resgate visual: varreduras bi-direcionais cegas em janelas de 600ms
- Velocidades PWM 8-bit: Base=160, Máxima=220, Giro=200
- 9 sensores IR com reutilização de portas analógicas como digitais
Shift Register 74HC595 — Multiplexação de Motor
cpp
// 3 pinos controlam 8 saídas via shift register
void setMotors(byte data) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, data);
digitalWrite(LATCH_PIN, HIGH);
}
// Controlador PD
int error = readSensors(); // -4000 a +4000
int derivative = error - lastError;
int correction = (Kp * error) + (Kd * derivative);
int leftSpeed = constrain(BASE_SPEED + correction, 0, MAX_SPEED);
int rightSpeed = constrain(BASE_SPEED - correction, 0, MAX_SPEED);
setMotors(motorByte(leftSpeed, rightSpeed));
lastError = error;