Herramientas de usuario

Herramientas del sitio


Barra lateral

Traducciones de esta página:

Página principal

Análisis y comparativas

Eventos Guías Herramientas Información de interés Proyectos
> Usuarios Varios Wiki Privado

No hay páginas en esta sección.

old admin

No hay páginas en esta sección.

proyectos:barcosolar2022

Barco Solar 2022

El barco es un catamarán totalmente construido a partir de láminas de poliestireno extruido de 3cm de espesor con dos cascos hechos con dos láminas cortadas con hilo caliente de nicrom para dar la forma a cada una de las mitades , pegadas entres si con los motores y ejes rígidos embutidos dentro de cada casco. Ambos unidos entre si por dos láminas del mismo material y espesor. Ambos han sido pulidos con lijas la más fina de 2000 sin ningún otro acabado. El barco vira por diferencia de velocidad entre los dos motores hasta que se gira completamente la dirección, momento en el cual entra un timón con un ángulo fijo en la parte delantera interna al giro para ayudar a cerrar más la curva (inspirado en las traineras). Para ello se han dispuesto dos servos controlados por un Arduino nano en la parte delantera que recibe la señal de la dirección directa y maneja los servos.

Los dos motores son de escobillas de 5 polos de muy bajo consumo que alcanzan unas 8000rpm a 18v , la emisora utilizada es de volante (radiolink RC6GS) pero con hasta 6 canales y realiza la mezcla de dirección y aceleración para mover los dos motores de manera diferencial a través de los canales 1 y 2 por el tercer canal se envía una señal de ajuste de la profundidad de los timones de dirección y en el cuarto la señal de dirección sin mezclar para el Arduino nano delantero. El sistema de control de la potencia procedente del panel solar se encomienda a un esp32 que únicamente vigila la tensión del panel a través de un divisor de tensión para no dañar la entrada , y atenúa las señales de control de los variadores de velocidad de los motores, solo si la tensión baja de 18v . Para la alimentación de la parte lógica hemos prescindido de las pilas y los sistemas de alimentación bec de cada variador de velocidad alimentan al receptor y el esp32 uno, el Arduino nano y los dos servos con el otro. El barco tiene un largo total de 1.6m y el ancho aproximadamente del panel situado longitudinalmente, pesa unos 4kg y en nuestras pruebas desarrolla una velocidad máxima de unos 5 nudos.

Enlaces a los principales componentes

A la izquierda (pincha en la imagen para verla con detalle) tenemos el adhesivo utilizado para todas las uniones entre poliestireno extruido y también con policarbonato.

A la derecha: detalle del suelo dentro de la caja de electrónica, para que actúe de sentina en el caso de que entre una pequeña cantidad de agua.


A la izquierda podemos ver la caja con varios hilos de nicron para aproximar la curva del casco.

En las otras dos fotos podemos ver los resultados en el propio casco (Recuerda que puedes pinchar en la imagen para ampliar).


A la izquierda, moldeando la popa del casco.

Resto de fotos, detalles del alojamiento de los motores embutidos en el casco. Y la herramienta utilizada para crear el alojamiento de los motores


A la izquierda, refuerzos de policarbonato para la proa. Además de reforzar la proa proporcionan una base para los servos de los timones de proa.

A la derecha, detalle del pegado de las dos mitades de un casco.


Detalle de los timones de proa para las maniobras de ciaboga.


Software

Control de timones de proa

Este es el programa que gestiona los timones delanteros del Arduino nano y al que llegan la señal de la dirección sin mezclar con la del acelerador y otra de ajuste de calado de los timones , osea que cuando bajen al agua lo hagan entre 45 y 90 grados desde la horizontal que tienen en reposo:

#include <Servo.h> 
 
Servo timondch;
Servo timonizq;
int pin = 2;            // entrada de señal de direcion
int patilla = 3;        // entrada de señal de ajuste de angulo maximo de baja de timones
unsigned direccion;     // registro del valor de direccion leido procedente del receptor
unsigned ajuste;        // registro de valor de ajuste de angulo maximo de bajada de timones
unsigned long delaydch; // registro de retardo para activar el timon derecho despues de una cantidad de ciclos 
unsigned long delayizq;
 
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  timondch.attach(6);
  timondch.writeMicroseconds(1980);  // timon dcho recogido
  timonizq.attach(5);
  timonizq.writeMicroseconds(960);   // timon izq recogido
}
 
void loop() {
  ajuste = pulseIn(patilla,HIGH,32000);  // lee la señal de ajuste de calado del receptor
  ajuste = ajuste -1000;
  ajuste=ajuste/2 +1;
  direccion = pulseIn(pin, HIGH, 32000 );     // lee la señal de direccion del receptor, timeout in 30,000uS (30mS)
  if (direccion<1050){                        // si la lectura es casi el extremo izq
    timonizq.writeMicroseconds(1950-ajuste);  // baja el timon 1950=>90º menos el ajuste entre cero y 500
  } else {
    timonizq.writeMicroseconds(960);          // si no recogelo
  }
  if(direccion>1980){                         // si la lectura es casi es extremo  dcho 
    timondch.writeMicroseconds(1000+ajuste);  // baja el timon  1000=>90º mas el ajuste entre cero y 500
  } else {
    timondch.writeMicroseconds(1980);         // si no recogelo
  }
}

Control de tensión demandada

Este es el programa que evita que la tensión del panel baje de 18v al que le entra una medida de tensión directa del panel que únicamente pasa por un divisor de tensión que se compone de tres resistencias: una de 33kOhm entre el positivo y la entrada y otra de 5k9 (4k7 + 1k2) entre la entrada y el negativo.

Además recibe las señales de servo que irían a los ESC de los dos motores ya mezcladas en la emisora y procedentes del receptor. El programa envía esas mismas señales sin modificar hacia dichos ESC siempre y cuando la tensión del panel no baje de los ya citados 18v:

#include <ESP32Servo.h>
 
Servo motorizquierdo;
Servo motorderecho;
int pin = 5;          // entrada de canal 1 del receptor
int pin2= 18;         // entrada de canal 2
int led= 2;           // define led interno y externo(si procede)
unsigned long motor1;
unsigned long motor2;
unsigned long resta=0 ;     // registro donde ajustaremos la cuantia de la atenuacion 
unsigned long modulado1;    // registro de resultado del valor atenuado para enviar al motor uno
unsigned long modulado2;    // registro de resultado del valor atenuado para enviar al motor 2
float caidaV;               // registro de diferencia de tension entra la medida actual y la maxima del panel
float VoltMinima;           // tension umbral para atenuar la señal
float VoltMaxima=3300;      // tension maxima registrada partimos de 3300 aprox=>  18 voltios (3070 aprox 17v)
float voltaje=3300;         // tension medida en panel  (antes588)
float voltajeanterior;      // tension medida en el ciclo anterior
 
void setup() {
  motorizquierdo.attach(4);               // salida  
  motorizquierdo.writeMicroseconds(1500); // set servo to mid-point
  // Serial.begin(9600);
  pinMode(pin, INPUT);
  motorderecho.attach(15);                // salida  
  motorderecho.writeMicroseconds(1500);   // set servo to mid-point
  // Serial.begin(9600);
  pinMode(pin2, INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);                // turn the LED off  
}
void loop() {
  voltaje = analogRead(A0);                   // lectura de tension de panel
  VoltMaxima= (3300);                         // esto anula el bucle inicial de calculo y fija 18v aprox como voltaje maxima
  motor1 = pulseIn(pin, HIGH, 30000 );        // Lee el pin5 y lo guarda en el registro de , timeoutmotor del canaluno in 30,000uS (30mS)
  motor2 = pulseIn(pin2,HIGH, 30000);         // lee el pin2 y lo guarda en el registro de canal2
  caidaV=VoltMaxima-voltaje;                  // calculamos la caida de tension del panel
  if (voltaje>voltajeanterior) goto recupera; // si la tension medida es mayor que la anterior no seguimos atenuando la señal 
  if (caidaV>100)resta = resta+2;             // si la caida es mayor que 0.5v (200/voltio) baja un punto la señal
  if (caidaV>500)resta =resta+10;             // si la caida es mayor que 2.5v baja diez puntos
  if (resta>400)resta=400;
  goto salta;
 
  recupera:;
  if (resta<5)goto salta;        // si el valor ya es casi cero ya no lo reduce mas
  resta=resta-0.5;               // sube medio punto solo por estar subiendo la tension aunque los niveles sean bajos aun
  if (caidaV<300)resta =resta-1; // si la caida de tension es inferior a voltio y medio y su valor no es ya cero, sube 
  if (caidaV<100)resta= resta-2; // si ademas es inferior a 0.5v le sube otrosi dos puntos.
 
  salta:;
  if (resta>10) digitalWrite(led, HIGH);   // o encendemos el indicador de atenuacion
  if (resta<10) digitalWrite(led, LOW);    // apagamos 
  modulado1=motor1-resta;
  if (modulado1<1600)modulado1 = 1600; // señal minima atenuada sera 1550 (recordemos 1000 freno/atras 1500 parado 2000 a fondo)
  if (modulado1>motor1){               // si la orden del acelerador es menor que la calculada
    modulado1=motor1;                  // y escribiremos la señal directa
  }
  modulado2=motor2-resta;
  if (modulado2<1600)modulado2 = 1600; // señal minima atenuada sera 1550 (recordemos 1000 freno/atras 1500 parado 2000 a fondo)
  if (modulado2>motor2){               // si la orden del acelerador es menor que la calculada
    modulado2=motor2;                  // y escribiremos la señal directa
  }
  motorizquierdo.writeMicroseconds(modulado1); // envia el valor directo al motor izq
  motorderecho.writeMicroseconds(modulado2);   // envia el valor directo al motor dcho
  voltajeanterior=voltaje ; 
}
proyectos/barcosolar2022.txt · Última modificación: 2022/06/14 07:44 por Sergio Alvariño