Proyecto Barco Velero RadioControl (Nano+NRF24)

Hola!

Vengo a enseñaros un proyecto curioso, un día andaba con mi novia en la Manga del Mar Menor, viendo los veleros y catamaranes con los que ella trabajaba en una escuela de vela, y dije, algún día tendremos uno!
Bueno, lo que realmente hemos obtenido no esta a la altura de aquellos navíos pero menos da una piedra.

Todo el sistema esta hecho desde 0 con arduino, un velero radiocontrol el cual solo tenia las partes móviles y los servos, todo lo demás ya no lo tenia el antiguo dueño (lo compramos en wallapop), ademas de una emisora RC que tenia de un antiguo coche de gasolina el cual ya no tenia, cosas del destino…

He utilizado los modulos de radio NRF24L01 con antena amplificadora


Empezando con el EMISOR:
Esquema de conexionado

Datos importantes a tener en cuenta, se utilizan condensadores de 10microFaradios para estabilizar la alimentación del modulo de radio y del Nano, ademas también se deben alimentar los módulos NRF24L01 con unos estabilizadores de tensión LD33, a 3,3 voltios el arduino se alimentará directamente de la batería LIPO de 7,4V y 800mAh (aunque diga otra cosa en el esquema).

Y el codigo

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <ServoPot.h>

ServoPot potTimon;
ServoPot potVela;
ServoPot potMotor;
RF24 radio(7, 8); // CE, CSN
const uint64_t pipes = { 0xF0F0F0F0E1LL };
int pul = 9;
int var[1];
int AMP;

struct Mando{
  byte timon;
  byte vela;
  byte motor;
};

Mando Message;

void setup() {
  pinMode(10, OUTPUT);
  pinMode(pul, INPUT);
  Serial.begin(9600);
  lcd.begin(16, 2);
   radio.begin();
     radio.openWritingPipe(pipes);

  potVela.setInput(A4);
  potVela.setSAV(50,120);
  potVela.setPotval(680,360);

  potTimon.setInput(A5);
  potTimon.setSAV(35,125);
  potTimon.setPotval(465,785);
 
 AMP = 3;
  pinMode(AMP, INPUT);
}


void loop() {
  
  //Parte que imprime valores a struct y manda por Radio   
       
        Message.timon = potTimon.GetValue();
        Message.vela = potVela.GetValue();
        Message.motor = digitalRead(pul);
        radio.write(&Message, sizeof(Message));
     
    /*              
          Serial.print(analogRead(A5));
          Serial.print(" <-TIMON-> ");
          Serial.print(Message.timon);
          Serial.print(" - ");
          Serial.print(analogRead(A4));
          Serial.print(" <-VELA->");
          Serial.print(Message.vela);
          Serial.print(" - ");
          Serial.print(analogRead(A0));
          Serial.print(" <-MOTOR-> ");
          Serial.println(Message.motor);   */

}

Y el RECEPTOR:
Esquema de conexionado


Aquí tendremos que tener en cuenta la señal que va a los servos, dado que si dejamos la conexión tal cual esta crea interferencias y hace que la transmisión sea errática haciendo que vaya a trompicones, por lo que utilizaremos unos diodos a la salida del Nano. Este esta alimentado con una batería 7,4V y 1280mAh ademas de llevar un avisador acústico para el agotamiento de esta (lo venden en tiendas RC)

Y el codigo del receptor

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

Servo timon; // CREAMOS EL OBJETO SERVO TIMON
Servo vela; //CREAMOS EL OBJETO SERVO VELA
RF24 radio(7, 8);  // PINES PARA LA COMUNICACION DE LA RADIO

const uint64_t pipes = { 0xF0F0F0F0E1LL };
int motor = 2; // DIRECCION A SALIDA DIGITAL DEL MOTOR

 /* - CREAMOS CONSTRUCTOR PARA RECIBIR LOS DATOS - */
struct Barco{
  byte timon;
  byte vela;
  byte motor;
}; Barco Message;



void setup()
{
 
  pinMode(10, OUTPUT);
  
 /* - AJUSTES AL SERIAL - */
  Serial.begin(9600); 
 while (!Serial);
     radio.begin();
     radio.openReadingPipe(0, 0xF0F0F0F0E1LL);
     radio.startListening();
 /* - FIN AJUSTES DE SERIAL - */

 /* - AJUSTES A LOS SERVOS - */
  timon.attach(6);
  vela.attach(9);
 /* - FIN AJUSTES A LOS SERVOS - */

 /* - AJUSTES AL MOTOR - */
  pinMode(motor, OUTPUT);
 /* - FIN AJUSTES AL MOTOR - */
 
}

void loop()
{
 /* - TOMANDO LECTURA DE LA RADIO - */
  if (radio.available()) {
   radio.read(&Message, sizeof(Message));  // LECTURA DEL MENSAJE ENVIADO EN EL EMISOR
     timon.write( Message.timon );  // PASAMOS LOS DATOS DEL POTENCIOMETRO TIMON EN EL EMISOR A EL SERVO TIMON EN RECEPTOR
     vela.write( Message.vela ); // PASAMOS LOS DATOS DEL POTENCIOMETRO VELA EN EL EMISOR A EL SERVO TIMON EN VELA
   if (Message.motor == 0 ){ // SI LOS DATOS DEL INTERRUPTOR EN EMISOR SON 0 MANTEN APAGADO EL MOTOR, SI NO ENCIENDELO
       digitalWrite(motor,LOW);
     }else{
       digitalWrite(motor,HIGH);
   }
 }
}

os dejo por aquí las ultimas versiones del software tanto emisor como receptor ademas de una librería que he programado para añadir al IDE para el control de servos con potenciometros.

y una foto del velero jeje

en los adjuntos teneis los .ino y la librería.

Un saludo ya me comentáis dudas y cuando tenga un rato le haré un vídeo.
comentad vuestras dudas y que mejorariaís en el proyecto que es lo que mejor me viene

GRACIAS!!!

EMISOR_1.3.ino (2.41 KB)

RECEPTOR_1.2.ino (1.51 KB)

ServoPot.zip (2.72 KB)

Gracias DavidGom1, por el aporte, estoy intentando hacer algo parecido con una maqueta de un barco contra incendios, el Dusseldorf, estoy viendo que es algo mas complicado de lo que a mi me parecía pero recopilando información como la tuya, estoy aclarando un montón de dudas, muchas gracias.

Cuando tenga algo en condiciones, publicare el proyecto, de momento solo tengo comprado el casco y me estoy peleando con el montaje del casco del barco en si, dejando toda la parte de la estructura desmontable, para poder acceder a las tripas del barco y poder modificar el interior a mis necesidades, lo del control del movimiento lo estoy estudiando, para poder implementarlo en la maqueta.

Tiene tres mangueras contra incendios, que deben moverse independientemente, con sus motores, un radar móvil y un cabrestante para un bote auxiliar, y otro para mover (soltar y recoger) el ancla.

La propulsión se la dan 2 motores sin escobillas, que ya tengo claro como se controlan, y a demás tiene un tercer propulsor en la parte de adelante (propulsor de proa), sincronizado con los motores traseros, para facilitar las maniobras, de modo que cuando los propulsores principales giren hacia un lado, el propulsor de proa gire en sentido contrario, y se reduzca el radio de giro del barco.

Hola David.

Yo estoy montando un drone para controlarlo del el pc. El día que que pueda volar lo publicaré.

Hay algo que tendrías que tener en cuenta y es el consumo del motor auxiliar.

Las salidas de forma individual (y el micro en su conjunto) tienen muy limitada la corriente que pueden entregar.

Los servos también consumen.

Cuando todo esté en funcionamiento puede producirse desde un reset hasta la muerte del microcontrolador.

En casa tengo uno que en cuanto lo alimentas se calienta hasta más de 90 grados. Lo conservo porque fue mi primera víctima, jejeje.

Muy chulos los dos barcos.