Publicidad

sábado, 17 de junio de 2017

Barco Aerodeslizador RC Bluetooth

Estaba el otro día paseando por el parque, cuando vi a unos niños jugando con un barquito hecho con corchos de botellas de vino unidos entre sí con palillos de madera, y un pañuelo a modo de vela.

barco con corchos.jpg
Imagen cortesía elhadadepapel.com

Como fan de las cosas DIY que soy, me pareció una idea brillante por su simplicidad y funcionalidad. Y ahí estaban los niños, soltando el barquito en un lado del estanque y corriendo hacia el contrario esperando para recogerlo, mientras el viento lo empujaba.

Pensé en lo divertido que sería tener tu propio barco de radiocontrol. Y se me encendió la bombilla. Esos peques me enseñaron como hacer el barco, del resto me encargo yo.

En el siguiente proyecto veremos cómo hacer un sencillo barco de radiocontrol mediante bluetooth. La idea es imitar el funcionamiento de un aerodeslizador.

aerodeslizador.jpg
Fuente wikipedia

Vale que nuestro barquito desentonaría un poco entrando en Puerto Banús, pero es 100% DIY y eso es lo que importa.

Como hacer el barco

Para el barco propiamente dicho, voy a emplear una botella de agua de 1 litro abierta por la mitad. En la parte trasera he pegado con una pistola de silicona un trozo de plástico donde irá un pequeño ventilador montado sobre un servo para dirigir el barco.



A continuación pegamos a cada lado, una botella más pequeña, de 33cl con el fin de dar estabilidad al barco y evitar que naufrague.


Para terminar introducimos en el interior del barco, las baterías y la electrónica. También he añadido dos leds blancos en la proa y dos rojos en la popa.


Para el control remoto vamos a utilizar un módulo HC-05 conectado a un Arduino NANO V3 controlado con una aplicación desde un móvil Android.


Al utilizar el móvil, nos ahorramos tener que hacer un mando de control remoto, pues lo único que necesitamos es instalar la aplicación Arduino Bluetooth RC Car de Andi Co.
Además el bluetooth ofrece mayor alcance y fiabilidad que los mandos por radiofrecuencia.





Esquema

Como se aprecia en el esquema, he utilizado un L293D para controlar el motor del ventilador, de esta manera podemos invertir el sentido de giro y mover el barco hacia delante y atrás.

Para evitar sobrecargar los pines del Arduino NANO, he alimentado los leds y el zumbador mediante transistores. También se pueden conectar directamente, siempre que el consumo sea inferior a 40mA por cada pin digital del Arduino.

Es posible simplificar el circuito, sustituyendo el L293D por un transistor, pero con la desventaja de no poder invertir el sentido de giro del motor. Pincha aquí para más info.

Todo el circuito se alimenta con cuatro pilas recargables NI-MH de 1,2V.







Sketch

Vamos a pasar a la parte del código.

El funcionamiento es muy sencillo, dependiendo del botón que pulsemos en la pantalla de nuestro móvil, la aplicación manda un mensaje por bluetooth correspondiente a una letra. El receptor lo interpreta y actúa en consecuencia invocando a la función que corresponda.

Mira el Tutorial Oficial de la aplicación para obtener más información.


/* Bluetooth RC Boat
  version On Change mode
  LEDS en Proa y Popa
  Buzzer
*/

#include <Servo.h>
Servo myservo;

int in1Pin = 8; // pin 2 del L293D
int in2Pin = 7; // pin 7 del L293D
int enableM1 = 6; // pin 1 del L293D
int ledsProa = 4; // Leds Proa al pin D4 del Arduino
int ledsPopa = 3; // Leds Popa al pin D3 del Arduino
int buzzer = 2; // Buzzer al pin D2 del Arduino

char command = 'S';
void setup() {
 
  myservo.attach(5);  // Servo al pin D5 del Arduino
   pinMode(in1Pin, OUTPUT);
   pinMode(in2Pin, OUTPUT);
   pinMode(enableM1, OUTPUT);
   pinMode(ledsProa, OUTPUT);
   pinMode(ledsPopa, OUTPUT);
   pinMode(buzzer, OUTPUT);
   Serial.begin(9600);
}

// Funciones
// Si el commando es 'S' el motor se para
void motorsOff(){
 
 digitalWrite(enableM1, LOW);  
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
  
}

// Si el commando es 'F' el barco avanza
void goForward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
       
}

// Si el commando es 'B' el barco retrocede
void goBackward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, HIGH);
 myservo.write(90);
       
}

// Si el comando es 'R' el barco gira a estribor
void turnRight() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(120);
}

// Si el comando es 'L' el barco gira a babor
void turnLeft() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(60);
}

// Si el comando es 'U' encender los leds de popa
void ledsPopaOn() {
       digitalWrite(ledsPopa, HIGH);
}

// Si el comando es 'u' apagar los leds de popa
void ledsPopaOff() {
       digitalWrite(ledsPopa, LOW);
}

// Si el comando es 'W' encender los leds de proa
void ledsProaOn() {
       digitalWrite(ledsProa, HIGH);
}

// Si el comando es 'w' apagar los leds de proa
void ledsProaOff() {
       digitalWrite(ledsProa, LOW);
}

// Si el comando es 'V' activar el zumbador
void buzzerOn() {
       digitalWrite(buzzer, HIGH);
}

// Si el comando es 'v' desactivar el zumbador
void buzzerOff() {
       digitalWrite(buzzer, LOW);
}

// Si el comando es 'D' apagar todo
void allOff(){
 digitalWrite(ledsProa, LOW);
 digitalWrite(buzzer, LOW);
 digitalWrite(ledsPopa, LOW);
 digitalWrite(enableM1, LOW);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
}

void loop() {
   //if some date is sent, reads it and saves in command
   if(Serial.available() > 0){
     command = Serial.read();
     
       switch(command){
         case 'S':
           motorsOff();
           break;
         case 'F':
           goForward();
           break;
         case 'B':
           goBackward();
           break;
         case 'R':
           turnRight();
           break;
         case 'L':
           turnLeft();
           break;
         case 'U':
           ledsPopaOn();
           break;
         case 'u':
           ledsPopaOff();
           break;
         case 'W':
           ledsProaOn();
           break;
         case 'w':
           ledsProaOff();
           break;
         case 'V':
           buzzerOn();
           break;
         case 'v':
           buzzerOff();
           break;
         case 'D':
           allOff();
           break;
             
           
         }   
       }
      }




Una vez subido el código al Arduino, abrimos la aplicación Bluetooth RC Car y tocamos en Settings . Seleccionar Connect to car, en la lista de dispositivos, seleccionamos HC-05 y ponemos el PIN 1234 o bien 0000 si es la primera vez que conectamos con el módulo bluetooth.

Una vez el móvil se conecta por bluetooth, el icono pasa a verde y al pulsar sobre los mandos, el barco actuará en consecuencia.



Barco Aerodeslizador RC Bluetooth v2

Actualizado el 6 de mayo de 2017

He sometido al barco aerodeslizador a una pequeña actualización. Los cambios que he realizado son, por un lado sustituir el motor original procedente de un ventilador a pilas, por dos motores de cuadricóptero y he simplificado el esquema de conexión. Clic sobre la imagen siguiente para ver un gift.


Esquema

Como se aprecia en el esquema, he prescindido de los transistores que alimentaban los ledes y el zumbador. Este cambio no supone ningún problema, siempre que no se superen los 40mA por cada pin digital del Arduino NANO, o 20mA si estamos utilizando al Arduino UNO.

Aunque no lo he dibujado en el esquema, los dos motores están conectados en paralelo en los pines 3 y 6 del L293D.

Arduino Bluetooth RC BOAT - Schematic v2.PNG


Sketch

Solo queda modificar el código visto más arriba, para adaptarlo al nuevo esquema.


/* Bluetooth RC Boat
  version On Change mode Rev 2
  LEDS en Proa y Popa
  Buzzer
*/

#include <Servo.h>
Servo myservo;

int in1Pin = 8; // pin 2 del L293D
int in2Pin = 7; // pin 7 del L293D
int enableM1 = 6; // pin 1 del L293D
int DL1 = 12; // Led Proa al pin D12 del Arduino
int DL2 = 11; // Led Proa al pin D11 del Arduino
int DL3 = 10; // Led Popa al pin D10 del Arduino
int DL4 = 9; // Led Popa al pin D9 del Arduino
int buzzer = 2; // Buzzer al pin D2 del Arduino

char command = 'S';
void setup() {
 
  myservo.attach(5);  // Servo al pin D5 del Arduino
   pinMode(in1Pin, OUTPUT);
   pinMode(in2Pin, OUTPUT);
   pinMode(enableM1, OUTPUT);
   pinMode(DL1, OUTPUT);
   pinMode(DL2, OUTPUT);
   pinMode(DL3, OUTPUT);
   pinMode(DL4, OUTPUT);
   pinMode(buzzer, OUTPUT);
   Serial.begin(9600);
}

// Funciones
// Si el commando es 'S' el motor se para
void motorsOff(){
 
 digitalWrite(enableM1, LOW);  
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
  
}

// Si el commando es 'F' el barco avanza
void goForward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
       
}

// Si el commando es 'B' el barco retrocede
void goBackward() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, HIGH);
 myservo.write(90);
       
}

// Si el comando es 'R' el barco gira a estribor
void turnRight() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(120);
}

// Si el comando es 'L' el barco gira a babor
void turnLeft() {
 digitalWrite(enableM1, HIGH);
 digitalWrite(in1Pin, HIGH);
 digitalWrite(in2Pin, LOW);
 myservo.write(60);
}

// Si el comando es 'U' encender los leds de popa
void ledsPopaOn() {
       digitalWrite(DL3, HIGH);
       digitalWrite(DL4, HIGH);
}

// Si el comando es 'u' apagar los leds de popa
void ledsPopaOff() {
       digitalWrite(DL3, LOW);
       digitalWrite(DL4, LOW);
}

// Si el comando es 'W' encender los leds de proa
void ledsProaOn() {
       digitalWrite(DL1, HIGH);
       digitalWrite(DL2, HIGH);
}

// Si el comando es 'w' apagar los leds de proa
void ledsProaOff() {
       digitalWrite(DL1, LOW);
       digitalWrite(DL2, LOW);
}

// Si el comando es 'V' activar el zumbador
void buzzerOn() {
       digitalWrite(buzzer, HIGH);
}

// Si el comando es 'v' desactivar el zumbador
void buzzerOff() {
       digitalWrite(buzzer, LOW);
}

// Si el comando es 'D' apagar todo
void allOff(){
 digitalWrite(DL1, LOW);
 digitalWrite(DL2, LOW);
 digitalWrite(DL3, LOW);
 digitalWrite(DL4, LOW);
 digitalWrite(buzzer, LOW);  
 digitalWrite(enableM1, LOW);
 digitalWrite(in1Pin, LOW);
 digitalWrite(in2Pin, LOW);
 myservo.write(90);
}

void loop() {
   //if some date is sent, reads it and saves in command
   if(Serial.available() > 0){
     command = Serial.read();
     
       switch(command){
         case 'S':
           motorsOff();
           break;
         case 'F':
           goForward();
           break;
         case 'B':
           goBackward();
           break;
         case 'R':
           turnRight();
           break;
         case 'L':
           turnLeft();
           break;
         case 'U':
           ledsPopaOn();
           break;
         case 'u':
           ledsPopaOff();
           break;
         case 'W':
           ledsProaOn();
           break;
         case 'w':
           ledsProaOff();
           break;
         case 'V':
           buzzerOn();
           break;
         case 'v':
           buzzerOff();
           break;
         case 'D':
           allOff();
           break;
             
           
         }   
       }
      }


Una vez subido el código al Arduino, abrimos la aplicación Bluetooth RC Car y tocamos en Settings . Seleccionar Connect to car, en la lista de dispositivos, seleccionamos HC-05 y ponemos el PIN 1234 o bien 0000 si es la primera vez que conectamos con el módulo bluetooth.

Una vez el móvil se conecta por bluetooth, el icono pasa a verde y al pulsar sobre los mandos, el barco actuará en consecuencia.




Enlaces

Descarga la aplicación Arduino Bluetooth RC Car de Andi Co

Tutorial oficial de la aplicación.

Más sobre Arduino y módulos bluetooth aquí y aquí.



1 comentario:

Publicidad