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
- • Reads four LDR sensors continuously.
- • Calculates horizontal and vertical light imbalance.
- • Rotates horizontal servo toward brighter side.
- • Rotates vertical servo toward stronger sunlight.
- • Stops movement when illumination values become balanced.
- • Helps maximize photovoltaic energy capture.
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);
}