Arduino Proyecto "RoboCar4W Robot Machine"

Usted entiende ", explicó el editor," debe ser entretenido, fresco, lleno de aventuras interesantes ... para que el lector no pueda salir.
I. Ilf, E. Petrov "Cómo se creó Robinson" .


Comenzar con Arduino, como con cualquier otra plataforma de software o hardware, siempre es más interesante desde un proyecto real. Al mismo tiempo, los programadores escriben un código que muestra "Hola, mundo", los arduinistas parpadean un LED. Y todos son felices como niños.


Decidí comenzar con un proyecto avanzado, incluso con la esperanza secreta de separar a la generación joven de Counter-Strike (fallido).


Como se puede adivinar por el nombre RoboCar4W, el primer proyecto fue un automóvil robot de cuatro ruedas. Al comenzar a trabajar, ya tenía experiencia en programación, una vez supe cómo soldar durante mucho tiempo, pero ni siquiera conocía los pinouts de Arduino y no leí la documentación en absoluto. Estudié toda la sabiduría en el curso de la obra y Google para ayudar.


Dado que el proyecto en sí mismo no es fundamentalmente nuevo, tales descripciones en la red son suficientes, todos los componentes son conocidos, no se esperaban sorpresas. Por lo tanto, la idea se formuló en los términos más generales y el objetivo principal era sumergirse en el "mundo de las cosas" utilizando Arduino, como plataforma para la creación rápida de prototipos. En esta obra, tal vez alguien se reconoce al comienzo del viaje.


Todo el hardware se compró en eBay, y desde mi propia experiencia quiero decir que es más fácil comprar un kit de inicio de inmediato (búscalo en las palabras del Kit de inicio de Arduino), en lugar de ensamblarlo en detalle. Sí, y todos vienen a la vez juntos. Se decidió no jugar, comprar un chasis normal, ruedas normales, motores normales, por lo que era "caro".


El secreto principal para las compras exitosas en eBay es comprar a los vendedores mejor calificados y leer cuidadosamente la descripción del producto. Hay muchos artículos sobre esto en Internet.


¿Qué placa Arduino elegir?


Tomé Arduino UNO, muchos proyectos con descripciones para ello. Pero ahora tomaría el Arduino Mega 2560, tiene más salidas digitales y analógicas y compatibilidad total en proyectos con UNO.


Descripción general del proyecto.


En el mundo del desarrollo de software, esto también se llama "requisitos del sistema".


La idea del proyecto fue la siguiente. La primera versión de la máquina robot llamada RoboCar4W debe realizar acciones simples:


  • avanzar, retroceder, realizar giros
  • medir la distancia a los obstáculos
  • ser capaz de sortear automáticamente los obstáculos al frente.

La segunda versión de la máquina debe controlarse manualmente a través de Bluetooth desde un teléfono Android.


Para que haya trabajado mejor aquí está todo el proyecto final RoboCar4W ensamblado (aquí sin bluetooth).


Arduino RoboCar4W


Aquí hay un video de pruebas en el mar.


En el primer video, RoboCar4W conduce en modo automático con evitación de obstáculos en dos versiones diferentes del "firmware", es decir Esbozar, por lo tanto, si alguien es el más entusiasta y se da cuenta de que el comportamiento del robot en diferentes episodios es ligeramente diferente.


Coche robot RoboCar4W


En el segundo video, RoboCar4W se mueve con la ayuda de comandos transmitidos por el "controlador" a través de Bluetooth desde un teléfono móvil con Android. "Bluetooth RC Car" está instalado en el teléfono. Además, si hay un obstáculo cerca al frente, el robot se detiene, es decir. embestir algo no funcionará (sin embargo, hay un botón "secreto" que desactiva el modo seguro).


Coche robot RoboCar4W


En el tercer video, RoboCar4W muestra un programa de movimiento de demostración preprogramado con turnos. El programa de demostración se activa por comando desde el mismo teléfono móvil con Android. El robot solo monta un rato y hace giros.


Coche robot RoboCar4W


Algoritmo de control de movimiento


Es un error llamar a nuestro método "algoritmo para evitar obstáculos" o "búsqueda de ruta". Estas son disciplinas matemáticas separadas, matemáticas puras. Si realmente te gustan las matemáticas, entonces busca estas frases en google, se te proporcionará lectura durante seis meses.


Mientras tanto, nos interesan las cosas mucho más fácilmente. Por lo tanto, lo llamaremos simplemente: el algoritmo de control de movimiento de un robot de 4 ruedas. Por supuesto, estamos hablando de control automático sin intervención humana.


Aquí está este algoritmo simple escrito en palabras, para algoritmos más complejos es necesario (lo quiera o no) componer diagramas de bloques.


Ahora, al mismo tiempo, mire el código fuente del boceto RoboCar4W-1.ino .


  1. Medimos la distancia al obstáculo al frente.
  2. Si esta distancia medida es menor que el valor DST_TRH_BACK (corto para el umbral de distancia), entonces nos detenemos y retrocedemos mientras giramos. La dirección de rotación se elige de la siguiente manera: si previamente giró a la izquierda, gire a la derecha y viceversa.
  3. Si la distancia medida es mayor que DST_TRH_BACK , pero menor que DST_TRH_TURN , simplemente gire. La dirección de rotación se elige al azar.
  4. Si está lejos del obstáculo, simplemente continúe.
  5. Repetimos de nuevo.

¿Qué tiene de bueno que tengamos 4 ruedas y tracción total? Podemos realizar (programar) varios tipos de turnos:


  • Rotación suave Todas las ruedas giran, pero las ruedas de un lado giran más rápido.
  • Un giro brusco. Las ruedas giran solo por un lado.
  • Giro en U en su lugar. Como un tractor, las ruedas de un lado giran hacia atrás y el otro hacia adelante.

En la segunda versión del programa, cuando se controla desde un teléfono Android, el modo seguro, cuando el robot intenta evitar colisiones frontales, se puede desactivar si se presiona el programa dos veces
Botón


y se volvió a encender presionándolo una vez.


Nota importante Toda la lógica está bajo el control de Arduino. Android aquí actúa como una consola de juegos (sin cerebro) desde la consola, su tarea es transmitir estúpidamente presionar botones (es decir, comandos) a través de Bluetooth al Arduino RoboCar4W.


Componentes


Inicialmente, la máquina incluía un servoaccionamiento que giraba el medidor de distancia ultrasónico un cierto ángulo para mediciones en tres direcciones. Pero durante las pruebas, debido a un manejo descuidado, el servo se quemó, por lo que ahora el sensor de distancia simplemente se fija rígidamente frente a la caja.


No hay un lado positivo, pero el boceto se ha vuelto un poco más fácil.


Para el futuro, compre el servo más simple y económico, no se necesita potencia especial, velocidad y precisión de rotación en un ángulo dado, y resulta que es bastante fácil deshabilitar un servo, como resultó. SG90 por valor de $ 2 es un buen ajuste.


Por lo tanto, los componentes del proyecto RoboCar4W incluyen una descripción en inglés para facilitar la búsqueda en eBay y similares:


  • Arduino UNO R3
  • Chasis listo para usar 4 ruedas motrices Plataforma de robot móvil Chasis de automóvil inteligente Compatible con Arduino
  • Motores de corriente continua con rotación en ambas direcciones - 4 piezas
  • Ruedas - 4 piezas
  • Placa para controlar 4 motores de CC Motor Drive Shield L293D
  • Medidor de distancia por ultrasonidos HC-SR04 Módulo de ultrasonidos Sensor de medición de distancia
  • Baterías Ni-MH 1.2 V - 8 piezas
  • Soporte de caja de plástico para baterías, Soporte de caja de batería 4 baterías AA - 2 piezas.
  • Tipo de batería "Krona" 8.4 V - 1 pc.
  • Interruptor de palanca opcional - interruptor de encendido

El chasis, los motores de CC y las ruedas se compraron inmediatamente en el kit e incluso con instrucciones de montaje.


Pinout


Las entradas analógicas se pueden usar como pines digitales de puertos de E / S. Los pines Arduino correspondientes a las entradas analógicas están numerados del 14 al 19. Esto se aplica solo a los pines Arduino, no a los números de pin físicos del microcontrolador Atmega.


No tiene que dibujar, simplemente puede poner todo en una mesa. Lo hice de esta manera.


Pinout


Los pines D4, D7, D8, D12 estarán ocupados si se utilizan motores de CC o motores paso a paso.


Los pines D9 (control del servo n. ° 1), D10 (control del servo n. ° 2) se utilizarán solo si se utilizan servomotores.


El pin Arduino no ocupa los pines Arduino para controlar el Motor Drive Shield L293D.


Los pines de alimentación de 3.3 V, 5 V y tierra están duplicados en el blindaje del motor en cantidades suficientes. Por lo tanto, no hay necesidad de preocuparse por su escasez.


Si aún quieres dibujar maravillosamente, entonces el programa gratuito Fritzing te ayudará.


Nutrición


Este es el segundo punto muy importante. Mucho depende de la nutrición. Por ejemplo, un servomotor al girar el eje en un ángulo dado comienza a consumir mucha corriente. Al mismo tiempo, si el servo está alimentado por un Arduino de 5 V, entonces hay una "reducción" en el voltaje y el resto del circuito comienza a fallar, y el Arduino puede incluso reiniciarse al mismo tiempo.


En cualquier caso, si utiliza motores en la embarcación, se necesita un Motor Drive Shield (o un circuito similar).


Por lo tanto, tenemos 4 motores de CC, un servoaccionamiento, la placa Arduino y varios sensores. Los motores son los más glotones, pero los sensores pueden alimentarse con éxito desde los conectores de la placa Arduino, por lo que todo es simple con ellos. Por conveniencia, he reducido toda la economía en una sola tabla.


Tensión recomendada o típica. Consumo actualTensión máximaLo que se planea alimentarNotas
Arduino UNO R3 Board7 - 12V, 200mA (promedio)6 - 20"Krone 9V" Li-ion 650mAh, 8.4VConector central
Servomotor MG-9955-6 V, 0.1 - 0.3A (pico)4.8 - 7.2Baterías (5) piezas Ni-Mh 1.2V = 6VAlimentos solo de una fuente separada. Si enciende junto con Arduino, entonces todo fallará. 4 voltios de batería Ni-Mh * 1.2V = 4.8V no es suficiente. Algunos sostienen que este servo no debe usarse a 6 voltios solo 4.8
Motores DC (4 piezas)6 - 8V, corriente de 70mA a 250mA3 - 12baterías (5 + 3) piezas Ni-Mh 1.2V = 9.6VNo podrá arrancar los motores normalmente con una batería de 9 V, ¡así que ni siquiera pierda tiempo (y baterías)!
Motor Drive Shield L293Dno requerido4,5 - 36no requerido
Módulo Bluetooth HC-05063,3 V, 50 mA1.8-3.6Con pin placa Arduino 3.3V
Medidor de distancia por ultrasonidos HC-SR045 V, 2 mA5 5Con pin placa Arduino de 5V

No tenía un convertidor de voltaje CC / CC. Krona 9V no era una muy buena fuente de energía, ya la tenía.


Pero me negué a usar baterías de iones de litio de alta capacidad. En primer lugar, debido al alto costo, y en segundo lugar, en las compras en línea chinas es fácil encontrarse con una falsificación. Más precisamente, no "fácil", sino "siempre". Además, el ion de litio requiere un manejo especial, y no es seguro.


Entonces, como vemos en la tabla, necesitamos 3 fuentes de energía independientes:


  • Para placa Arduino y sensores.
  • Para servomotor.
  • Para 4 motores DC.

¿Dónde puedo obtener tanto? En cualquier caso, la placa Arduino debe alimentarse desde una fuente separada, como cuando el voltaje "baja", por ejemplo, al encender los motores, la placa puede reiniciarse o simplemente fallar. Aquí usamos la batería del factor de forma Krona 9V, y el conector que se conectará al Arduino debe estar con un "más en el centro".


Para un servomotor y 4 motores de CC, puede hacerlo con una fuente de alimentación. El único problema es que el servomotor está diseñado para un voltaje de 5-6V (máximo 7.2V) y una corriente de 100-300mA (pico), y los motores de CC necesitan 6-8V (máximo 12V) y una corriente de 250mA.


Para resolver el problema, hay convertidores DC-DC, pero no los tenía. Como resultado, apliqué mi diagrama de cableado "patentado" (sin circuitos electrónicos reductores, ¡solo voltaje y corriente ecológicos!): Conecté 8 piezas. Baterías de 1.2V en serie y tomas en los lugares correctos, como se muestra en el diagrama.


Nutrición


6V fueron al servomotor, y 9.6 fueron a los motores DC. Está claro que las baterías 1-5 experimentarán una mayor carga.


Para controlar motores servo y de corriente continua, utilicé un motor Drive Shield de 4 canales basado en el chip L293D.


Asamblea


Ensamblar el chasis terminado es un pequeño problema. Pero no piense que sin dopaje obtendrá todo de inmediato. Por lo tanto, prepare los archivos.


Asamblea


Asamblea


No es posible conectar varios motores normalmente, un servomotor o un motor paso a paso directamente al Arduino. Dado que los pines (conclusiones) del Arduino son de baja corriente. Para resolver el problema, hay un módulo de control de unidad adicional: Motor Drive Shield basado en el chip L293D, que es uno de los chips más comunes diseñados para este propósito. El chip L293D también se conoce como H-Bridge.


Utilicé una placa que proporciona 4 canales para conectar dos chips L293D y un registro de desplazamiento. Comprado en eBay por $ 5.


Esta placa del módulo de control del variador tiene las siguientes especificaciones.


  • L293D Motor Drive Shield compatible con Arduino Mega 1280 y 2560, UNO, Duemilanove, Diecimila
  • Control de 4 canales
  • motores alimentados de 4.5V a 36V
  • corriente de carga permitida 600mA por canal, corriente de pico - 1.2A
  • protección contra sobrecalentamiento
  • 2 interfaces con un temporizador Arduino exacto (no habrá "jitter") para conectar los servomotores a 5V, si la tensión de alimentación debe ser mayor, entonces la conexión de alimentación debe rehacerse como se describe a continuación
  • Se pueden controlar simultáneamente 4 motores de colector de CC bidireccionales o 2 motores paso a paso y 2 servomotores
  • 4 motores DC bidireccionales están conectados a un bus de 8 bits para la selección de velocidad individual
  • Conexión de unidades de hasta 2 pasos (unipolar o bipolar), con una bobina, doble bobina o pasos alternos
  • conector para conectar una fuente externa para una fuente de alimentación separada de lógica de control y motores
  • Botón RESTAURAR Arduino
  • La biblioteca Adafruit AFMotor se utiliza para la gestión.

Motor Drive Shield necesita un poco de refinamiento para que pueda conectar cualquier cosa después de él. Solde los conectores necesarios en la parte superior, esto es lo que sucedió.


Escudo de accionamiento del motor


Los motores se pueden conectar a una fuente de alimentación adicional en relación con la placa Arduino. Recomiendo solo este método de conexión. Para hacer esto, quite, abra el puente, como se muestra en la imagen.


Blindaje de accionamiento de motor L293D de 4 canales. Puente para alimentación externa.


En este caso, el Arduino se alimenta y los motores se alimentan independientemente uno del otro.


El LED en el escudo del motor se enciende cuando hay energía para los motores, si no está encendido, los motores no funcionarán.


Nuevo problema


La posición del puente de alimentación no se aplica a los servos, todavía estarán alimentados por 5V Arduino. Dado que los servomotores generalmente consumen mucha corriente y si la potencia es insuficiente, entonces todo el dispositivo comienza a fallar, en el "mejor" caso, solo fallará el servoaccionamiento: no rotará en el ángulo establecido, o todo el tiempo antes de cada turno gire primero a 0 grados, y solo entonces en un ángulo dado (y si puedes seguir el ritmo). Por lo tanto, recomiendo alimentar el servo también desde una fuente de alimentación adicional. Para hacer esto, tendrá que rehacer ligeramente el diagrama de conexión: muerda el cable positivo (generalmente rojo) del conector estándar y conéctelo directamente al positivo de la fuente de alimentación.


Finalización para conectar la potencia del servomotor


Al conectar un Motor Drive Shield, no se utilizan pines analógicos. Los pines digitales 2, 13 no se utilizan.


Los siguientes pines se usan solo si se conectan y usan los motores de CC o motores paso a paso correspondientes:


  • D11: Motor DC # 1 / Stepper # 1 (activación y control de velocidad)
  • D3: Motor DC # 2 / Stepper # 1 (activación y control de velocidad)
  • D5: Motor DC # 3 / Paso a paso # 2 (activación y control de velocidad)
  • D6: Motor DC # 4 / Stepper # 2 (activación y control de velocidad)

Estos pines estarán ocupados si se utilizan DC / steppers: D4, D7, D8, D12.


Los siguientes pines se ocuparán solo si se utilizan los servomotores adecuados:


  • D9: control Servo # 1
  • D10: control servo # 2

Tabla de conexión


Para comenzar con Motor Drive Shield, debe descargar e instalar la biblioteca Adafruit AFMotor .


Código de ejemplo para controlar motores:


 #include <AFMotor.h> //   Adafruit #include <Servo.h> //     AF_DCMotor motor(1); //   ,    DC    Motor Shiled , ,  frequency Servo servo; //    servo.attach(10); //     9  10 (    Motor Shiled) motor.setSpeed(speed); //   DC   0 ()  255 ( ) motor.run(RELEASE); // DC   motor.run(FORWARD); // DC   motor.run(BACKWARD); // DC   servo.write(90); //    90 . 

El motor de CC comenzó a girar solo cuando indica una velocidad superior a 100, si es menor, solo zumba. Tendrá que determinar la velocidad mínima de su motor experimentalmente.


Para los motores conectados a M1 y M2, puede configurar la frecuencia: MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, MOTOR12_1KHZ. La velocidad de rotación más alta se alcanza a 64KHz, esta frecuencia se escuchará, la frecuencia más baja y la velocidad a 1KHz, pero también usa menos energía. Los motores 3 y 4 siempre funcionan a 1KHz; se ignoran otros valores. El valor predeterminado es 1 kHz en todas partes.


Después de eso, es necesario ejecutar una prueba de motores. Boceto para la prueba se puede tomar aquí . Al comienzo del boceto, cambie el número del motor en una línea (o en líneas) del tipo:


 AF_DCMotor motor(); 

Un boceto durante algún tiempo gira los motores hacia adelante a lo largo del movimiento del robot y luego hacia atrás. Mire cuidadosamente para ver si el motor gira en esa dirección, y cambie la polaridad de la conexión si es necesario.


Conectamos el medidor de distancia ultrasónico Módulo ultrasónico HC-SR04. Pinout:


  • Vcc
  • Trig (T)
  • Eco (r)
  • GND

El tiempo empleado por el buscador de rango ultrasónico en mediciones (determinado empíricamente):


  • máximo 240 ms si la distancia es demasiado larga (fuera de rango)
  • al menos 1 ms si la distancia es demasiado corta
  • se determina una distancia de 1,5 m en aproximadamente 10 ms

Medidor de distancia por ultrasonidos Módulo ultrasónico HC-SR04


Un sensor de rango ultrasónico, debido a su naturaleza física, y no porque China, en algunos casos, determina mal la distancia a un obstáculo:


  • Si el obstáculo tiene una forma compleja, el ultrasonido se refleja en diferentes ángulos y el sensor está equivocado.
  • El ultrasonido es perfectamente absorbido (es decir, no reflejado) por muebles tapizados o juguetes, y el sensor cree que no hay nada frente a él.

En otras palabras, para un telémetro ultrasónico, idealmente sería excelente si todos los obstáculos estuvieran en forma de un plano sólido perpendicular a la dirección de la radiación de ultrasonido.


Algunos problemas se pueden resolver con un sensor de distancia infrarrojo. Pero tampoco es perfecto:


  • rango máximo pequeño en comparación con el ultrasonido: 0.3-0.8 m versus 4 m
  • gran distancia mínima en comparación con la ecografía: 10 cm frente a 2 cm
  • Dependencia de la sensibilidad del sensor de la iluminación general.

Aunque si instala estos telémetros en un par, la eficiencia de su trabajo aumentaría significativamente.


Conecte Bluetooth HC-05


Como puede ver en la hoja de datos, los pines principales del HC-05 "desnudo":


  • Transmisión TX (pin 1)
  • Recepción RX (pin 2)
  • 3.3V (pin 12) fuente de alimentación 3.3V
  • GND (pin 13) tierra
  • Indicador de modo PIO8 (pin 31)
  • Estado de conexión PIO9 (pin 32), si se establece la conexión, la salida será alta
  • PIO11 (pin 34) para habilitar el modo de comando AT

Nuestro módulo está soldado a la placa base / breakout, donde ya hay un divisor de voltaje, por lo que tiene un rango de voltaje de trabajo de 3.3V a 6V.


Conectamos nuestro conjunto de módulo Bluetooth:


  • Arduino (TX) - (RX) HC-05
  • Arduino (RX) - (TX) HC-05
  • Arduino (+ 5V) - (VCC) Bluetooth
  • Arduino (GND) - (GND) Bluetooth
  • LED, los pines KEY no se utilizan

Una vez que se suministra energía al módulo Bluetooth HC-05, el LED debe parpadear, lo que significa que el bluetooth está funcionando.


Encienda bluetooth en el móvil, busque el dispositivo con el nombre HC-05 y conéctese, contraseña 1234.


Para probar, complete un boceto simple en Arduino:


 int count = 0; void setup() { Serial.begin(9600); Serial.println("Test Arduino + Bluetooth. http://localhost"); } void loop() { count++; Serial.print("Count = "); Serial.println(count); delay(1000); } 

En el teléfono Android, instale el terminal Bluetooth. Estamos conectados al dispositivo HC-05 y observamos en la pantalla del teléfono líneas que se arrastran con un contador creciente.


Para que el módulo pueda recibir los comandos AT, debe ponerlo en el modo apropiado; para esto, debe configurar la salida KEY (PIO11) en 1 lógico. En algunos paneles Breakout / Base, en lugar de la salida KEY, hay una salida EN (ENABLE), que puede o no ser soldado al pin en el chip en sí. Esto se aplica solo a los chips HC05. Esa es solo mi salida de terminal EN no está soldada en ninguna parte. Por lo tanto, se puede soldar con un cable separado al terminal KEY (PIO11) del chip. O, durante la operación, para poner el HC05 en modo de comando AT, cortocircuite la salida del chip KEY (PIO11) a la salida de potencia Vcc durante un par de segundos. Para HC06, el pin KEY no es necesario.


Software


Nota Cada vez que descargue el programa en Arduino, asegúrese de que el módulo Bluetooth no esté conectado al Arduino. Esto causará problemas de relleno de bocetos. Simplemente desconecte la alimentación del módulo Bluetooth o los cables que conectan los pines del módulo Arduino y RX, TX.


Al comienzo del boceto, cambie los números de motor en las líneas del tipo:


 AF_DCMotor motor(); 

Boceto para el modo automático con evitación de obstáculos descarga aquí .


Si reemplazas la cuerda


 byte debug = 0; 

en


 byte debug = 10; 

Esto habilitará el modo de depuración.


En el modo de depuración, el RoboCar4W realmente no conducirá ni rodará. En su lugar, active el monitor de puerto serie y allí verá cómo se "maneja" virtualmente. En lugar de una unidad real hacia adelante, la cadena "Forward" se escribirá en el monitor del puerto serie, en lugar de retroceder con un giro a la izquierda, "Turn Back L (eft)", etc. El sensor de distancia ultrasónico tampoco hace nada, en cambio, las distancias a los obstáculos se generan mediante programación y al azar.


Este modo de depuración es conveniente si cambia el algoritmo de movimiento y, en lugar de atrapar una máquina de escribir en la sala, simplemente verifique todo en inactivo.


Boceto de Bluetooth para descarga de control manual aquí . El boceto no tiene modo de depuración, ya que todo es transparente allí. Presionas el botón: el robot se va.


Programa para Adnroid Bluetooth RC Car .


Bueno, eso es todo! Que tengas un buen viaje!


Que tengas un buen viaje!

Source: https://habr.com/ru/post/es426097/


All Articles