Seguidor Solar de Doble Eje con Control Automático y Manual: Sistema Eficiente de Seguimiento Solar
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| Potenciómetro rotativo (genérico) | 2 |
| LED (genérico) | 2 |
| Pulsador 12mm (SparkFun) | 1 |
| Servos Tower Pro MG996R | 2 |
| Fotorresistencia (LDR) | 4 |
| Resistencia 10kΩ | 5 |
| Resistencia 221Ω | 2 |
Herramientas y Máquinas Necesarias
- Soldador (genérico)
Aplicaciones y Servicios Online
- Autodesk Tinkercad
- Arduino IDE
Sobre este Proyecto
Este es un proyecto que mis estudiantes implementaron durante el club vespertino 2017-2018 "Young Hackers". Es un proyecto exigente para estudiantes de primaria y nos llevó muchas reuniones lograrlo. Contiene un pequeño panel solar de 5V que puede rotar en dos ejes para cosechar la máxima potencia del sol. El proyecto se basa en el Proyecto de Seguidor Solar de Doble Eje de OpenSourceClassroom.
Queríamos implementar dos modos en el producto final:
- Modo manual - controlado por dos potenciómetros.
- Modo automático - controlado con cuatro sensores de luz (LDR).
Para lograr esto, programamos el dispositivo para cambiar entre modos con la ayuda de un pulsador y dos LEDs indicadores. Cuando el dispositivo está en modo manual, la luz roja está encendida y podemos controlar la rotación del panel en dos ejes con la ayuda de dos potenciómetros. Cuando el dispositivo está en modo automático, la luz azul está encendida y la rotación del panel está determinada por la luz captada por los cuatro LDR. La programación se hizo en Tinkercad.
Los estudiantes trabajaron en grupos en estilo línea de producción para completar las tareas (soldadura de cables, aislamiento de cables, atornillado de piezas, etc.).
Código
Código del Panel Solar Rotativo (Arduino)
El código final del panel solar de doble eje.
#include <Servo.h>
// Inicializar variables
int mode = 0;
int buttonState = 0;
int prevButtonState = 0;
int topLeftLight = 0;
int topRightLight = 0;
int bottomLeftLight = 0;
int bottomRightLight = 0;
int LeftLight = 0;
int RightLight = 0;
int TopLight = 0;
int BottomLight = 0;
// Declarar dos servos
Servo servo_9;
Servo servo_10;
void setup() {
pinMode(7, INPUT); // Botón de modo
pinMode(12, OUTPUT); // LED indicador modo manual
pinMode(11, OUTPUT); // LED indicador modo automático
pinMode(A0, INPUT); // Potenciómetro movimiento derecha-izquierda
pinMode(A1, INPUT); // Potenciómetro movimiento arriba-abajo
pinMode(A2, INPUT); // Sensor luz arriba - izquierda
pinMode(A3, INPUT); // Sensor luz arriba - derecha
pinMode(A4, INPUT); // Sensor luz abajo - izquierda
pinMode(A5, INPUT); // Sensor luz abajo - derecha
servo_9.attach(9); // Servo motor derecha - izquierda
servo_10.attach(10); // Servo motor arriba - abajo
}
void loop() {
buttonState = digitalRead(7);
if (buttonState != prevButtonState) {
if (buttonState == HIGH) {
// Cambiar modo y encender el indicador correcto
if (mode == 1) {
mode = 0;
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
} else {
mode = 1;
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
}
}
}
prevButtonState = buttonState;
delay(50); // Esperar 50 milisegundos
if (mode == 0) {
// Si el modo es manual, mapear valores del potenciómetro a grados de rotación
servo_9.write(map(analogRead(A0), 0, 1023, 0, 180));
servo_10.write(map(analogRead(A1), 0, 1023, 0, 180));
} else {
// Si el modo es automático, mapear valores del sensor a 0-100 intensidad de luz.
// Cada sensor de luz tiene diferente sensibilidad y debe probarse primero
// para sus valores alto y bajo
topLeftLight = map(analogRead(A2), 50, 980, 0, 100);
topRightLight = map(analogRead(A3), 200, 990, 0, 100);
bottomLeftLight = map(analogRead(A4), 170, 970, 0, 100);
bottomRightLight = map(analogRead(A5), 250, 1000, 0, 100);
// Calcular condiciones promedio de luz
TopLight = ((topRightLight + topLeftLight) / 2);
BottomLight = ((bottomRightLight + bottomLeftLight) / 2);
LeftLight = ((topLeftLight + bottomLeftLight) / 2);
RightLight = ((topRightLight + bottomRightLight) / 2);
// Rotar servos si es necesario
if (abs((RightLight - LeftLight)) > 4) {
// Cambiar posición solo si la diferencia de luz es mayor al 4%
if (RightLight < LeftLight) {
if (servo_9.read() < 180) {
servo_9.write((servo_9.read() + 1));
}
}
if (RightLight > LeftLight) {
if (servo_9.read() > 0) {
servo_9.write((servo_9.read() - 1));
}
}
}
if (abs((TopLight - BottomLight)) > 4) {
// Cambiar posición solo si la diferencia de luz es mayor al 4%
if (TopLight < BottomLight) {
if (servo_10.read() < 180) {
servo_10.write((servo_10.read() - 1));
}
}
if (TopLight > BottomLight) {
if (servo_10.read() > 0) {
servo_10.write((servo_10.read() + 1));
}
}
}
}
}
Esquemático
Proceso de manufactura
- Proyecto Sensor DHT11 Temperatura y Humedad con Indicadores LED y Altavoz Piezo
- Sensor de obstáculos IR casero con Arduino – Tutorial fácil con LED IR y fotodiodo
- Rastreador Solar V2.0 – Sistema Avanzado DIY de Seguimiento Solar
- Seguidor Solar IoT: Gestión Inteligente de Energía con Arduino
- Construye un Cubo LED 4x4x4 con Arduino Uno y 1Sheeld – Proyecto LED Interactivo
- Tacómetro Arduino de Alta Velocidad – Algoritmo "Single-Shot" para RPM Preciso
- Proyecto de electroplacado de cobre: Construye un sistema inteligente con Arduino UNO
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
- Kit Placa Lógica Digital: Componentes y Guía de Montaje
- Plataforma Seguidora Solar de Precisión con Servos para Captura Óptima de Energía
- Calidad de paneles solares: puntos de control esenciales para rendimiento óptimo