Tabla de contenido:

UCL Embedded - B0B the Linefollower: 9 pasos
UCL Embedded - B0B the Linefollower: 9 pasos

Video: UCL Embedded - B0B the Linefollower: 9 pasos

Video: UCL Embedded - B0B the Linefollower: 9 pasos
Video: Javonte Smart has Committed to LSU! Top 100 Camp Highlights! 2024, Mes de julio
Anonim
UCL Embedded - B0B el seguidor de línea
UCL Embedded - B0B el seguidor de línea

Esto es B0B. *

B0B es un coche genérico controlado por radio, que sirve temporalmente como base a un robot de seguimiento de línea.

Como tantos robots seguidores de líneas antes que él, hará todo lo posible para permanecer en una línea causada por una transición entre el piso y un material contrastante, en nuestro caso cinta adhesiva.

A diferencia de muchos otros robots de seguimiento de línea, B0B también recopila datos y los envía a través de WiFi.

Completamente exagerado para un proyecto de pasatiempo, involucra una serie de temas que pueden resultar interesantes. Esta guía describe su nacimiento, sus funciones y cómo puedes hacer uno como él.

También implica estar enojado con varios dispositivos electrónicos por no funcionar como queríamos, y los pasos que tomamos para superar esas dificultades (te estoy mirando ESP 8266-01).

Hay 2 códigos para que el proyecto funcione. El primer código es para el módulo ESP8266 que usamos Arduino como programador, y el segundo código se ejecutará en Arduino.

Paso 1: componentes

Para este proyecto necesitará:

Hardware:

• 1x coche controlador de radio, (debe tener ESC y servo de dirección).

Estábamos usando un Traxxas 1/16 E-Revo VXL en su mayoría de serie, principalmente porque eso es lo que teníamos, y estábamos bastante seguros de que podríamos controlarlo con un Arduino. Además, debido a que terminará llevando una cantidad no insignificante de hardware adicional, estábamos seguros de que esto no sería un problema para el 1/16 E-Revo.

Sin embargo, la mayoría de los automóviles controlados por radio (que se pueden desmontar fácilmente) probablemente podrían usarse en su lugar, y el proceso será muy similar.

• Una tonelada de cinta adhesiva.

El color debe contrastar el piso tanto como sea posible. En nuestro entorno de prueba, usamos cinta blanca en un piso oscuro.

• 1x Arduino Mega 2560.

Los Arduino más pequeños probablemente también estén bien, pero te presionarán por pines.

• 1x tabla de pan grande.

Uno es suficiente, pero también teníamos uno más pequeño para separar las otras líneas eléctricas de voltaje para reducir el riesgo de error del usuario.

• 1 sensor analógico IR TCRT5000 (utilizado para evitar colisiones).

La marca / modelo exacto no importa si es compatible con Arduino y mide la distancia. Busque palabras clave como "Distancia", "sensor de obstáculos". Técnicamente, un sensor digital también funcionaría con cambios menores en el código, pero estamos usando uno analógico.

• 1x o 2x Gravedad: Sensor analógico de escala de grises v2

Uno es una necesidad para el seguidor de línea. El modelo exacto no importa, siempre que observe la intensidad de la luz reflejada y emita una señal analógica. El segundo para la detección de "habitación" no funcionó tan bien como se esperaba y se puede omitir, o se puede encontrar una alternativa, como un sensor de color RGB, presumiblemente para un mejor efecto. Todavía tenemos que probar esto.

• 1 x ESP 8266-01.

Hay muchas versiones del ESP 8266 disponibles. Solo tenemos experiencia con el 8266-01 y no podemos garantizar que el código ESP funcione con una versión diferente.

• 1 x escudo Wi-Fi ESP8266-01.

Técnicamente opcional, pero si no lo usa, todo lo relacionado con el módulo Wi-Fi se volverá mucho más complicado. Sin embargo, la guía asumirá que tiene esto (si no es así, busque las guías en línea para conectar correctamente el ESP-01 al Arduino), ya que hacerlo incorrectamente puede dañar el módulo y probablemente lo dañará.

• Baterías para el propio vehículo y baterías para alimentar los componentes electrónicos adicionales.

Usamos un par de baterías Lipo de 2.2 AH de capacidad y 7.4V en paralelo para alimentar todo. Debería poder usar las baterías que normalmente usaría con su vehículo de elección. Si está por encima de 5 V pero por debajo de 20 V, la capacidad es más importante que el voltaje nominal.

• Muchos cables de puente.

Dejé de contar el número exacto de estos. Si cree que tiene suficiente, probablemente no lo tenga.

• Finalmente, para conectar todo, necesitará montar el Arduino, los sensores, la (s) placa (s) y el módulo Wi-Fi en el vehículo de su elección. Su resultado variará según lo que esté utilizando como base y los materiales disponibles.

Nosotros usamos:

• Cremalleras.

• Un poco de superpegamento.

• Pequeños trozos de papel de desecho / tubo de resina que teníamos con un diámetro adecuado.

• Una placa posterior de Masonite vieja de un marco de imagen, cortada a la medida.

• Un poco más de cinta adhesiva.

• Todas las herramientas necesarias para trabajar en el automóvil radiocontrolado de su elección.

Usamos principalmente un pequeño juego de destornilladores con múltiples brocas, pero ocasionalmente tuvimos que sacar el juego de herramientas de serie que venía con el automóvil.

Software:

• Nodo-rojo

Una parte importante de la recopilación de datos.

• Un servidor MQTT.

El intermediario entre nuestro vehículo y Node-red. Inicialmente, para las pruebas, usamos test.mosquitto.org

Más tarde usamos:

• CloudMQTT.com

Esto era mucho más confiable, lo que compensaba con creces el hecho de ser un poco más complicado de configurar.

• WampServer.

La última parte de la recopilación de datos. Específicamente, usaremos su base de datos SQL para almacenar nuestros datos recopilados.

Paso 2: diagrama eléctrico

Diagrama eléctrico
Diagrama eléctrico

Paso 3: Construcción física

Construcción física
Construcción física
Construcción física
Construcción física
Construcción física
Construcción física

Nuestra solución tiene un enfoque sencillo para el ensamblaje físico.

El receptor original y su carcasa impermeable se quitaron del automóvil RC, ya que no es necesario.

Descubrimos que había una ubicación adecuada entre las ruedas delanteras para nuestro sensor de seguimiento de línea, por lo que lo mantuvimos en su lugar colocando una brida sobre la placa protectora delantera.

El sensor que usamos para anticolisión está como encajado detrás del parachoques delantero. Todavía está protegido de los impactos y su ajuste por fricción. Termina mirando hacia adelante en un ángulo ascendente muy leve. Esto es perfecto.

La placa de Masonite, (placa posterior del antiguo marco de fotos), en la parte superior tiene pequeñas secciones de tubería de papel / resina cortadas a medida y pegadas en la parte inferior. Estos se alinean con los soportes de los postes del cuerpo y simplemente se asientan en la parte superior, sujetando todo de forma segura. Suponiendo que el pegamento que fija el tubo a la placa se mantenga y que no se incline excesivamente, este permanecerá en su lugar. También vale la pena señalar que la placa se encuentra dentro de la esfera protectora de las ruedas y los parachoques. El Arduino Mega y las dos placas de prueba se han pegado a la placa con cinta adhesiva de doble cara o con un bucle de cinta adhesiva enrollada alrededor, con pegamento.

No se han tomado medidas especiales para asegurar el módulo WiFi. No es nuestro, por lo que se consideró innecesario pegarlo o pegarlo con cinta adhesiva, ya que es tan liviano que no se mueve mucho y los cables son suficientes para mantenerlo en su lugar.

Por último, tenemos un sensor para detectar "habitaciones" que se unió a los componentes de la suspensión mediante una de las ruedas traseras. Durante la operación, esto debe estar alejado de la línea que marca el vehículo para navegar.

Paso 4: Módulo ESP8266

Módulo ESP8266
Módulo ESP8266
Módulo ESP8266
Módulo ESP8266

El módulo WiFi, ESP8266, requiere una configuración de dos pines diferentes. Se debe usar una configuración cuando se actualiza el módulo con un nuevo programa y se usa el Arduino Mega 2560 como programador. La otra configuración es para el módulo cuando está en uso y envía información al MQTT Broker.

Usando Arduino IDE para cargar código al módulo ESP8266, necesitará instalar un administrador de placa y un administrador de placas adicional

En el administrador de la placa, instale el administrador de la placa esp8266. Se encontrará fácilmente buscando "esp". Es crucial que instale la versión 2.5.0, ni más antigua ni más nueva.

En la configuración de las URL adicionales del administrador de tableros, copie en esta línea:

arduino.esp8266.com/stable/package_esp8266c…

Para poder cargar cualquier cosa en el módulo ESP8266, deberá usar una configuración de pin específica para que pueda actualizar el módulo. Esto debe hacerse cada vez que desee realizar un cambio en el código actual que se ejecuta en el módulo. No olvide seleccionar el módulo ESP8266 correcto del administrador de la placa antes de actualizar el módulo. En este proyecto elegimos la placa ESP8266 genérica. La configuración de pines para flashear el módulo se encuentra en la primera imagen de este segmento.

Después de haber flasheado el módulo ESP8266, debe cambiar la configuración de los pines. También puede optar por utilizar un adaptador para facilitar la configuración. En este proyecto, elegimos tener un adaptador siempre que tuviéramos el módulo en ejecución. La configuración de pines con adaptador se encuentra en la segunda imagen de este segmento.

El código que se va a flashear en el módulo ESP8266 configura la conexión a un WiFi y un MQTT Broker, en este caso con un nombre de usuario y contraseña, pero se puede prescindir si realiza los cambios necesarios descritos en los comentarios del código. Para este proyecto, nuestro corredor requirió un nombre de usuario y contraseña para trabajar. El módulo lee los mensajes entrantes del puerto serie al que está conectado. Leerá cada nueva línea creada por el código Arduino, descifrará el mensaje y volverá a crear el mensaje. A continuación, envía el mensaje al Broker MQTT que se ha especificado en el código. El código para el módulo ESP8266:

Paso 5: Arduino

Después de haber configurado el módulo WiFi, miramos el programa que se utilizará para controlar el motor y el servo en el coche RC. El automóvil reaccionará de acuerdo con una información de escala de grises del sensor central, también conocido como "Detector de línea" en este proyecto. Claramente, su objetivo es mantener la información del Detector de línea cerca de un valor preestablecido que iguale la información registrada en el cambio entre claro y oscuro o en este proyecto, blanco y negro. Entonces, si el valor difiere demasiado, la salida correspondiente al servo conducirá el automóvil cerca del valor preestablecido de la línea.

El programa tiene dos botones que funcionan como botón de inicio y parada para el automóvil RC. Técnicamente, el botón de "parada" es un botón de "armado" que en términos equivale a un valor de PWM enviado al motor que hace que el coche RC se detenga. El botón de inicio envía un valor de PWM que iguala al automóvil RC que apenas avanza, ya que conducirá demasiado rápido si gana demasiado impulso.

Se agrega un detector para evitar colisiones en la parte delantera del automóvil RC para detectar si el camino por delante está despejado o bloqueado. Si está bloqueado, el coche RC se detendrá hasta que el obstáculo desaparezca o se elimine. La señal analógica del detector se usa para determinar si algo está bloqueando el camino o no y se convierte en un criterio para poder avanzar y detenerse.

Un sensor secundario de escala de grises, "Room Detector", se utiliza para detectar en qué habitación ha entrado el coche RC. Funciona con un principio similar al Line Detector, pero no busca el cambio entre claro y oscuro, sino valores dentro de un rango específico que corresponde a diferentes habitaciones dependiendo del valor visto desde el Room Detector.

Por último, el programa crea una línea de información de los sensores para que el módulo WiFi lea y luego envíe al Broker MQTT. La línea de información se crea como una cadena y se escribe en la serie correspondiente a la que está conectado el módulo WiFi. Es importante que la escritura en la serie solo ocurra tan a menudo como el módulo WiFi pueda leer el mensaje entrante, pero recuerde no usar ningún retraso en este código, ya que interferirá con la capacidad del automóvil RC para seguir la línea. En su lugar, use "millis", ya que permitirá que el programa se ejecute sin demora, pero después de pasar una cantidad definida de milis desde que se encendió el Arduino, escribirá un mensaje en la serie sin bloquear el código de la misma manera que lo hace el delay.

El código para Arduino Mega 2560:

Paso 6: base de datos MySQL

WampServer es un entorno de desarrollo web para Windows que nos permite crear aplicaciones con PHP y una base de datos MySQL. PhpMyAdmin nos permite gestionar nuestras bases de datos de forma sencilla.

Para comenzar, vaya a:

En este proyecto usamos la versión 3.17 x64 bits para Windows. Después de la instalación, asegúrese de que todos los servicios se estén ejecutando, lo que significa que el pequeño icono se vuelve verde en lugar de rojo o naranja. Si el ícono es verde, entonces puede acceder a PhpMyAdmin para administrar su base de datos MySQL.

Acceda a MySQL usando PhpMyAdmin y cree una nueva base de datos. Nómbrelo con algo apropiado que pueda recordar, en este proyecto se llamó "line_follow_log". Después de crear la base de datos, debe crear una tabla en la base de datos. Asegúrese de que el número de columnas se ajuste. En el proyecto usamos 4 columnas. Una columna es para una marca de tiempo y las últimas tres se utilizan para almacenar datos del vehículo. Utilice un tipo de datos adecuado para cada columna. Usamos "texto largo" para la columna de marca de tiempo y "texto medio" para el resto.

Eso debería ser todo lo que tienes que hacer en PhpMyAdmin y MySQL. Recuerde su base de datos y la tabla de la sección sobre Node-Red.

Paso 7: Node-Red

Para manejar la recopilación de datos, usaremos un flujo bastante simple en Node-red. Se conecta a nuestro servidor MQTT y escribe en nuestra base de datos MYSQL.

Para hacer esto, necesitamos algunas paletas para que funcionen varias funciones, y necesitamos algo de código real para que se ejecute.

Lo primero es lo primero. Necesitaremos las siguientes paletas.

Node-red-contrib-mqtt-broker: esta es la conexión con nuestro corredor MQTT.

Node-red-dashboard: Nuestro panel, necesario para representar visualmente los datos recopilados.

Node-red-node-mysql: nuestra conexión a la base de datos SQL.

Esto no pretende ser una guía completa para Node-red, pero explicaré lo que hace el flujo de Node-red.

Al principio, tuvimos problemas con la muerte / desconexión de nuestro servidor MQTT de elección, aparentemente al azar, lo que hizo que realizar cualquier cambio fuera un esfuerzo frustrante, ya que no estaba claro si los cambios habían sido beneficiosos o no cuando no podíamos ver el resultado. Entonces, el botón '¿Murió el servidor?' inyecta 'No' el siguiente bloque lo inyecta en nuestro servidor MQTT. Si no está muerto, aparecerá 'No' en la ventana Depurar. Esto se hace no solo para probar, sino para forzar a Node-red a intentar volver a conectarse al servidor MQTT.

La 'Cadena de prueba' envía una cadena personalizada al corredor de MQTT. Formateamos esta cadena para que sea similar a lo que obtendríamos del Arduino. Esto fue para facilitar la configuración de la red que decodifica los mensajes, sin necesidad de tener el proyecto en ejecución, recopilando datos.

El último flujo del espacio de trabajo se puede dividir en dos segmentos. La rama inferior simplemente lee los mensajes entrantes, los publica en la ventana de depuración y los guarda en el servidor SQL.

La gran red de conmutadores conectados que siguen a un nodo de función si es donde ocurre la verdadera 'magia'.

La función de procedimiento lee la cadena entrante, la divide con cada punto y coma y pasa las secciones en cada una de las salidas. Los siguientes conmutadores buscan una de dos piezas diferentes de información entrante. Una información específica siempre se transmite a través de una salida, la otra opción sale por la segunda salida. Después de eso, hay un segundo grupo de bloques de interruptores. Solo se activarán con una entrada específica y emitirán algo más.

Un ejemplo, "obstáculo", como todos los demás son una opción binaria, o está claro para conducir o no. Por lo tanto, recibirá un 0 o un 1. Se enviará un 0 a la rama 'limpia', y un 1 a la rama 'Obstruida'. Los interruptores 'Limpiar', 'Obstruido', si se activan, darán salida a algo específico, Despejado u obstruido, respectivamente. Los bloques de procedimiento verdes se publicarán en la ventana de depuración, el azul se escribirá en nuestro tablero.

Las ramas de 'estado' y 'ubicación' funcionan exactamente igual.

Paso 8: Broker MQTT

Un Broker es un servidor que enruta los mensajes de los clientes a los clientes de destino adecuados. Un intermediario MQTT es aquel en el que los clientes utilizan una biblioteca MQTT para conectarse al intermediario a través de una red.

Para este proyecto creamos un Broker MQTT usando el servicio CloudMQTT con la suscripción gratuita para una versión "Cute Cat". Tiene sus limitaciones, pero no las superamos en este proyecto. El módulo WiFi puede conectarse al corredor y el corredor luego enruta los mensajes a un cliente de destino apropiado. En este caso el cliente es nuestro Node-Red. El servicio CloudMQTT establece un nombre de usuario y contraseña para su servidor, por lo que se nos garantiza una mayor seguridad. Básicamente significa que solo aquellos con el nombre de usuario y la contraseña pueden acceder a este servicio específico de CloudMQTT. El nombre de usuario y la contraseña son cruciales al configurar la conexión en el código ESP8266, así como en Node-Red.

Las estadísticas continuas de los mensajes que recibe el corredor es una característica agradable, que puede usarse para ver qué tan bien su plan de suscripción está manejando la información que enruta.

Una buena característica es la posibilidad de enviar mensajes desde el Broker al módulo WiFi, pero no los usamos en este proyecto.

Paso 9: Electrónica para pasatiempos

Antes de comenzar, sabíamos por un proyecto anterior que el servo de dirección de stock podía controlarse desde un Arduino con una señal PWM, que tenía un cableado similar y se conectaba a diferentes canales en el mismo receptor de radio de stock, asumimos el Control de velocidad electrónico, (ESC de ahora en adelante), que controla el motor, podría controlarse de manera similar a través de PWM desde el Arduino.

Para probar esta teoría, diseñamos un pequeño boceto de Arduino. El boceto lee una entrada analógica de un potenciómetro, reasigna el valor de 0, 1024 a 0, 255 y envía el valor resultante a un pin PWM, usando analogWrite () mientras tenía el automóvil R / C en una caja pequeña, y tenía el ruedas quitadas.

Después de recorrer el rango en el medidor de potenciómetro, el ESC pareció 'despertar' y pudimos acelerarlo hacia arriba y hacia abajo, también hicimos que Arduino imprimiera los valores en la conexión en serie para poder monitorearlos.

Al ESC parecía no gustarle valores por debajo de un cierto umbral, en este caso 128. Vio la señal 191 como acelerador neutral y 255 como acelerador máximo.

No necesitábamos variar la velocidad del vehículo y lo estábamos haciendo perfectamente a la velocidad más lenta que lo haría moverse. 192 fue el valor más bajo que haría girar el motor, sin embargo, aún tenemos que ensamblar todo y no estamos seguros de si esta salida sería suficiente para mover el vehículo después del ensamblaje final; sin embargo, ingresar un valor ligeramente mayor debería ser trivial.

Sin embargo, eludir el potenciómetro y poner un valor fijo en el código no funcionó. El ESC original simplemente parpadeaba y no hacía girar el motor, 'ajustaba el nivel del acelerador' de acuerdo con el manual.

La resolución de problemas furiosa, arrojarle varios valores, usar diferentes cables e incluso experimentar con el cambio de la frecuencia PWM que usa Arduino resultó en más rarezas.

Parecía ser un problema intermitente, a veces se ejecutaba, otras veces se negaba a hacer nada. Simplemente siguió parpadeando. Una prueba con el controlador y el receptor originales confirmó que el ESC seguía funcionando exactamente como se esperaba, lo que hizo que los problemas fueran aún más extraños. Los valores más altos, se ignoró y siguió parpadeando, los valores más bajos el ESC volvió a brillar en un verde feliz, pero aún así no giró.

¿Qué fue diferente de la configuración con el potenciómetro, o el transmisor y receptor de serie, y la versión que proporcionaba valores fijos?

A veces, el trabajo según lo previsto y el funcionamiento esperado no se superponen mucho en el diagrama de Venn. En este caso, al ser un juguete, no debería haber ninguna posibilidad de que el modelo simplemente se despegue o se rompa los dedos o que se enganche el pelo en las ruedas o el tren de transmisión cuando el modelo se enciende, incluso si algo como sostener el transmisor de manera extraña tiene el acelerador en cualquier otra posición que no sea neutral.

"Ajustar el nivel del acelerador", eso es exactamente lo que significa. El ESC está esperando una señal neutral cuando se enciende, antes de obtener que no hará nada. Normalmente, el transmisor siempre estaría en neutral cuando el ESC está encendido y desde allí conducirá felizmente. En caso de que no sea así, probablemente esté de vuelta en neutral al menos una vez para cuando el modelo esté firmemente en el suelo y el operador se sienta listo para correr.

Mientras usábamos el potenciómetro, estábamos 'barriendo' los rangos y luego comenzaba a funcionar. Simplemente se armó cuando el potenciómetro pasó de la posición neutral y luego funcionó.

Los rangos más bajos, sin embargo, todavía parecían disgustar a la ESC. Esto resulta que es un producto de los ciclos de trabajo de PWM.

Ya sea por diseño o por una razón técnica, tanto el servo de dirección como el ESC ignoran las señales por debajo del 50% de los ciclos de trabajo. Esto podría ser en caso de que el receptor / transmisor deje de funcionar o se quede sin energía, el modelo volvería a neutral y no despegaría en la distancia con el acelerador completamente inverso. Del mismo modo, el servo solo gira 180 grados y no necesita el rango completo.

Con este nuevo conocimiento en la mano, se creó un nuevo boceto de Arduino. La versión inicial acepta cadenas ingresadas en el monitor Serial, lo convierte en un número entero y lo mueve al pin PWM, usando la biblioteca de servos y write () *. Si se ingresa un nuevo valor en el monitor serial, se actualiza el valor de escritura ().

Durante las pruebas, el Traxxas ESC original fue reemplazado por un Mtroniks G2 Micro, sin embargo, deberían funcionar igual, aunque los valores exactos pueden ser ligeramente diferentes.

Esta biblioteca trata el ESC como un servo, aparentemente esto está bien. La función write () de la biblioteca Servo.h va de 0 a 180, se espera que la señal de armado esperada esté en el medio.

El G2 Micro se arma en una escritura () en un rango de valores cercano a 90, sin embargo, fue difícil de precisar, ya que parece "recordar" haber sido armado.

Se espera que el Traxxas VXL-s3 se arme a un valor de escritura () de 91.

Después de la señal de armado, ESC aceptó felizmente las señales PWM, sin importar las funciones de Arduino llamadas para generarlas, y controla el motor en consecuencia.

Hablando de funciones; el estándar analogWrite (), así como write () y writeMicroseconds () de la biblioteca Servo.h se pueden usar indistintamente, solo tenga en cuenta qué hace qué y, en última instancia, nada más que el ciclo de trabajo importa. WriteMicroseconds () podría usarse si se requiere una mayor granularidad, solo tenga en cuenta que el rango aquí es de 1000 a 2000, y se espera que el armado o 'neutral' esté en 1500. Con el estándar analogWrite () se espera que el rango utilizable sea ser de 128 a 255 con alrededor de 191 siendo neutral.

Recomendado: