Go Down

Topic: Seguidor Solar Automatizado. [TERMINADO] (Read 19074 times) previous topic - next topic

goroldi

Dec 29, 2014, 12:41 pm Last Edit: Jan 05, 2015, 12:37 am by goroldi
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:

Code: [Select]
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:


max_saeta

#1
Dec 29, 2014, 01:42 pm Last Edit: Dec 29, 2014, 01:43 pm by max_saeta
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.

Code: [Select]

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

Code: [Select]

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

goroldi

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:
Quote
-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:

Code: [Select]
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



}

goroldi

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






surbyte

Sigo con los errores

Defines a estos pines

Code: [Select]
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) ;


goroldi

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.


https://www.youtube.com/watch?v=a2OTa4YwJgI


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.

surbyte

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.

_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.

Code: [Select]
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) ;

goroldi

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

goroldi

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.

Code: [Select]
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.

_jose_

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

surbyte

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?

goroldi

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



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

max_saeta

#13
Dec 30, 2014, 02:50 am Last Edit: Dec 30, 2014, 01:15 pm by max_saeta
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

goroldi

#14
Dec 30, 2014, 11:16 am Last Edit: Dec 30, 2014, 11:18 am by goroldi
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)

Go Up