Here you have a dual axis solar tracker. The main function is to turn the panel in the direction to guarantee that the solar light is perpendicular to the panel to produce the maximum output. All this is guaranteed by a pyramid composed by 4 resistors which read the light and command the two motor giving the direction to the panel.
dual stepper motor shield
https://www.dropbox.com/home?preview=20150709_222358.mp4
pointing Pyramid
#include <Stepper.h>
#include <limits.h>
#define fotoresistenza4 A9
#define fotoresistenza3 A8
#define fotoresistenza2 A5
#define fotoresistenza1 A4
#define dolong(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
#define dolongint(x) (int)dolong(x)
int PinDirezione_1 = 3;
int PinStepper_1 = 2; //definisce stepper 1 e 2
int PinDirezione_2 = 7;
int PinStepper_2 = 6;
int _step = 0; // valore iniziale per le funzioni che guidano motori passo-passo
int counter_steps_1 = 0;
int counter_steps_2 = 0;
float LR;
float UD;
float km1 = 0.65;
float km2 = 0.45;
int SUM;
int AV;
int FP1;
int FP2;
int FP3;
int FP4;
signed counter_diff_passi;
int num_steps_1 ;
int num_steps_2 ; //per efettuare una rivoluzione, num_ steps = 1600
boolean dirOrario = true; //rotazione verso dx
boolean dirAntiOrario = false; // rotazione verso sx
void setup()
{
Serial.begin(9600); //Comunicazione seriale al computer
pinMode(A4,INPUT);
pinMode(A5,INPUT);
pinMode(A8,INPUT);
pinMode(A9,INPUT);
pinMode(PinDirezione_1, OUTPUT); //definisce la firezioen nella quale lo stepper 1 ruota
pinMode(PinStepper_1, OUTPUT);
pinMode(PinDirezione_2, OUTPUT); //definisce la direzione nella quale lo stepper 2 ruota
pinMode(PinStepper_2, OUTPUT);
}
float diff_1(int FP1, int FP2) {
float res1;
res1 = FP1 - FP2;
return res1;
}
int sum(int FP1, int FP2, int FP3, int FP4) {
int res3;
res3 = FP1 + FP2 + FP3 + FP4;
return res3;
}
int avarage(int SUM) {
int res4;
res4 = SUM/4;
return res4;
}
//queste due funzioni(diff_1 e diff_2) calcolano la differenza
//tra le intensit delle luci sull'asse orizontale
//e su quello verticale dei due fotoresistori
float diff_2(int FP3, int FP4) {
float res2;
res2 = FP3 + 100 - FP4;
return res2;
}
int steps (float X, float k) {
int passi;
if( X < 0.0){
passi = dolongint ( - k * X);
}else{
passi = dolongint ( k * X);
}
return passi;
}
//
// int steps_1(float X) {
// int passi_1;
// if( X < 0.0){
// passi_1 = dolongint ( -km1 * X);
// }else{
// passi_1 = dolongint (km1 * X);
// }
// return passi_1;
// }
//
//
// int steps_2(float Y ) {
// int passi_2;
// if(Y < 0.0){
// passi_2 = dolongint ( -km2 * Y);
// }else{
// passi_2 = dolongint ( km2 * Y);
// }
// return passi_2;
// }
//
void loop()
{
/*digitalWrite(PinStepper_1, LOW);
digitalWrite(PinStepper_2, LOW);*/
int FP1 = (analogRead(fotoresistenza1));
int FP2 = (analogRead(fotoresistenza2));
int FP3 = (analogRead(fotoresistenza3));
int FP4 = (analogRead(fotoresistenza4));
Serial.print ("Valore luminosit_0=");
Serial.println(FP1);
//delay(100);
Serial.print ("Valore luminosit_1=");
Serial.println(FP2);// Scrivo il valore della fotoresistenza
//delay(100);
Serial.print ("Valore luminosit_2=");
Serial.println(FP3);
//delay(100);
Serial.print ("Valore luminosit_3=");
Serial.println(FP4);//
delay(100);
/*int FP1 = 100; // test con valori settati da me
int FP2 = 0;
int FP3 = 0;
int FP4 = 0;*/
LR = diff_1(FP1, FP2);
Serial.print ("Valore_LR=");
Serial.println(LR);
//delay(1000);
UD = diff_2(FP3, FP4);
Serial.print ("Valore_UD=");
Serial.println(UD);
SUM = sum(FP1, FP2, FP3, FP3);
AV = avarage(SUM);
Serial.print ("Valore_AV=");
Serial.println(AV);
num_steps_1 = steps(LR, km1);
//num_steps_1 = steps_1(LR);
Serial.print ("Numero passi motore 1 =");
Serial.println(num_steps_1);
num_steps_2 = steps(UD, km2);
//num_steps_2 = steps_2(UD);
Serial.print ("Numero passi motore 2 =");
Serial.println(num_steps_2);
//delay(10000);
if (AV > 0 && AV < 1023)
{
findStability();
// delay(500);
}
else
{
//delay(900000);
delay(100);
}
}
void findStability() {
if (LR <= -35) {
counter_steps_1 += num_steps_1;
if (counter_steps_1 <=810){
if (UD > -45 && UD < 45)
step(false, true, num_steps_1, 0);
else if (UD >= 45)
step(false, false, num_steps_1, num_steps_2);
else if (UD <= -45)
step(false, true, num_steps_1, num_steps_2);
}
else{
counter_steps_1 = -805;
step(true, true, 1610, 0);
}
}
else if (LR >= 35) {
counter_steps_1 -= num_steps_1;
if (counter_steps_1 >=-810){
if (UD > -45 && UD < 45)
step(true, true, num_steps_1, 0);
else if (UD >= 45)
step(true, false, num_steps_1, num_steps_2);
else if (UD <= -45)
step(true, true, num_steps_1, num_steps_2);
}
else{
counter_steps_1 = 805;
step(false, true, 1610, 0);
}
}
else if (LR > -35 && LR < 35){
if (UD > -45 && UD < 45)
step(true, true, 0, 0);
else if (UD >= 45)
step(true, false, 0, num_steps_2);
else if (UD <= -45)
step(true, true, 0, num_steps_2);
}
}
void step(boolean dir1, boolean dir2,int steps1, int steps2){
digitalWrite(PinDirezione_1,dir1);
digitalWrite(PinDirezione_2,dir2);
delay(100); // codice implementato da noi
int max_steps = 0;
int max_PinStepper = 0;
int min_steps = 0;
int min_PinStepper = 0;
if (steps1 >= steps2) {
max_steps = steps1;
max_PinStepper = PinStepper_1;
min_steps = steps2;
min_PinStepper = PinStepper_2;
} else {
max_steps = steps2;
max_PinStepper = PinStepper_2;
min_steps = steps1;
min_PinStepper = PinStepper_1;
}
for(int i=0; i < max_steps; i++){
digitalWrite(max_PinStepper, HIGH);
if (i < min_steps)
digitalWrite(min_PinStepper, HIGH);
delayMicroseconds(3500);
digitalWrite(max_PinStepper,LOW);
if (i < min_steps)
digitalWrite(min_PinStepper,LOW);
delayMicroseconds(3500);
}
}
Comments