Introduction: DIY Solar Tracker

Picture of DIY Solar Tracker


We aim to introduce young students to engineering and teach them about solar energy; by having them build a Helios as part of their curriculum. There is an effort in engineering to push energy generation away from the use of fossil fuels and towards greener alternatives. One option for greener energy is to use a device called a heliostat, which uses a mirror to direct the sun’s light onto a target throughout the day. Such a device can be used for many applications, from concentrating solar energy onto the heat reservoir of a power plant to illuminating areas that are blocked from the sun.

In addition to the number of uses of this technology, there is also a diverse range of structures that have been designed to enable solar tracking. The physical structure of Helios’s design, as with other heliostat designs, functions to mount a mirror onto two controllable axes. The mechanism will track the sun by using a program to calculate the star’s location in the sky thought the day, based on the global position of the Helios. An Arduino micro-controller will be used to run the program and control the two servo motors.

Design Considerations

To ensure that this project is widely dispersed, considerable effort went into designing the Helios to be built with common tools and cheap materials. The first design choice was to build the body almost entirely out of foam core, which is rigid, affordable, easy to acquire, and easy to cut. Also, for maximum strength and rigidity, care was taken to design the body so that all of the foam parts are either in tension or compression. This was done to take advantage of foam core’s strength in tension and compression, and because the adhesive that was used is more effective at supporting a load in tension than in bending. Additionally, the shaft that is attached to the mirror is powered through a timing belt, which allows for a small alignment error between the motor and the mirror, the servo motors are accurate to within 1 degree, and the platform runs on the open source Arduino platform. These design choices, along with a few other considerations, make the presented design a durable and affordable, educational tool.

Our open-source promise

The goal of Helios is to promote engineering education. Because this is our main focus, our work is licensed under the GNU FDL license. Users have full rights to reproduce and improve on what we have done, as long as they continue to do so under the same license. We hope that users will improve the design and continue to evolve Helios into a more effective learning tool.

Epilog Challenge VIAn Epilog Zing 16 Laser would allow me to complete higher quality projects, , and increase the amount of impact that I have with interesting large scale things, and to tinker more effectively in general. An Epliog Laser would also allow me to build more interesting things and write more cool Instructables, such as this one about a Kayak that I refurbished. My next goal is to build a kayak from laser cut plywood that is reinforced with carbon fiber or glass fiber, as well as a cardboard surf board that is wrapped in structural fiber.

I've also entered this instructable in the Tech and the Teach It contests. If you enjoyed this post, please vote!

Step 1: Table of Contents

Picture of Table of Contents

Table of Contents:

  • Introduction: DIY Solar Tracker
  • Table of Contents
  • Tools and Bill of Materials
  • Step 1-16 Hardware Assembly
  • Step 17-22 Electronics Assembly
  • Purchasing Links
  • Works Cited
  • Thanks for your Support!!!

Step 2: Tools and Bill of Materials

All of these tools can be purchased at local stores or at the links in the reference section. The total cost of these materials is approximately $80, if they are all purchased online at the given links.


  • Power Drill
  • Drill Bits (.1258”, .18”, and .5” Diameter)
  • Screwdriver Set
  • Straight Edge
  • Box Cutter
  • Large Vice Grips
  • 2 Foam Core Sheets (20” X 30”, ~.2in thick)
  • 9.5” Long by 1/2” Diameter Rod
  • Square Nut (7/16” -14 Thread Size, 3/8” Thick)
  • Vigor VS-2A Servo (39.2g/5kg/0.17 sec)
  • Tape
  • Timing-Belt Pulleys (2), 1” OD
  • Washers
  • Krazy Glue
  • Timing-Belt 10"
  • Templates (Files attached)
  • Mirrored Acrylic Sheet (6” X 6”)
  • Krazy Glue Gel
  • 8 Machine Screws (4-40, 25mm long)
  • 8 Nuts (4-40)
  • 1.5" long Nails
  • Starter Kit for Arduino Uno
  • Real Time Clock Module
  • Wall Adapter Power Supply (5VDC 1A)
  • 9V battery
  • 3.3 KOhm Resistor (2)

Step 3:

Print the templates in the attached file.

Note: These have to be printed in full scale. Compare the printouts with the PDFs, to ensure that your printer has not changed the scale.

Step 4:

Picture of

Secure the templates to the poster board as shown in Figure 1 and, using the center lines as guides, drill the .18 inch and .5 inch holes.

Note: Drill the .5 inch holes with the .18inch drill bit first for increased accuracy.

Step 5:

With a sharp box cutter, cut out the individual components.

Note: Cut the foam core with multiple passes of the box cutter, this will result in a much cleaner cut. Don’t try to cut through the whole sheet in one pass.

Step 6:

Picture of

Glue the matching cutouts together as shown in Figure 2, using the super glue. You should be able to look through the cutouts and see that all of the holes are aligned, the base of parts 1 and 2 should be flat, and one template on part 3 should be facing out.

Note: After applying glue to one surface, join the parts and press them together for 30 seconds. Then, allow the glue to set for five minutes.

Step 7:

Picture of

Using the superglue gel, glue parts 1, 2 and 3 together as shown in Figure 3. Be sure that the parts are arranged so that the .5” diameter holes are closest to the section of the base that is labeled short, also be sure that the template on the base is facing down/out. Allow the glue to set for five minutes. After the glue has set, insert 3 nails through the base and into each of the uprights for added support.

Step 8:

Picture of

Cut through the top layer of both cross beams and insert them into the Helios as shown in Figure 4. Apply superglue gel to joints between the cross beams and the walls of the Helios, and the surface shared between the two cross beams, as indicated in blue. Allow the glue to set for five minutes.

Step 9:

Picture of

Place a piece of tape along the cuts, as shown in Figure 5.

Step 10:

Picture of

Superglue the spacer to the base, by lining it up with the template as shown in Figure 6, and allow the glue to set for five minutes.

Step 11:

Picture of

Center the largest servo horn onto the bottom base and secure it with the superglue, as shown in Figure 7. Allow the glue to set for five minutes.

Step 12:

Bore out one of the timing belt-pulleys to a .5” diameter hole using the .5 inch drill bit, and check that it fits onto the .5” diameter shaft. It should either press on, or have a gap small enough to fill with super glue. If the drilled hole is too small, sand down the outer diameter of the shaft by hand.

Step 13:

Carefully bore out two square nuts to .5” diameter holes and check that they fit snuggly onto the shaft.

Note: Clamp the nut to a sacrificial surface, with a pair of vice grips, and progressively increase the diameter of the hole with multiple bits until a .5” diameter hole is left. Remember to plunge the drill bit into the nut slowly.

Step 14:

Picture of

Attach a servo horn to the timing belt pulley as shown here, being careful to center the servo horn’s axis with the pulley’s, as shown in Figure 8.

Step 15:

Picture of

Assemble the shaft and servo, with no glue, and align the two timing belt pulleys as shown in Figure 9. Some of the rod should be exposed from the wall opposite the pulley.

Note: Screw the servo into the uprights, being careful not to force the screws through the foam core, and screw the servo horn into the servo. You may use superglue instead of screws , however you won’t be able to easily disassemble the unit.

Step 16:

Once the shaft’s pulley is aligned with the servo’s pulley, slide the inner set of washers against each wall and glue them to the shaft using the superglue gel. They will keep the shaft from sliding out of alignment. Also, glue the pulley to the shaft using the super glue. Let the glue set for five minutes.

Step 17:

Picture of

Shorten the timing belt to the correct length, around 7.2 inches, and use the superglue gel to make a loop that connects the shaft’s pulley to the servo’s pulley, as seen in Figure 10. First, wrap the belt around both pulleys and take out the slack. Now, cut the belt just after the teeth on both ends, the ends of the belt to just reach each other. Now cut around .5” of belt from the piece you just removed. Finally, bring both ends together and glue them with this extra length of belt, image 2. Once the glue dries, place the belt around the pulleys. It should be such a snug fit that you will have to unattach the pulley from the servo to fit the belt on. If it fits, place it to the side for later.

Step 18:

Glue the mirror template onto the back of the mirror, or draw the center line by hand. Then, using the line as a guide, glue the square nuts onto the mirror with the super glue gel. Make sure that the mirror is able to rotate 180 degrees from facing straight up to facing straight down without interfering with anything, and then glue the square nuts to the shaft with the superglue gel.

Note: The bottom edge of the square washers should be aligned with the dotted line on the template.

Step 19:

Picture of

Install the final servo, secure the bottom base to the final servo with a screw through the servo horn, and place the timing belt onto the pulleys to complete the Helios.

Note: Once you understand how the electronics and software work, by reading below, you can adjust your Helios to increase its accuracy.

Step 20:

Picture of

Connect the servos as shown, leaving the power disconnected from the DC jack. (Figure 12)

Note: Connect the 9 volt battery directly to the Arduino through the jack on the board and connect the Arduino to your computer through its USB port. DO NOT connect the 9 volt battery to the prototyping board, as this may damage your real time clock.

Step 21:

Download and Install Arduino Version 1.0.2 from here

Note: This download includes the Helios control code and all the libraries that you will need to run it. To install, download the folder and unzip it. The Arduino program runs directly out of its directory, no formal installation is required. For general installation directions and directions on how to install drivers for your Arduino, head here.

Step 22:

Run the Blink Arduino Sketch based on the directions here. Once you get this short sketch to work, you can be sure that you have properly connected your Arduino to your computer.

Step 23:

Picture of

Open the control program (ArduinoCode >Helios_2013) to set the time and location of the Heliostat, and to upload the program onto the Arduino.

1) Choose whether you want Helios to act like a solar panel and track the sun (set the variable heliostat=0) or a heliostat (set the variable heliostat=1)

a. Note: We suggest that you try it as a solar panel first to make sure that it moves how you expect. If one of the axis seems to be off, then you may have put in one of the servos backwards.

2) Gently turn Helios clockwise all the way. Then point the whole machine east.

3) Enter the coordinates of your location.

a. Find the coordinates of a location by Google searching the address. Next, right click the location and select “What’s here?”. The coordinates will appear in the search box, with latitude and the longitude.

b. Change the default latitude and longitude values in the program to the latitude and longitude values of Helios.

4) If you choose to use Helios as a solar panel, then skip this step. If you choose to use Helios as a heliostat, then enter the altitude and azimuth angle of Helios’s target. The coordinate system is defined in Figure 15.

5) To set the Real Time Clock, determine the current time in UTC and replace the corresponding variables with these values, in military time. Then delete the “//” where indicated, upload the sketch, and replace the “//” (Ex. 6:30pm EST is 10:30pm UTC. In the program this would look like hour=22, minute=30, and second=0)

a. After the clock is set, unplug the servos and run the code in “solar panel” mode (heliostat=0). Verify the calculated angles of the solar tracker with something like the solar position calculator from ( “dAzimuth” is the Azimuth angle of the sun as predicted by Helios and “dElevation” is the elevation /altitude angle of the sun. Both Helios’s and the website’s predictions should agree to within around five degrees. Any discrepancy within this range is from the uploaded time being off by a few minutes, and would cause an unnoticeable change in Helios’s behavior.

b. Once Helios’s prediction for the sun’s location is accurate, then replace the “//” to comment out the code that sets the clock. The real time clock only needs to be set once, so it will not have to be updated as you upload new sketches or change targets.

6) Remove the USB and power from the Arduino and connect the servo motors again.

Step 24:

If Helios was assembled correctly, then it should point towards the target that you command and keep the sun’s reflection stationary there when power is applied to the Arduino once again. Helios will correct the sun’s reflection every degree. This means that the sun’s refection will shift until the sun has moved one degree, at this point Helios will move to correct the reflection. Once you understand how the program works, you may want to play with the variables “offset_Elv” (Elevation) and “offset_Az” (Azimuth) to compensate for any assembly error. These variables control the orientation of Helios’s coordinate system.

Step 25: Purchasing Links


Rod: (Part Number: 8528K32)

Box cutter:



Templates: Print the pages at the end of this document. Paper can be purchased online at:

Square nut: (Part Number: 98694A125)

Super glue:

Super glue gel:

Straight Edge:

Power Drill:

Screws: (Part Number: 90272A115)

Nuts: (Part Number: 90480A005)

Mirror: (Part Number: 1518T18)

Screwdriver Set:

2 Timing-Belt Pulleys: (Part Number: A 6M16-040DF25)

Timing-Belt: (Part Number: 7887K82)

Drill Bits:

Washers: (Part Number: 95630A246)

Large Vice Grips:

Nails: (Part Number: 97850A228)

Arduino Kit:

Real Time Clock Module:

Power Supply:



Step 26: Works Cited

4photos. (2112, 07 07). 3d compass navigation. Retrieved June 6, 2013, from 4photos:

Commons, C. (2010, January 1). Real Time Clock Module. Retrieved May 28, 2013, from Sparkfun:

Commons, C. (2011, January 1). DC Barrel Jack Adapter - Breadboard Compatible. Retrieved May 28, 2013, from Sparkfun:

Commons, C. (2013, May 16). Ethernet library. Retrieved May 28, 2013, from Arduino:

ElmarM. (2013, March 24). Haunted Doll. Retrieved May 28, 2013, from instructables:

Gaze, M. (n.d.). STEPsss. Retrieved May 28, 2013, from kennyviper:

sonlineshop. (2012, January 1). Resistor 2.2K Ohm. Retrieved May 28, 2013, from

Step 27: ​Thanks for Your Support!!!

We would like to extend a huge thank you to Alexander Mitsos, our supportive advisor, and all of the people that supported us throughout this project:

  • Whitney Meriwether
  • Benjamin Bangsberg
  • Walter Bryan
  • Radha Krishna Gorle
  • Matthew Miller
  • Katharina Wilkins
  • Garratt Gallagher
  • Rachel Nottelling
  • Randall Heath
  • Paul Shoemaker
  • Bruce Bock
  • Robert Davy
  • Nick Bolitho
  • Nick Bergeron
  • Paul English
  • Alexander Mitsos
  • Matt C
  • William Bryce
  • Nilton Lessa
  • Emerson Yearwood
  • Jost Jahn
  • Carl Men
  • Nina
  • Michael and Liz
  • Walter Lickteig
  • Andrew Heine
  • Rich Ramsland
  • Bryan Miller
  • Netia McCray
  • Roberto Melendez


Abdul-KhaliqN made it! (author)2017-05-23

Thanks Phillip for a great project!

If anyone's interested, I've modified Phillip's sketch to work with a serial GPS receiver and an OLED display, and thus doing away with having to manually set the time on initial setup. I'd like to get it to a state where there is no code editing necessary for setting timezone, DST or Heliostat/Tracker mode - which needs a substantial amount of motivation at the moment!

Not being familiar with Instructables, I'm not sure how to post sketches, but I'm sure I'll work it out soon enough. Some pictures of the OLED and of the pan/tilt unit I'm using while testing are attached.

The modified sketch is documented within, so it's easy to follow if you want to make your own changes. The modifications are nothing spectacular, and rather rudimentary. Most importantly, it works! I'll try to respond as best as I can, so please be patient if I'm AWOL for some time.

NeilM113 (author)Abdul-KhaliqN2017-08-12

Were you able to work out how to upload sketches? Your additions to the original project sound very worthwhile!

Abdul-KhaliqN (author)NeilM1132017-08-15


I'm afraid I've not managed to find out how to upload. There have been a number of updated since my last post. Namely:

1. Servos parked at 90Degs and PWM switched off at dusk. Back on at dawn
2. Store GPS coordinates into Flash at first GPS fix.
3. Hardware switch added for Helio/Tracker modes.

Future updates will be:

1. to fix timezone/DST calculation for correct display of date
2. to offer a menu function to modify Timezone and DST

If you'd like to have the sketch, click here:


NeilM113 (author)Abdul-KhaliqN2017-08-17

That's really cool, thanks so much for sharing your code!

pdaniel7 (author)Abdul-KhaliqN2017-08-15

Awesome update @Abdul-KhaliqN, thank you for adding to the project!

Abdul-KhaliqN made it! (author)pdaniel72017-08-15

Only because the source project and materials made a great springboard!

I must add that the sketch, once compiled is currently too large to fit into an Uno, so I've continued development with a Mega. The OLED library, although versatile, is just too memory hungry. Other OLED libraries come nowhere near the u8glib in terms of content placement. Maybe it's just my poor/lazy programming skills.

The download link above will expire on 22 Aug 2017.

Wiring layout attached..

pdaniel7 (author)2017-06-04

And thanks!

denissato (author)2017-06-02

Congratulations, great project! I have a question: How does the system work at night? (In solar panel mode). Does it turn it off?

pdaniel7 (author)denissato2017-06-04

It's battery powered, so it will run as long as the batteries are charged

NickK145 (author)2017-01-06

I was able to get the electronic side of this working very quickly,I have not built the hardware components yet It is reporting to within a degree or two to the sun tracking site in the instructable but appears to be tracking the sun even though there is no sun. I have not yet been through the code but I would have thought it would default to a standby position at sunset? a minor problem is a semicolon missing in the download code bringing up an expecting or statement error. I used a duinotech RTC module that built in pull up resistors so can be directly connected to the assigned pins.Fantastic project., and easy to follow for an arduino Newb who doesn't know how code ;)

pdaniel7 (author)NickK1452017-01-13

I am glad to hear that the project is going well for you! I didn't add in a standby position, but that is a good idea. Good catch with the semicolon. Feel free to paste the corrected code block here so that others can correct the code if they also get an error.

prabhnoorkaur (author)2016-10-04

hey! i cant locate the timing belt pulleys , there are so many in the links provided for them, please help!

pdaniel7 (author)prabhnoorkaur2016-10-04

Hey, sorry about that. Any that fit should work, you don't have to get the same ones that I used. It has been a while, so I can see how my links expired unfortunately. Look for a matching pulley and belt that have the appropriate inner pulley diameter for the shaft, an outer diameter that isn't so big that the two pulleys will touch (smaller the better), and a thickness close to around 3/4" so there is enough grip on the shaft.

prabhnoorkaur (author)pdaniel72016-10-04

Thanks! Is there any way i can get the illustrator files for the template.. I wanted to try laser cutting

pdaniel7 (author)prabhnoorkaur2016-10-06

you can use PDF files to laser cut. They are vector files

prabhnoorkaur (author)pdaniel72016-10-07

Thank you so much! I just hve another query i couldnt find the 5 kg servo but i do have 13 kg 6v servo and a 4.2 kg 6v servo and a 9v battery.. Can i use them with a 3.3kohm resistor ? Or should i buy two 13 kg or two 4.2 kg servos .. Help!

pdaniel7 (author)prabhnoorkaur2016-10-08

As long as the servo fits and has enough torque you should be fine. I would check the bolt pattern of your servo against the one that I used.

prabhnoorkaur (author)pdaniel72016-10-08

Thanks for that! . Also is there any tutorial on how i can fit the 9v battery in the arduino uno board. I'm just confused because the port in which the 9v should go , it accepts the adapter pin in it. I'm sorry i'm very new to arduino.. bear with me..

pdaniel7 (author)prabhnoorkaur2016-10-09

No problem bud. Search for something called a 9v battery adapter. It would look like this:

prabhnoorkaur (author)pdaniel72016-10-13

Thanks o you ive assembled everything together! I've made changes in the code but the system doesn't moves a bit. I've checked the servos individually they both work. I'm attaching some pictures. Kindly let me know where i am wrong. Thanks again you've helped a lot!

here are the pictures

pdaniel7 (author)prabhnoorkaur2016-10-16

This looks awesome! Great job with the hardware. The system will move very slowly since it tracks the sun, so it may be hard to tell just by watching it. One way of checking would be to command some artificially large moves in your code for Azimuth and Elevation to ensure that the hardware is tracking those varialbles.

spencydub (author)2016-07-27

Is there a way to simply adjust the code for a single axis (left/right) solar tracker?

pdaniel7 (author)spencydub2016-07-27

Yes, but it has been a while since I looked at it. I believe that I wrote in a variable that you can change to go from Heliostat (reflect light to a stationary point) to Solar Tracker (point at the sun always).

RusmanS (author)2016-02-29

how to download the PDF document how to pack, Thank you very much before his

Afzal cassim (author)2016-01-04

Nice project!

pdaniel7 (author)Afzal cassim2016-01-11

Thank you, Afzal.

Afzal cassim (author)pdaniel72016-01-15

Cool & very aesthetic ! I got some inspiration to solve a problem,after watching the tracker's design & functionality...!

TheCoffeeDude (author)2015-12-24

Really cool cross-disciplenary project!

pdaniel7 (author)TheCoffeeDude2015-12-25

Thank you, Scottbus.

ojesteri (author)2015-10-29

Please I need assistance.

fc264 (author)2015-05-14

Hi there, I'm recreating the electronic control system depicted without the apparatus and cannot understand, in figure 12 why there is a second power input with the 5V not attached. I thought the servo motors would powered directly from the 5V output pin. So what is the use of the auxiliary 9V battery? cheers for the help

fc264 (author)fc2642015-06-04

Are the templates printed on A4 paper and then cut out as shown in the picture, or do you use A3 prints?

pdaniel7 (author)fc2642015-05-14

Servo motors can pull too much power from the Arduino, so they need their own power.

frazelle09 (author)2015-05-25

Great job, Daniel! We've been working
on a parabolic solar hot water heater for some time now and still can't
get the LEDs into a position where they aren't affected by the
reflection of the trough at some point or another, so i'm finally
thinking about just switching to a scheduled tracker. We already have a
Raspi B and have two questions...

One, will your sketch be translateable to the Raspi?

the motor that we are using to move the trough is a small one, about 1
amp. What should we do to get the pulses from the Raspi to the motor? -
lol i hope this is not too much for one post.

Have a great morning! :)

Here's a link to our project...

pdaniel7 (author)frazelle092015-05-28

I have never gotten around to playing with a Raspi, so I am not sure how translatable my sketch would be. I am not sure it depends on the type of motor that you have. If you have a hobby servo, you probably want to send PWM signals out of a digital output pin.

frazelle09 (author)pdaniel72015-05-28

Thanks for replying. We really appreciate it, and thanks for the comment and suggestion.

Maybe i can find someone who's done the same thing in Raspi for tracking.

All we have is the little motor connected to the sun tracker. The motor is 12V 1 amp and since the trough is balanced, it does a good job of turning it. A guy up in Canada has six troughs connected to the same motor.

Have a great evening and thanks again! :)

hendrif (author)2015-03-31

is this dual solar tracker or single?

pdaniel7 (author)hendrif2015-04-02


hendrif (author)pdaniel72015-04-02

so..what is the function of the servo at the bottom one...?

pdaniel7 (author)hendrif2015-04-03

Two axis tracker

indharachod73 (author)2015-03-04

amazing your build for mankind,

Thank you& Regards,


pdaniel7 (author)indharachod732015-03-04

Thanks, Indy!

BrownDogGadgets made it! (author)2015-03-01

I made this up the other day, and just posted it to Instructables. It's an active solar tracker using two servos and an Arduino.

pdaniel7 (author)BrownDogGadgets2015-03-02

Cool, thanks for sharing.

eshaansj (author)2015-01-04

Hi, I am building this as my 9th grade project and have built the Heliostat (with dad's help). It won't run though. I am using Arduino 1.0.6 and was able to get the sketch uploaded successfully, set the time on the RTC module (I think) and added the lat/long. After upload, I unhooked the USB and Arduino power and plugged in the 5V DC to the prototype board but theres no movement of any kind. Can't figure out whats wrong... (how do I test if the RTC is working?). Thanks in advance for any guidance you or others who have built this can provide!

pdaniel7 (author)eshaansj2015-01-07

It is difficult for me to troubleshoot without seeing it. Any movement will be very slow though, so you probably will not be able to see it just by looking. Try to turn the servos. If they resist you turning them, then the code is probably working. If they don't resist you turning them, then something may be wrong. You can check the RTC by reading the time that it prints out to the serial line.

jwgottabass (author)2014-10-25

I'm still a long ways from being at a level sufficient to do this; but I wanted to say that the graphics are exceedingly easy to follow and give me hope that I could do this project one day.

pdaniel7 (author)jwgottabass2014-10-27

No, jwgottabass. You are at a sufficient level to do this. I am confident that you are capable of learning what you need during the process of working through this build, if you are so motivated. Thank you for your positive feedback. Be well.

leadzeplin (author)2014-10-08

How can you use this in other projects?

About This Instructable



Bio: I am a graduate student in the Mechanical Engineering department at MIT, with aspirations of improving the world. I was raised in Durham, North Carolina ... More »
More by pdaniel7:DIY Solar TrackerRefurbish a Skin on Frame Kayak
Add instructable to: