Arduino Solar Tracker

576,444

793

295

Introduction: Arduino Solar Tracker

About: Hello, I'm Bruce. I'm a student in Belgium. I have a wide variety of interests: electronics, computers, technology, ... In my spare time I spend a lot of time on: projects, exploring the internet, cycling. ht…

Step 1: How It Works

How it works:
I'd made a sensor of 4 LDRs with sheets between them

The white dots are the LDRs

When the stick on top is righted to the sun or the brightest point
the four LDRs get the same amount of light on them.


Example1 when the light is left on top:
right-top, right-down, left-down are in the shadow
and left-top get the most light

Example2 when the light is on top
left and right down are in the shadow and top is in the light


Step 2: Parts List

Step 3: The Set-up

Just hot glue it together!!! 

Step 4: The Circuitry

Step 5: The Code

you can download the code down this page

/* this code is written by geobruce
for more info check my site http://xprobe.net
*/
#include <Servo.h> // include Servo library 

Servo horizontal; // horizontal servo
int servoh = 90; // stand horizontal servo

Servo vertical; // vertical servo 
int servov = 90; // stand vertical servo

// LDR pin connections
// name = analogpin;
int ldrlt = 0; //LDR top left
int ldrrt = 1; //LDR top rigt
int ldrld = 2; //LDR down left
int ldrrd = 3; //ldr down rigt

void setup()
{
  Serial.begin(9600);
// servo connections
// name.attacht(pin);
  horizontal.attach(9); 
  vertical.attach(10);
}

void loop() 
{
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down rigt

  int dtime = analogRead(4)/20; // read potentiometers
int tol = analogRead(5)/4;

int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right

int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt

if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
{
if (avt > avd)
{
servov = ++servov;
if (servov > 180)
{
servov = 180;
}
}
else if (avt < avd)
{
servov= --servov;
if (servov < 0)
{
servov = 0;
}
}
vertical.write(servov);
}

if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < 0)
{
servoh = 0;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > 180)
{
servoh = 180;
}
}
else if (avl == avr)
{
// nothing
}
horizontal.write(servoh);
}
delay(dtime);




Celestron Space Challenge

Runner Up in the
Celestron Space Challenge

Microcontroller Contest

Participated in the
Microcontroller Contest

Make It Move Challenge

Participated in the
Make It Move Challenge

20 People Made This Project!

Recommendations

  • Make It Bridge

    Make It Bridge
  • For the Home Contest

    For the Home Contest
  • Big and Small Contest

    Big and Small Contest

295 Comments

0
TomDunlap
TomDunlap

9 years ago on Introduction

Just finished it and got it debugged. Really cool. Now I'm going to try to use it to build a Solar Forge and or a Solar Sand Sinter 3D Printer. Should be a snap. ;-)

0
ShreyasP4
ShreyasP4

Reply 7 years ago

Hey Tom, We are right now making a Solar sand sinter 3D printer. We have finished making the coordinate plate and are working on the tracking system now. Would like to get your inputs. Best,

0
BalaJ11
BalaJ11

Reply 7 years ago

hi dude ,

what is the rate and power of servo motor which u have used.. can u give me some details.. i have to do this as mini project

0
TomDunlap
TomDunlap

Reply 7 years ago

Good luck with your project. I have not been able to pursue this one so not much more to add. Everything you need should be available online now. Except time and money. You'll have to come up with those. ;-)

0
geo bruce
geo bruce

Reply 9 years ago on Introduction

cool! :p
can you show us some video's or pictures?

thnx

0
TomDunlap
TomDunlap

Reply 9 years ago on Introduction

Another development, I used a Makerbot Replicator to print a replacement for the foam core sensor holder. Here is the Sketchup pic of it. The two pieces glue together. The center top hole is for a fifth sensor to shut the system down if clouds block the sun so it doesn't try to point at the brightest cloud.

Pyramid 3.png
0
geo bruce
geo bruce

Reply 9 years ago on Introduction

nice upload your design to http://www.thingiverse.com/

0
بارقا
بارقا

Reply 7 years ago

What are the results and conclusions

0
بارقا
بارقا

Reply 7 years ago

What are the results and conclusions

0
TomDunlap
TomDunlap

Reply 9 years ago on Introduction

Sure, here is the link to the YouTube clip I made: http://youtu.be/6GTVWdeKvzY
0
geo bruce
geo bruce

Reply 9 years ago on Introduction

Nice!!!

It's cool to see your instructable finished by someone else :D
it means i've helped someone ^^ or someone liked my project! :D

0
TomDunlap
TomDunlap

Reply 9 years ago on Introduction

It's really helpful to get me started toward my other goals.
Next I want to modify the code to operate some 12V drill motors with a MotorShield or the like if I can find one that will handle the 3-4A current.

0
idemaemughki
idemaemughki

2 years ago

This is the code that has really worked for me. I just had to change the ldr pins to suit my design because I have already done the hardware some days back.

I really appreciate your good works.

0
JLSiles79
JLSiles79

2 years ago

Hi, thank you very much for the idea. I adapt it for 2 LDR:
// (*) según el montaje se puede modificar
// (*) must be modified according to the assembly

#include // include la libreria Servo.h
Servo horizontal; // se nombra el servo horizontal
int LDRl = 1; // pin de la fotoresistencia left
int LDRr = 2; // pin de la fotoresistencia right
int delayPot = 4; // pin del potenciometro 10k para la velocidad
int tolPot = 5; // pin del potenciometro 10k tolerancia

int paso = 2; // estos son los grados de cada movimiento(1, 2 or 5) (*)

int servoh = 90; // initial position

void setup()
{
Serial.begin(9600);
horizontal.attach(9); // se define el pin del servo
horizontal.write(servoh);
delay(1000);
horizontal.write(0); // this line helps to a inicial test
delay(1000); // this line helps to a inicial test
horizontal.write(180); // this line helps to a inicial test
delay(1000); // this line helps to a inicial test
horizontal.write(servoh); // this line helps to a inicial test
delay(250); // this line helps to a inicial test
}

void loop()
{
int medidaLDRl = analogRead(LDRl); // medida LDR izquierdo (left)
int medidaLDRr = analogRead(LDRr); // medida LDR derecho (right)
int delaytime = analogRead(delayPot)/2 + 100; // potenciometro velocidad (*)
int tol = (analogRead(tolPot)+10) / 10 + 10; // potenciometro tolerancia (*)
int diffhoriz = medidaLDRl - medidaLDRr; // calcula la diferencia entre left and rigt
if (diffhoriz < -1*tol || diffhoriz > tol) // check if the difference is in the tolerance else change horizontal angle

{
if (medidaLDRl > medidaLDRr)
{
servoh = servoh - paso;
if (servoh < 0)
{
servoh = 0;
}
}
else if (medidaLDRl < medidaLDRr)
{
servoh = servoh + paso;
if (servoh > 180)
{
servoh = 180;
}
}
else if (medidaLDRl == medidaLDRr)
{
// nothing
}
horizontal.write(servoh);
}
delay(delaytime);
}

0
Jessiceee
Jessiceee

Question 3 years ago

Hi I was wondering if I can use your code for my school project?

0
AlexUstos
AlexUstos

Question 3 years ago

Доброго времени! Вы сделали новый проект, и новый скетч, но не указали как подключить Н-мост. Купил 7A-160W. Как подключить старый скетч?