Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Robot Seguidor de Línea con Control PID e Integración Android

Componentes y materiales

ComponenteCantidad
Arduino Nano R31
Sensor seguidor línea SparkFun RedBot1
Módulo sensor IR 4 canales TCRT50001
Módulo Bluetooth HC-061
Dispositivo Android1
Portapilas 4xAA2
Servo rotación continua RobotGeek (SM-S4303R)2

Aplicaciones y servicios

Descripción del proyecto

Construye un robot seguidor de línea con control PID y usa un dispositivo Android para ajustar fácilmente los parámetros de control (Kp, Ki, Kd) y lograr una puesta a punto rápida. Es la primera parte de un proyecto mayor: en la segunda fase se convertirá en un resolvedor de laberintos con IA simple.

Robot Seguidor de Línea con Control PID e Integración Android

Paso 1: Lista de materiales (BOM)

Robot muy económico (~75 USD):

Paso 2: Configurar los servos

Dos servos continuos SM-S4303R pegados en bloque (cinta 3M/cola/doble cara). Funcionan por ancho de pulso:

Conexiones:

Alimentación servos: pack 5V exclusivo (red lateral protoboard). GND común con Arduino.

Primer test: enviar 1500 µs a ambos. Si giran, ajustar tornillo amarillo bajo el servo hasta parar. Si no tiene tornillo, cambiar 1500 en código hasta lograr paro total.

#include <Servo.h>
Servo leftServo, rightServo;
void setup() {
  leftServo.attach(5);
  rightServo.attach(3);
  leftServo.writeMicroseconds(1500);
  rightServo.writeMicroseconds(1500);
}
void loop() {}

Paso 3: Montar chasis y test movimiento

Robot Seguidor de Línea con Control PID e Integración Android

Rangos de velocidad (servos en oposición):

Código test movimiento (avance, retroceso, giros):

while(digitalRead(buttonPin)) {}  // Espera pulsar botón
motorTurn(LEFT, 500);
motorTurn(RIGHT, 500);

Paso 4: Módulo Bluetooth HC-06 (opcional)

Robot Seguidor de Línea con Control PID e Integración Android

El robot funciona con o sin Bluetooth. Si no se activa BT, usa parámetros por defecto. La app Android permite ajuste remoto PID y control manual.

Paso 5: Sensores de línea IR

Robot Seguidor de Línea con Control PID e Integración Android

Conexiones pines Arduino:

Uso módulo 4 sensores integrado + 1 suelto; equivalentes a 5 independientes.

Paso 6: Lógica sensores IR

Cada sensor: LED IR + fotodiodo IR. Luz reflejada → voltaje proporcional a reflectancia (alto en claro, bajo en oscuro). Módulo integra comparador + potenciómetro: salida digital HIGH = oscuro (línea), LOW = claro.

Array 5 sensores montado para que:

Estados posibles del array (0=claro, 1=oscuro):

0 0 0 0 1
0 0 0 1 1
0 0 0 1 0
0 0 1 1 0
0 0 1 0 0   ← CENTRADO (error = 0)
0 1 1 0 0
0 1 0 0 0
1 1 0 0 0
1 0 0 0 0

Variable error según posición línea:

0 0 1 0 0  → error =  0
0 0 1 1 0  → error =  1
0 0 0 1 0  → error =  2
0 0 0 1 1  → error =  3
0 0 0 0 1  → error =  4
0 1 1 0 0  → error = -1
0 1 0 0 0  → error = -2
1 1 0 0 0  → error = -3
1 0 0 0 0  → error = -4

Implementación en Arduino:


const int lineFollowSensor0 = 12;
const int lineFollowSensor1 = 18;
const int lineFollowSensor2 = 17;
const int lineFollowSensor3 = 16;
const int lineFollowSensor4 = 19;

int LFSensor[5] = {0,0,0,0,0};

void readLFSsensors() {
  LFSensor[0] = digitalRead(lineFollowSensor0);
  LFSensor[1] = digitalRead(lineFollowSensor1);
  LFSensor[2] = digitalRead(lineFollowSensor2);
  LFSensor[3] = digitalRead(lineFollowSensor3);
  LFSensor[4] = digitalRead(lineFollowSensor4);

  if      (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==0 && LFSensor[3]==0 && LFSensor[4]==1) error =  4;
  else if (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==0 && LFSensor[3]==1 && LFSensor[4]==1) error =  3;
  else if (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==0 && LFSensor[3]==1 && LFSensor[4]==0) error =  2;
  else if (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==1 && LFSensor[3]==1 && LFSensor[4]==0) error =  1;
  else if (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==1 && LFSensor[3]==0 && LFSensor[4]==0) error =  0;
  else if (LFSensor[0]==0 && LFSensor[1]==1 && LFSensor[2]==1 && LFSensor[3]==0 && LFSensor[4]==0) error = -1;
  else if (LFSensor[0]==0 && LFSensor[1]==1 && LFSensor[2]==0 && LFSensor[3]==0 && LFSensor[4]==0) error = -2;
  else if (LFSensor[0]==1 && LFSensor[1]==1 && LFSensor[2]==0 && LFSensor[3]==0 && LFSensor[4]==0) error = -3;
  else if (LFSensor[0]==1 && LFSensor[1]==0 && LFSensor[2]==0 && LFSensor[3]==0 && LFSensor[4]==0) error = -4;
}

Paso 7: Control proporcional (P)

Robot Seguidor de Línea con Control PID e Integración Android

Definir iniMotorPower = 250 (medio gas):


rightServo.writeMicroseconds(1500 + iniMotorPower);  // 1750 µs
leftServo.writeMicroseconds(1500 - iniMotorPower);   // 1250 µs

Si robot deriva izquierda (línea "va derecha") → error = +1. Corregir: reducir velocidad derecho (pulso ↓), aumentar izquierda (pulso ↓):


rightServo.writeMicroseconds(1500 + iniMotorPower - Kp*error);
leftServo.writeMicroseconds(1500 - iniMotorPower - Kp*error);

Kp (constante proporcional) amplifica la corrección. Ej: Kp=50 → error 1 corrige 50 µs.

Paso 8: Control PID completo (opcional)

Robot Seguidor de Línea con Control PID e Integración Android

PID (Proporcional, Integral, Derivativo) es el control industrial estándar. Analogía: un muelle que tiende a recuperar su longitud original.

Ecuación: PIDvalue = (Kp*P) + (Ki*I) + (Kd*D)

Ajuste manual (trial-error):

  1. Kd=0, Ki=0. Ajusta Kp solo. Kp=25 buen inicio (Kp=50 funcionó bien).
  2. Una vez respuesta razonable: Kp=Kp/2, Kd=Kp/2. Aumenta Kd para reducir overshoot; baja si inestable.
  3. Si 반응 lento → sube Kp/Kd. Si inestable/oscilante → baja.
  4. Frecuencia muestreo (delay en loop) afecta mucho. Ajustar por prueba-error.

Implementación:


float Kp=50, Ki=0, Kd=0;
float P, I, D, PIDvalue, previousError, error;

void calculatePID() {
  P = error;
  I = I + error;
  D = error - previousError;
  PIDvalue = (Kp*P) + (Ki*I) + (Kd*D);
  previousError = error;
}

void motorPIDcontrol() {
  int leftMotorSpeed  = 1500 - iniMotorPower - PIDvalue;
  int rightMotorSpeed = 1500 + iniMotorPower - PIDvalue;
  leftServo.writeMicroseconds(leftMotorSpeed);
  rightServo.writeMicroseconds(rightMotorSpeed);
}

Paso 9: Código final integrado

Robot Seguidor de Línea con Control PID e Integración Android

Estados (mode):


#define STOPPED 0
#define FOLLOWING_LINE 1
#define NO_LINE 2

int mode = STOPPED;

void loop() {
  readLFSsensors();

  // Detectar condiciones especiales
  if (LFSensor[0]==1 && LFSensor[1]==1 && LFSensor[2]==1 && LFSensor[3]==1 && LFSensor[4]==1) mode = STOPPED;
  else if (LFSensor[0]==0 && LFSensor[1]==0 && LFSensor[2]==0 && LFSensor[3]==0 && LFSensor[4]==0) mode = NO_LINE;
  else mode = FOLLOWING_LINE;

  switch (mode) {
    case STOPPED:     motorStop(); break;
    case NO_LINE:     motorStop(); motorTurn(LEFT, 180); break;
    case FOLLOWING_LINE: calculatePID(); motorPIDcontrol(); break;
  }
}

El código completo (con inicializaciones, funciones motorForward/Backward/Turn/Stop, manejo Bluetooth, etc.) está en el repositorio GitHub.

Paso 10: Ajuste PID con App Android

Robot Seguidor de Línea con Control PID e Integración Android

En robotDefines.h:

float Kp=50; float Ki=0; float Kd=0;

La app (MIT App Inventor 2) tiene:

Archivos: .aia (editable en App Inventor) y .apk (instalable directo).

Paso 11: Modificar código para ajuste PID remoto

En setup(), bucle de configuración antes de empezar:


while (digitalRead(buttonPin) && !mode) {
  checkBTcmd();      // ¿comando BT recibido?
  manualCmd();       // Ejecuta comando manual
  command = "";
}
checkPIDvalues();    // Actualiza Kp,Ki,Kd desde variables globales
mode = STOPPED;

Función comandos manuales + PID:


void manualCmd() {
  switch (command[0]) {
    case 'g': mode = FOLLOWING_LINE; break;
    case 's': motorStop(); break;
    case 'f': motorForward(); break;
    case 'r': motorTurn(RIGHT, 30); motorStop(); break;
    case 'l': motorTurn(LEFT, 30); motorStop(); break;
    case 'b': motorBackward(); break;
    case 'p': Kp = command.substring(2).toFloat(); break;  // "p/50"
    case 'i': Ki = command.substring(2).toFloat(); break;
    case 'd': Kd = command.substring(2).toFloat(); break;
  }
}

Paso 12: Conclusión

Robot Seguidor de Línea con Control PID e Integración Android

Primera parte completada: seguidor de línea PID + ajuste Bluetooth/Android. Próxima fase: resolvedor de laberintos con IA simple, basado en este hardware.

Archivos actualizados en GitHub - Mjrovai/MJRoBot-Line-Follower.

Más tutoriales en MJRoBot.org.

¡Saludos desde el sur del mundo! – Marcelo

Código (fragmentos clave)

Ver sección "Code" del proyecto original para archivos completos (.ino, .h). Aquí se incluyen los fragmentos esenciales mostrados en los pasos.

Esquemático

Robot Seguidor de Línea con Control PID e Integración Android
Esquemático en formato Fritzing (.fzz)

Proceso de manufactura

  1. Sensor de seguimiento de línea con Raspberry Pi – Detector simple KY‑033 para puerta/línea
  2. Control de sensores y actuadores con Raspberry Pi: acelerómetro, servo y streaming de datos
  3. Construye un Robot Controlado por WiFi con Raspberry Pi y Smartphone Android
  4. Mando universal Android con Arduino, 1Sheeld y control IR
  5. Robot industrial seguidor de línea para transporte de materiales
  6. Robot seguidor de línea V4 – Sistema avanzado con Arduino Nano y PCB a medida
  7. Control PID para Pinza Robótica 3D en MATLAB/Simulink: Tutorial Avanzado
  8. Wittmann Battenfeld lanza el WX153: Línea avanzada de robots para automatización de inyección de alta fuerza
  9. FANUC amplía su línea de robots SCARA: seis modelos, cargas de 3‑20 kg, alcances de 400‑1100 mm
  10. Optimice la Garantía de Calidad del Empaquetado con Sistemas de Control Automatizados Avanzados
  11. Robótica en el siglo XXI: Sistemas distribuidos, telepresencia y exploración espacial