Herramientas de usuario

Herramientas del sitio


proyectos:cochesolar2022

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
proyectos:cochesolar2022 [2022/06/14 09:43] Sergio Alvariñoproyectos:cochesolar2022 [2022/08/19 17:08] (actual) Andrés Luces
Línea 1: Línea 1:
 ====== Coche Solar 2022 ====== ====== 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. +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. +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.
-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. 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 ===== ===== Software =====
Línea 17: Línea 15:
  
 Servo motor; Servo motor;
-int pin = 5;       //  entrada de direccion del receptor +int pin = 5;                 // entrada de direccion del receptor 
-int pin2= 18;       // entrada de acelerador +int pin2= 18;                // entrada de acelerador 
-int led= 2;           //define led interno y externo(si procede)+int led= 2;                  // define led interno y externo(si procede)
 unsigned long direccion; unsigned long direccion;
 unsigned long acelerador; 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 restadegiro;   // aqui escribiremos la diferencia entre 1500 y el valor de direcion 
-unsigned long motorinterior;  //aqui escribiremos el valor de velocidad del motor que avanza menos en el interior de la curva antes de enviarlo +                             // aplicado para restarle velocidad al motor interior de la curva 
-unsigned long receptor;        ///registro de lectura de pulso de entrada de receptor +unsigned long motorinterior; // aqui escribiremos el valor de velocidad del motor que avanza 
-unsigned long resta=0 ;           ///registro donde ajustaremos la cuantia de la atenuacion  +                             // menos en el interior de la curva antes de enviarlo 
-unsigned long modulado;                ////registro de resultado del mppt para enviar al variador de velocidad +unsigned long receptor;  // registro de lectura de pulso de entrada de receptor 
-unsigned long potActual;          /// factor de potencia de la ultima medida +unsigned long resta=0 ;  // registro donde ajustaremos la cuantia de la atenuacion 
-float operando1=20;+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 operando2;
 float operando3; float operando3;
-float caidaV;               //registro de diferencia de tension entra la medida actual y la maxima del panel +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 VoltMinima;        // tension umbral para atenuar la señal 
-float VoltMaxima=3300;       //tension maxima registrada partimos de 3300 aprox=>  18 voltios (3070 aprox 17v) +float VoltMaxima = 3300; // tension maxima registrada partimos de 3300 aprox=>  18 voltios (3070 aprox 17v) 
-float voltaje=3300;          //tension medida en panel  (antes588) +float voltaje = 3300;    // tension medida en panel  (antes588) 
-float voltajeanterior;       //tension medida en el ciclo anterior +float voltajeanterior;   // tension medida en el ciclo anterior 
-float factorpot=1;          //valor del pot de ajuste +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 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+float factorV = 0;       // valor del factor de ajuste resultado de restar la tension max y la actual 
 void setup() { void setup() {
- //   motorizquierdo.attach(4);    //salida   +  // motorizquierdo.attach(4);               // salida 
- // motorizquierdo.writeMicroseconds(1500);  // set servo to mid-point +  // motorizquierdo.writeMicroseconds(1500); // set servo to mid-point 
- // Serial.begin(9600);+  // Serial.begin(9600);
   pinMode(pin, INPUT);   pinMode(pin, INPUT);
-      motor.attach(15);    //salida  +  motor.attach(15);    //salida
   motor.writeMicroseconds(1500);  // set servo to mid-point   motor.writeMicroseconds(1500);  // set servo to mid-point
-// Serial.begin(9600);+  // Serial.begin(9600);
   pinMode(pin2, INPUT);   pinMode(pin2, INPUT);
-    pinMode(led, OUTPUT); +  pinMode(led, OUTPUT); 
-    digitalWrite(led, HIGH);    // turn the LED off   +  digitalWrite(led, HIGH);    // turn the LED off 
-    delay (100); +  delay (100); 
-       digitalWrite(led, LOW);    // turn the LED off  +  digitalWrite(led, LOW);     // turn the LED off 
-       delay (100); +  delay (100); 
-           digitalWrite(led, HIGH);    // turn the LED off   +  digitalWrite(led, HIGH);    // turn the LED off 
-    delay (100); +  delay (100); 
-       digitalWrite(led, LOW);    // turn the LED off +  digitalWrite(led, LOW);     // turn the LED off
 } }
  
 void loop() { void loop() {
- +  VoltMaxima= analogRead(A0);      // hacemos una primera lectura directa al registro
-  VoltMaxima= analogRead(A0);      //  hacemos una primera lectura directa al registro +
   lectura:;   lectura:;
-  operando1=operando1-1; +    operando1 = operando1 - 1; 
-  voltaje = analogRead(A0);      //  lectura de tension de panel +    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 +    operando2= voltaje/20;         // registramos el voltaje del panel solo ahora que estamos parados y no hay carga 
-  operando3=VoltMaxima/20;  +    operando3= VoltMaxima/20; 
-  VoltMaxima=operando3*19+operando2;    //cada lectura modifica solo en una pequeña porcion para afinar un poco mas +    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 +    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  +    //receptor = pulseIn(pin, HIGH, 20000 ); // lee la señal del receptor 
-  //variador.writeMicroseconds(receptor);   ///envia señal al variador directa+    //variador.writeMicroseconds(receptor);  // envia señal al variador directa 
 bucle:; bucle:;
-  voltaje = analogRead(A0);      //  lectura de tension de panel +  voltaje = analogRead(A0);                // lectura de tension de panel 
-   VoltMaxima= (3300);       //  esto anula el bucle inicial de calculo y fija 18v aprox como voltaje maxima +  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  +  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 +  caidaV = VoltMaxima - voltaje;           // calculamos la caida de tension del panel 
-   // Serial.println(caidaV); +  // 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>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 (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>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 (caidaV>500) resta = resta+10;           // si la caida es mayor que 2.5v baja diez puntos 
-  if (resta>400)resta=400;+  if (resta>400) resta = 400;
   goto salta;   goto salta;
-   recupera:; + 
-  if (resta<5)goto salta;               //si el valor ya es casi cero ya no lo reduce mas +recupera:; 
-  resta=resta-0.5;                        //sube medio punto solo por estar subiendo la tension aunque los niveles sean bajos aun +  if (resta<5) goto salta;        // si el valor ya es casi cero ya no lo reduce mas 
-  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  +  resta=resta-0.5;                // sube medio punto solo por estar subiendo la tension aunque los niveles sean bajos aun 
-  if (caidaV<100)resta= resta-2;          //si ademas es inferior a 0.5v le sube otrosi dos puntos. +  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 
-   salta:; +  if (caidaV<100)resta = resta-2; // si ademas es inferior a 0.5v le sube otrosi dos puntos. 
-    //    Serial.println(resta); + 
-         if (resta>10) digitalWrite(led, HIGH);    // o encendemos el indicador de atenuacion +salta:; 
-     if (resta<10) digitalWrite(led, LOW);    //  apagamos  +  //    Serial.println(resta); 
-  modulado=acelerador-resta; +  if (resta>10) digitalWrite(led, HIGH); // o encendemos el indicador de atenuacion 
-   if (modulado<1600)modulado = 1600;          //señal minima atenuada sera 1550 (recordemos 1000 freno/atras 1500 parado 2000 a fondo) +  if (resta<10) digitalWrite(led, LOW);  // apagamos 
-  if (modulado>acelerador){           //si la orden del acelerador es menor que la calculada +  modulado = acelerador - resta; 
- //   resta=0;                          //reiniciamos el registro de atenuacion +  if (modulado<1600)modulado = 1600;  // señal minima atenuada sera 1550 (recordemos 1000 freno/atras 1500 parado 2000 a fondo) 
-    modulado=acelerador;                // y escribiremos la señal directa+  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 +  motor.writeMicroseconds(modulado);  // sacamos la señal hacia el variador 
-   + 
-  //  Serial.println(modulado); +  // Serial.println(modulado); 
-  + 
- voltajeanterior=voltaje ;  +  voltajeanterior = voltaje ; 
-goto bucle;+  goto bucle;
 } }
 +
 +
 </code> </code>
 +
 +{{:proyectos:coche_solar:coche_a.jpg?400|coche_a.jpg}}{{  :proyectos:coche_solar:coche_d.jpg?400|coche_d.jpg}}
 +
 +{{:proyectos:coche_solar:coche_c.jpg?400|coche_c.jpg}}{{  :proyectos:coche_solar:coche_d.jpg?400|coche_d.jpg}}
 +
  
proyectos/cochesolar2022.1655199814.txt.gz · Última modificación: 2022/06/14 09:43 por Sergio Alvariño