Entrega rápida
Condiciones de descuento para empresas
Hasta un 10% de descuento para alumnos, estudiantes y centros de enseñanza
Envío a toda Europa por €4.90
Cerrar filtro
Filtrar por:

Construye un coche teledirigido con Arduino: Vehículo autónomo - Parte 3

Comprender la movilidad del futuro con los coches robot, parte 3

Bienvenido a la tercera entrega de nuestra serie de blogs sobre coches robot. En la primera parte conocimos los fundamentos del vehículo básico. En la segunda parte desarrollamos un sistema de código universal para definir los pasos de conducción del coche robot y realizamos un sencillo control remoto con un mando a distancia por infrarrojos. Debido a las limitaciones físicas de este mando a distancia, me gustaría mostrar en este episodio la transmisión de instrucciones de conducción con Bluetooth, por ejemplo, desde un smartphone al receptor BT HC-05. Bluetooth es una señal de radio de 2,4 GHz de corto alcance. Es seguro hasta unos 10 m y no produce interferencias bajo la luz del sol.

El módulo Bluetooth HC-05 es en realidad un transceptor=transmisor+receptor. Sin embargo, nosotros sólo lo utilizamos como receptor, para enviar las instrucciones de conducción utilizamos una APP Bluetooth en un smartphone Android (debido a la forma especial de Apple con el Bluetooth, no funciona con un iPhone). En principio, también es posible construir un mando a distancia Bluetooth con el HC-05; sin embargo, para ello se necesita un segundo HC-05, otro microcontrolador y un dispositivo de entrada (mando joystick).

 Módulo HC-05 - parte delantera y trasera


De los seis pines del módulo HC-05, sólo se necesitan cuatro: VCC (5V) y GND para la alimentación del módulo, y RXD y TXD para la conexión a dos pines del microcontrolador donde se configura el SoftwareSerial. Sin embargo, no puedes ignorar la inscripción NIVEL: 3,3V para no dañar el módulo. En nuestro microcontrolador con lógica de 5V, necesitamos un divisor de tensión de 5V a 3,3V al menos para el pin RXD, por ejemplo, resistencias de 1 kOhm y 2,2 kOhm.

Esquema del circuito: Módulo HC-05 en el microcontrolador

Esquema del circuito - Módulo HC-05

Los comandos AT del módulo HC-05 para microcontroladores Arduino

A la izquierda del conector marcado como Key hay un pequeño botón que es importante para la configuración. Si se pulsa este botón al encender el módulo, entramos en el modo de comandos AT (el LED parpadea lentamente a un ritmo de 2s), en el que realizamos la configuración con los llamados comandos AT (por Atención, Achtung). Para ello utilizamos un programa de ejemplo modificado, en el que la interfaz serie habitual se conecta al Monitor serie del IDE Arduino y al HC-05 mediante SoftwareSerial.

/*
SoftwareSerial Prueba serie múltiple
Recibe del hardware serie, envía al software serie.
Recibe del software serie, envía al hardware serie.
El circuito:
* RX es el pin digital 10 (conectar a TX de otro dispositivo)
* TX es el pin digital 11 (conectar a RX de otro dispositivo) // ¡divisor de tensión!
creado en la noche de los tiempos
modificado el 25 de mayo de 2012
por Tom Igoe
basado en el ejemplo de Mikal Hart
Este código de ejemplo es de dominio público.
*/
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX, TX // mySerial cambiado a BTSerial
char c=' '; // Declaración de variable para transmisión
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);                                                                                   // Baud rate changed to 9600
Serial.println("Serial started!");
// set the data rate for the SoftwareSerial port
BTSerial.begin(38400);                                                                            // Baud rate for BT 38400
Serial.println("BTSerial started!");
}
void bucle() { // ejecutar una y otra vez
if (BTSerial.available()) {
c=BTSerial.read();
Serial.write(c);
}
if(Serial.available()) {
c=Serial.read();
BTSerial.write(c);
Serial.write(c);                                                                                       // re-transmission of input in Serial Monitor
}
}

En la siguiente imagen se utilizan los comandos AT esenciales. La estación remota, el HC-05, envía una respuesta si es necesario y acusa recibo con OK.

Nos interesan principalmente el nombre y la dirección HEX para identificar de forma única el módulo más adelante en el smartphone. Los comandos AT se introducen en el monitor serie del microcontrolador. En la siguiente imagen puedes ver el monitor serie del IDE Arduino.

Si quieres, puedes cambiar la contraseña por defecto 1234 con"AT+PSWD=xxxx", donde x representa un dígito del 0 al 9. A continuación, comprueba con"AT+PSWD?" si la entrada se ha realizado correctamente.

Comandos AT - HC-05
Una vez completadas las entradas, desconecta brevemente el módulo de la fuente de alimentación. Tras volver a encenderlo sin pulsar ningún botón, el módulo HC-05 se encuentra en modo estándar. El LED parpadea rápidamente (unas 5 veces/s).

Modificaciones en el coche teledirigido: escudo motor diferente

Pasemos ahora al Coche Robot. Después de que la última vez utilizáramos el Controlador de Motor V2, que sólo necesita los dos conectores I2C SDA=A4 y SCL=A5 para las señales de control, esta vez quiero introducir el antiguo Controlador de Motor V1, que bloquea muchos pines digitales, pero que a menudo se puede comprar a precio de ganga.

Módulo L293D

También he modificado un poco este Motorshield para tener acceso a los sensores y receptores de radio. En el lado de los pines digitales, sólo hay un pin al que se puede acceder mediante un conector acodado: Pin 2. Esto es bueno para quienes quieran conectar aquí el receptor de infrarrojos. Hay más posibilidades de ampliación en el otro lado, donde puedes acceder a todas las entradas analógicas, así como a la fuente de alimentación, con la ayuda de conectores hembra (también llamados conectores de zócalo).

Como todas las entradas analógicas también se pueden utilizar como entradas o salidas digitales, aquí tenemos la posibilidad de conectar nuestros receptores de radio. Esto funciona de maravilla con el transceptor de 433 MHz HC-12 (ver próximo episodio), pero para el receptor BT HC-05 sólo con restricciones. En primer lugar, no podemos conectar la patilla RXD directamente, necesitamos el divisor de tensión, y en segundo lugar, las patillas no proporcionan suficiente corriente para alimentar el módulo en estas patillas.

La siguiente imagen muestra un pequeño adaptador que hicimos nosotros mismos, que alimenta el HC-05 con 5V y masa desde los pines apropiados, conecta TXD directamente a RX de la interfaz SoftwareSerial A1 =D15 y RXD a A2 = D16 a través del divisor de tensión.
Adaptador HC-05

El diagrama de cableado: Módulo HC-05 con Motorshield L293D en el microcontrolador Arduino
Esquema del circuito HC-05 con L293D

Por supuesto, el circuito también se puede realizar en una mini protoboard con cables de puente.

Como la última vez, el código de las instrucciones de conducción aumenta o disminuye pulsando un botón; esta vez, sin embargo, no con el mando a distancia por infrarrojos, sino con la función táctil de la APP del smartphone y la consulta Bluetooth mediante SoftwareSerial.

Emparejar el módulo Bluetooth HC-05 con una aplicación Android (APP)

Antes de que la APP pueda conectarse al Coche Robot, tenemos que emparejarla con el módulo Bluetooth en los ajustes. Esto debería ser bastante fácil, ya que anteriormente hemos utilizado los comandos AT para consultar el nombre y la dirección HEX del HC-05.

Cuando el emparejamiento ha funcionado y se ha instalado una aplicación BT adecuada, se puede iniciar y configurar. Pulsando sobre la lupa de la imagen de la izquierda, se muestran los dispositivos adecuados. Pulsamos sobre el HC-05 y recibimos el mensaje "conectado". La aplicación que utilizo ofrece varias interfaces para su funcionamiento (imagen central). Decidí utilizar el mando del juego. En la parte superior derecha de la imagen central, hay dos flechas que forman un pequeño círculo. Toca aquí si se ha perdido la conexión.

La imagen de la derecha muestra los botones de un mando de juego. Antes de utilizarlos por primera vez, hay que asignar a los botones los valores numéricos que se transmitirán al pulsarlos.

Para los botones del cursor he asignado los valores numéricos 1 a 4 en el sentido de las agujas del reloj. A los demás botones les he asignado el valor numérico 5. Estos valores se pasan en el boceto a la variable blueToothVal y conducen en los if-pointers de la función loop( ) a la determinación del código para el nivel de conducción.

Aplicación Bluetooth HC-05

Los cambios de Infrarrojos a Bluetooth y de Controlador de Motor V2 a V1 provocan algunas modificaciones en la parte principal del sketch. En cambio, en la función motor() no cambia casi nada. Sólo en la notación, las funciones motor1->setSpeed() se convierten ahora en motor1.setSpeed() debido a las diferentes bibliotecas del programa (librerías).

El código del programa: Construir un Coche RC para Arduino

* Código de ejemplo para Coche Robot con Motor Shield V1 y receptor BT  HC-05, a partir de 20220515
* basado en la biblioteca Adafruit Motor shield V2, copyright Adafruit Industries LLC
* este código es de dominio público, ¡disfrútalo!
* modificado para Funduino
* Pines
* BT VCC a salida de 5Vde Arduino.
* BT GND a GND
* Arduino A1=15 (SS RX) - BT TX no necesita divisor de tensión
* Arduino A2=16 (SS TX) - BT RX a través de un divisor de tensión(5va 3,3v)
*/
#include <AFMotor.h>
AF_DCMotor motor1(2);
AF_DCMotor motor2(3);
#include <SoftwareSerial.h>
// Inicializar HC-05
SoftwareSerial BTSerial(15, 16); // RX, TX cruzar a TX, RX(divisor de tensión)
char blueToothVal;
int x = 0
int y = 0
int izquierda = 0
int derecha = 0
int código = 5555
int velocidadL = 0
float factor = 1.8; // Corrección para speedLevel 255/100 * 6V/VBatt
void setup() {
Serial.begin(9600); // set up Serial Monitor at 9600 bps
Serial.println("Motor test!");
BTSerial.begin(9600); // set up transmission speed for HC-12
Serial.println("SoftwareSerial initialized!");
} // fin de la configuración
void bucle() {
if(BTSerial.available()) //si se reciben datos ...
Serial.print("disponible");    
{
blueToothVal=BTSerial.read();//..sollen diese ausgelesen werden
Serial.println(blueToothVal);
}
if (blueToothVal=='1') //si  el módulo Bluetooth recibe un "1"....
{
if (code<9000)   code = code + 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='2') //si el módulo Bluetooth recibe un "2 "....
{
if ((code-1000*int(code/1000))<900)  code = code + 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='3') //si el módulo Bluetooth recibe  un"3"....
{
if (code>2000)   code = code - 1000;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='4') //si el módulo Bluetooth recibe un "4 "....
{
if (code-1000*int(code/1000) > 200)   code = code - 100;
Serial.print("Code = ");
Serial.println(code);
}
else if (blueToothVal=='5') //si el módulo Bluetooth recibe un "5"...
{
code = 5555;
Serial.print("Code = ");
Serial.println(code);
}
delay(200); //un poco de retraso para mejorar la comunicación serie y evitar rebotes
motor();
} //fin del bucle
void motor(){
int velocidadNivel[9]={-100,-80,-60,-40,0,40,60,80,100};
y = int(código / 1000);
x = int((código - 1000*y) / 100);
velocidadL = velocidadNivel[y-1];
Serial.print("código = ");
Serial.print(código);
Serial.print(" y= ");
Serial.print(y);
Serial.print(" x= ");
Serial.print(x);
Serial.print(" velocidadL= ");
Serial.println(velocidadL);
//Corrección de los pasos de velocidad para las curvas
si (x==1){
right = speedL+20;
left = speedL-20;
}
si (x==2){
right = speedL+15;
left = speedL-15;
}
si (x==3) {
right = speedL+10;
left = speedL-10;
}
si no (x==4) {
right = speedL+5;
left = speedL-5;
}
si no (x==6) {
right = speedL -5;
left = speedL+5;
}
si no (x==7) {
right = speedL-10;
left = speedL+10;
}
si (x==8) {
right = speedL-15;
left = speedL+15;
}
si (x==9) {
right = speedL-20;
left = speedL+20;
}
si no {
right = speedL;
left = speedL;
}
//Introducción de los pasos de conducción para "izquierda" y "derecha
Serial.print("izquierda= ");
Serial.print(izquierda);
Serial.print(" derecha = ");
Serial.println(derecha);
si (izquierda < 40 & izquierda > -40) {
motor1.run(RELEASE);
}
si (derecha < 40 y derecha > -40) {
motor2.run(RELEASE);
}
si (izquierda>=40) {
if (left>100) left=100;
motor1.run(FORWARD);
motor1.setSpeed(left * factor);
}
si (derecha>=40) {
if (right>100) right=100;
motor2.run(FORWARD);
motor2.setSpeed(right * factor);
}
si (izquierda<= -40) {
if (left<-100) left=-100;
motor1.run(BACKWARD);
left = -left;
motor1.setSpeed(left * factor);
}
si (derecha<= -40) {
if (right<-100) right=-100;
motor2.run(BACKWARD);
right = -right;
motor2.setSpeed(right * factor);
}
} // fin motor

Hasta aquí la segunda solución más barata para un Coche Robot con mando a distancia (suponiendo que tengas un smartphone Android). La próxima vez mostraré lo fácil que es integrar un transceptor HC-12 de 433 MHz. Con él se pueden conseguir incluso varios cientos de metros de alcance. Sin embargo, los costes aumentan porque ahora se necesitan dos transceptores y otro microcontrolador. Hasta entonces.

Introduce la cadena en el campo de texto de abajo.

Los campos marcados con * son obligatorios.

Artículos coincidentes
Bluetooth Modul - Typ "HC-05" Bluetooth Modul - Typ "HC-05"
Contenido 1 Stück
7,86 € *
Nº de artículo F23107169
Añade
Bluetooth Modul - Typ "HC-06" Bluetooth Modul - Typ "HC-06"
Contenido 1 Stück
7,75 € *
Nº de artículo F23106816
Añade
Escudo motor L293D para Arduino UNO y MEGA Escudo motor L293D para Arduino UNO y MEGA
Contenido 1 Stück
3,78 € *
Nº de artículo F23107155
Añade
Breadboard (placa enchufable) con 830 contactos Breadboard (placa enchufable) con 830 contactos
Contenido 1 Stück
2,22 € *
Nº de artículo FUN-1010553
Añade