¿Alguna vez imaginaste crear tu propia cinta transportadora capaz de clasificar objetos por colores? En esta guía te mostraremos cómo desarrollar una cinta clasificadora utilizando un sensor de color, un motor DC y un servo, todo controlado por un Arduino. Este proyecto es ideal para quienes quieren aprender más sobre robótica, automatización y programación.
Además, abordaremos un detalle técnico clave: la interacción de la librería Servo con los temporizadores de Arduino, que limita la disponibilidad de algunos pines PWM. ¡Sigue leyendo para descubrir cómo lo resolvimos y crea tu propia cinta clasificadora desde cero!
¿Qué hace este proyecto?
La cinta clasificadora detecta el color de un objeto mediante un sensor APDS-9960. Según el color predominante (rojo, verde o azul), un servo dirige la rampa de salida hacia un recipiente específico mientras un motor DC mueve la cinta transportadora.
Materiales necesarios
- Arduino Uno.
- Sensor de color APDS-9960.
- Un motor DC y controlador (L298N).
- Un servo (SG90 o similar).
- LEDs (rojo, verde y azul).
- Resistencias (330 Ω para los LED).
- Cables.
- Fuente de alimentación para el motor (batería o adaptador).
Pines usados en el proyecto
Para asegurar un funcionamiento óptimo, configuramos los siguientes pinos:
LED:
- Rojo: Pin 8.
- Verde: Pin 6.
- Azul: Pin 7.
Motor CC:
- PWM para velocidad: Pin 5.
- Dirección: Pines 12 y 11.
Servo:
- Pin 9.
Nota importante sobre los servos:
La librería Servo en Arduino utiliza intensivamente el Timer 1 , lo que hace que los pines 9 y 10 no puedan usarse como salidas PWM mientras esté activo un servo. Por eso, reasignamos el motor al pin PWM 5 para evitar conflictos. Este detalle técnico es esencial para quienes buscan proyectos avanzados en Arduino.Circuito
- Sensor de color: Conecta el sensor APDS-9960 al Arduino a través de los pines I2C (SDA y SCL).
- LED: Cada LED se conecta a su pin asignado con una resistencia de 330 Ω en serie.
- Servo: Conecta el pin de señal al pin 9 del Arduino, el VCC al pin de 5V y el GND al GND.
- Motor DC: Conecte el controlador L298N al motor ya los pines PWM y de dirección especificada.
Código del proyecto
El código está diseñado para integrar todos los elementos y garantizar una detección y clasificación precisa.
// Librerías
#include
#include
#include
// Inicialización del sensor y el servo
Adafruit_APDS9960 apds;
Servo servo;
// Pines de los LEDs
const int ledRojo = 8;
const int ledVerde = 6;
const int ledAzul = 7;
// Pines del motor
const int motorPWM = 5; // Velocidad del motor (PWM)
const int motorDir1 = 12;
const int motorDir2 = 11;
// Variables de color
uint16_t r, g, b, c;
void setup() {
// Configuración de pines
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledAzul, OUTPUT);
pinMode(motorPWM, OUTPUT);
pinMode(motorDir1, OUTPUT);
pinMode(motorDir2, OUTPUT);
// Inicialización del monitor serie
Serial.begin(9600);
Serial.println("Inicializando la cinta clasificadora...");
// Inicialización del sensor de color
if (!apds.begin()) {
Serial.println("Error al inicializar el sensor APDS9960");
while (1);
}
apds.setADCGain(APDS9960_AGAIN_16X); // Aumentar la sensibilidad del sensor
Serial.println("Sensor APDS9960 inicializado correctamente.");
// Configuración del sensor para lecturas de color
apds.enableColor(true); // Habilita el sensor de color
apds.setADCIntegrationTime(10); // Reduce el tiempo de integración para lecturas rápidas
// Inicialización del servo
servo.attach(3); // Pin de control del servo
servo.write(90); // Posición inicial
// Inicialización del motor (cinta transportadora)
digitalWrite(motorDir1, HIGH); // Dirección del motor
digitalWrite(motorDir2, LOW);
analogWrite(motorPWM, 100); // Velocidad inicial (ajustable)
Serial.println("Cinta clasificadora lista");
}
void loop() {
// Leer colores del sensor
if (apds.colorDataReady()) {
apds.getColorData(r, &g, &b, &c);
Serial.print("R: "); Serial.print(r);
Serial.print(" G: "); Serial.print(g);
Serial.print(" B: "); Serial.print(b);
Serial.print(" C: "); Serial.println(c);
// Lógica para encender los LEDs y mover el servo según el color
if (c > 10) { // Evaluar solo si hay suficiente luz
if (g > r + 5 && g > b + 5) { // Verde predominante
encenderLED(ledVerde);
moverServo(60); // Mover rampa al recipiente verde
} else if (r > g + 5 && r > b + 5) { // Rojo predominante
encenderLED(ledRojo);
moverServo(120); // Mover rampa al recipiente rojo
} else if (b > r + 5 && b > g + 5) { // Azul predominante
encenderLED(ledAzul);
moverServo(90); // Mover rampa al recipiente azul
} else {
apagarTodos();
}
}
// Movimiento continuo de la cinta
moverCinta(100); // Velocidad ajustable
}
delay(500); // Pequeña pausa para estabilizar lecturas
}
void encenderLED(int ledPin) {
apagarTodos();
digitalWrite(ledPin, HIGH);
}
void apagarTodos() {
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAzul, LOW);
}
void moverServo(int posicion) {
servo.write(posicion);
delay(500); // Esperar a que el servo alcance la posición
}
void moverCinta(int velocidad) {
analogWrite(motorPWM, velocidad); // Controla la velocidad del motor
digitalWrite(motorDir1, HIGH); // Dirección de avance
digitalWrite(motorDir2, LOW);
}
Resultados esperados
- Coloque un objeto en la cinta transportadora.
- El sensor detectará el color predominante y enviará las lecturas al monitor serie.
- Según el color detectado, el LED correspondiente se encenderá y el servo dirigirá la rampa al recipiente adecuado.
- La cinta transportadora seguirá avanzando.
Conclusiones y aprendizajes
Este proyecto es un excelente ejemplo de integración de múltiples componentes con Arduino. Nos permitimos un desafío técnico importante relacionado con los temporizadores y el uso de pines PWM, lo que puede ser un obstáculo común en proyectos avanzados.
Ahora que tienes esta guía completa, ¡es tu turno de construir tu propia cinta clasificadora y personalizarla según tus necesidades! Si tienes dudas o mejoras, déjanos tus comentarios.
¡Manos a la obra!