¿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

  1. Arduino Uno.
  2. Sensor de color APDS-9960.
  3. Un motor DC y controlador (L298N).
  4. Un servo (SG90 o similar).
  5. LEDs (rojo, verde y azul).
  6. Resistencias (330 Ω para los LED).
  7. Cables.
  8. 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

  1. Sensor de color: Conecta el sensor APDS-9960 al Arduino a través de los pines I2C (SDA y SCL).
  2. LED: Cada LED se conecta a su pin asignado con una resistencia de 330 Ω en serie.
  3. Servo: Conecta el pin de señal al pin 9 del Arduino, el VCC al pin de 5V y el GND al GND.
  4. 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

  1. Coloque un objeto en la cinta transportadora.
  2. El sensor detectará el color predominante y enviará las lecturas al monitor serie.
  3. Según el color detectado, el LED correspondiente se encenderá y el servo dirigirá la rampa al recipiente adecuado.
  4. 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!