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”.