Seguidor Solar Automatizado. [TERMINADO]

VIDEO DEL SEGUIDOR SOLAR CON ARDUINO

Para realizar este proyecto lo primero que hay que tener en cuenta es el principio de funcinamiento que se basa en la colocación simétrica de 4 paneles fotovoltaicos y una "seta" colocada en el centro para generar una sombra.

Imagen explicativa.

Imagen del panel fotovoltaico.

Imágenes de la maqueta.

vástago

base

Eje superior

Eje inferior

Maqueta:

VIDEO DEL SEGUIDOR SOLAR CON ARDUINO

Codigo ARDUINO:

int Vplaca1 = A0; 
int Vplaca2 = A1;
int Vplaca3 = A2;
int Vplaca4 = A3;

int km1 = 2;  
int km2 = 3;
int km3 = 4;
int km4 = 5;


 int fc1 = 6;  
 int fc2 = 7;
 int fc3 = 8;
 int fc4 = 9;

void setup() {
  
    // initialize km as outputs:
  pinMode(km1, OUTPUT) ;
  pinMode(km2, OUTPUT) ;
  pinMode(km3, OUTPUT) ;
  pinMode(km4, OUTPUT) ;
  
   pinMode(fc1, INPUT) ;
  pinMode(fc2, INPUT) ;
  pinMode(fc3, INPUT) ;
  pinMode(fc4, INPUT) ;
  
  
   Serial.begin(9600) ;
}
void loop() {
  // read the values of the solar panels:
  int V1 = analogRead(Vplaca1) ;
  int V2 = analogRead(Vplaca2) ;
  int V3 = analogRead(Vplaca3) ;
  int V4 = analogRead(Vplaca4) ;
    int Km1 = digitalRead(km1) ;
    int Km2 = digitalRead(km2) ;
    int Km3 = digitalRead(km3) ;
    int Km4 = digitalRead(km4) ;
    int Lekfc1 = digitalRead(fc1) ;
    int Lekfc2 = digitalRead(fc2) ;
    int Lekfc3 = digitalRead(fc3) ;
    int Lekfc4 = digitalRead(fc4) ;
  
  int Tolerancia = 60;
  
   // left move:
  int Dif12 = V1-V2 ;
  int Dif34 = V3-V4 ;
   // right move
  int Dif21 = V2-V1 ;
  int Dif43 = V4-V3 ;
   //up move
  int Dif13 = V1-V3 ;
  int Dif24 = V2-V4 ;
  //Down move
  int Dif31 = V3-V1 ;
  int Dif42 = V4-V2 ;
  
  // Print voltage.
    Serial.print("-V1.."); Serial.print(V1);    
     Serial.print("-V2.."); Serial.print(V2);    
      Serial.print("-V3.."); Serial.print(V3);    
       Serial.print("-V4..."); Serial.print(V4);
       
       
       // estado de las salidas:
       
       
       Serial.print("..km1."); Serial.print(Km1);    
        Serial.print("..km2."); Serial.print(Km2);    
        Serial.print("..km2."); Serial.print(Km3);    
         Serial.print("..km4."); Serial.print(Km4);
         
         
         // estado de las restas de tensión:
         
        Serial.print("..fc1: "); Serial.print(digitalRead(fc1));        Serial.print("..fc2:  "); Serial.print(digitalRead(fc2));  
        Serial.print("..fc3:  "); Serial.print(digitalRead(fc3));       Serial.print("..fc4:  "); Serial.print(digitalRead(fc4)); 
   
          
         
         
        Serial.println();    

     delay(1);         
       
       // left move:
        if ((Lekfc1 == 0) && (((V1>V2) && (Dif12>Tolerancia)) || ((V3>V4) && (Dif34>Tolerancia) )))
    {
        digitalWrite(km1, HIGH) ;
        }
    else {
    digitalWrite(km1,LOW) ; 
  }
     // right move
       
         if ( (Lekfc2==0) && ((  (V2>V1) && (Dif21>Tolerancia)) ||( (V4>V3) && (Dif43>Tolerancia)) ))
  {
    digitalWrite(km2, HIGH) ;
  }
  else {
    digitalWrite(km2,LOW) ; 
  }
       
     //up move
   
      if (  (Lekfc4==0) &&(( (V1>V3) && (Dif13>Tolerancia) ) || ((V2>V4) && (Dif24>Tolerancia))))
  {
    digitalWrite(km3, HIGH) ;
    }
 
  else {
    digitalWrite(km3,LOW) ; 
   } 
  
  
    //Down move   
       
     if ((Lekfc3==0) && (((V3>V1) && (Dif31>Tolerancia)) || ((V4>V2) && (Dif42>Tolerancia))))
  {
    digitalWrite(km4, HIGH) ;
  }
  else {
    digitalWrite(km4,LOW) ; 
}  


}

PLANOS:

Saludos
Primero tratas km1, km2, km3 y km4 como salidas y como entradas pero no las defines en ninguna parte.

Es decir en la parte de setup debería haber sentencias que le indique al Arduino que son si entradas o salidas.

pinMode(km1, OUTPUT); // pasa salidas
pinMode(ent1, INPUT);     //  para entradas

Si las defines como salidas tambien las puedes leer.

También seria bueno que separases entre paréntesis las comparaciones

if((V2>V1 && Dif21>Tolerancia) ||( V4>V3 && Dif43>Tolerancia )){}  // tu caso
if(((V2>V1) && (Dif21>Tolerancia)) || (( V4>V3) && (Dif43>Tolerancia )))  {} // Mi recomendacion

Corrige eso y prueba

Lo primero gracias por contestar.

Sigue sin funcionar. Se puede leer el estado tal y como lo hago?

este es el resulado. KM1 esta activado y ninguna de las variables Dif supera la tolerancia marcada en 150.

Vista serial:

-V1..703-V2..749-V3..730-V4...724..km1.1..km2.0..km2.0..km4.0..Diferencia V1 y V2: -46..Diferencia V3 y V4: 6..Diferencia V2 y V1: 46..Diferencia V4 y V3: -6..Diferencia V1 y V3: -27..Diferencia V2 y V4: 25..Diferencia V3 y V1: 27..Diferencia V4 y V2: -25

el código completo:

int Vplaca1 = A0; 
int Vplaca2 = A1;
int Vplaca3 = A2;
int Vplaca4 = A3;
int km1 = 1;  
int km2 = 2;
int km3 = 3;
int km4 = 4;

void setup() {
  
    // initialize km as outputs:
  pinMode(km1, OUTPUT) ;
  pinMode(km2, OUTPUT) ;
  pinMode(km3, OUTPUT) ;
  pinMode(km4, OUTPUT) ;
  
  
   Serial.begin(9600) ;
}
void loop() {
  // read the values of the solar panels:
  int V1 = analogRead(Vplaca1) ;
  int V2 = analogRead(Vplaca2) ;
  int V3 = analogRead(Vplaca3) ;
  int V4 = analogRead(Vplaca4) ;
    int Km1 = digitalRead(km1) ;
    int Km2 = digitalRead(km2) ;
    int Km3 = digitalRead(km3) ;
    int Km4 = digitalRead(km4) ;
  
  int Tolerancia = 150;
  
   // left move:
  int Dif12 = V1-V2 ;
  int Dif34 = V3-V4 ;
   // right move
  int Dif21 = V2-V1 ;
  int Dif43 = V4-V3 ;
   //up move
  int Dif13 = V1-V3 ;
  int Dif24 = V2-V4 ;
  //Down move
  int Dif31 = V3-V1 ;
  int Dif42 = V4-V2 ;
  
  // Print voltage.
    Serial.print("-V1.."); Serial.print(V1);    
     Serial.print("-V2.."); Serial.print(V2);    
      Serial.print("-V3.."); Serial.print(V3);    
       Serial.print("-V4..."); Serial.print(V4);
       
       
       // estado de las salidas:
       
       
       Serial.print("..km1."); Serial.print(Km1);    
        Serial.print("..km2."); Serial.print(Km2);    
        Serial.print("..km2."); Serial.print(Km3);    
         Serial.print("..km4."); Serial.print(Km4);
         
         
         // estado de las restas de tensión:
         
        Serial.print("..Diferencia V1 y V2: "); Serial.print(Dif12);        Serial.print("..Diferencia V3 y V4:  "); Serial.print(Dif34);  
        Serial.print("..Diferencia  V2 y V1:  "); Serial.print(Dif21);       Serial.print("..Diferencia V4 y V3:  "); Serial.print(Dif43);
        Serial.print("..Diferencia  V1 y V3:  "); Serial.print(Dif13);       Serial.print("..Diferencia V2 y V4:  "); Serial.print(Dif24);
        Serial.print("..Diferencia  V3 y V1:  "); Serial.print(Dif31);       Serial.print("..Diferencia  V4 y V2:  "); Serial.print(Dif42);
         
         
         
         
        Serial.println();             
       
       // left move:
        if (((V1>V2) && (Dif12>Tolerancia)) || ((V3>V4) && (Dif34>Tolerancia) ))
    {
        digitalWrite(km1, HIGH) ;
        }
    else {
    digitalWrite(km1,LOW) ; 
  }
     // right move
       
         if ((  (V2>V1) && (Dif21>Tolerancia)) ||( (V4>V3) && (Dif43>Tolerancia) ))
  {
    digitalWrite(km2, HIGH) ;
  }
  else {
    digitalWrite(km2,LOW) ; 
  }
       
     //up move
   
      if (  ( (V1>V3) && (Dif13>Tolerancia) ) || ((V2>V4) && (Dif24>Tolerancia)))
  {
    digitalWrite(km3, HIGH) ;
    }
 
  else {
    digitalWrite(km3,LOW) ; 
   } 
  
  
    //Down move   
       
     if (((V3>V1) && (Dif31>Tolerancia)) || ((V4>V2) && (Dif42>Tolerancia)))
  {
    digitalWrite(km4, HIGH) ;
  }
  else {
    digitalWrite(km4,LOW) ; 
}  


  delay(1);        // delay in between reads for stability



}

Para animar esto una imagen 3D y una foto de la maqueta.

Sigo con los errores

Defines a estos pines

int km1 = 1;  // dirección NO VALIDA => No puede usarse el 1 esta usado por Serial.
                              // usa el 5 o corre todos una unidad desde el 2 al 5
int km2 = 2;  // direccion válida
int km3 = 3;  // direccion valida
int km4 = 4;  // dirección válida

 int Km1 = digitalRead(km1) ;
    int Km2 = digitalRead(km2) ;
    int Km3 = digitalRead(km3) ;
    int Km4 = digitalRead(km4) ;

Bua, despues de que se haya derramado la cerveza por encima del arduino y secarlo. Creo que ese era el Fallo, a ver si al poner los finales de carrera también funciona.

Os pongo un vídeo del seguidor funcionando con Unity.

Se puede poner que la tensión de salida sea menor a 5v? O tengo que hacer un divisor de tensión. Los motores van a 1v.

Muy bueno, pero no me digas que funcionaba con

int km1 = 1; // dirección NO VALIDA => No puede usarse el 1 esta usado por Serial.
// usa el 5 o corre todos una unidad desde el 2 al 5

no te creo.

Estas definiendo dos veces las mismas variables Km1,Km2,Km3 y Km4 primero antes del setup y luego en el loop las vuelves a definir y les asignas valores que pueden ser 0 o 1 y ya no son el numero de pin que les asignaste antes.

int km1 = 1;   // Defines los pines aqui
int km2 = 2;
int km3 = 3;
int km4 = 4;

void setup() {
   Serial.begin(9600) ;
}
void loop() {
  // read the values of the solar panels:
  int V1 = analogRead(Vplaca1) ;
  int V2 = analogRead(Vplaca2) ;
  int V3 = analogRead(Vplaca3) ;
  int V4 = analogRead(Vplaca4) ;
    int Km1 = digitalRead(km1) ;        // Y vuelves a definir la mismas variables y le asignas la lectura 
    int Km2 = digitalRead(km2) ;        // de los pines
    int Km3 = digitalRead(km3) ;
    int Km4 = digitalRead(km4) ;

No no, eso esta hecho con UNITY (automata SCHNEIDER) y grabado en la universidad.
Quiero hacerlo funcionar en casa con arduino.

Es posible reducir la tensión de salida del arduino? o lo tengo que hacer con un divisor de tensión?

MUchisimas gracias

jose:
Estas definiendo dos veces las mismas variables Km1,Km2,Km3 y Km4 primero antes del setup y luego en el loop las vuelves a definir y les asignas valores que pueden ser 0 o 1 y ya no son el numero de pin que les asignaste antes.

int km1 = 1;   // Defines los pines aqui
int km2 = 2;
int km3 = 3;
int km4 = 4;

void setup() {
  Serial.begin(9600) ;
}
void loop() {
 // read the values of the solar panels:
 int V1 = analogRead(Vplaca1) ;
 int V2 = analogRead(Vplaca2) ;
 int V3 = analogRead(Vplaca3) ;
 int V4 = analogRead(Vplaca4) ;
   int Km1 = digitalRead(km1) ;        // Y vuelves a definir la mismas variables y le asignas la lectura 
   int Km2 = digitalRead(km2) ;        // de los pines
   int Km3 = digitalRead(km3) ;
   int Km4 = digitalRead(km4) ;

Gracias, pero un es k minúscula las que son el numero de pin y con K mayúscula, es el valor del pin.

ok no me habia dado cuenta,pero desde luego no son buenas practicas de programacion poner nombres tan parecidos.En cuanto al motor del video parece un servo de los de radiocontrol y me extraña muchisimo que funcione con 1v

goroldi:
Es posible reducir la tensión de salida del arduino? o lo tengo que hacer con un divisor de tensión?

Reducir QUE tensión de salida?
Las salidas del arduino son digitales TTL 0 a 5V.
Las salidas PWM con un filtro pueden tener todo el rango que se desee sin practicamente corriente.
No se que quieres hacer?

surbyte Quiero mover directamente los motores. No creo que consuman mucho.

PD: Jose Efectivamente son servos modificados y funcionan como motores DC.

Cuanto es mucho o poco para ti? Sabes que es la corriente? Si el motor consume mas de 40mA vas a dañar el arduino

Pues na mi gozo en un pozo, he alimentado los motores con una pila de 1.5 v con el polímetro y cundo baja consume 40mA pero a la subida que es el máximo esfuerzo consume 78mA

Pd: pensaba que podría mover directamente el motor, ya que he movido servos directamente con el pin de salida del Arduino. (de manera inconsciente pero siguiendo los tutoriales)

goroldi:
surbyte Quiero mover directamente los motores. No creo que consuman mucho.

PD: Jose Efectivamente son servos modificados y funcionan como motores DC.

como te dicen los compañeros,el arduino no va poder con ese servo y aun menos con dos.para manejarlo desde arduino solo tendras que conectar el cable de señal y manejarlo con la libreria servo (suponiendo que la modificacion que has hecho sea para rotacion continua) y los otros dos de alimentacion a una fuente externa (conectando los gnd de la fuente y el arduino).

Hola, realmente no son servos. Son servos a los que se les ha quitado el potenciometro y drivers. Vamos que son motores de dc. Pueden llegar a 5v pero van muy rapido. Prefiero alimentarlos a 1.5 para que la orientación sea mas precisa.
Compre este pac de transistores. Cual creéis que es el mas idóneo para usar a modo de rele?

10 x S9012H
10 x S9013H
10 x S9014C
10 x S9015C
10 x S9018H
10 x S8050D
10 x S8550D
10 x A1015
10 x C1815
10 x A42
10 x A92
10 x 2N5401
10 x 2N5551
10 x A733
10 x C945
10 x 2N3904
10 x 2N3906
10 x SS8050D (current 1.5A)
10 x SS8550D (current 1.5A)
10 x TL431

goroldi:
Hola, realmente no son servos. Son servos a los que se les ha quitado el potenciometro y drivers. Vamos que son motores de dc. Pueden llegar a 5v pero van muy rapido. Prefiero alimentarlos a 1.5 para que la orientación sea mas precisa.
Compre este pac de transistores. Cual creéis que es el mas idóneo para usar a modo de rele?

10 x S9012H
10 x S9013H
10 x S9014C
10 x S9015C
10 x S9018H
10 x S8050D
10 x S8550D
10 x A1015
10 x C1815
10 x A42
10 x A92
10 x 2N5401
10 x 2N5551
10 x A733
10 x C945
10 x 2N3904
10 x 2N3906
10 x SS8050D (current 1.5A)
10 x SS8550D (current 1.5A)
10 x TL431

ojo con eso porque disminuyendo voltaje aumentas intensidad,ademas de restar potencia al motor (aunque veo que lleva reductores).Una duda que tengo,esa especie de paraguas encima de las placas sirve para crear una sombra que usas para saber cuando esta directamente enfocado ?

jose:
ojo con eso porque disminuyendo voltaje aumentas intensidad,ademas de restar potencia al motor (aunque veo que lleva reductores).

he provado con 1,5v y consume maximo 80mA y mueve perfectamente.

jose:
.Una duda que tengo,esa especie de paraguas encima de las placas sirve para crear una sombra que usas para saber cuando esta directamente enfocado ?

si el paraguas es el que crea sombra para disminuir la tensión en los paneles que no estén orientados al sol.

Ok asi que lo que se compara es el voltaje obtenido en las celulas y se reorienta en funcion de esas lecturas buscando la posicion en que el voltaje de todas es igual o similar y la tolerancia sera las diferencias que pueda haber entre celulas.?