====== Barco Solar 2022 ====== {{ :proyectos:barco_solar:barco_bricolabs_2.jpg?600 |}} 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 ===== * Motores y ejes: [[https://a.aliexpress.com/_BOJZyS|Juego de acoplamiento de Motor Dual 545 + eje de 20CM + hélice CW CCW + Motor DIY, pieza de repuesto para cebo de pesca RC, modelo de barco]] * Acoplamiento ejes: [[https://a.aliexpress.com/_vD55uz|Conector de junta de resorte de acoplamiento Flexible suave para barco de control remoto, piezas de repuesto de eje de Motor de barco de alimentación, 2 uds.]] * Variadores electrónicos: [[https://a.aliexpress.com/_vnMncV|Cepillo bidireccional ESC 480A/960A, 10v-32v, 24v, 6S, controlador de velocidad eléctrico para DIY RC, pista diferencial, coches de escalada, barco]] * Hélices: [[https://a.aliexpress.com/_uiI2HF|Hélice de Metal de 4,76mm, tornillo izquierdo/derecho, 2 cuchillas, aleación de puntal, relación Picth 1,9, tornillo de 40/42/45/48mm para eje de barco de 4,76mm y 3/16'']] {{:proyectos:barco_solar:adhesivo.jpg?75 |}} 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. {{ :proyectos:barco_solar:detalle_sentina.jpg?200|}} ---- {{:proyectos:barco_solar:perfilado_nicron.jpg?200 |}} 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).{{ :proyectos:barco_solar:detalle_casco_a.jpg?200|}} {{ :proyectos:barco_solar:detalle_casco_b.jpg?400 |}} ---- {{:proyectos:barco_solar:perfilado_popa.jpg?200 |}}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 {{ :proyectos:barco_solar:alojamiento_motores_a.jpg?200|}} {{ :proyectos:barco_solar:alojamiento_motores_b.jpg?400 |}} {{ :proyectos:barco_solar:dremel.jpg?200|}} ---- {{:proyectos:barco_solar:refuerzo_policarbonato.jpg?200 |}}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. {{ :proyectos:barco_solar:pegado_casco.jpg?200|}} ---- Detalle de los timones de proa para las maniobras de ciaboga. {{ :proyectos:barco_solar:timones_proa.jpg?400 |}} ---- ===== 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 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 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 ; }