Солнечный трекер на Arduino

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

Схема солнечного трекера

Принципиальная схема солнечного трекера

Схема состоит из одного сервопривода и 2-х фоторезисторов. Фоторезисторы меняют свое сопротивление в зависимости от падающего света, далее происходит сравнение этих двух величин. И в зависимости от того где полученное цифровое значение больше туда и происходит поворот сервопривода.

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

Полученные значения сохраняются в переменные val1 и val2, далее происходит их сравнение. Если они равны то солнечный трекер находиться в покое, а если их разница больше или меньше нуля, то сервопривод начинает работать.

Фоторезисторы подключены по схеме делителя напряжения, через дополнительное сопротивление в 10 кОм подключенные к земле. При изменении сопротивления фоторезисторов, меняеться напряжение на вывода A0 и A1 платы Arduino.

Код программы

#include  Servo myservo; 
int pos = 90; // initial position int sens1 = A0; // LRD 1 pin int sens2 = A1; //LDR 2 pin int tolerance = 2; void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object pinMode(sens1, INPUT); pinMode(sens2, INPUT); myservo.write(pos); delay(2000); // a 2 seconds delay while we position the solar panel } void loop() { int val1 = analogRead(sens1); // read the value of sensor 1 int val2 = analogRead(sens2); // read the value of sensor 2 if((abs(val1 - val2) <= tolerance) || (abs(val2 - val1) <= tolerance)) { //do nothing if the difference between values is within the tolerance limit } else { if(val1 > val2) { pos = --pos; } if(val1 < val2) { pos = ++pos; } } if(pos > 180) { pos = 180; } // reset to 180 if it goes higher if(pos < 0) { pos = 0; } // reset to 0 if it goes lower myservo.write(pos); // write the position to servo delay(50); }

Комментарии  

 
#1 Денис 07.11.2015 00:34
Мне кажется как-то неразумно. На фоторезистрах постоянно будет скакать показания в небольших пределах, сервоприводу покоя не будет. Надо бы хоть дать небольшую зону погрешности после очередного поворота сервоприводу.
Цитировать
 

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


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа