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.
#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);
}
}
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);
}
}
Ciao sapresti dirmi la fotoresistenza di rifermento dove va posizionata ?
RispondiElimina