Diseño de un Robot Autónomo IoT para clasificación de objetos por color con sistema siguelíneas
Objetivos
Se pretende programar un Robot Tipo Coche diseñado en impresión 3D.
- Este coche sería controlado por un ESP32-S3.
.
- Cuenta con 4 motores reductores + ruedas de Arduino.
- El control de motores es por un puente en H.
- Está alimentado por pilas AA como se ve en la imagen.
El objetivo del proyecto sería usar dos sensores infrarrojos CNY70 (para hacer el siguelineas) y usar dos sensores TCS3425 (para detectar colores).
Los pasos son los siguientes:
- El operario coloca un objeto de color específico (amarillo, rojo, azul o verde) en el robot.
- Ahora el robot sigue la línea hasta llegar a una zona de depósito donde habrá un área con el color donde debe pararse y depositar el objeto mediante un servo.
- Vuelve a empezar el bucle
La otra aplicación es realizar un control remoto mediante el módulo Bluetooth HC-05.
Componentes
Soportes para la electrónica.
Para la sujeción de los motores y la electrónica, se diseña un soporte en 3D.
Este diseño cuenta con varias partes:
- Agujeros perforados para el Arduino UNO.
- Agujeros perforados para el puente en H.
- Soporte para el servomotor SG90.
- Soporte para el sensor de color TCS34725.
- Agujeros para la colocación de sensores CNY70.
- Soportes para los motores.
En principio, el microcontrolador utilizado iba a ser un Arduino UNO pero, debido a que necesitamos dos sensores TCS34725 y, que el fabricante no nos ofrece la posibilidad de cambiar la dirección I2C del dispositivo, se decide sustituir el microcontrolador por un ESP32-S3. Otra posible solución sería el uso de un multiplexor I2C pero, debido al material, esta es la opción que se ha determinado.
Por ello el diseño debía ser modificado pero, debido a que ya se tenía la estructura impresa 3D y, debido a los plazos de entrega, se decide seguir con esta estructura y usar para el nuevo ESP32 unión adhesiva.
Sensor TCS34725
Este proyecto, necesita dos sensores de colores que sean capaces de detectar el color de la pista y el color de los bloques ha dispensar.
El TCS34725 es un sensor de color RGB con la electrónica asociada integrada que, mediante I2C, nos devuelve valores digitales entre rojo, verde y azul. Además, este dispositivo, cuenta con un filtro que bloquea la luz infrarroja y una luz led para intentar evitar las interferencias de luz provenientes del exterior.
A continuación, se adjunta un diagrama de bloques proporcionado por el fabricante donde se explica el funcionamiento del dispositivo.
Según el diagrama de bloques y el Datasheet, convierte luz en señales digitales usando una matriz de fotodiodos con filtros para rojo, verde, azul. Internamente, cuenta con cuatro conversores analógico-digitales (ADC) que transforman la corriente de los fotodiodos en valores digitales de 16 bits, estos resultados se guardan en el registro.
El sensor cuenta con diferentes pines:
- Vdd: voltaje de alimentación, aunque el datasheet indica que el integrado acepta tensiones de alimentación de 2.7 V a 3.6 V, el proveedor nos proporciona una electrónica asociada que consigue una alimentación de hasta 5 V.
- Pines SCL y SDA: reloj y data del bus I2C.
- Interrupt: Incluye una salida de interrupción configurable. Esta interrupción se activa cuando los valores superan umbrales definidos por el usuario. En este caso, no se va a utilizar este pin.
- GND: conexión a masa.
- NC: sin conexión.
El dispositivo, tiene varias direcciones de registro I2C, a continuación, se indican:
Dirección | Nombre del registro | Lectura / Escritura | Descripción | Valor para reset |
– | COMMAND | Escritura | Especificar el registro | 0x00 |
0x00 | ENABLE | Lectura / Escritura | Activa interrupciones y estados | 0x00 |
0x01 | ATIME | Lectura / Escritura | Tiempo RGBC (integración del ADC) | 0xFF |
0x03 | WTIME | Lectura / Escritura | Tiempo de espera | 0xFF |
0x04 | AILTL | Lectura / Escritura | Byte bajo (LSB) del umbral de interrupción inferior (low threshold). | 0x00 |
0x05 | AILTH | Lectura / Escritura | Byte alto (MSB) del umbral de interrupción inferior. | 0x00 |
0x06 | AIHTL | Lectura / Escritura | Byte bajo (LSB) del umbral de interrupción superior (high threshold). | 0x00 |
0x07 | AIHTH | Lectura / Escritura | Byte alto (MSB) del umbral de interrupción superior. | 0x00 |
0x0C | PERS | Lectura / Escritura | Controla la cantidad de veces que debe cumplirse una condición para generar una interrupción. | 0x00 |
0x0D | CONFIG | Lectura / Escritura | Configuración | 0x00 |
0x0F | CONTROL | Lectura / Escritura | Control | 0x00 |
0x12 | ID | Lectura | ID del dispositivo | ID |
0x13 | STATUS | Lectura | Estado del dispositvo | 0x00 |
0x14 | CDATAL | Lectura | Datos claridad – Byte bajo | 0x00 |
0x15 | CDATAH | Lectura | Datos claridad – Byte alto | 0x00 |
0x16 | RDATAL | Lectura | Datos Rojo – Byte bajo | 0x00 |
0x17 | RDATAH | Lectura | Datos Rojo – Byte alto | 0x00 |
0x18 | GDATAL | Lectura | Datos Verde – Byte bajo | 0x00 |
0x19 | GDATAH | Lectura | Datos Verde – Byte alto | 0x00 |
0x1A | BDATAL | Lectura | Datos Azul – Byte bajo | 0x00 |
0X1B | BDATAH | Lectura | Datos Azul – Byte alto | 0x00 |
En este caso, se va a utilizar los registros de ENBLE, ATIME, CONTROL, ID, CDATA, RDATA, GDATA y BDATA.
A continuación, se analizan las funciones implementadas para la configuración del sensor:
Primero, se ha implementado una función que comprueba que el sensor está conectado y es capaz de comunicarse ‘ComprobarConexion()’ como se puede observar a continuación:
El código se explica mediante sus propios comentarios.
Al llamar a la función, se indica si la conexión ha sido correcta o no.
A continuación, cómo se ha podido ver en ‘ComprobarConexion()’ hay que enviar el comando 0x80 para poder realizar cualquier escritura. Para ello, se han implementado las fución ‘EscribirRegistro(-, -)’ para facilitar el proceso.
Ahora, se explica la función para hacer la configuración inicial del sensor, igual que en las figuras anteriores, se explica mediante los comentarios del código:
Tambien, se incluye la llamada a la funcion:
Se procede a explicar la función ‘LeerColor()’ , dada que esta función es más compleja se explica mediante los comentarios en el código y una explicación adicional:
Primero, se va a explicar como funciona el registro ‘CDATA’ usado en esta función. Cada color y claridad, está almacenado en 16 bits y, estos 16 bits se dividen 2 byte (8 y 8), tal y como se puede ver en esta tabla:
Registro | Dirección | Bits | Descripción |
CDATA | 0x14 | 7:0 | Claridad : LSB |
CDATAH | 0x15 | 7:0 | Claridad : MSB |
RDATA | 0x16 | 7:0 | Rojo: LSB |
RDATAH | 0x17 | 7:0 | Rojo: MSB |
GDATA | 0x18 | 7:0 | Verde: LSB |
GDATAH | 0x19 | 7:0 | Verde: MSB |
BDATA | 0x1A | 7:0 | Azul: LSB |
BDATAH | 0x1B | 7:0 | Azul: MSB |
Se crean 4 variables de 16 bits sin signo para almacenar esta información. Aprovechando que la función ‘Wire.read()’ lee de byte en byte seguimos el siguiente orden :
- Primero se reciben los primeros 8 bits que, al ser ya la parte baja del byte, no hace falta moverlo.
- El siguiente byte recibido, se mueve 8 bits hacia la izquierda para poder organizar la información en 2 bytes cada color y claridad.
- Se usa la operación OR “|” para “sumar” bits dado que no escribimos sobre los existentes.
Comprobamos los resultados:
Puente en H
El puente en H, es un conjunto de transistores utilizado para poder controlar la dirección de un motor eléctrico. Estos, se activan por pares tal y como se puede ver en las siguientes figuras.
- Para que se mueve en un sentido, debemos activar los transistores Q1 y Q3.
- Para moverse en el sentido contrario, activamos Q2 y Q4.
Dado que tenemos cuatro motores en el vehículo pero, solo un puente en H, decidimos soldar cables entre los motores para trabajar con dos pares de motores, tal y como se puede observar en la siguiente figura:
El L298N incluye 2 puentes H, por lo que podemos controlar 2 motores. En nuestro caso, se quieren controlar 4 motores, para solucionar esto unimos los motores en pares (los de la derecha y los de la izquierda). Tal y como se puede ver en la siguiente figura. Ahora, se va a explicar el código encargado de controlar los motores. En la siguiente figura, se definen las variables encargadas de controlar el puente en H.
También, se definen las salidas encargadas de controlar la velocidad de los motores mediante PWM.
A continuación, debido a que el ESP32-S3 no tiene salidas PWM preconfiguradas, se deben crear dos variables que definan la frecuencia y resolución de las salidas PWM:
En primer lugar, explicamos el “void setup()”. Aquí se define la velocidad en Baudios del puerto serie y el modo de los pines que necesitamos, en este caso, salidas.
En segundo lugar, se comprueba que se han configurado las salidas PWM correctamente:
En tercer lugar, se indica la velocidad para enableA y enable B de los motores, pines encargados de modificar la velocidad de los motores. Como anteriormente se ha explicado, al haber configurado los pines de 8 bits, este parámetro puede variar de 0 a 255. Para evitar errores, se empieza el programa con los motores detenidos:
Al final del código, se programan funciones para que el coche sea capaz de avanzar, girar a la izquierda, girar a la derecha y detenerse.
CNY70- Sensor Óptico reflectivo con Fototransistor
Según el datasheet, el pinout es el siguiente:
Como se puede observar, el sensor consta de un emisor infrarrojo y un fototransistor. Según las recomendaciones del datasheet y de varias comunidades de makers, se ha optado por realizar el siguiente conexionado:
Al no contar con resistencia de 180 Ohms y, personalmente, solo tener de 10 kΩ y 1 kΩ, se optó por poner 4 resistencias en paralelo, tal y como se puede ver en la siguiente fórmula:
Valor que es más que suficiente para cumplir las especificaciones. Según los valores recibidos por los sensores por los pines 2 y 9, el movimiento del coche se modifica:
Servo motor SG90
Para dispensar los bloques en determinadas zonas, se utiliza un Servomotor SG90 que es capaz de mover la base. Para que se puedan dispensar los bloques, se ha diseñado una pieza auxiliar que aproveche las piezas que tiene el servomotor al adquirirlo. El diseño es el siguiente:
En los agujeros perforados, se acoplará el segundo sensor de color que detecte el color de los bloques.
MIT App Inventor.
Para realizar la conexión Bluetooth con el ESP32, se ha decidido usar la MIT App Inventor.
El objetivo de esta APP, es realizar el control remoto mediante conexión Bluetooth con un dispositivo móvil con software Android. A continuación se adjunta la interfaz diseñada:
A continuación se explica el funcionamiento de cada botón de la interfaz:
- Seleccionar el dispositivo Bluetooth.
- Mover el coche hacia delante.
- Girar el coche hacia la derecha.
- Girar el coche hacia la izquierda.
- Mover el coche hacia atrás.
- Parar el vehículo.
Este es el código asociado a la interfaz:
Primero se configura la conexión Bluetooth:
En segundo lugar, se programan los movimientos a realizar:
El código de Arduino asociado al control remoto, permite controlar un vehículo mediante comandos recibidos por UART1. Puede moverse en cuatro direcciones (adelante, atrás, izquierda, derecha) o detenerse. La velocidad está fijada al máximo mediante PWM, y también controla la alimentación. Debido a que estamos un ESP32-S3, hay que configurar la recepción de datos serie manualmente, para ello se utiliza la siguiente librería:
También, el pin del ESP32 que tiene la alimentación de 3.3 V para los sensores, está desactivado por defecto, para solucionar esto, definimos el pin para controlarlo:
A continuación, se configuran los motores tal y como se ha explicado en el apartado correspondiente:
Además, se configura la comunicación serial en los pines 41 (RX) y 42 (TX).
Adicionalmente, se configura la comunicación serial:
Configuramos los motores como se explica en el apartado correspondiente.
Ahora, se activa la fuente de 3.3 V:
A continuación, se espera a que se reciba información por el puerto serie. Esta información se almacena en un String “Dirección” y realizamos la operación según los comandos recibidos.