Seguidor Solar
1
Seguidor solar Instrumentación Profesor: Ing. Ricardo Yáñez Brambila Angel Moisés Hernández Ponce Instituto Tecnológico de Colima, Departamento de Ingeniería Mecatrónica, Avenida Tecnológico No. 1 C.P. 28976. Villa de Álvarez, Col. Tel/Fax (01 312) 3129920 www.itcolima.edu.mx
Resumen: En el siguiente reporte se muestra
Material: Tarjeta Arduino Mega 2560,
los pasos para la construcción de un seguidor
Protoboard, Resistencias, LED’s, Cable,
de luz solar mediante la tarjeta Arduino Mega
Fotorresistencia, Linterna, Servomotor.
2560.
Marco Teórico: Para que el panel solar fuera
Objetivo: Fabricación de un prototipo de
capaz de realizar su función principal
seguidor solar de panel dinámico,
(seguimiento de luz) fue necesario
autoorientado utilizando Arduino como sistema
implementar un servomotor para que generara
de control.
una trayectoria de 180º. El servo funciona
Introducción: Un panel solar es un dispositivo
como eje de desplazamiento para la celda, con
que es capaz de aprovechar la energía de la
la diferencia de que este eje estará controlado
radiación solar. Para este caso se uso un panel
por la luminosidad que reciban las
de engría fotovoltaica, estos paneles o celdas
fotorresistencias.
transforman la luz en electricidad a base del
"
efecto fotovoltaico por el cual la energía
Un servomotor es un motor eléctrico que
lumínica produce cargas positivas y negativas
consta con la capacidad de ser controlado tanto
en dos semiconductores próximos de diferente
en velocidad así como en precisión. Por lo
tipo, produciendo así un campo eléctrico capaz
general tienen integrada un detector que
de generar corriente. Suelen ser de silicio
permite conocer su posición y velocidad
cristalino o de arsenuiro de galio.
comúnmente llamados encoders. Existen dos tipos de servos: analógicos y digitales, para esta practica se uso un servomotor del tipo analógico.
" Los servos analógico se componen de un motor DC, un reductor de velocidad y un potenciómetro ubicado sobre el eje de salida
Seguidor Solar
2
del mismo y por ultimo, la placa con el circuito
(milisegundos) que se repite a una frecuencia
de control. En la siguiente imagen se muestra
de 10 a 22 ms. Mientras se mantenga este
la estructura interna de un servomotor.
ancho, el servo estará en un posición neutral (0º), si el ancho disminuye se moverá hacia un lado, depende del servo, y si el ancho aumenta tendrá un dirección contraria a la anterior. Usualmente los servos que existen en el mercado manejan rangos de 0º a 180º.
Este tipo de servos funcionan mediante el envío de pulsos de señal, tienen tres cables de salida: cable de alimentación, cable de señal y cable de tierra física, por lo general se usan los colores rojo,naranja y negra respectivamente. El voltaje demandado es alrededor de 4.8 a 6 V por lo cual es ideal para trabajar con circuitos electrónicos.
Para la parte encargada del seguimiento de la luz se usaron fotorresistencias que es un componente electrónico cuya resistencia disminuye cuando aumenta la intensidad de luz incidente, está formado por una celda y dos patilla. Su funcionamiento está basado en el efecto fotoeléctrico, si la luz incidente es de alta frecuencia, los fotones son absorbidos por las elasticidad del semiconductor dando a los electrones la suficiente energía para saltar la banda de conducción; a pesar de que pudiera parecer sensible a la luz, este sensor tiene cierto retraso de aproximadamente una décima Como se dijo anteriormente, un servo funciona a base de señales cuadradas de 1.5 ms
de segundo, se compone de un semiconductor
Seguidor Solar
3
de alta resistencia que puede ser de sulfuro de
"
cadmio.
Desarrollo: Para ensamblar el circuito se tomo como bosquejo el siguiente diagrama.
Para la parte de control se optó por usar la
• Se conectaron 4 LED’s a tierra (protoboard)
tarjeta Arduino Mega 2560. El Arduino Mega
en serie a una resistencia de 220Ω y de
es una placa microcontrolador basada
izquierda a derecha se conectan a la entrada
ATmeg1280. Tiene 54 entradas/salidas
13,12,11 y 10 del puerto PWM.
digitales (de las cuales 14 proporcionan salida
• Se colocan 4 fotorresistencias(una pata a
PWM), 16 entradas digitales, 4 UARTS
tierra) y en seria a un resistencia de 220Ω;
(puertos serie por hardware), un cristal
dejar un espacio libre para el siguiente paso.
oscilador de 16MHz, conexión USB, entrada
• Del espacio libre sacar 4 cables que irán
de corriente, conector ICSP y botón de reset.
conectados al puerto A0,A1,A2 y A3 de la
Contiene todo lo necesario para hacer
sección Analog In.
funcionar el microcontrolador.
" " " " " " " "
• Conectar el cable central del servo al puerto positivo (protoboard), el cable negativo a tierra (protoboard) y por ultimo, el cable que falta conectarlo a la entrada 5 del puerto PWM. • Por ultimo, se realiza una conexión para que exista un tierra común entre los componentes.
Seguidor Solar
4
Se puede apreciar que dicho esquema esta
recibiendo el máximo voltaje que pueda
configurado de tal modo que halla dos servos
recibir; para el segundo caso el movimiento
funcionando de modo que se tendría un
es mas notable que en el anterior puesto que
seguidor solar completo (dos ejes) que
la luz se concentra en un solo punto por lo
emularía el movimiento de un girasol. Para esta
que se ejecuta más rápido el programa, la
practica solo interesa que el seguidor se mueva
desventaja en este caso es que el panel
de mana horizontal, por lo que se conecta solo
llegará a su máximo nivel de voltaje.
un servo.
• Realizar un buen cableado ayudará a tener
Si la conexión se realizó con éxito, cuando se
una mejor estabilidad en el sistema.
alimente el circuito con +5V, que pueden ser
• Asegurarse de que las resistencias no reciban
tomados de la misma placa o de una fuente
interferencia de alguna otra fuente de luz
externa, el servo regresará a su posición inicial
externa ya que esto ocasiona que el servo
(si se presta el caso), es decir 0º, si se le acerca
gire solo en un sentido o que no se desplace
una fuente de luz (linterna) a cualquier
de su posición inicial, para comprobar un
fotorresistencia comenzará a moverse hacia el
funcionamiento optimo de las
lado en el que esté orientada la fotorresistencia
fotorresistencia se recomienda probar el
y a su vez se encenderá un LED que indica que
circuito con muy poca luminosidad y si no
se está realizando un movimiento; lo mismo
funciona de esta manera se recomienda
pasará para la fotorresistencia opuesta.
revisar que en efecto estén conectadas las
Conclusión: Para esta practica se obtuvieron
fotorresistencias y los cables que van a ella.
las siguientes conclusiones: • Un servo es un motor útil para la realización de trabajos que requieren mucho torque y poca velocidad, además de que es excelente para este caso en particular donde se requiere tener una buena precisión en cada movimiento. • Existe una gran diferencia en el comportamiento del seguidor si expone a luz natural o a luz artificial, para el primer caso no se notará tanto el movimiento pues las fotorresistencias siempre estarán recibiendo luz por lo que el panel solar siempre estará
"
Seguidor Solar
5
Anexos Código #include
Servo servo_Vertical;
// create servo object to control a servo (Vertical)
Servo servo_Horizonal; // create servo object to control a servo (Horizontal) int val_Vertical=90;
// variable to read the value from the analog pin
int val_Horizonal=90;
// variable to read the value from the analog pin
" /
/
======================================================================= ======== const int referenceVolts = 5; const float R1 = 51000.0; //Resistor #1 (51K) const float R2 = 100000.0; //Resistor #2 (100K) const float Ratio = (R1/R2); const float resistorFactor = ((referenceVolts/Ratio)/1023.0); // eq 0.014471088
" const int TolarencePin = A4; // Use Potentiometer for Tolarence Settings const int solarPin = A5;
// +V from Solar Panel connected to analog pin
float v = 0; // const int LDR_1_Left = A0; const int LDR_2_Right = A1; const int LDR_3_Down = A2; const int LDR_4_Up = A3; // int LDR_1_Left_val = 0; int LDR_2_Right_val = 0; int LDR_4_Up_val = 0; int LDR_3_Down_val = 0; //
// LDR connected to Analog Pin 0 Left // LDR connected to Analog Pin 1 Right // LDR connected to Analog Pin 2 Down // LDR connected to Analog Pin 3 Up
Seguidor Solar
6
//LEDs 10=UP; 11=Right; 12=Left; 13=Down int ledPins[] = {10,11,12,13}; // int dtime = 25; int Tolarence = 0;
" void setup() { servo_Vertical.attach(5); // attaches the servo on pin 5 (Elevation) to the servo object servo_Horizonal.attach(6); // attaches the servo on pin 6 (Horizontal) to the servo object
//Setup LED Pins as OUTPUT for (int x = 0; x < 4; x++){ pinMode(ledPins[x], OUTPUT); } Serial.begin(9600); }
void loop() { reset_leds(); read_potentiometer(); read_voltage(); read_LDRs(); adjust_Servos();
display_status(); delay(dtime);
// waits for the servo to move
}
" /
/
======================================================================= ==
Seguidor Solar
"
7
// Subs....
" " /
/
======================================================================= == void reset_leds(){ for (int x = 0; x < 4; x++){ digitalWrite(ledPins[x], LOW); } } /
/
======================================================================= == void read_potentiometer(){ // Use Potentiometer for Tolarence Settings Tolarence = analogRead(TolarencePin)/4; }
" /
/
======================================================================= == void read_voltage(){ v = analogRead(solarPin); v *= resistorFactor; } // end read_voltage
" /
/
======================================================================= == void read_LDRs(){ // Set the LDRs in an x config and label the LDRs from 1-4
Seguidor Solar
8
// \ 4 / // 1 X 2 // / 3 \ ///arduino LDR Pins 10=UP; 11=Right; 12=Left; 13=Down LDR_1_Left_val = analogRead(LDR_1_Left); LDR_2_Right_val = analogRead(LDR_2_Right); LDR_3_Down_val = analogRead(LDR_3_Down); LDR_4_Up_val = analogRead(LDR_4_Up); } //end read_LDRs
" /
/
======================================================================= == void adjust_Servos(){
int avg_Left_Top =
(LDR_1_Left_val + LDR_4_Up_val) / 2;
int avg_Left_Botton =
(LDR_1_Left_val +
// average value Left_Top
LDR_3_Down_val) / 2;
// average value
Left_Botton int avg_Right_Top =
(LDR_2_Right_val + LDR_4_Up_val) / 2;
// average value Right_Top
int avg_Right_Botton = (LDR_2_Right_val + LDR_3_Down_val) / 2;
// average value
Right_Botton
" int dvert = (avg_Left_Top + avg_Right_Top) - (avg_Left_Botton + avg_Right_Botton); // check the diffirence of up and down int dhoriz = (avg_Left_Top + avg_Left_Botton) - (avg_Right_Top + avg_Right_Botton);// check the diffirence og left and rigt
" // Using the tolarence value stop servo seeking // Check Vertical if (-1*Tolarence > dvert || dvert > Tolarence){ // check if the diffirence is in the tolerance else change vertical angle if ((avg_Left_Top + avg_Right_Top) > (avg_Left_Botton + avg_Right_Botton)){ //adjust Vertical Servo Down
Seguidor Solar
9
digitalWrite(ledPins[3], HIGH); //Blink the Bottom LED val_Vertical = ++val_Vertical; if (val_Vertical > 179){ val_Vertical = 179; } } else if ((avg_Left_Top + avg_Right_Top) < (avg_Left_Botton + avg_Right_Botton)){ //adjust Vertical Servo Up val_Vertical= --val_Vertical; digitalWrite(ledPins[0], HIGH); //Blink the Top LED if (val_Vertical < 1){ val_Vertical = 1; } } servo_Vertical.write(val_Vertical); } //Check Horizonal if (-1*Tolarence > dhoriz || dhoriz > Tolarence){ // check if the diffirence is in the tolerance else change horizontal angle if ((avg_Left_Top + avg_Left_Botton) > (avg_Right_Top + avg_Right_Botton)){ //adjust Horizonal Servo Left val_Horizonal = --val_Horizonal; digitalWrite(ledPins[1], HIGH); //Blink the Left LED if (val_Horizonal < 1){ val_Horizonal = 1; } } else if ((avg_Left_Top + avg_Left_Botton) < (avg_Right_Top + avg_Right_Botton)){ //adjust Horizonal Servo Right val_Horizonal = ++val_Horizonal; digitalWrite(ledPins[2], HIGH); //Blink the Right LED if (val_Horizonal > 179){ val_Horizonal = 179;
Seguidor Solar
10
} } else if ((avg_Left_Top + avg_Left_Botton) == (avg_Right_Top + avg_Right_Botton)){ // nothing } servo_Horizonal.write(val_Horizonal); } } // end adjust servos
/
/
======================================================================= = void display_status(){ Serial.print("Solar Panel Volts: "); Serial.print(v);
Serial.print(" Servo Horizontal: "); Serial.print(val_Horizonal); Serial.print(" Servo Vertical: "); Serial.print(val_Vertical);
Serial.print(" LDR_1_L: "); Serial.print(LDR_1_Left_val); Serial.print(" LDR_2_R: "); Serial.print(LDR_2_Right_val); Serial.print(" LDR_3_D: "); Serial.print(LDR_3_Down_val); Serial.print(" LDR_4_U: "); Serial.print(LDR_4_Up_val);
Serial.print(" Tolarence: "); Serial.println(Tolarence); } //end display status
Seguidor Solar Fotografias
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
11
Seguidor Solar
12
Seguidor Solar
"
13
Seguidor Solar
Esquema
"
14