Diferencia entre revisiones de «Robot teledirigido por bluetooth»
Línea 176: | Línea 176: | ||
[https://www.luisllamas.es/conectar-arduino-por-bluetooth-con-los-modulos-hc-05-o-hc-06/ Tutorial de cómo conectar] | [https://www.luisllamas.es/conectar-arduino-por-bluetooth-con-los-modulos-hc-05-o-hc-06/ Tutorial de cómo conectar] | ||
[https://robologs.net/2015/05/15/tutorial-de-bluetooth-con-arduino-hc-06-en-linux/ Tutorial de conectar y monitorizar] |
Revisión actual - 18:35 21 may 2019
El robot teledirigido que nosotros vamos a hacer está basado en el Robot sigue líneas con Arduino, tan solo que no vamos a usar sensores. En nuestro caso, el robot será manejado con el teléfono móvil.
Construcción del robot
Materiales
El chasis que verás en las fotos es específico, creado a medida por la empresa What's Next? para el proyecto [Robots Boost Skills]. El resto de componentes son genéricos y se pueden comprar Arduinos oficiales, What's Next Yellow o cualquier clon compatible.
Esta es la lista de materiales:
- Chasis que permita 2 ruedas con motor DC analógicos y una rueda delantera.
- 2 Motores DC analógicos con reducción y ruedas.
- Arduino Uno o equivalente.
- Arduino Motor Shield o alguno que tenga el mismo Chip L298
- Baterías, entre 9V y 12V
- Receptor bluetooth HC-06.
- Teléfono móvil (En nuestro caso, con Android, bluetooth y una app como, por ejemplo, Arduino Bluetooth Controller)
Este sería el esquema a montar:
Programación
Leyendo del receptor
Para empezar, vamos a probar que comunica nuestro bluetooth con el teléfono. Podemos cargar este programa:
const int led = 13;
int option;
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
//si existe información pendiente
//delay(1000);
if (Serial.available()>0){
//leeemos la opcion
char option = Serial.read();
//si la opcion esta entre '1' y '9'
if (option >= '1' && option <= '9')
{
//restamos el valor '0' para obtener el numero enviado
option -= '0';
for(int i=0;i<option;i++){
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(200);
Serial.println(i);
}
}
}
}
Ahora, conectamos el bluetooth, en nuestro caso la contraseña es 1234, y abrimos la opción de Terminal Mode donde podremos enviar el número que queramos y leer lo que envía. Al mismo tiempo, el LED integrado se encenderá las veces que marque nuestro número.
Moviendo las ruedas
Para mover las ruedas, podemos crear las funciones para ir hacia delante, atrás, izquierda y derecha:
void front(int time, int speed){
digitalWrite(12, HIGH); // Dirección de A
digitalWrite(9, LOW); // Quitar el freno de A
analogWrite(3, speed); // Establece la velocidad de A
digitalWrite(13, LOW); // Dirección de B
digitalWrite(8, LOW); // Quita el freno de B
analogWrite(11, speed); // Establece velocidad de B
delay(time);
}
void left(int time, int speed){
digitalWrite(12, HIGH);
digitalWrite(9, LOW);
analogWrite(3, speed);
digitalWrite(13, LOW);
digitalWrite(8, HIGH);
analogWrite(11, 0); // <-- Parar el motor B (velocidad 0)
delay(time);
}
void right(int time, int speed){
digitalWrite(12, HIGH);
digitalWrite(9, HIGH);
analogWrite(3, 0); // <-- Para el motor A
digitalWrite(13, LOW);
digitalWrite(8, LOW);
analogWrite(11, speed);
delay(time);
}
Una vez creadas las funciones, podemos llamarlas en función de lo que el mando a distancia indique. Para ello, vamos a asociar un caracter del mando a un movimiento. Podemos usar el estándar de los juegos wasd:
↑ w ← a s d → ↓
De esta manera, el algoritmo queda así:
const int led = 2;
void back(int time, int speed){
digitalWrite(12, HIGH); // Dirección de A
digitalWrite(9, LOW); // Quitar el freno de A
analogWrite(3, speed); // Establece la velocidad de A
digitalWrite(13, LOW); // Dirección de B
digitalWrite(8, LOW); // Quita el freno de B
analogWrite(11, speed); // Establece velocidad de B
delay(time);
}
void front(int time, int speed){
digitalWrite(12, LOW); // Dirección de A
digitalWrite(9, LOW); // Quitar el freno de A
analogWrite(3, speed); // Establece la velocidad de A
digitalWrite(13, HIGH); // Dirección de B
digitalWrite(8, LOW); // Quita el freno de B
analogWrite(11, speed); // Establece velocidad de B
delay(time);
}
void left(int time, int speed){
digitalWrite(12, LOW);
digitalWrite(9, LOW);
analogWrite(3, speed);
digitalWrite(13, HIGH);
digitalWrite(8, HIGH);
analogWrite(11, 0); // <-- Parar el motor B (velocidad 0)
delay(time);
}
void right(int time, int speed){
digitalWrite(12, LOW);
digitalWrite(9, HIGH);
analogWrite(3, 0); // <-- Para el motor A
digitalWrite(13, HIGH);
digitalWrite(8, LOW);
analogWrite(11, speed);
delay(time);
}
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
//Setup Channel A
pinMode(12, OUTPUT); //Inicia el pin del Motor A
pinMode(9, OUTPUT); //Inicia el freno del Motor A
//Setup Channel B
pinMode(13, OUTPUT); //Inicia el pin del Motor B
pinMode(8, OUTPUT); //Inicia el freno del Motor B
}
void loop(){
//si existe información pendiente
//Serial.println("Blue");
//delay(1000);
if (Serial.available()>0){
//leeemos la opcion
char option = Serial.read();
//si la opcion esta entre '1' y '9'
if (option == 'a') { left(150,100); }
if (option == 'w') { front(150,100); }
if (option == 's') { back(150,100); }
if (option == 'd') { right(150,100); }
}
}