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;