LIMPINGLIM
Published © GPL3+

Sun-Tracking Mechanism for 40W solar panel

Trackers generate more electricity than their stationary counterparts due to increased direct exposure to solar rays.

BeginnerShowcase (no instructions)11,737
Sun-Tracking Mechanism for 40W solar panel

Things used in this project

Hardware components

Dual H-Bridge motor drivers L298
SparkFun Dual H-Bridge motor drivers L298
×1
RobotGeek Light Sensor
RobotGeek Light Sensor
×4
panel mounted push-button
×2
12V DC motor with gearbox (3rpm)
×2
Solar Panel 40W
×1
10A PWM solar charge controller
×1
12V 7.2Ah AGM Battery
×2
Arduino UNO
Arduino UNO
×1
Mini Ball Bearing – 105zz 5x10x4
OpenBuilds Mini Ball Bearing – 105zz 5x10x4
10mm external Diameter
×4
Electronic Enclosure
×1

Software apps and online services

Arduino IDE
Arduino IDE
Tinkercad
Autodesk Tinkercad
early stage mechanical design and code simulation done on this online platform.

Hand tools and fabrication machines

Dremel Rotary Tool & drill bits
Tap & Die Kit
circle router

Story

Read more

Custom parts and enclosures

Schematic Design

rough concept

Schematics

Wiring Schematic

Code

Dual_Axis_Sun_Tracking_with_DC_Motors.ino

Arduino
This might not be the most effective code, but it's giving me the result and flexibility that I need. Comments included in the code to guide wiring of the various components. Speed of motor can also be adjusted by varying the value of AnalogWrite.
// define pin numbers:
#define redbutton 12
#define greenbutton 13
#define IN1 6
#define IN2 9
#define IN3 10
#define IN4 11
#define ldrEast 7
#define ldrWest 8
#define ldrUp 4
#define ldrDown 5

int ldrEastState = 0; //variable for reading east LDR status
int ldrWestState = 0; //variable for reading west LDR status
int ldrUpState = 0; //variable for reading Up LDR status
int ldrDownState = 0; //variable for reading Down LDR status

void setup() {
  
pinMode(IN1, OUTPUT);//make two output pins
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);//make two output pins
pinMode(IN4, OUTPUT);
pinMode(ldrEast, INPUT); //make LDR input pin
pinMode(ldrWest, INPUT); //make LDR input pin
pinMode(ldrUp, INPUT); //make LDR input pin
pinMode(ldrDown, INPUT); //make LDR input pin
pinMode(redbutton, INPUT); //make red button input pin
digitalWrite (redbutton, HIGH);
pinMode(greenbutton, INPUT); //make green button input pin
digitalWrite (greenbutton, HIGH);

}

void loop() {
  //check east-west orientation first
ldrEastState = digitalRead(ldrEast); //read east ldr
ldrWestState = digitalRead(ldrWest); //read west ldr
digitalWrite(IN1,LOW); //set signal to motor driver board to low
digitalWrite(IN2,LOW); //set signal to motor driver board to low
digitalWrite(IN3,LOW); //set signal to motor driver board to low
digitalWrite(IN4,LOW); //set signal to motor driver board to low

//manual overwrite to orientate panel to west
if (digitalRead (greenbutton) == LOW) {
  analogWrite (IN2,150); //turn motor CCW to go towards west
} else {
  digitalWrite (IN2,LOW);
  }

//manual overwrite to orientate panel to east
if (digitalRead (redbutton) == LOW) {
  analogWrite (IN1, 150); //turn motor CW to go towards east
} else {
   digitalWrite (IN1, LOW);
  }

if (ldrWestState == HIGH) {
  if (ldrEastState == LOW) {
    analogWrite (IN2,150); //turn motor CCW to go towards west
  } else {
    }
} 

if (ldrWestState == LOW) {
  if (ldrEastState == HIGH) {
    analogWrite (IN1, 150); //turn motor CW to go towards east
  } else {
    }
}
delay (500); //wait 0.5 second


//check up-down orientation after eas-west orientation has been adjusted
ldrUpState = digitalRead(ldrUp); //read up ldr
ldrDownState = digitalRead(ldrDown); //read down ldr
digitalWrite(IN1,LOW); //set signal to motor driver board to low
digitalWrite(IN2,LOW); //set signal to motor driver board to low
digitalWrite(IN3,LOW); //set signal to motor driver board to low
digitalWrite(IN4,LOW); //set signal to motor driver board to low

if (ldrUpState == HIGH) {
  if (ldrDownState == LOW) {
    analogWrite (IN3,150); //ON tilt motor to rotate up
  } else {
    }
} 

if (ldrUpState == LOW) {
  if (ldrDownState == HIGH) {
    analogWrite (IN4, 150); //ON tilt motor to rotate down
  } else {
    }
}
delay (500); //wait 0.5 second

}

Credits

LIMPINGLIM

LIMPINGLIM

2 projects β€’ 27 followers

Comments