Final Project Summary
This page summarizes my work on
SKÖLL - the sun tracker
as a final project for Fab Academy 2025.
What does it do?
The machine I built rotates a sphere on an arm in a two axes movement (azimuth and zenith) around a pyranometer. It is controlled by the input of date, time and geographical position and points the sphere constantly into the sun to shade the sensor of the pyranometer.
This device is known as a sun tracker / solar tracker. It can be used for solar energy and meteorological applications. By shading the sensor of the pyranometer, the indirect (diffuse) solar irradiance can be measured and compared to the global irradiance measurement of an unshaded pyranometer.
Below is a functional description diagram to visualize the input and output of the machine and it's boundaries.
I also include the system diagram from week 16.
Who has done what beforehand?
Obviously, this device has a very limited group of users and there are a few companies that sell this equipment. Some examples I found are:
As with all low-batch scientific equipment, the cost for one device can be very high, due to the development cost being distributed on few items.
I didn't have any detailed drawings of the interior components of this devices, but I reused some design features that I could clearly identify from the pictures.
For the mathematical model I could luckily use the SolarCalculator library for C++. That saved me quite some time.
The inspiration for the 3D printed harmonic drive I got from this design.
My work and sources
Note
No artificial intelligence was used for this project.
I designed all the main mechanical (non-standard) components from scratch, including the harmonic drive.
I also designed the main PCB and the breakout boards for the encoders.
I wrote the code for the microcontroller in C++ and included the following libraries:
- SoftwareSerial for serial communication on GPIO
- AMS_AS5048B for reading the I2C encoder
- Wire for I2C communication
- SolarCalculator for calculation of the sun azimuth and elevation
- TimeLib for timekeeping
- RunningMedian for filtering the encoder readings
- Stepper for controlling the stepper motors
- TinyGPS for parsing the GPS data
Materials, Suppliers & Cost
I used a variety of suppliers and materials and kept track of the usage and costs.
Materials used in the final project
These are the materials I used for manufacturing:
-
Metals
- stainless steel 304 / 316
- carbon steel
- soldering tin
- copper (PCB stock, wires)
-
Plastics
- PETG (filament)
-
Other
- NBR (o-ring)
- Soldering paste
- Anti-seize paste
- Contact glue (cyanoacrylate)
Part list
Here is the final part list, devided into three sections for better oversight.
Manufactured components
This table lists the components I made myself.
Pos | Qty | Description | Material | Machine |
---|---|---|---|---|
1 | 1 | Main circuit board | FR1 | Roland MDX-20 |
2 | 2 | Encoder breakout board | FR1 | Roland MDX-20 |
3 | 2 | GT2 Pulley and wave generator | PETG | Prusa MK4s |
4 | 1 | Circular spline vertical | PETG | Prusa MK4s |
5 | 1 | Lower body | PETG | Prusa Core One |
6 | 2 | Motor bracker NEMA17 | PETG | Prusa MK4s |
7 | 1 | Upper body | PETG | Prusa Core One |
8 | 2 | Encoder plate | PETG | Prusa MK4s |
9 | 1 | Circular spline horizontal | PETG | Prusa Core One |
10 | 1 | Shading sphere | PETG | Prusa MK4s |
11 | 1 | Cover plate | PETG | Prusa Core One |
12 | 1 | Rod end 1 | PETG | Prusa MK4s |
13 | 1 | Rod end 2 | PETG | Prusa MK4s |
14 | 1 | Rod end 3 | PETG | Prusa MK4s |
15 | 1 | Rod end 4 | PETG | Prusa MK4s |
16 | 1 | Rod link | PETG | Prusa MK4s |
17 | 2 | Flex spline gear | PETG | Prusa MK4s |
18 | 1 | Counterweight mount | PETG | Prusa MK4s |
19 | 1 | O-ring Ø2,5 L=425 | NBR | - |
20 | 1 | O-ring Ø2,5 L=660 | NBR | - |
Purchased parts, mechanical
Pos | Qty | Description | Supplier | Price | Sum |
---|---|---|---|---|---|
1 | 2 | GT2 Timing belt 356mm | MaiLeXun | $1,51 | $3,02 |
2 | 2 | GT2 Timing belt pulley 16T | MaiLeXun | $1,11 | $2,22 |
3 | 2 | NEMA17HS4401 Stepper Motor | Hanpose | $8,35 | $16,70 |
4 | 4 | Ball Bearing 62200-2RS | BCE Bearing | $3,05 | $12,20 |
5 | 2 | Ball Bearing 61900-ZZ | BCE Bearing | $0,76 | $1,52 |
6 | 4 | Ball Bearing 61821-2RS | BCE Bearing | $12,41 | $49,64 |
7 | 2 | Magnet Diametric Ø6 x 3 | DigiKey | $0,72 | $1,44 |
8 | 1 | M12 Connector | DigiKey | $10,52 | $10,52 |
9 | 1 | Base plate 3mm AISI304 | Local Shop | 7000kr | 7000kr |
10 | 1 | Counterweight Ø40 L=100 AISI304 | Local Shop | 2000kr | 2000kr |
11 | 8 | M6 Insert Stainless Steel | Mouser | $0,92 | $7,36 |
12 | 5 | M5 Insert Stainless Steel | Mouser | $0,69 | $3,45 |
13 | 1 | Air Vent IP67 M32x1,5 | Mouser | $27,65 | $27,65 |
14 | 1 | Carbon Fibre Tube Ø12mm | Easycomposites | $16,22 | $16,22 |
15 | 1 | Carbon Fibre Hexagon Tube 14mm | Easycomposites | $23,07 | $23,07 |
16 | 2 | Hex Bolt M10x80 A4-70 | Ísól | 131kr | 262kr |
17 | 6 | Hex Nut Nylon M10 A4 | Ísól | 33kr | 198kr |
18 | 4 | Socket Head Bolt M10x55 A4-70 | Ísól | 122kr | 488kr |
19 | 6 | Button Head Bolt M6x12 | Ísól | 16kr | 96kr |
20 | 5 | Button Head Bolt M5x12 | Ísól | 11kr | 55kr |
21 | 12 | Hex Nut Nylon M6 A4 | Ísól | 9kr | 108kr. |
22 | 2 | Hex Nut Nylon M5 A4 | Ísól | 5kr | 10kr |
23 | 4 | Hex Nut Nylon M8 A4 | Ísól | 15kr | 60kr |
24 | 1 | Hex Nut M6 A4 | Ísól | 6kr | 6kr |
25 | 8 | Socket Head Bolt M6x30 A4-70 | Ísól | 22kr | 176kr |
26 | 2 | Socket Head Bolt M6x25 A4-70 | Ísól | 21kr | 42kr |
27 | 4 | Hex Head Bolt M8x60 A4-70 | Ísól | 67kr | 268kr |
28 | 4 | Hex Head Bolt M6x40 A4-70 | Ísól | 31kr | 124kr |
29 | 2 | Socket Head Bolt M6x40 A4-70 | Ísól | 35kr | 70kr |
30 | 4 | Oversized Washer M6 A4 | Ísól | 9kr | 36kr |
Purchased Components - Electrical
These are the electrical components (mainly on the PCB).
Pos | Qty | Part-No | Description | Supplier | Price | Sum |
---|---|---|---|---|---|---|
1 | 1 | PCB Stock FR1 4'' x 6'' | Carbide 3D | $1,0 | $1,0 | |
2 | 4 | C1206C104K5RACTU | Capacitor SMD 1206 0,1µF | DigiKey | $0,08 | $0,32 |
3 | 2 | EEE-FN1E101UL | Capacitor 100µF | DigiKey | $0,59 | $1,18 |
4 | 1 | 150120BS75000 | LED SMD 1206 blue | DigiKey | $0,23 | $0,23 |
5 | 2 | JST Connector male 01x05 THT | Adafruit | $0,13 | $0,26 | |
6 | 4 | JST Connector male 01x04 THT | Adafruit | $0,13 | $0,52 | |
7 | 1 | JST Connector male 01x03 THT | Adafruit | $0,13 | $0,13 | |
8 | 1 | JST Connector male 01x02 THT | Adafruit | $0,13 | $0,13 | |
9 | 2 | JST Connector female 01x05 | Adafruit | $0,13 | $0,26 | |
10 | 4 | JST Connector female 01x04 | Adafruit | $0,13 | $0,52 | |
11 | 1 | JST Connector female 01x03 | Adafruit | $0,13 | $0,13 | |
12 | 1 | JST Connector female 01x02 | Adafruit | $0,13 | $0,13 | |
13 | 1 | 95278-101-04LF | Header 02x02 SWD P2,54 SMD | DigiKey | $0,41 | $0,41 |
14 | 4 | RNCP1206FTD1K00 | Resistor SMD 1206 1k | DigiKey | $0,10 | $0,40 |
15 | 1 | RC1206JR-07620RL | Resistor SMD 1206 620 | DigiKey | $0,10 | $0,10 |
16 | 1 | B3SN-3012P | Switch Tactile Omron | DigiKey | $0,86 | $0,86 |
17 | 4 | DRV8251ADDAR | MotorDriver HalfBridge | DigiKey | $1,78 | $7,12 |
18 | 1 | AVR128DB32-I/PT | Microprocessor AVR128DB32 | DigiKey | $1,96 | $1,96 |
19 | 1 | LM3480IM3X-5.0/NOPB | Voltage Regulator 5 V 100 mA | DigiKey | $1,07 | $1,07 |
20 | 4 | RMCF1206ZT0R00 | Jumper SMD 1206 0 OHM | DigiKey | $0,10 | $0,40 |
30 | 1 | - | NEO-6M GPS Module | ebay | $6,50 | $6,50 |
40 | 2 | TLE5012BE1000XUMA1CT-ND | Hall effect sensor absolute angle | DigiKey | $3,45 | $6,90 |
41 | 4 | RC1206FR-07100RL | Resistor SMD 1206 100 | DigiKey | $0,10 | $0,40 |
42 | 2 | RMCF1206JT470R | Resistor SMD 1206 470 | DigiKey | $0,10 | $0,20 |
43 | 2 | C1206C104K5RACTU | Capacitor SMD 1206 100nF | DigiKey | $0,08 | $0,16 |
Total Cost
The total cost divides and sums up as follows, when considering currency conversion and taxes:
Category | Sum | Currency | Import Taxes | Amount in USD |
---|---|---|---|---|
Purchased parts mechanical | 175,01 | USD | 25% | 218,76 |
Purchased parts mechanical | 10999 | ISK | - | 85,24 |
Purchased parts electrical | 32,33 | USD | 25% | 40,41 |
Purchased filament PETG | 17160 | ISK | - | 131,03 |
= | $475,44 |
Assembly-Tree
The assembly tree shows, how subassemblies and components are organized on the three highest levels.
- SUN TRACKER
- Base plate assembly
- Solid steel plate
- Spirit level
- Feet
- Encoder bolt with magnet
- Circular spline gear
- Azimuth drive
- Lower housing
- Harmonic drive
- Wave generator / pulley
- Flex spline
- Motor mount
- Motor with pulley
- Timing belt
- Encoder
- Zenith drive
- upper housing
- Harmonic drive
- Wave generator / pulley
- Flex spline
- Motor mount
- Motor with pulley
- Timing belt
- Air vent
- PCB
- GPS-module
- Arm assembly
- Torque arm with circular spline gear
- Encoder bolt with magnet
- Carbon fibre rods
- Joints
- Shading sphere
- Counterweight incl. mounting bracket
- Service cover assembly
- Cover
- M12 connector
- Base plate assembly
Fabrication Processes
I used the following fabrication processes in the final project:
- Machining
- manual drilling
- manual turning (facing, boring)
- manual sawing, grinding, filing, sanding
- CNC milling (PCB)
- Joining
- Soldering (PCB)
- Adhesive bonding
- Fastening (nuts, bolts)
- Press fitting
- Heat inserting
- Crimping
- Additive manufacturing
- 3D printing (FDM)
Additionally, I ordered a custom waterjet-cut stainless steel plate.
Software Tools
I used the following tools for designing the machine:
- Autodesk Fusion 360
- KiCad 9.0
- Arduino IDE
- VSCode
These tools were used in the manufacturing process:
- Prusa Slicer 2.9.2
- Gerber2PNG
- Mods
Lastly, I used the following software for planning, documentation and presentation:
- ProjectLibre
- VSCode
- RStudio
- Inkscape
- paint.net
- Microsoft Clipchamp
Design files
The major part of the design was done in Fusion 360. Because of the size of the *.stl files for 3D printing - I could not include them in my repository, but here is a link to the 3D model:
The PCB design files for the main board and encoder breakout boards can be found here.
In the same directory are also some vector graphic files and an excel sheet, where I calculated the transfer formula for the kinematics.
The code / program including different test versions can be found in this directory. The latest version when the assignment is due, is suntracker_v0.4.ino
.
Questions answered
-
Is it possible to design and build a reliable and robust sun tracker prototype from scratch?
Yes, but time will prove if it is actually as robust and reliable as required and how much maintenance will be involved. At least for now, it seems to work, but I'm also sure that I'm going to improve some details in the future / for the next prototype.
-
Will the sun tracker be able to follow the sun path accurately enough to shade the sensor at all times?
Yes, when monitoring it for a couple of hours, the shadow was accurately on the sensor. However, I have to perform more tests in difficult conditions, as strong wind, snow, icing and so on.
-
What is the actual accuracy of an absolute angle magnetic encoders?
At least in my setup with the 12-bit encoder, I experienced some noise in the measurements. I didn't have the instruments to verify the accuracy over a full rotation, but it is indicated that the accuraccy is within ± 0,1°, which is good enough for me.
-
Can you successfully 3D-print a harmonic drive?
Yes, that is possible with a standard FDM printer with 0,4 mm nozzle and PETG filament. There is some noise and friction in it, but it is strong enough to move both axes of my machine. The life-time needs to be determined yet, but fortunately the replacement of the wear parts is relatively easy and cheap.
Success and Failure
There was one mechanical design fault I made in the harmonic drive, which I discovered in week 16 and fortunately, was able to solve by implementing design changes.
All other mechanical components seem to fit and work without major issues.
Most failures occured on the electronics side of the project. Some have been related to wiring / connectivity issues, but most occur in the programming.
In week 18 I discovered, that the reason for the I2C connectivity issues, was related to the missing pullup resistors, which I managed to add.
Another failure I could identify in week 18, was a short between two pins of the microcontroller, caused by a tin bridge.
In week 19 I identified and solved temporarily a power supply issue.
All in all the development was succesful. I got the machine working and have it track the sun for a longer period of time, with the shadow being cast on the right spot.
There are some improvements I have in mind, that should be implemented before deploying the machine to the measuring site, but I'm optimistic that it can be used with only minor improvements.
Evaluation
There are several methods to evaluate the success of this project.
I already proofed, that the sun tracking does work over a 24 h period of time and the shadow covers the sensor all the time. In the timelapse, you can see that the movement is not constant - I programmed the code to wait until a certain deviation between the encoder reading and the setpoint angle is reached, before moving the machine. This allows me to prevent unneccesary movements and I can turn off the h-bridges in between the movements to reduce energy consumption and heat buildup. However, I might consider making the movement a bit more smooth, but reducing the allowed deviaton.
Another thing I tested was the shake test to see if all connectors and wiring looms are okay and there were no issues found. Nevertheless, I can improve the cable routing inside the machine for the next prototype.
During outdoor testing I had a few rain showers and could not see any water ingress. It would be good to do a proper ingress protection testing according to EN 60529. I would like to aim for a rating of IP 54 (dust protection, splash water protection).
Implications
For now, I only plan to make one machine and hand it over to my employer once it runs stable. Hopefully it will proof useful and accurate enough to perform the indirect solar irradiance measurments. I'm going to follow up on the performance and reliability and might consider making an updated / improved version with the learnings from the final project.
I want to share the design with scientific institutions and non-profit organizations as well as allowing private use with the restriction of crediting me, but I find it quite unlikely, that somebody is going to reproduce the machine in the exact same way. It would most likely need to be adapted to local conditions/availability and manufacturer preference. Nevertheless, it would be great if this could be the inspiration for somebody to improve or adopt the design and make their own version of a sun tracker.
License
As documented in week 19, I discovered that the CC BY 4.0 license is already applied to the gitlab repository and this can't be changed. Therefore, I'm going to stick to this license for the final project version, but might consider changing it for the next iteration to CC BY-NC-SA 4.0, to prevent commercial use.