Buscar

viernes, 15 de mayo de 2020

Proyecto control de un coche RC con Arduino


El otro día me encontré un pequeño coche de RC de Nikko, estaba en condiciones desastrosas, la electrónica estaba toda destrozada, pero los motores y la parte mecánica estaba bastante bien, así que decidí aprovecharlo para mis pruebas.
El motor de tracción trasera era un pequeño motor DC, con un sistema de engranajes, así que solo tuve que desmontarlo y engrasarlo.

El motor tiene tres hilos, dos de los polos y uno de masa conectado al chasis del motor, asi que solo necesitaba los polos para hacerlo funcionar.

En cambio el servo de dirección tiene 6 hilos, ahí es donde  tirando de Internet, descubrí que es un sencillo motor DC, por lo que solo usa dos hilos, luego tres cables son un potenciómetro que da el valor de giro. Asi´que con un polímetro medí el valor de resistencia máximo dando un valor de 5k2 Ohmios

El siguiente paso fue calcular el valor que daba cuando las ruedas giraban a la izquierda y cuando giraban a la derecha. Para ello programé un sketch de Arduino que mostraba en el monitor serial, los valores al girar. Dando los siguientes valores...

Para poder controlar el coche, utilicé el L293D, es un doble puente en H, que viene en un encapsulado DIP10, permite controlar dos motores DC, usando dos salidas PWM para habilitarlos, y además cambiar el sentido y la velocidad de los mismos.
El esquema es este:


Para la programación del sketch, primero diseñe un sistema de control que posteriormente fui ampliando, en el que enviando un carácter por el serial, habilitaba un motor u otro. Lo definí de la siguiente manera:

  • Si enviaba un char 'a', el motor de tracción avanzaba. Ponía la salida de control 1 a HIGH, y una salida de dirección en HIGH y la otra en LOW
  • Si enviaba un char 'r', el motor retrocedía. Lo mismo que antes pero intercambiando las salidas de giro.
  • Si enviaba un char 's', el motor paraba. La salida de control en LOW y las de giro en LOW
Para la dirección definí los siguientes comandos:
  • Si enviaba un char 'd', el motor de dirección giraba las ruedas a derecha. Para ello al igual que en el dirección, habilitaba un HIGH a la salida de control 2 y a las de giro un LOW y un HIGH. al cabo de un tiempo mandaba un LOW a las salidas.
  • Y si enviaba un char 'i', giraba a la izquierda.
¡El sistema funcionaba!
Bueno era un comienzo, así que me animé, me dí cuenta que me hacia falta un control de velocidad para las ruedas tractoras. Usando la misma salida de control del motor, en vez de enviar un HIGH, me decanté por usar la PWM, 
Creando un función velocidad() que sencillamente recibía un entero(int) para emplear la función analogWrite(pin,valor). y habilitaba el motor de tracción a esa velocidad.
  • En este caso enviaba un char 'v' con el rango de velocidad de 0 a 9, utilizando la función map(), para establecer un rango entre 0 y 255 para la salida PWM. En el caso de "v0" el motor para y en el de "v9" el motor coge la máxima velocidad. Un ejemplo de orden era "v5"= motor al 50%
Un problema de diseño que me encontré con el servo de dirección era que el giro era brusco y no podía controlar el grado de giro, así que aprovechando el potenciómetro del servo, y usando una entrada analógica del Arduino, con un divisor de tensión con una resistencia de 4k7 ohmios, recibía un valor que correspondía al grado de de giro.
Por lo tanto se hacía necesario crear una función grados_dirección que devuelve un entero. También modifique las funciones izquierda() y derecha() para que solo hiciera falta mandar el angulo de giro.
  • Si enviaba un comando "i10", el servo se giraba 15º a la izquierda, si enviaba un 0º, las ruedas se colocaban en posición recta.
  • Si enviaba "d10" giraba 10º a la derecha.
¿Porque elegí esta opción?, cuando con un solo comando por ejemplo 'g' e indicando grados positivos y negativos me habría ahorrado el uso de dos funciones.  Pero luego pensé en un futuro en el que pusiera dos servos independientes.
La siguiente ampliación del proyecto fue incluir un módulo HC06, para el control por Bluetooth, un modulo MPU6050 usado como acelerómetro y giroscopio para obtener los cambios de dirección, velocidad e inclinación. Y un optointerruptor como un encoder para obtener la distancia exacta recorrida.
Esto lo desarrollaré en las siguientes entradas.

Empezando por el principio

Este blog no pretende ser nada más que un pequeño borrador de todos los experimentos y pruebas que estoy realizando. Es un simple sitio para plasmar las ideas que me surgen. Así que no esperes encontrar "megatutoriales", ni "proyectos asombrosos". Eso si si ves algo que te pueda interesar úsalo. Mi filosofía es que si todos aprendemos de todos podremos hacer grandes cosas.

Un saludo
Vulpes