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 <Servo.h>
    
    // 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>
    • 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”.