Coche Solar 2022

El coche, está diseñado a partir del tren trasero y las manguetas delanteras de un antiguo fórmula 1 escala 1/10 (marca 3racing , modelo F109) es la típica configuración de motor transversal junto al eje rígido que integra un diferencial de bolas en la corona en este caso con ruedas de espuma. El tren delantero se ha ensanchado casi al del panel para aportar estabilidad y al tiempo garantizar el agarre lateral del trasero al dejarlo en su medida original mucho más estrecho. El resto del chasis está hecho con láminas de policarbonato de 3mm de espesor procedentes de recortes (salvados de la basura) sobrantes de la elaboración de mamparas protectoras y que aportan una buena torsión y un peso bastante bajo. Utiliza un servo de dirección básico y de consumo moderado Hitec HS325HB alimentado por las pilas reglamentarias junto con el receptor y el esp32 que supervisa la tensión procedente del panel y atenúa la señal de control del acelerador (canal 2 del receptor) solo si dicha tensión baja de 18v como pseudo mppt.

Cómo sistema de tracción se utiliza un variador electrónico diseñado para coches de radiocontrol escala 1:8 (tekin rx8) que soportan la alta tensión del panel y también aportan un plus de unas 200 revoluciones más a la rueda en motores con sensores en su configuración del “timing”, el motor es del tipo brushless 3650 inrunner con sensores, típicos de coches escala 1/10, al que tuvimos que modificar el bobinado a 48 espiras de hilo de 0.51mm para obtener un rendimiento adecuado a la alta tensión y poca intensidad, pues son motores pensados para baterías 2s (8.4v máximo) y muchísimos más amperios disponibles. Aprovechando que el motor estaba abierto hemos acortado un poco el bobinado retirando algunas láminas del devanado para subir un poco las revoluciones a costa de perder algo de par. Lleva un piñón de motor de 13 dientes y una corona de 81 ya sobre el eje de las ruedas traseras.

El peso total es de unos 2,3kg y en las mejores condiciones hemos llegado a medir unos 25km/h de velocidad máxima.

Software

Este es el programa del Esp32 que supervisa que la tensión del panel no baje de 18v para lo que recibe la señal del acelerador del receptor y la reenvía modificada si es necesario en función de la medida de la tensión del panel a través de un divisor de tensión de tres resistencias: una de 33k entre el positivo y la patilla del micro y otra de 5k9 (4k7+1k2) entre la patilla y el negativo:

#include <ESP32Servo.h>
 
Servo motor;
int pin = 5;                 // entrada de direccion del receptor
int pin2= 18;                // entrada de acelerador
int led= 2;                  // define led interno y externo(si procede)
unsigned long direccion;
unsigned long acelerador;
unsigned long restadegiro;   // aqui escribiremos la diferencia entre 1500 y el valor de direcion
                             // aplicado para restarle velocidad al motor interior de la curva
unsigned long motorinterior; // aqui escribiremos el valor de velocidad del motor que avanza
                             // menos en el interior de la curva antes de enviarlo
unsigned long receptor;  // registro de lectura de pulso de entrada de receptor
unsigned long resta=0 ;  // registro donde ajustaremos la cuantia de la atenuacion
unsigned long modulado;  // registro de resultado del mppt para enviar al variador de velocidad
unsigned long potActual; // factor de potencia de la ultima medida
float operando1 = 20;
float operando2;
float operando3;
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
float factorpot = 1;     // valor del pot de ajuste
float factorRc = 0;      // valor del factor de ajuste de la atenuacion en funcion de la señal del receptor
float factorV = 0;       // valor del factor de ajuste resultado de restar la tension max y la actual
 
void setup() {
  // motorizquierdo.attach(4);               // salida
  // motorizquierdo.writeMicroseconds(1500); // set servo to mid-point
  // Serial.begin(9600);
  pinMode(pin, INPUT);
  motor.attach(15);    //salida
  motor.writeMicroseconds(1500);  // set servo to mid-point
  // Serial.begin(9600);
  pinMode(pin2, INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);    // turn the LED off
  delay (100);
  digitalWrite(led, LOW);     // turn the LED off
  delay (100);
  digitalWrite(led, HIGH);    // turn the LED off
  delay (100);
  digitalWrite(led, LOW);     // turn the LED off
}
 
void loop() {
  VoltMaxima= analogRead(A0);      // hacemos una primera lectura directa al registro
  lectura:;
    operando1 = operando1 - 1;
    voltaje = analogRead(A0);      // lectura de tension de panel
    operando2= voltaje/20;         // registramos el voltaje del panel solo ahora que estamos parados y no hay carga
    operando3= VoltMaxima/20;
    VoltMaxima= operando3*19 + operando2;    // cada lectura modifica solo en una pequeña porcion para afinar un poco mas
    if (operando1>0) goto lectura;           // hacemos un pequeño bucle antes de arrancar para fijar la maxima con cierta precision
    //receptor = pulseIn(pin, HIGH, 20000 ); // lee la señal del receptor
    //variador.writeMicroseconds(receptor);  // envia señal al variador directa
 
bucle:;
  voltaje = analogRead(A0);                // lectura de tension de panel
  VoltMaxima = (3300);                     // esto anula el bucle inicial de calculo y fija 18v aprox como voltaje maxima
  acelerador = pulseIn(pin2,HIGH, 30000);  // lee el pin2 y lo guarda en el registro de acelerador
  caidaV = VoltMaxima - voltaje;           // calculamos la caida de tension del panel
  // Serial.println(caidaV);
  if (voltaje>voltajeanterior) goto recupera; // si la tension medida es mayor que la anterior no seguimos atenuando la señal
  //  if (voltaje>VoltMaxima) caidaV = 0;     // por si algun pico en la medida nos da un numero alto en la resta
  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:;
  //    Serial.println(resta);
  if (resta>10) digitalWrite(led, HIGH); // o encendemos el indicador de atenuacion
  if (resta<10) digitalWrite(led, LOW);  // o apagamos
  modulado = acelerador - resta;
  if (modulado<1600)modulado = 1600;  // señal minima atenuada sera 1550 (recordemos 1000 freno/atras 1500 parado 2000 a fondo)
  if (modulado>acelerador){           // si la orden del acelerador es menor que la calculada
    // resta=0;                       //   reiniciamos el registro de atenuacion
    modulado=acelerador;              //   y escribiremos la señal directa
  }
 
  motor.writeMicroseconds(modulado);  // sacamos la señal hacia el variador
 
  // Serial.println(modulado);
 
  voltajeanterior = voltaje ;
  goto bucle;
}

coche_a.jpgcoche_d.jpg

coche_c.jpgcoche_d.jpg