Control de Banda Transportadora con Sensor de Color TCS230 y Compuerta Automática

Control de Banda Transportadora con Sensor de Color TCS230 y Compuerta Automática

En la era de la automatización, el control eficiente de sistemas de transporte es fundamental para optimizar procesos industriales y mejorar la productividad. En este tutorial, te mostraremos cómo construir un sistema de control de banda transportadora utilizando el sensor de color TCS230 y una compuerta automática. Aprenderás a integrar estos componentes para detectar colores y accionar la compuerta de manera precisa, permitiendo la clasificación automática de objetos según su color.

A lo largo de este artículo, te guiaremos paso a paso en el proceso de montaje, desde la selección de materiales hasta la programación del microcontrolador. Ya seas un entusiasta de la electrónica o un profesional en el campo, este proyecto te proporcionará una comprensión profunda de cómo combinar sensores y actuadores para crear soluciones innovadoras en el mundo real. ¡Comencemos a construir tu sistema de control de banda transportadora!

Materiales Necesarios:

Diagramas de Conexión:

En esta sección, presentaremos los diagramas de conexión necesarios para integrar los componentes clave de nuestro proyecto: el sensor de color TCS230, el puente H L298N y el servomotor. Estos esquemas te guiarán en el proceso de conexión, asegurando que cada componente esté correctamente instalado y listo para funcionar. A continuación, encontrarás los diagramas correspondientes a cada uno de los componentes.

Conexión del Sensor de Color TCS230

Este diagrama muestra cómo conectar el sensor de color TCS230 a tu microcontrolador. Asegúrate de seguir las conexiones de los pines correctamente para garantizar un funcionamiento óptimo.

Conexión del Puente H L298N

En este esquema, se detallan las conexiones necesarias para integrar el puente H L298N, que controla el motor. Verifica que los pines de control estén conectados adecuadamente.

Conexión del Servomotor

Este diagrama ilustra cómo conectar el servomotor a tu sistema. Asegúrate de conectar correctamente los pines de alimentación y control.

Explicación Código:

Primero abriremos Arduino IDE, si tienes dudas sobre como utilizar esta aplicación por favor revisa la siguiente guía dedicada donde encontraras la versión recomendada para Arduino de origen Chino o genuinos.

¿Cómo Cargar Códigos a Arduino?

Código Completo:

En esta sección, presentaremos el código completo para el proyecto de control de la banda transportadora utilizando el sensor de color TCS230, el puente H L298N y el servomotor. Este código ha sido diseñado para facilitar la integración de todos los componentes y permitir un funcionamiento eficiente del sistema. A continuación, podrás ver el código en su totalidad, listo para ser utilizado en tu propio proyecto.

#include 

// Definición de los pines para el sensor de color TCS230
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define salidaSensor 8

// Definición del pin para el servomotor
#define pinServo 9

// Definición de los pines para el puente H L298N
#define motorPin1 10 // Pin de control 1 para el motor
#define motorPin2 11 // Pin de control 2 para el motor

Servo miServo;
int modo = 0; // 0: No establecido, 1: Detección de colores, 2: Datos en bruto, 3: Calibración del servomotor, 4: Instrucciones

void setup() {
  // Configurar los pines del TCS230 como salidas
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(salidaSensor, INPUT);

  // Configurar los pines del puente H como salidas
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);

  // Apagar el motor al inicio
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);

  // Establecer la escala de frecuencia al 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  // Adjuntar el servomotor al pin y establecerlo en 90 grados
  miServo.attach(pinServo);
  miServo.write(90); // Iniciar el servomotor a 90 grados

  // Iniciar la comunicación serial a 115200 baudios
  Serial.begin(115200);
  mostrarMenu();
}

void loop() {
  if (modo == 0) {
    // Esperar a que el usuario seleccione un modo
    if (Serial.available() > 0) {
      char entrada = Serial.read();
      if (entrada == '1') {
        modo = 1;
        Serial.println(F("Modo: Detección de colores y control de servomotor."));
      } else if (entrada == '2') {
        modo = 2;
        Serial.println(F("Modo: Visualización de datos en bruto."));
      } else if (entrada == '3') {
        modo = 3;
        Serial.println(F("Modo: Calibración del servomotor."));
      } else if (entrada == '4') {
        modo = 4;
        mostrarSubMenuInstrucciones();
      } else {
        Serial.println(F("Opción no válida. Por favor, elige 1, 2, 3 o 4."));
      }
    }
  } else if (modo == 1) {
    // Encender el motor en la opción 1
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    // Función de detección y control omitida
  } else if (modo == 2) {
    // Apagar el motor en otras opciones
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    // Función de visualización de datos omitida
  } else if (modo == 3) {
    // Apagar el motor en otras opciones
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    // Función de calibración omitida
  } else if (modo == 4) {
    // Apagar el motor en otras opciones
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    mostrarSubMenuInstrucciones();
  }
}

void mostrarMenu() {
  Serial.println(F("====================================="));
  Serial.println(F("            MENÚ PRINCIPAL           "));
  Serial.println(F("====================================="));
  Serial.println();
  Serial.println(F("Selecciona una opción:"));
  Serial.println(F("1: Detección de colores y control de servomotor"));
  Serial.println(F("2: Visualización de datos en bruto del sensor"));
  Serial.println(F("3: Calibración del servomotor"));
  Serial.println(F("4: Instrucciones de conexión y funcionamiento"));
  Serial.println(F("r: Volver al menú principal"));
  Serial.println();
  Serial.println(F("====================================="));
}

// Funciones
// void detectarYControlar() { ... }
// void mostrarSubMenuInstrucciones() { ... }
// int leerFrecuenciaColor(int estadoS2, int estadoS3) { ... }
// String detectarColor(int rojo, int verde, int azul) { ... }

Descarga del Código Completo

Para facilitarte el acceso, puedes descargar el código completo haciendo clic en el siguiente botón:

 Inclusión de Bibliotecas y Definición de Pines

#include 
  • Servo.h: Esta biblioteca se utiliza para controlar servomotores. Permite mover el servomotor a posiciones específicas mediante el uso de funciones simples.
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define salidaSensor 8
#define pinServo 9
#define motorPin1 10
#define motorPin2 11
  • Definición de Pines: Aquí se definen los pines del microcontrolador que se conectarán a los diferentes componentes: el sensor de color TCS230, el servomotor y el puente H L298N. Esto facilita el cambio de pines si es necesario, sin modificar el código en múltiples lugares.

Declaración de Variables Globales

Servo miServo;
int modo = 0;

Servo miServo: Crea una instancia del objeto Servo, que se utilizará para controlar el servomotor.

int modo: Variable que almacena el estado actual del sistema. Los valores posibles son:

  • 0: No establecido.
  • 1: Detección de colores.
  • 2: Visualización de datos en bruto.
  • 3: Calibración del servomotor.
  • 4: Instrucciones.

Configuración Inicial en setup()

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(salidaSensor, INPUT);
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);

  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);

  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  miServo.attach(pinServo);
  miServo.write(90);

  Serial.begin(115200);
  mostrarMenu();
}
  • Configuración de Pines: Los pines del sensor de color se configuran como salidas, excepto salidaSensor, que es una entrada. Los pines del puente H también se configuran como salidas.
  • Inicialización del Servomotor: Se adjunta el servomotor al pin especificado y se establece en 90 grados, que es la posición neutral.
  • Comunicación Serial: Se inicia la comunicación serial a 115200 baudios para interactuar con el usuario a través del monitor serial.
  • Mostrar Menú: Llama a la función mostrarMenu() para imprimir el menú principal en el monitor serial.

Bucle Principal en loop()

void loop() {
  if (modo == 0) {
    if (Serial.available() > 0) {
      char entrada = Serial.read();
      if (entrada == '1') {
        modo = 1;
        Serial.println(F("Modo: Detección de colores y control de servomotor."));
      } else if (entrada == '2') {
        modo = 2;
        Serial.println(F("Modo: Visualización de datos en bruto."));
      } else if (entrada == '3') {
        modo = 3;
        Serial.println(F("Modo: Calibración del servomotor."));
      } else if (entrada == '4') {
        modo = 4;
        mostrarSubMenuInstrucciones();
      } else {
        Serial.println(F("Opción no válida. Por favor, elige 1, 2, 3 o 4."));
      }
    }
  } else if (modo == 1) {
    digitalWrite(motorPin1, HIGH);
    digitalWrite(motorPin2, LOW);
    // Función de detección y control omitida
  } else if (modo == 2) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    // Función de visualización de datos omitida
  } else if (modo == 3) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    // Función de calibración omitida
  } else if (modo == 4) {
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    mostrarSubMenuInstrucciones();
  }
}
  • Modo de Operación: El bucle principal revisa el valor de modo y ejecuta la lógica correspondiente. Si modo es 0, espera la entrada del usuario para cambiar de modo.
  • Control del Motor: Dependiendo del modo, el motor se enciende o apaga. En el modo 1, el motor se enciende para la detección de colores.
  • Interacción con el Usuario: Utiliza Serial.read() para recibir la entrada del usuario y cambiar el modo del sistema.

 Función mostrarMenu()

void mostrarMenu() {
  Serial.println(F("====================================="));
  Serial.println(F("            MENÚ PRINCIPAL           "));
  Serial.println(F("====================================="));
  Serial.println();
  Serial.println(F("Selecciona una opción:"));
  Serial.println(F("1: Detección de colores y control de servomotor"));
  Serial.println(F("2: Visualización de datos en bruto del sensor"));
  Serial.println(F("3: Calibración del servomotor"));
  Serial.println(F("4: Instrucciones de conexión y funcionamiento"));
  Serial.println(F("r: Volver al menú principal"));
  Serial.println();
  Serial.println(F("====================================="));
}

Impresión del Menú: Esta función imprime el menú principal en el monitor serial, permitiendo al usuario seleccionar una opción. Es fundamental para la interacción del usuario con el sistema.

Resumen de Funciones Esenciales:

  • detectarYControlar(): Esta función se encarga de leer las frecuencias de los colores detectados por el sensor TCS230 y determinar el color. Luego, ajusta el servomotor en función del color detectado. Es crucial para la funcionalidad de detección de colores.
  • mostrarSubMenuInstrucciones(): Imprime un submenú con instrucciones detalladas sobre cómo conectar los componentes y cómo funciona el sistema. Permite al usuario obtener más información sobre el hardware y el software.
  • leerFrecuenciaColor(int estadoS2, int estadoS3): Configura los pines S2 y S3 para seleccionar el filtro de color y luego mide la frecuencia de salida del sensor. Esta frecuencia es proporcional a la intensidad del color detectado.
  • detectarColor(int rojo, int verde, int azul): Analiza las frecuencias de los colores rojo, verde y azul para determinar el color predominante. Devuelve una cadena que representa el color detectado, como «Rojo», «Verde», «Azul», o «Desconocido».