Introduction

This is our submission for the MakeUofT 2025 Makeathon. Our team has Kerem, Humaam, Junting and Isabella

Inspiration

We wanted to create a unique yet practical device that could be used by those supporting sustainable and renewable energy. We also wanted to create something that could fall under multiple categories, hence we decided to create a backpack mounted sun tracking solar panel, that allows the user to always have the post optimal power output from their solar panel.

What it does

Our device is a portable solar panel that adjusts to the direction of sunlight to absorb maximum energy on the go.

How we built it

We utilised two servo motors to change the panel alignment in two different axis directions and four degrees of freedom. We also used photoresistors to detect the intensity of light in various directions and had the panel react by moving in the direction of highest intensity.

We had a kit that accommodated 2 servo motors, making up the hardware portion the project. The panel was created by making 3 different parts before assembling it in SolidWorks. Measurements were taken of the clips at the top of the model, and we got to work on a friction fit base. A connecting portion was made to extrude atop the hangers, and after that we designed the main panel. The panel has three circular holes each separated by a line which ensured that the photoresistor pins would not touch each other. An aesthetics based design decision was made to add lines which mimic the look of an actual solar panel. Unfortunately we were not allowed to print as it was cancelled by the executives due to no overtime prints allowed.

We also had to solder some cables to the photoresistors, as we had to create 3 connections from the 2 pin sensor, and the HSS had run out of MtoF jumper wires. We had to do this as the photoresistors requires us to connect one pin to 5V, one to ground (with a resistor), and one to our analog pin, which will actually read the value of the sensor.

We used an open source project that utilised one servo motor as a foundation to build off of. The final code consists of a start-up animation where the panel nods, and then proceeds to the main loop. If the detected values on the east PR are higher than the ones on the west, the panel will react and move rightward. The same process is reversed for leftward movement. For the south PR we decided to set a calibrated value for which the panel would return to a home position that was set in an upward direction. As the south PR detects light in the lower position, the panel will move downwards at a steady speed. When the panel is turned to the boundary angle we set, it will automatically return to its home position. If the light source moves to the upper position, the panel will go in the same direction and move upwards.

Challenges we ran into

  • We were initially very puzzled with an error in Arduino regarding the servo library. Turns out, the servo being named “SP” was causing problems with the libraries being installed in 2 directories, and an “unqualified ID before volatile”, which didnt allow us to compile the code at all.
  • Debugging the thing turning the panel towards the light. Fine tuning boundary values was tedious and took a lot of trial and error to get just right, and finding the perfect angle value to rotate at was also a challenge to find.

Accomplishments that we're proud of

  • Getting the panel to move in directions of the source of light was a big eureka moment
  • We are proud of the technical complexity of this project while keeping the bot clean with simple aesthetics
  • We were also proud of piecing together various pieces laying around, including soldering together wires to get the desired wire lengths/connections.

What we learned

  • Fine tuning takes a long time. We learnt how to adjust the value of PR based on different environment. As the sunshine decreases we need to adjust accordingly.
  • Learned how to work with photoresistors, being familiar with PR’s property and servos.

What's next for DeLaSol

Auto Calibration feature - This would allow the photoresistors to read the values from their environment, and adjust the calibration values in the code automatically.

Energy Saver mode– Implement a low-power mode where the tracker moves only when a significant light change is detected, reducing unnecessary movement.

Data Logging & Visualization – Record solar intensity, panel orientation, and energy output over time. You could display this data on an OLED screen or send it to a web dashboard.

Mobile App Integration – Build a basic app to manually override movement, view real-time data, or set custom tracking parameters.

Environmental Sensors – Add temperature, humidity, or air quality sensors to provide additional insights and showcase the multi-functionality of the device.

Auto-Stow Feature – Detects strong winds or nighttime conditions and fold into a safe position to prevent damage.

Portable Power Output – Add USB or wireless charging to directly power small devices, demonstrating a real-world application.

Here is the code that we created for this project:

#include <Servo.h>

Servo baseServo;
Servo panelServo;

// Photoresistor def
const int prWest = A0;
const int prEast = A1;
const int prSouth = A2;

int west = 0;
int east = 0;
int south = 0;

int westCAL = 200;
int eastCAL = 105;
int southCAL = 220;


int panelAngle = 90;
int baseAngle = 90;

void startup() {

  panelServo.write(90);
  delay(1000);
  panelServo.write(65);
  delay(200);
  panelServo.write(115);
  delay(200);
  panelServo.write(65);
  delay(200);
  panelServo.write(115);
  delay(200);
}

void setup() {


  baseServo.attach(7);
  panelServo.attach(6);

  pinMode(prWest, INPUT);
  pinMode(prEast, INPUT);
  pinMode(prSouth, INPUT);

  delay(500);

  startup();

}

void loop() {

  west = analogRead(prWest);
  east = analogRead(prEast);
  south = analogRead(prSouth);

  if (south > southCAL) {

    panelAngle += 5;
    panelServo.write(panelAngle);
    delay(100);
  }

  if (south < southCAL && panelAngle > 25 ) {

    panelAngle -= 5;
    delay(100);
    south = analogRead(prSouth);
    panelServo.write(panelAngle);
    delay(100);
  }

  // Move base to the left (west)
  if (west > westCAL) {
    if (baseAngle > 5) {
      baseAngle -= 3;
      baseServo.write(baseAngle);
    }
  }

  // Move base to the right (east)
  if (east > eastCAL) {
    if (baseAngle < 175) {  // Ensure the base doesn't go beyond 175
      baseAngle += 3;
      baseServo.write(baseAngle);
    }
  }

  delay(100);  // Short delay to prevent rapid movement



}

Built With

Share this project:

Updates