Bộ theo dõi mặt trời tự xoay tấm pin năng lượng mặt trời với Arduino
Tấm pin mặt trời lắp cố định chỉ đạt hiệu suất tối đa vào đúng một thời điểm trong ngày — sáng sớm và chiều muộn, ánh sáng chiếu xiên khiến sản lượng giảm mạnh. Bộ theo dõi mặt trời (solar tracker) xoay tấm pin theo hướng ánh sáng mạnh nhất suốt cả ngày, có thể tăng sản lượng thu được 20-30% so với lắp cố định cùng công suất. Dự án này dùng Arduino, hai cảm biến quang trở và một servo để dựng bản demo một trục — đủ để hiểu nguyên lý trước khi làm hệ hai trục quy mô lớn hơn.
Nguyên lý hoạt động
- Hai cảm biến quang trở (LDR) đặt hai bên một vách ngăn nhỏ ở giữa, sao cho khi ánh sáng chiếu lệch, một bên bị che bóng còn bên kia nhận sáng trực tiếp.
- Arduino đọc giá trị ánh sáng của cả hai LDR qua chân analog.
- Nếu chênh lệch giữa hai bên vượt một ngưỡng nhất định, Arduino ra lệnh cho servo xoay dần về phía LDR đang nhận nhiều ánh sáng hơn.
- Khi chênh lệch về gần 0 (tấm pin đã hướng thẳng vào nguồn sáng mạnh nhất), servo dừng lại — chu trình lặp lại liên tục theo chuyển động của mặt trời trong ngày.
Linh kiện
- Arduino Uno hoặc Nano
- 2 cảm biến quang trở (LDR) + 2 điện trở 10kΩ (mắc phân áp)
- Servo SG90 hoặc servo mô-men lớn hơn nếu tấm pin nặng
- Tấm pin mặt trời nhỏ (5V, dùng để demo hoặc sạc pin phụ)
- Vách ngăn nhỏ giữa hai LDR (bìa cứng hoặc nhựa in 3D) để tạo bóng đổ lệch khi ánh sáng chiếu xiên
- Khung xoay cơ khí gắn servo với tấm pin (in 3D hoặc lắp ghép thủ công)
Code mẫu
#include <Servo.h>
Servo panelServo;
const int LDR_LEFT = A0;
const int LDR_RIGHT = A1;
const int SERVO_PIN = 9;
int servoAngle = 90; // vi tri giua, 0-180 do
const int STEP = 1; // buoc xoay moi lan chinh
const int DEAD_ZONE = 40; // nguong chenh lech, tranh rung lac lien tuc
const int READ_DELAY = 3000; // doc lai sau moi 3 giay, du cho servo di chuyen on dinh
void setup() {
Serial.begin(9600);
panelServo.attach(SERVO_PIN);
panelServo.write(servoAngle);
}
void loop() {
int left = analogRead(LDR_LEFT);
int right = analogRead(LDR_RIGHT);
int diff = left - right;
Serial.print("Trai: "); Serial.print(left);
Serial.print(" | Phai: "); Serial.print(right);
Serial.print(" | Lech: "); Serial.println(diff);
if (abs(diff) > DEAD_ZONE) {
if (diff > 0 && servoAngle < 180) {
servoAngle += STEP; // anh sang manh hon ben trai, xoay ve trai
} else if (diff < 0 && servoAngle > 0) {
servoAngle -= STEP; // anh sang manh hon ben phai, xoay ve phai
}
panelServo.write(servoAngle);
}
delay(READ_DELAY);
}
Những lỗi thường gặp
- Không có vách ngăn giữa hai LDR — không tạo được bóng đổ lệch, tấm pin sẽ không bao giờ “quyết định” được hướng xoay vì hai cảm biến luôn đọc gần như giống nhau.
- Thiếu vùng chết (
DEAD_ZONE) khiến servo rung lắc liên tục quanh điểm cân bằng, hao pin servo và mòn cơ khí nhanh — luôn để một khoảng dung sai trước khi ra lệnh xoay. - Đọc và xoay quá nhanh làm servo phản ứng với từng đám mây thoáng qua thay vì xu hướng ánh sáng thực sự trong ngày — nên giãn cách vài giây giữa các lần đọc, hoặc lấy trung bình nhiều mẫu.
- Servo nhỏ (SG90) không đủ mô-men nếu tấm pin và khung nặng — cần servo mô-men cao hơn hoặc động cơ giảm tốc DC kèm driver.
Mở rộng
Thêm trục thứ hai (xoay theo độ cao mặt trời ngoài phương ngang) để có hệ hai trục theo dõi chính xác hơn, gắn cảm biến dòng/áp (INA219) để đo trực tiếp công suất thu được và so sánh với chế độ lắp cố định, hoặc dùng ESP32 để log dữ liệu theo thời gian thực lên dashboard như trong bài dashboard giám sát cảm biến với Grafana.
Bình luận