Arduino Uno o Mega
Shield Motores
Bluetooth HC_06
2 Motores de cc
1 Servomotor
1 Ultrasonidos
1 Rueda loca
Chasis del coche
![]() |
![]() |
Móvil. Instalar la aplicación Bluetooth Electronics
Pinchar en la imagen para ir a la página de Bluetooth Electronics, donde podeís aprender a usarlo.
Montar el siguiente circuito
Por defecto, el nombre del bluetooth de fábrica es HC-06
Vamos a crear un programa para cambiar el nombre.
El comando a usar es: AT+NAMENuevoNombre, donde vamos a cambiar NuevoNombre por vuestro nombre e inicial de vuestro primer apellido.
Ejemplo: AT+NAMECarlosV
Guardar el programa como: p1.ino
/* Cambiar nombre al Bluetooth HC_06 Conexion del Modulo Bluetooth HC-06 y el Arduino ARDUINO Bluetooth HC-06 19 (RX1) TX 18 (TX1) RX 5V VCC GND GND */ void setup() { Serial1.begin(9600); Serial1.write("AT+NAMENuevoNombre"); } void loop() { }
Cargar el programa al arduino
Activar el bluetooth en el móvil y emparejar con vuestro bluetooth.
Contraseña a poner: 1234
Configurar el bluetooth para que cuando desde el móvil se mande:
Caracter | Función |
---|---|
a | Enciende el led 13 |
b | Apaga el led 13 |
Desde el móvil conectado al Bluetooth vamos a enviar un carácter y, dependiendo de cual mandemos, haremos una función u otra.
La forma de recibir datos en el Arduino Mega es a través del puerto serie 1 (Serial1).
En el programa habrá un apartado a la espera de recibir datos ( Serial1.available ), meteremos el valor recibido en una variable y, usando la instrucción Switch Case, determinaremos la función para cada carácter recibido.
Guardar el programa como: p2.ino
/* Encender y apagar el led 13. El carácter "a" enciende el led 13 y el "b" lo apaga. Conexion del Modulo Bluetooth HC-06 y el Arduino ARDUINO Bluetooth HC-06 19 (RX1) TX 18 (TX1) RX 5V VCC GND GND */ char recibido; // variable encargada de almacenar el carácter recibido desde el móvil int led13 = 13; void setup() { Serial1.begin(9600); pinMode(led13, OUTPUT); } void loop() { if (Serial1.available()) { recibido = Serial1.read(); switch (recibido) { case 'a': digitalWrite(led13, HIGH); break; case 'b': digitalWrite(led13, LOW); break; } } }
Ejercicio a realizar:
Modificar el código para que nos muestre en el monitor el caracter recibido.
Guardar el programa como: p3.ino
Dicha librería la vamos a descomprimir dentro de la carpeta “libraries”, que esta dentro de la carpeta “Arduino”, normalmente estará en vuestra carpeta de Documentos.
Conectar el motor de cc a la salida M1 de la shield (motor1).
Desde el móvil se manda:
Caracter | Función |
---|---|
c | Giro derecha del motor 1 |
d | Giro izquierda del motor 1 |
e | Paro del motor 1 |
Guardar el programa como: p4.ino
char recibido; // variable encargada de almacenar el carácter recibido desde el móvil #include <AFMotor.h> // cargamos la libreria de la shield l293d AF_DCMotor motor1(1); // 1 para M1 int vm1 = 200; // velocidad motor 1 (de 0 a 255) void setup() { Serial1.begin(9600); // usado para conectar con el bluetooth motor1.setSpeed(vm1); // usado para poner la velocidad en el motor1 (no se mueve el motor) } void loop() { if (Serial1.available()) { recibido = Serial1.read(); switch (recibido) { case 'c': motor1.run(FORWARD); // el motor1 va hacia adelante (Si va hacia atras, cambiar el orden // de los cables conectados a M1) break; case 'd': motor1.run(BACKWARD); // el motor1 va hacia atras break; case 'e': motor1.run(RELEASE); // el motor1 se para break; } } }
Conectar otro motor de cc a la salida M2 de la shield (motor2).
Desde el móvil se manda:
Caracter | Función |
---|---|
f | Giro derecha del motor 2 |
g | Giro izquierda del motor 2 |
h | Paro del motor 2 |
Ejercicio a realizar:
Modificar el código para añadir el motor2.
Llamarlo: p5.ino
Desde el móvil se manda:
Caracter | Función |
---|---|
i+valor | Control de velocidad del motor 1 |
j+valor | Control de velocidad del motor 2 |
valor es un número entre 0 y 255 (siendo 255 la velocidad máxima)
Añadir este código a vuestro programa.
Guardar el programa como: p6.ino
switch (recibido) { case 'i': vm1 = Serial1.parseInt();// en vm1 almaceno el valor recibido desde el móvil motor1.setSpeed(vm1); // pongo el motor1 a la velocidad recibida break; case 'j': // Añadir vuestro código aquí para en control de velocidad del motor2 break; }
Ejercicio a realizar:
Montar el coche con 2 motores de continua y una rueda loca. Probar a controlar la velocidad de los motores para ir recto, girar a la derecha y a la izquierda. Más rápido y más lento.
Ejercicio a realizar (Opcional):
Controlar el coche con el acelerómetro del móvil.
Llamarlo: p7.ino
Ejercicio a realizar (Opcional):
Programar una secuencia, que al pulsar un botón en el móvil, el coche haga un recorrido automático en el que dibuje un 8.
Llamarlo: p8.ino
Vamos a montar en la parte superior delantera un servomotor que controle el módulo de ultrasonidos
Programa para controlar el servomotor
Llamarlo: p9.ino
#include <Servo.h> Servo servo1; int posServo1; char recibido; // datos recibidos del bluetooth void setup() { Serial1.begin(9600); } void loop() { servo1.detach(); if (Serial1.available()) { recibido = Serial1.read(); switch (recibido) { case 'k': servo1.attach(9); posServo1 = Serial1.parseInt(); if (posServo1 >= 45 && posServo1 <= 135) { servo1.write(posServo1); delay(20); } } } delay(10); }
Programa para controlar el servomotor
Llamarlo: p10.ino
#define MEDIA_VELOCIDAD_SONIDO 0.017175 // Mitad de la velocidad del sonido a 20 °C expresada en cm/µs #define PIN_TRIGGER A2 #define PIN_ECHO A3 #define ESPERA_ENTRE_LECTURAS 1000 // tiempo entre lecturas consecutivas en milisegundos #define TIMEOUT_PULSO 25000 // la espera máxima de es 30 ms o 30000 µs float distancia; unsigned long tiempo; unsigned long cronometro; unsigned long reloj=0; void medirDistancia(){ cronometro=millis()-reloj; if(cronometro>ESPERA_ENTRE_LECTURAS) { digitalWrite(PIN_TRIGGER,HIGH); // Un pulso a nivel alto… delayMicroseconds(10); // …durante 10 µs y digitalWrite(PIN_TRIGGER,LOW); // …volver al nivel bajo tiempo=pulseIn(PIN_ECHO,HIGH,TIMEOUT_PULSO); // Medir el tiempo que tarda en llegar un pulso distancia=MEDIA_VELOCIDAD_SONIDO*tiempo; Serial.print(distancia); Serial.println(" cm"); reloj=millis(); } } void setup() { Serial1.begin(9600); pinMode(PIN_ECHO,INPUT); pinMode(PIN_TRIGGER,OUTPUT); digitalWrite(PIN_TRIGGER,LOW); // Para «limpiar» el pulso del pin trigger del módulo delayMicroseconds(2); } void loop() { medirDistancia(); Serial1.print("*D"+String(distancia,1)+"*"); }
Ejercicio a realizar:
Modificar el coche de tal forma que al darle al botón de marcha esté avanzando y evitando obstáculos hasta que al pulsar otro botón se pare.
El servo moverá el módulo de ultrasonidos, haciendo un barrrido.
Llamarlo: p11.ino