# Solar tracker, funciona aún sin sol...



## ELIUSM (May 8, 2010)

Estimadísimos,

estoy trabajando en un seguidor solar (solar tracker) que está a medio armar. Falta el "cerebro" electrónico. O sea, la parte de electrónica de potencia para mover los motores del tracker está hecha.

Ok, hay montones de esos en internet, pero ninguno que cumpla con lo siguiente: a ver si me entienden la secuencia de los hechos:

Este tracker sigue el sol, cuando HAY sol a través de sus sensores de luz. Pero cuando no hay, porque hay nubes, este tracker igual debe seguir el sol. Por lo tanto, debo meter dentro del PIC una función matemática que describa la trayectoria del sol en el cielo por todo un año, y el tracker se debe mover según esa función. Existe.

Para esto existen dos formas de incluír esto en el programa dentro de un uC o PIC: 
1) Calcular posición según Lat, Long, fecha, tiempo, etc, lo cual me obliga a agregar librerías matemáticas al programa, que puede que ocupen demasiada memoria.
2) Utilizar una tabla con los resultados calculados que esté dentro de una memoria externa. Estas tablas también existen, y existen de esas que con pocos datos y cálculos de interpolación simples tienen un error porcentual de ... poquísimo, lo cual me serviría.

Ahora la pregunta:
Alguien conoce una de estas tablas o sabe como se llama? No tengo idea como buscar una de estas en internet. Existen al alcance de todos. Solo necesito una guía de como llegar a ellas.

Les agradezco mucho!
Eliusm


----------



## fernandob (May 8, 2010)

no te calentes asi che !!!!!!!!

es mas facil de lo que pensas.
te digo como , pero vos sabes programar , no ?? no es la idea que te lo hagan , no ??


----------



## Don Barredora (May 8, 2010)

Vengo a salvar tu dia.. 

No tenia idea si existian.. pero busque un poco y lo encontre...

http://www.nrel.gov/midc/solpos/spa.html

Espero que sea lo que buscas.

Saludos!


----------



## fernandob (May 8, 2010)

por favor donbarredora, no le des eso
no me digas que vas a poner una tabla o algo asi de raro ??
un poco de imaginacion che.....

un pic es UN MUNDO , un lujo, un chiche, y mas para uno que siempre trabajo con la tecnologia vieja .

ademas, que haces con esas tablas ????
un lio eso, segun donde y como pongas al aparato bueno , para empezar supongo que uno lo pone mirando para arriba .

pero ........un pic ......ahhhh...
lastima que mi mercado no me dio para hacer cosas, por que son un mundo de posibilidades.


----------



## Don Barredora (May 8, 2010)

Jajaja a mi tambien me parece algo engorroso utilizar tantos datos...

Pero es lo que el pidio.. 

Ademas le hubiese dicho que de otra forma es mejor pero no se me ocurre esa otra forma.. solo encontre esas tablas.. 

Saludos!


----------



## fernandob (May 8, 2010)

a pensar un poco , si no hay ideas lo pongo, el concepto sirve para otra scosas.
pero que mejor que pensar.


----------



## ELIUSM (May 9, 2010)

Hola a amigos!

Si, sé programar PIC, bastante bien. No esperaba que alguien me hiciera el programa... jajaja.

Super bueno el Link que me mandaste Don Barredora.

Al ver la tabla que genera el programa de ese Link, que asombrosamente también incluye correcciones por refracción atmosférica, veo que es muy precisa (lo cual es bueno).

Me encuentro entonces frente a la siguiente disyuntiva:

La librería de matemática en C será más pesada que esta tabla, como para implementar una o la otra? Resulta que haciendo todos los cálculos matemáticos (programando las funciones matemáticas respectivas, con Cos y Sen) se lograría aún más presición.

Ahora, alguien me preguntaría cuánta presición nnecesito... bueno, el tracker que tengo tiene su parte mecánica hecha, y esa parte tiene una trementa presición, con motores paso a paso conectados a cajas reductoras.

Entonces, qué convendrá más? Cargar la librería de matemática de C o cargar esta tabla?

PD: Esta tabla se podría meter en una memoria externa, no como la librería de matemática... pero pensemos como si quisiera evitar usar memorias externas. Ah! Y otra cosa: dispongo de 8K de memoria de programa en mi PIC (16F877).

Muchas gracias!


----------



## fernandob (May 9, 2010)

te voy a dar una opinion,vos sabes enverdad lo que necesitas, siqueres deci justo que es lo que vas a hacer.

eso de una libreria de como se mueve el sol no lo veo, te iba a dar una idea pero luego vi una mejor. paso a explicar:

la idea es pensar que VOS sos el aparato, o que estas junto a el , como te conviene comportarte ???
imagintate 3 dias sin sol y el aparato ese moviendose como si el sol estuviese ahi , una estupidez.
tambien tenes que tener en cuenta si estas justo o no con la fuente de poder.
si el aparato estara en un lugar remoto y controla celdas solares entonces no te conviene desperdiciar movimientos, ya que cada movimiento es energia.
ENTONCES el concepto de que tengas una libreria que le diga al aparato por donde el sol estaria asi lo sigue imaginariamente no me parece lo mejor.
ademas tenes que hacer un ck exacto , para no perder el calendario, que el PIC sepa donde esta (temporalmente) , imaginate que se queda sin energia el equipo una semana , como se entera el PIC si estuvo apagado 1 hora o 1 año ?? 
una tonteria meterte en eso.
si el sol sale cuando sale, y lo podes sensar...pàra que irse a esa locura de librerias ,calendarios y movimientos de el sistema inutiles ??? 


te repito , no se tu aplicacion yo estoy pensando en algo que sea exigido.

ahora fijate, vamso de cero:

me hago un aparato que tenga el sensor CERO el cual esta apuntando hacia arriba, junto con el objetivo, sea una celda solar o lo que sea.
PERO ADEMAS tendre 2 o 4 LDR mas, me refiero a LDR o lo que uses para sensar luz, como estos sensores son muy baratos no le veo problema en usar unos mas .
adjunto un dibujo sencillo .

ahora bien , solo tenes que sensar 3 entradas analogicas y nada mas, ingresar unos niveles minimso de luz y hacer el programa.

la idea es que si es de noche los 3 sensores detectan una luz por debajo de el minimo, el aparato no se mueve.
puede quedar en reposo en una posicion intermedia.
incuso si esta nublado 2 dias o mas.

pero apenas amanezca o se despeje de nubes los sensores detectaran luz, el sensor que este apuntando al sol o mas cerca detectara mas luz que los otros , al detectar el sistema esa luz gira buscando el punto en el cual el sensor cero tiene maxima deteccion (compara con los otros) .
o que tiene igual que los otros.

un dia de sol al mediodia los 3 sensores se saturaran, ahi no es necesario mover el aparato.

con que tu hagas unas pruebas (mediciones) podras entonces darte una idea de que valores tendras que detectar y cuando es util que el aparato se mueva, te repito , si es una aplicacion donde quieres que el aparato no derroche movimientos podras realizar un programa que , con esos 3 ojos el aparato se mueva solo cuando es necesario y en la direccion justa sin necesidad de librerias extrañas queen realidad requieren de mas cosas aun .

espero que me comprendas y te sirva.


----------



## ELIUSM (May 9, 2010)

Muy bien FernandoB. Todo lo que dices funciona para placas solares, que no disminuyen si eficiencia en forma considerable por no estar cara a cara al sol.

Talvez se me olvidó recalcar que esto se trata de un instrumento de medición de radiación solar. Mientras más presición, mejor.

Ahora, para aercarme a lo que me explicas, considera la siguiente situación:

1) El sol no sale todos los días del año en la misma posición. El ángulo, llamado Azimut, que es el ángulo medido con respecto al norte, es diferente cada día. Es necesario adaptarse a el. La cosa es que ok, ahora llegó la noche. El seguidor tiene que ponerse en la posición donde saldrá el sol al día siguiente. Dónde saldrá? Eso lo dirá la función matemática.

2) Día nublado. Llega una nube y no entra sol. La nube es grande y cuando pasa, la posición del sol será diferente, y el aparato estará mirando para otro lado? No. No hay tiempo para moverse y calibrarse hasta donde está el sol ahora. Los hoyos en las nubes de un día nublado son "imprevistos". No se puede andar tanteando a cada rato dónde está el sol. Se necesita un respaldo, y ese sería esa función matemática.

3) Si se corta la luz, debería estar usando yo un DS1302 con batería, donde no se le borrará la hora. Cuando vuelva la corriente, el PIC sabrá muy bien a dónde debería estar.

Ya, señores, busco un código o tabla que haga esto. La tabla ya la encontré, gracias a Don Barredora, ahora me falta ver qué es más pesado: la tabla o la librería en C que me calcule esto. No quiero discutir otras soluciones, ya que es la más usada, la he visto en  un aparato comprado, pero de código cerrado. Por algo será...

Saludos!


----------



## Don Barredora (May 9, 2010)

Recuerda que lo que te di yo es un algoritmo no una simple tabla..

Aca hay un enlace al pdf que lo explica al algoritmo:

http://www.nrel.gov/docs/fy08osti/34302.pdf

Te recomiendo que lo leas.. yo le di una miradita y esta interesante...



EDIT: Encontre esto tambien..

http://www.nrel.gov/midc/spa/spa.h


```
#ifndef __solar_position_algorithm_header
#define __solar_position_algorithm_header


//enumeration for function codes to select desired final outputs from SPA
enum {
    SPA_ZA,           //calculate zenith and azimuth
    SPA_ZA_INC,       //calculate zenith, azimuth, and incidence
    SPA_ZA_RTS,       //calculate zenith, azimuth, and sun rise/transit/set values
    SPA_ALL,          //calculate all SPA output values
};

typedef struct
{
    //----------------------INPUT VALUES------------------------

    int year;            // 4-digit year,    valid range: -2000 to 6000, error code: 1
    int month;           // 2-digit month,         valid range: 1 to 12, error code: 2
    int day;             // 2-digit day,           valid range: 1 to 31, error code: 3
    int hour;            // Observer local hour,   valid range: 0 to 24, error code: 4
    int minute;          // Observer local minute, valid range: 0 to 59, error code: 5
    int second;          // Observer local second, valid range: 0 to 59, error code: 6

    double delta_t;      // Difference between earth rotation time and terrestrial time
                         // It is derived from observation only and is reported in this
                         // bulletin: http://maia.usno.navy.mil/ser7/ser7.dat,
                         // where delta_t = 32.184 + (TAI-UTC) + DUT1
                         // valid range: -8000 to 8000 seconds, error code: 7

    double timezone;     // Observer time zone (negative west of Greenwich)
                         // valid range: -18   to   18 hours,   error code: 8

    double longitude;    // Observer longitude (negative west of Greenwich)
                         // valid range: -180  to  180 degrees, error code: 9

    double latitude;     // Observer latitude (negative south of equator)
                         // valid range: -90   to   90 degrees, error code: 10

    double elevation;    // Observer elevation [meters]
                         // valid range: -6500000 or higher meters,    error code: 11

    double pressure;     // Annual average local pressure [millibars]
                         // valid range:    0 to 5000 millibars,       error code: 12

    double temperature;  // Annual average local temperature [degrees Celsius]
                         // valid range: -273 to 6000 degrees Celsius, error code; 13

    double slope;        // Surface slope (measured from the horizontal plane)
                         // valid range: -360 to 360 degrees, error code: 14

    double azm_rotation; // Surface azimuth rotation (measured from south to projection of
                         //     surface normal on horizontal plane, negative west)
                         // valid range: -360 to 360 degrees, error code: 15

    double atmos_refract;// Atmospheric refraction at sunrise and sunset (0.5667 deg is typical)
                         // valid range: -5   to   5 degrees, error code: 16

    int function;        // Switch to choose functions for desired output (from enumeration)

    //-----------------Intermediate OUTPUT VALUES--------------------

    double jd;          //Julian day
    double jc;          //Julian century

    double jde;         //Julian ephemeris day
    double jce;         //Julian ephemeris century
    double jme;         //Julian ephemeris millennium

    double l;           //earth heliocentric longitude [degrees]
    double b;           //earth heliocentric latitude [degrees]
    double r;           //earth radius vector [Astronomical Units, AU]

    double theta;       //geocentric longitude [degrees]
    double beta;        //geocentric latitude [degrees]

    double x0;          //mean elongation (moon-sun) [degrees]
    double x1;          //mean anomaly (sun) [degrees]
    double x2;          //mean anomaly (moon) [degrees]
    double x3;          //argument latitude (moon) [degrees]
    double x4;          //ascending longitude (moon) [degrees]

    double del_psi;     //nutation longitude [degrees]
    double del_epsilon; //nutation obliquity [degrees]
    double epsilon0;    //ecliptic mean obliquity [arc seconds]
    double epsilon;     //ecliptic true obliquity  [degrees]

    double del_tau;     //aberration correction [degrees]
    double lamda;       //apparent sun longitude [degrees]
    double nu0;         //Greenwich mean sidereal time [degrees]
    double nu;          //Greenwich sidereal time [degrees]

    double alpha;       //geocentric sun right ascension [degrees]
    double delta;       //geocentric sun declination [degrees]

    double h;           //observer hour angle [degrees]
    double xi;          //sun equatorial horizontal parallax [degrees]
    double del_alpha;   //sun right ascension parallax [degrees]
    double delta_prime; //topocentric sun declination [degrees]
    double alpha_prime; //topocentric sun right ascension [degrees]
    double h_prime;     //topocentric local hour angle [degrees]

    double e0;          //topocentric elevation angle (uncorrected) [degrees]
    double del_e;       //atmospheric refraction correction [degrees]
    double e;           //topocentric elevation angle (corrected) [degrees]

    double eot;         //equation of time [minutes]
    double srha;        //sunrise hour angle [degrees]
    double ssha;        //sunset hour angle [degrees]
    double sta;         //sun transit altitude [degrees]

    //---------------------Final OUTPUT VALUES------------------------

    double zenith;      //topocentric zenith angle [degrees]
    double azimuth180;  //topocentric azimuth angle (westward from south) [-180 to 180 degrees]
    double azimuth;     //topocentric azimuth angle (eastward from north) [   0 to 360 degrees]
    double incidence;   //surface incidence angle [degrees]

    double suntransit;  //local sun transit time (or solar noon) [fractional hour]
    double sunrise;     //local sunrise time (+/- 30 seconds) [fractional hour]
    double sunset;      //local sunset time (+/- 30 seconds) [fractional hour]

} spa_data;

//Calculate SPA output values (in structure) based on input values passed in structure
int spa_calculate(spa_data *spa);

#endif
```
Este codigo se utiliza para otro..



> *This section contains three C codes:*
> 
> 
> 
> ...


Ese archivo spa.c no se puede ver creo...

Espero que te sirva.

Saludos!

EDIT 2: el spa.c esta al final del pdf que te mostre antes. 

Saludos!


----------



## ELIUSM (May 9, 2010)

Don Barredora, te pasaste. No haré más preguntas sin antes haber leído y aprendido con atención todo lo que me mandaste.

Y cierto, lo que genera esas tablas es un algoritmo.

Muchas gracias denuevo!


----------



## tecnogirl (May 10, 2010)

ELIUSM: La imagen adjunta muestra la absorcion de radiacion solar por la atmosfera.
En ella se aprecian rangos de frecuencia que no son tan atenuados y que se podrian aprovechar, por ejemplo, Que tal si pruebas un sensor Ultravioleta ?. Estos sensores se emplean en sistemas de deteccion de flama para hornos a gas. Tambien en el rango de microondas es factible. Saludos.



> Alguien conoce una de estas tablas o sabe como se llama? No tengo idea como buscar una de estas en internet. Existen al alcance de todos. Solo necesito una guía de como llegar a ellas.


 
Se llaman Efemerides (http://es.wikipedia.org/wiki/Efem%C3%A9rides) y las hay para muchisimos objetos celestes y hay numerosos algoritmos (y tablas, que resultan de aplicar los algoritmos) para ello, algunos son mas precisos que otros y la inmensa mayoria emplean matematica en punto flotante y los mejores algoritmos son los que introducen correciones periodicas.

Tu estas interesado en una en especial, la del Sol y su transito por los cielos, que se conoce como la Ecliptica (http://es.wikipedia.org/wiki/Eclíptica).

Este video ilustra la ecliptica:

http://www.youtube.com/watch?v=J9WP-2Os7oY&feature=related


Tu consulta es igual al problema de la observacion astronomica, seguir un objeto celeste a traves de su transito por el cielo compensando la rotacion terrestre para no perderlo. Existen telescopios que tienen un controlador y una base de datos que hacen los ajustes de seguimiento de un objeto cualquiera que se escoja (http://www.meade.com/lx200-acf/index.html).

Por ahi tenes una pista para investigar el tracker de tu diseño.

Saludos


----------



## tecnogirl (May 11, 2010)

En http://en.wikipedia.org/wiki/Solar_tracker mencionan varias tecnicas de rastreo del Sol y, en particular citan la Chronological tracker que es similar a la que te han planteado pero con algunas modificaciones interesantes.

En http://www.redrok.com/electron.htm encuentras varias tecnicas de tracking solar electronicos.

Saludos


----------



## ELIUSM (May 13, 2010)

Muchísimas gracias Tecnogirl. Super buena información. Sirve para tener una buena base para comenzar aqui. Leí hartas cosas, aún no todo.

Bajé los programas en C que estaban en el link que me mandó Don Barredora, y los estoy analizando.
La verdad es que no soy experto en C, o sea, sé leer un programa para ver qué hace, pero no escribirlo. Por lo mismo no he podido ver cuánto pesa la librería math.c compilada. Si pesa demasiado... no la podría meter dentro del PIC.

Hmm, en eso está el proyecto.

Saludos y gracias!!


----------



## tecnogirl (May 14, 2010)

Hola ELIUSM: El codigo sugerido por Don Barredora esta en C para las cpu 80x86 de las maquinas PC y el codigo compilado debe correr bajo DOS o Windows. Lo que hace grande el programa ejecutable es que hay que emular por software las operaciones con variables float (y mira que hay muchas!).

Intentaré compilar esos programas para mi PC y darte el tamaño del ejecutable... pero ese dato no te va a decir mucho ya que no es codigo ejecutable para PICs sino para cpus 80x86....

Para poder aprovechar el programa de Don Barredora, habria que reescribir el codigo pero para un PIC, que tenga un gran poder de calculo, una tarea nada facíl. Pero, otra posibilidad es emplear esos programas para generar tablas de datos, las cuales se envian al PIC para que un programa interno las procese y pueda apuntar el tracker.

Saludos


----------



## ELIUSM (May 17, 2010)

Exactamente!

Yo imagino que el ejecutable para los procesadores 80x86 igual servirá como para tener una idea del tamaño en memoria.

Lo otro que yo pensaba, es que en C existen los niveles de optimización, donde en PIC siempre se usa el máximo: o sea, nivel 6. Un informático me dijo que a ese nivel de optimización incluso desaparecen las partes del programa que nunca se usan. Por ejemplo, de la librería Math.c casi necesito solamente Cos y Sen (y lo anterior a ello), y todo el resto debería desaparecer, por ejemplo Log, exp... lo cual seguramente alivianará el programa.

Otra idea es la que tu decías: generar tablas. Como esto son solamente datos, se debería poder ponerle una tremenda memoria Eprom externa al PIC donde esté esa tabla guardada.
Lo que quisiera saber, hablando de este método, es cómo se guardan números con decimales en binario? Bueno, puede ser un byte de memoria para cada número, donde en el programa se decide dónde está la coma. Pero eso lo veré en el camino.

Sigo en "pausa" mientras tanto, tengo muchas pruebas en la universidad esta semana...

Muchas gracias!!
Saludos!


----------



## elbrujo (May 17, 2010)

Al margen de la automatizacion que me parece barbara, alguno midio que superfice de mas hay que poner como para que sea algo quieto?


----------



## tecnogirl (May 18, 2010)

ELIUSM: El archivo zip adjunto contiene el programa spa.exe compilado a partir de los archivos fuente en C que recomendó Don Barredora. El ejecutable ocupa 56.6 kbytes. Funciona perfectamente y dá los resultados que indica el programa de prueba.

Como te dije, ese codigo ejecutable es para x86 y no tengo criterio para decir si es similar en tamaño a un codigo ejecutable para PIC. Solo ten en cuenta que el PIC es un micro orientado a control de dispositivos de E/S y carece, por ejemplo, de coprocesador matematico, que si lo tienen los 80x86 y que gestionan la matematica con numeros decimales muy facilmente.

Algo para pensar: Existen computadoras en una placa, conocidos como Single Board Computer y que tiene una cpu compatible con x86 la cual se podria programar, esa si, con el algoritmo y los datos calculados se enviarian al microcontrolador.

Almacenar datos en lugar del algoritmo se ve mas facil y no necesariamente necesita una gran memoria, puesto que se podria reemplazar la tabla periodicamente del PIC (si es factible hacerlo).

Saludos


----------



## ELIUSM (May 18, 2010)

Bueena!

Bueno, tal como dices, lo dejaré para pensar, eso del procesador compatible con el x86. Lamentablemente no tendría el tiempo para aprender a usarlo.

Bajé el programa, y super bueno! aunque igual bajé el de la página, que también tiene su interfaz de usuario.

Te cuento que tengo pensado solucionar esto de la siguiente manera:
Compraré este aparatito.
En la memoria SD que tendrá, se encontrará esta tabla generada. Calcularé cuánta presición necesito, la Lat y Long, todo lo demás que se necesita, y haré la tabla con el programa SPA.
Este aparato que tiene un puerto serial y se utiliza por medio de comandos simples, será el buen dato de esta solución. Podré así leer la tabla, por grande que sea, y hacer que el tracker se mueva según ella.

En el mismo chip podré meter también todo el resto de la documentación, aparte de la tabla misma, y quedará todo en uno. La memoria SD terminará siendo el cerebro de todo.

Les iré contando como voy. Mientras tanto, les agradezco su ayuda, sin ella estaría en pañales.

Saludos!


----------



## tecnogirl (May 20, 2010)

ELIUSM: Interesante tarjeta, aunque solo soluciona el problema de almacenar datos. Creo que cuesta U$54.74 pero entiendo que falta comprar por aparte un chip de memoria microSD, verdad, cuanto cuesta la memoria ?.

Una pregunta, el aparato que estas diseñando no es equivalente al Heliofanografo (imagen adjunta) ?.

Saludos


----------



## ELIUSM (May 20, 2010)

Hola!

Bueno, en verdad el unico problema que tengo es el problema del almacenamiento... o almaceno la gigante tabla, o uso un PIC que tenga más memoria de programa, donde pueda hacer todos los cálculos.
El problema de la segunda idea es que no sabría programarlo... decidí además irme por la primera idea, ya que en el mismo chip podré guardar todo el resto de la documentación, la cual de esa manera estaría al acceso de quien sea que quiera ocupar la máquina. Sería muy práctico y bonito.

El chip debería estar costando ocmo 16 dólares, (el de 2 gigas).

La máquina con la que estoy trabajando es la que sale en la foto. Tiene un anillo al cual se le puede montar algún instrumento de medición. Ese anillo se mueve en dos ejes, por dos motores paso a paso.

Estoy estudiando una forma de cálculo que me evita usar tablas o calcular con funciones... es una forma que mueve a los motores directamente. Una función más simple. De allí les cuento cómo va la cosa.

Saludos!!!


----------



## tecnogirl (May 21, 2010)

Ahhhhh... es un tracker y es justamente como los que usan los telescopios modernos. En la caja metalica podria caber una placa con algun tipo de cpu en la que se implemente el algoritmo de calculo... en consideracion de que es relativamente pequeño (56 kB).

Una pregunta... ese dispositivo opera en un sitio remoto o es para operar en una oficina ?. Pregunto esto porque si es el segundo caso, el calculo se puede hacer en una PC y descargar los datos al tracker. 

Saludos


----------



## ELIUSM (May 22, 2010)

Hola!

Estará hecho para funcionar en forma independiente montado en la azotea de un edificio.

Lo otro, es que su función (de ser un tracker) es tan simple, que no valdría la pena meter alta tecnología, como un computador, aunque sea solamente una mini motherboard con un linux embebido. Debería bastar con un PIC. El problema aqui era ver, qué tan cerca del límite del PIC llego.

No he tenido tiempo ultimamente para seguir. Pero tengo algunas ideas que trabajaré antes de publicarlas acá, ya que no he visto si tienen la posibilidad de ser factibles.

Saludos!


----------



## uno1 (May 19, 2013)

Hola, acabo de leer vuestro interesante hilo y me pillas intentando emular los seguidores de MECASOLAR.  Ellos basan su sistema en un PLC de Siemens el S7 1200, y usan el algoritmo del NREL, el spa.c famoso.  Lo que no acabo de entender es como se mete el algoritmo en el PLC, porfa,, te veo muy puesta en el tema, a ver si me puedes echar una mano.  Gracias de antemano.


----------

