OPEN_ROBO_HUB ← Back to Projects
Module 02 Dual-Axis Solar Tracker

Dual-Axis Solar Tracker

Integrates LDR Sensor Array logic gates/configurations to trigger solar panel positioning when dual light sensor matrix values narrow down. The controller continuously compares illumination levels detected by left and right photoresistors and rotates servo motors toward the strongest light source, improving solar harvesting efficiency.

Hardware Pin Schematic

Sensor Connection Point Target Uno Pin
Left LDR Output =====> A0
Right LDR Output =====> A1
Top LDR Output =====> A2
Bottom LDR Output =====> A3
Horizontal Servo Signal =====> D9
Vertical Servo Signal =====> D10
Servo VCC =====> 5V
Servo GND =====> GND

Project Working Principle

Arduino IDE Sketch


#include <Servo.h>

Servo horizontalServo;
Servo verticalServo;

const int leftLDR = A0;
const int rightLDR = A1;
const int topLDR = A2;
const int bottomLDR = A3;

int horizontalPos = 90;
int verticalPos = 90;

const int tolerance = 40;

void setup()
{
Serial.begin(9600);

horizontalServo.attach(9);
verticalServo.attach(10);

horizontalServo.write(horizontalPos);
verticalServo.write(verticalPos);

delay(1000);
}

void loop()
{
int leftValue = analogRead(leftLDR);
int rightValue = analogRead(rightLDR);
int topValue = analogRead(topLDR);
int bottomValue = analogRead(bottomLDR);

int horizontalDifference = leftValue - rightValue;
int verticalDifference = topValue - bottomValue;

if(abs(horizontalDifference) > tolerance)
{
if(horizontalDifference > 0)
{
horizontalPos++;
}
else
{
horizontalPos--;
}

horizontalPos = constrain(horizontalPos, 0, 180);
horizontalServo.write(horizontalPos);
}

if(abs(verticalDifference) > tolerance)
{
if(verticalDifference > 0)
{
verticalPos++;
}
else
{
verticalPos--;
}

verticalPos = constrain(verticalPos, 0, 180);
verticalServo.write(verticalPos);
}

Serial.print("Left: ");
Serial.print(leftValue);

Serial.print(" Right: ");
Serial.print(rightValue);

Serial.print(" Top: ");
Serial.print(topValue);

Serial.print(" Bottom: ");
Serial.print(bottomValue);

Serial.print(" HPos: ");
Serial.print(horizontalPos);

Serial.print(" VPos: ");
Serial.println(verticalPos);

delay(50);
}