Самодельный трекер для солнечных батарей на Arduino

Чтобы получить максимальную пользу от использования солнечных батарей применяют трекер. Его задача состоит в том, чтобы следить за нахождением солнца. Эту функцию выполняет серводвигатель, который выполняет свои вращательные движения благодаря двум датчикам. За счет своей простоты достигается высокий коэффициент полезности.

Данный вид прибора оснащен двумя датчиками-фоторезисторами, которые расположены в разных сторонах от ровной поверхности под наклоном. Если рассматривать их по отношению к друг другу, то они располагаются под прямым углом. Сверху датчиков прикреплены специальные колпачки, которые делают падающие лучи света узконаправленными.

Самодельный трекер для солнечных батарей на Arduino

Трекер оснащен специальным контроллером фирмы Arduino, который служит для приема показаний с датчиков и их анализ. Эти значения показывают направленность к солнцу. Если они одинаковые, значит платформа правильно повернута на солнечную сторону. Когда они отличаются друг от друга, Arduino воздействует на серводвигатель, заставляя его поворачиваться в нужную светлую сторону. Платформа выполнят вращательные движения до тех пор, пока значения двух датчиков не будут равны между собой.

Самодельный трекер для солнечных батарей на Arduino

Чтобы не происходил чрезмерное вращение платформы, установлены специальные программные требования, которые в случае возникновения такой ситуации произведут ее остановку. В данной программе присутствует постоянная deadband, которая не дает платформе дергаться в разные стороны. Это может произойти из-за разных показателей. Константа позволит контроллеру не давать никаких указаний двигателю.

Также, конструкторами были разработаны две переменные, которые помогаю датчиками давать четкие значения.

 

Скетчи для Arduino

На начальном этапе установленные программы описывают библиотеки и определяют пины и константы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <servo.h>
//IO Pins
int pinL = 5;              //IO Pin левого фоторезистора
int pinR = 4;              //IO Pin правого фоторезистора
int pinServo = 11;         //PWM pin серво
int leftValue = 0;         //Значение левого фоторезистора
int rightValue = 0;        //Значение правого фоторезистора
int error =0;              //Разница между показаниями двух датчиков
int errorAVG = 0;          //Error Average - Rolling 2 Point
int deadband = 10;         //Мертвая зона (защита от джиттера)
//Servo Stuff
Servo hServo;              //servo object
int Position = 45;         //Position to write out
int minPos = 5;            //Min позиция
int maxPos = 150;          //Max позиция
float output = (maxPos - minPos) /2;  //Initial output Position
</servo.h>


Далее будет произведена расшифровка функции Setup. Данный вид работы происходит только один раз при включении или выключении контролера. На монитор высвечиваются все данные, которые можно настраивать до получения желаемого результата. К примеру, произведем проверку двигателя по всей траектории.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void setup()
{
Serial.begin(9600);
hServo.attach(pinServo);
//Set Servo to Centre for Alignment Purpose
Serial.println("Перемещение к начальной позиции");
hServo.write(minPos);
delay(5000);
Serial.println("Перемещение к конечной позиции");
hServo.write(maxPos);
delay(5000);
Serial.println("Перемещение к средней точке");
hServo.write(output);
delay(5000);
Serial.println("Going Live................");
}


Настройка заключительной части кода  происходит с помощью функции loop. Благодаря ей показатели с датчиков поступают в контроллер, и только потом после тщательных расчетов выдается команда серводвигателю.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void loop()
{
  <em>//Чтение значений с фоторезисторов</em>
   leftValue = analogRead(pinL);
   rightValue = analogRead(pinR);
 Serial.print("L = "); Serial.print(leftValue); Serial.print(" | ");
 Serial.print("R = "); Serial.print(rightValue); Serial.print(" | ");
 Serial.print("E = "); Serial.print(error); Serial.print(" | ");
 Serial.print("Eavg = "); Serial.print(errorAVG);
 Serial.println();
  <em>//</em><em>Расчет</em>
 error = leftValue - rightValue;
 errorAVG = (errorAVG + error) / 2;
 float newOutput = output + getTravel();
 if (newOutput &gt; maxPos)
 {
   Serial.println("At Upper Limit");
   newOutput = maxPos;
 }
 else
 {
   if (newOutput &lt; minPos)
   {
     Serial.println("At Lower Limit");
     newOutput = minPos;
   }
 }
    Serial.println("Writing output");
    <em>//Вывод команды управления серво</em>
    hServo.write(newOutput);
    output = newOutput;
}
}
<!--/noindex-->

Программа обладает такой функцией как getTravel, которая определяет сторону поворота платформы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int getTravel()
{
<em>// -1 = </em><em>Влево</em><em>; +1 = </em><em>Вправо</em>
 
if (errorAVG &lt; (deadband * -1))
{
return 1;
}
else
{
if (errorAVG &gt; deadband)
{
return -1;
}
else
{
<em>//Ничего не делаем</em>
return 0;
}
}
}


Такой прибор как солнечный трекер может использоваться и в других устройствах. Например, применить его для улучшения показателей фильтрации. Для этого необходимо только добавить соответствующие программы и еще один серводвигатель.

Прикрепленные файлыLighttracker , СКЕТЧ

 

Автор: Симонов Константин. Россия, Москва.


 

Загрузка...

Похожее ...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

6 − 6 =