En este tutorial vamos a construir un coche robot de 2 ejes o 2wd controlado con arduino, comprado en aliexpress y os cuento mi opinión sincera.
Mis hijos ya tienen 7 años y me apetecía compartir con ellos un bonito momento construyendo algún proyecto con arduino e iniciarlos en el mundillo de la robótica.
Si son peques y les gusta el mundillo te recomiendo que visiten el Museo Robótica en Madrid donde se engancharán para siempre.
Me pareció buena idea comprar un coche robot en aliexpress ya que son baratos y puedes conseguir todas las piezas que necesites.
Elegí el más básico que puedes encontrar en aliexpress y el coche robot 2wd es barato y fácil de montar.
Índice
Los mejores Coche Robot de arduino en Amazon
Fasizi Encoder elegante de la velocidad del equipo del chasis de la caja de la batería del coche del robot del motor para Arduino
AptoFun 2WD Smart Robot Car Set compatible con Arduino IDE Electrónica Kit de construcción con 2 motores de engranaje, microcontrolador, placa ATmega328P, placa de expansión V5, etc.
OSOYOO Robot Car Starter Kit for Arduino UNO | STEM Remote Control App Educational Motorized Robotics for Building, Programming & Learning How to Code | IOT Mechanical DIY Coding for Kids Teens Adults
OSOYOO V2.1 Smart Robot Car Kit for Arduino – Controller Board Line Tracking, Ultrasonic Sensor, Bluetooth, Motor Shield, IR Remote Control, Mobile App – Battery and Charger Included
KEYESTUDIO Kit de Tanque de Robot Inteligente para Arduino IDE, Kit de construcción electrónica con UNO R3, Sensor ultrasónico, etc. Robot Educativo de programación Stem DIY
OSOYOO Robot Car Starter Kit for Arduino | Stem Remote Controlled Educational Motorized Robotics for Building Programming Learning How to Code | IOT Mechanical DIY Coding for Kids Teens Adults
Tardó en llegar a casa 2 semanas, algo de esperar si compras en un portal de ventas chino, así que nada que objetar.
Bien embalado y cada cosa en sus bolsita, todo bien ordenado.
Lo sacamos todo y lo presentamos encima de la mesa donde vamos a montar el coche arduino.
Coche arduino- Instrucciones
Una vez identificadas todas las piezas y agruparlas para que luego sea más fácil localizarlo todo comenzamos por la base de metacrilato.
La base donde irá el coche 2wd es de metacrilato pero necesita que quitemos el papel que va pegado, así que comenzamos por retirar el papel.
Como podéis ver en la foto tenemos el primer problema, la base viene partida, por lo que podría partirse en dos si apretamos los tornillos demasiado o no la tratamos con sumo cuidado.
Sin embargo sigo adelante con el montaje. Una vez retirado todo el papel hay que montar la rueda trasera, con sus separadores para que la rueda quede a la misma altura que las ruedas delanteras que son de más tamaño.
Segundo problema, aliexpress sólo me ha incluido 4 separadores dorados, los que podéis ver en la foto anterior, por lo que no puedo ponerle los 4 a la rueda trasera del robot, y más delante me faltarán para montar lo demás….muy mal por aliexpress.
Montar los motores 2wd
A continuación hay que montar los motores, que por cierto vienen sin los cables soldados, así que necesitarás un soldador, si no tienes te recomiendo este soldador barato que es con el que hemos soldado este proyecto.
Puedes soldar los cables como tu prefieras, pero yo te recomiendo soldar los cables iguales.
Debes saber que los motores de corriente continua no tienen polaridad, es decir, puedes poner los cables positivo y negativo como tu quieras, la diferencia es que el motor va a girar en un sentido o en otro, pero yo recomiendo que los hagas los dos iguales para evitar problemas con el código de arduino que explicaré más tarde.
Como te muestro en la foto, para montar el motor DC necesitas las pequeñas piezas de metraquilato que vienen con el papel marrón.
Una vez retirado el papel de todas las piezas de metacrilato, debes meter estas piezas por los huecos donde marco con una flecha, por debajo.
Anclado de los motores al metacrilato
Una pieza va por debajo como te he mencionado antes y la otra justa al borde de la base de metacrilato en una pequeñe hendidura para colocarla.
El motor va atornillado a este metacrilato, aunque en la foto muestra la posición de motor con los cables hacía fuera del coche, recomiendo que lo montéis al revés con los cables hacía dentro.
Así es como dejé en principio los dos motores para arduino montados en su base de metacrilato, pero como he comentado antes, es mejor que los cables queden hacía dentro, tuve que desmontarlo todo cuando me di cuenta y darle la vuelta.
En este punto ya puedes ponerle las ruedas en el eje exterior a presión, pero no te pases porque rozará con la base de metacrilato, y en el eje interior del motor DC ( de corriente continua ) irán las ruedas de los encoder, quedando sobre el hueco del metacrilato como podéis ver en la siguiente foto.
Lo siguiente que hice fue colocar el interruptor de encendido, va a presión, pero nuevamente tengo un problema, el hueco es demasiado grande y el interruptor se mueve.
En mi caso no tuve más remedio que pegarlo con pegamento mientras me acordaba del chino, y aunque le eché muy poco se quedo la marca en el metacrilato.
El interruptor debes soldarlo también con los cables que vienen incluidos, estos cables irán directamente al L298N motor driver.
Problemas con la base del coche robot
Me encuentro con otro problema, al intentar montar la placa del arduino uno. LOS AGUJEROS NO COINCIDEN.
Como lo habéis leído, la base parece que no coincidía con nada, sólo con el montaje de los motores, pero para el resto del proyecto no había manera de montar nada.
Después de mi enfado con aliexpress y llegados a este punto lo mejor era agujerearlo..
Usé un taladro con una broca de madera, recomiendo que lo hagáis lentamente porque si le subís muchas revoluciones al taladro se quemará el metacrilato por la temperatura.
Marqué con rotulador donde necesitaba los agujeros.
Con taladrar sólo un poco con la punta es suficiente para que entren los tornillos.
Así es como quedaron, quizás si los lijara quedaría con un acabado más fino, pero me arriesgaba a que se arañara el metacrilato y después de todo, no se iba a ver una vez le ponga los tornillos.
También coloqué la placa arduino con los separadores, que como recordáis aliexpress sólo me incluyeron 4, cuando necesitaba 12 para todo, así que sólo le pude colocar 2 al arduino.
H L298N Motor Driver
Con el H L298N control driver, me pasó lo mismo, no había manera de fijarlo a la base porque no había agujeros así que marqué, hice agujeros y atornille.
Hacemos un inciso con el tutorial de montaje de este coche robot 2wd para hablar un poco sobre esta placa.
Debéis saber que los motores de de corriente continua como estos, consumen una gran cantidad de corriente cuando giran.
En nuestro caso estos motores consumen hasta unos 500 mA cada uno, pero claro, nuestra placa Arduino uno solo puede proporcionar 40 mA a 5 V en sus pines digitales.
Cuál es la solución? utilizar una fuente de alimentación externa (baterías) para proporcionar a los motores la potencia necesaria para funcionar correctamente sin dañar la placa Arduino.
Si tu batería es de mayor voltaje puedes usar un regulador de tensión para bajar la tensión. Para mas información puedes ver mi articulo del divisor de tensión donde diseñamos lo mismo con un par de resistencias, aunque para este caso lo que recomendamos es un regulador de tensión.
También vamos a necesitar separar ese circuito de alimentación (la pila) del circuito de control ( Arduino uno).
Usaremos 4 pilas AA, en total 6 voltios como fuente de energía para alimentar a los motores.
Y utilizaremos una pila de 9v para alimentar al arduino.
El L298N motor driver es un circuito de doble puente en H que le permite alimentar estos motores con la potencia necesaria desde una fuente de alimentación externa.
También controlarála dirección de rotación de los motores con un arduino.
Es un controlador de dos canales, es decir que puede conectar dos motores de corriente continua diferentes y controlar cada uno de forma independiente.
Entre sus especificaciones tenemos que puedes conectar motores entre 5-35 V y con una corriente máxima de 2 A en cada canal.
Y como hemos mencionado las 4 pilas alimentarán el L298 y una pila de 9v alimentará al arduino.
Necesitarás un conectar para pilar de 9v y un conector de alimentación, entiendo que aliexpress no lo incluya porque puedes alimentar el arduino de la manera que quieras, por suerte tenia ambas cosas.
Si no sabes donde conseguirlos, os dejo el enlace donde los compro yo.
Montaje del servo SG90
El servomotor puede con 1.5kg, más que suficiente para mover el detector de ultrasonidos HC-SR04 y detectar la distancia.
La idea es que se moverá de izquierda a derecha para controlar si estamos cerca de un objeto.
El servo SG90 viene en una bolsa con 3 piezas diferentes según lo necesites, nuevamente no viene la pieza que necesito y que va dentro de la base del servo, así que toca coger una de ellas y recortarla con unos alicates de corte.
Una vez recortada ya se puede meter en la base donde irá el servo.
Yo recomiendo que le echéis pegamento fuerte, porque se saldrá constantemente sobre todo si el coche robótico choca contra algún objeto que no detente el sensor de ultrasonidos HC-SR04.
Además de pegarlo, hay que atornillarlo al servo por debajo, pero primero colocamos el servo entre las dos piezas diseñadas para ello, y va a presión.
Ya tendríamos todo para poder montar el servo SG90 en el la base.
Sólo quedaría unir ambas piezas para tener el conjunto completo.
Pero antes de fijarlo a la base, y como dije anteriormente, hay que atornillar la base al servo por debajo de la base.
Y así es como quedaría todo el conjunto
Sensor de ultrasonidos HC-SR04
Bien, llegados a este punto nos faltaría colocar el sensor de ultrasonidos HC-SR04 para controlar la distancia encima del servo.
Nuevamente aliexpress hace de las suyas y no viene nada para poder montarlo.
He visto otros proyectos en los que lo sujetan con bridas, pero creo que acabaría moviéndose con tanto movimiento del servo.
Pegarlo con pegamento además de feo, marcaría las piezas para siempre, sobre todo la placa del circuito del sensor de ultrasónico HC-SR04.
Así que he optado por silicona térmica, ya que se puede retirar en cualquier momento y aguantará bien el movimiento, y lo que es mejor, no le afectará a la placa del circuito si toca con algo.
Tan solo bastó echar una gotita de silicona térmica en las esquinas del sensor ultrasónico HC-SR04 para que quedara bien fija a la estructura de plástico del servo.
Esquema del cableado del coche autómata
Con esto, ya tendríamos todas las piezas montadas sobre la base de metacrilato, y nos quedaría cablearlo todo y programar el arduino.
Explicar todo el cableado sería muy tedioso tanto para mi, como para ti, así que mejor dejo un esquema muy claro donde van todos los cables.
El compañero Omar me comentaba que era confuso el esquema, y tiene toda la razón, me olvidé comentar que el kit del coche arduino viene con un arduino UNO, y además viene con una placa de expansión llamada Sensor Shield que hay que colocar justo encima del arduino y conectar ambas por medio de sus pines.
Una vez hecho esto, el cableado se hace desde la misma placa de expansión tal como os pongo en el diagrama.
En Amazon podéis encontrar esta placa de expansión en el siguiente enlace.
Si no tenéis prisa siempre podéis optar por comprarla en china, aunque tardará bastante en llegar.
Espero que os haya aclarado las cosas de lo contrario no dudéis en comentarlo más abajo en la zona de comentarios.
Código Arduino para este proyecto
Una vez todo montado y cableado sólo nos queda programar el arduino desde su IDE.
Una vez descargado e instalado, tu ordenador debería detectar tu arduino al conectarlo.
Debería de detectar automáticamente el modelo de ardunio en Herramientas/Placa Arduino en nuestro caso Arduino Uno.
El puerto te debe aparecer justo debajo, en mi caso me lo detecta en el COM3 pero te puede salir cualquier otro.
Una vez conectado sólo queda el programa, el cuál dejo un ejemplo completo para que copies y pegues, todo muy fácil y sin saber programar.
#include <Servo.h> //Servo motor library. This is standard library
#include <NewPing.h> //Ultrasonic sensor function library. You must install this library
//our L298N control pins
const int LeftMotorForward = 5;
const int LeftMotorBackward = 4;
const int RightMotorForward = 3;
const int RightMotorBackward = 2;
//sensor pins
#define trig_pin A1 //analog input 1
#define echo_pin A2 //analog input 2
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function
Servo servo_motor; //our servo name
void setup(){
pinMode(RightMotorForward, OUTPUT);
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
servo_motor.attach(11); //our servo pin
servo_motor.write(90);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop(){
int distanceRight = 0;
int distanceLeft = 0;
delay(50);
if (distance <= 20){
moveStop();
delay(300);
moveBackward();
delay(400);
moveStop();
delay(300);
distanceRight = lookRight();
delay(300);
distanceLeft = lookLeft();
delay(300);
if (distance >= distanceLeft){
turnRight();
moveStop();
}
else{
turnLeft();
moveStop();
}
}
else{
moveForward();
}
distance = readPing();
}
int lookRight(){
servo_motor.write(10);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
}
int lookLeft(){
servo_motor.write(170);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
delay(100);
}
int readPing(){
delay(70);
int cm = sonar.ping_cm();
if (cm==0){
cm=250;
}
return cm;
}
void moveStop(){
digitalWrite(RightMotorForward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(LeftMotorBackward, LOW);
}
void moveForward(){
if(!goesForward){
goesForward=true;
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
}
void moveBackward(){
goesForward=false;
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
}
void turnRight(){
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorForward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
void turnLeft(){
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
delay(500);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, HIGH);
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
El código no es mío, pero está compilado y comprobado por mi, y funciona perfectamente.
Sin embargo, yo lo he mejorado a mi gusto, os dejo el mismo código para arduino desde el cuál yo partí, por si queréis mejorarlo vosotros también.
Os voy a comentar un poco el código para que lo comprendáis.
#include <Servo.h> //Servo motor library. This is standard library
#include <NewPing.h> //Ultrasonic sensor function library. You must install this library
Inicialmente y como en todos los proyectos con arduino lo primer es importar todas las librerías que vayamos a necesitar.
En nuestro caso la libreria que no tenemos es NewPing.h y que la podéis descargar desde el enlace que os dejo.
Una vez descargada la importamos a nuestro IDE.
Una vez importada ya podemos compilar el código desde el botón del menú superior y no debería darte ningún tipo de problema, en todo caso, reinicia el IDE para asegurarte que se aplican correctamente los cambios.
Ya sin errores puedes proceder a programar el arduino con el botón de la flecha derecha en el menú superior, pero sigamos comprendiendo el código.
Definiendo la inicialización del código
//our L298N control pins
const int LeftMotorForward = 5;
const int LeftMotorBackward = 4;
const int RightMotorForward = 3;
const int RightMotorBackward = 2;
//sensor pins
#define trig_pin A1 //analog input 1
#define echo_pin A2 //analog input 2
#define maximum_distance 100
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function
Servo servo_motor; //our servo name
Lo primero que hace es crear unas constantes de tipo entero asignandole los pines del arduino, es decir, el pin 5 del arduino será para la constante LeftMotorForward, es decir Mover hacía adelante el motor izquierdo, etc.
Definimos los pines analógicos del arduino tanto para el Trig (disparo) como para el el Echo (recepción) del sensor de ultrasonidos HC-SR04.
Lo siguiente que hace el código es definir una distancia máxima en 100 y una varible booleana para saber si va hacía adelante o no, por defecto se deja en false. Y otra variable entera de distancia que se deja inicialmente en 100.
Para conocer la distancia con este sensor de ultrasonidos HC-SR04 es como sigue:
Distancia = {(Tiempo entre Trig y el Echo) * (V.Sonido 340 m/s)}/2
Seguidamente se usa una función de la libreria NewPing para conocer esto mismo y se le pasa los parámetros que hemos declarado anteriormente.
Por último le damos un nombre al servomotor.
Configurando el código del proyecto
Una vez que tenemos todo lo necesario inicializado vamos a proceder con el Setup()
Inicialmente la distancia a derecha e izquierda comenzará en 0.
Si la distancia es menor o igual que 20:
Se para, espera 300 milisegundos y el robot irá hacía atrás.
Hacemos otro retardo de 400 y se para.
Volvemos a hacer otro retardo o delay de 300 y escaneamos la distancia a la derecha.
Esperamos 300 y volvemos a escanear a la izquierda y volvemos a esperar 300.
Con esto hemos escaneado a los lados para saber por donde ir.
Si la distancia que dijimos al inicio es mayor o igual que la distancia a la izquierda el coche va a girar a la derecha y se parará sino hará lo contrario se girará a la izquierda y se parará.
En caso contrario seguirá avanzando, y por último vuelve a leer la distancia para tenerla en la variable distancia.
Servo SG90 y sensor ultrasonidos HC-SR04
int lookRight(){
servo_motor.write(10);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
}
int lookLeft(){
servo_motor.write(170);
delay(500);
int distance = readPing();
delay(100);
servo_motor.write(90);
return distance;
delay(100);
}
int readPing(){
delay(70);
int cm = sonar.ping_cm();
if (cm==0){
cm=250;
}
return cm;
}
Las funciones que usamos para que el servo pueda mirar hacia los lados y pueda medir la distancias son las que muestro, en el código anterior.
Las dos primera funciones int lookLeft() y int lookRight() se declaran de tipo entero porque van a devolver un número entero.
Ambos son similares solo que cambiamos los grados a los que va a mirar el servo.
Empieza colocando el servo en una posición 10 a la izquierda, 90 en el medio y 170 para ponerlo mirando a la derecha con servo_motor.write(170);
Es fácil de describir lo que hace, primero mira hacia un lado, vuelve al medio y se gira hacia el otro lado.
Depués devuelve la distancia obtenida.
La función int readPing() devuelve un número entero, será los centímetros, que obtenemos con sonar.ping_cm()
Controlando el movimiento de los motores
En esta ocasión no podré todas las funciones que permite el movimiento, pero las nombraremos en la siguiente lista:
moveStop() Paramos los motores.
moveForward() Avanzamos hacía adelante.
moveBackward() Volvemos hacía atrás.
turnRight() Giramos a la derecha.
turnLeft() Giramos a la izquierda.
Básicamente para parar ponemos todos los pones de ambos motores en estado LOW
Para finalizar la explicación del código usamos la lógica, si queremos que el robot gire, un motor debe girar hacia un lado y el otro debe girar hacía el otro tal que así.
Con este código giramos hacia la derecha, pero te preguntarás, para que es el DELAY ???
Con el delay controlamos cuanto queremos que gire, si hay más retardo, los motores giran más tiempo por lo que girara más, si ponemos un retardo muy corto, los motores giraran durante muy poco tiempo y girará menos.
Problemas y soluciones con el coche 2WD
El coche no anda, sólo gira el servo hacía los lados: Debes mirar que esté correctamente alimentado el L298N motor driver.
El robot avanza pero no detecta obtáculos: Comprueba que los pines de Trigger y Echo, están correctamente colocados.
Arduino está encendido y el L298N también pero no hace nada: El código está correcto y comprobado, revisa que lo hayas cargado correctamente en tu arduino.
Mi pc no detecta el puerto del arduino: A veces suele pasar y se soluciona instalando unos driver, si no los encuentras déjame un mensaje en los comentarios y encantado los compartiré con todos.
Conclusiones finales
Si te gusta el cacharreo, construir, solucionar problemas y estas cosas, aquí te vas a distraer bastante.
Lo que te mande el chino de aliexpress puede ser toda una sorpresa sobre todo si la base del autómata no tiene nada que ver con las piezas, pero bueno todo tiene solución.
Si tuviera que comprarlo de nuevo, yo no lo haría, compraría todas las piezas sueltas, por lo menos la base y los tornillos y separadores, para que no te falte nada.
El precio no es malo teniendo en cuenta que incluye un arduino UNO, el controlador de los motores y la base.
Pero si lo compras todo por separado tampoco creo que te ahorres tanto.
Sinceramente, yo hubiera pagado un poco más para que viniera todo perfecto.
Más que nada porque es un proyecto para montar con los niños, y a edad temprana los niños se aburren ante cualquier problema.
Si es tu caso, compra algo que no te de problemas sino los niños abandonarán a la mínima