SOLAR TRACKER

Inseguitore solare con Arduino, due servi e tre fotoresistenze



Era da tempo che volevo costruire il modellino di un inseguitore solare, e finalmente..eccolo!
Materiale necessario:

  • n.1 Arduino (qualsiasi va bene, basta che abbia 3 ingressi analogici e 2 uscite digitali)




  • n. 2 microservi: 

  • n.1 Supporto Pan-Tilt


  • n.3 fotoresistenze

  • n. 3 resistenze da 10KOhm


  • n.1 supporto celle (stampa 3d)

disponibile STL su Thingiverse (clicca qui)


Ecco... ora che abbiamo tutti i componenti possiamo montare il tutto come nello schema in alto nella pagina.
Sul supporto stampato in 3d bisogna applicare (io ho usato colla rapida) gli schermi (pezzi di cartoncino) che faranno ombra sulle fotocellule quando il piano stesso non è perpendicolare al sole:

ora che è tutto montato caricare il seguente codice nell'Arduino:



#include <Servo.h> // richiamo libreria Servo.h
Servo servox,servoy;
int isteresi=1;
boolean vicino=0;
boolean moltovicino=0;
int posx,posy,fotocom,fotox,fotoy;

void setup() {
  posx=90; //posizione servo x iniziale
  posy=90; //posizione servo y iniziale
  Serial.begin(9600);
  servox.attach(12); //servo x collegato al piedino 12
  servoy.attach(11); //servo y collegato al pin 11
}

void loop() {
  fotocom = analogRead(A0); //lettura fotoresistenza di riferimento collegata al pin analogico 0
  fotox=analogRead(A1); //lettura fotoresistenza asse x collegata al pin analogico 1
  fotoy=analogRead(A2); //lettura fotoresistenza asse y collegata al pin analogico 2

 if ((abs(fotocom-fotox)<10) && (abs(fotocom-fotoy)<10)) //stabilisco se siamo lontani/vicini/molto vicini alla posizione da raggiungere
   {
    vicino=1;
   }
  else{
  vicino=0;
  }
    if ((abs(fotocom-fotox)<3) && (abs(fotocom-fotoy)<3))
   {
    moltovicino=1;
   }
  else{
  moltovicino=0;
  }

if (fotocom>fotox) // confronto la fotoresistenza x con la fotoresistenza di riferimento per salere se e in che direzione far muovere il servo x
  {
   if ((fotocom-fotox)>isteresi)
    {
      posx--;
    }
  }
  else if ((fotox-fotocom)>isteresi)
    {
      posx++;
    }

if (fotocom>fotoy) // confronto la fotoresistenza y con la fotoresistenza di riferimento per salere se e in che direzione far muovere il servo y
  {
  if ((fotocom-fotoy)>isteresi)
    {
      posy++;
    }
  }
  else if ((fotoy-fotocom)>isteresi)
    {
      posy--;
    }

posx=constrain(posx,0,180); //limito la variabile da 0 a 180
posy=constrain(posy,0,180);
  servox.write(posx); //faccio muovere i servi
  servoy.write(posy);
  Serial.print(fotocom);//output sul monitor seriale delle tre fotoresistenze, delle posizioni x e y, e del tempo trascorso
  Serial.print("\t");
  Serial.print(fotox);
  Serial.print("\t");
  Serial.print(fotoy);
  Serial.print("\t");
  Serial.print(posx);
  Serial.print("\t");
  Serial.print(posy);
  Serial.print("\t");
  Serial.println(millis());

  if (moltovicino){ //se siamo molto vicini alla posizione da raggiungere il controllo viene fatto ogni 10 sec
  delay(10000);
  }
  if(vicino){     //se siamo nelle vicinanze della posizione da raggiungere il controllo viene fatto ogni 3 decimi di sec
    delay(300);
  }
}

Commenti

  1. Ciao sapresti dirmi la fotoresistenza di rifermento dove va posizionata ?

    RispondiElimina

Posta un commento

Post popolari in questo blog

aggiornamento - Tabella comparativa led SMD - 3528 - 5050 - 5630 - 3014 - 2835