| ||||
Солнечный трекер
| ||||
|
Солнечный трекер - система, предназначенная для слежения за перемещением солнца, чтобы получить максимальный КПД от солнечных батарей. В проекте используется два датчика-фоторезистора, которые направлены в разные стороны от плоской поверхности на 45°, т.е. относительно друг-друга фоторезисторы сориентированы на 90°. На сами датчики надеты колпачки, чтобы поток света, падающий на них был узконаправленным.
Для предотвращения чрезмерного поворота платформы присутствуют программные лимиты поворота, которые в случае необходимости можно отключить. Также, в коде программы предусмотрена константа deadband, при разности с датчиков меньше значения этой константы, контроллер не будет давать команду на поворот серводвигателя. Т.о. предотвращается дергание платформы (джиттер). Скетчи для ArduinoВ начальной секции программы описываются подключаемые библиотеки (в нашем случае servo.h), определяются пины и константы #include В следующей части кода описывается функция Setup(). Данная функция выполняется только один раз при запуске программы или после сброса контроллера. Здесь вы можете вывести в Serial Monitor какие либо данные для отладки, или как в приведенном ниже примере сделать "прогон" серводвигателя по всей траектории до лимитов. 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(). Здесь считываются значения с датчиков, производятся все расчеты и выдаются команды на серводвигатель. void loop() { //Чтение значений с фоторезисторов 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(); //Расчет error = leftValue - rightValue; errorAVG = (errorAVG + error) / 2; float newOutput = output + getTravel(); if (newOutput > maxPos) { Serial.println("At Upper Limit"); newOutput = maxPos; } else { if (newOutput < minPos) { Serial.println("At Lower Limit"); newOutput = minPos; } } Serial.println("Writing output"); //Вывод команды управления серво hServo.write(newOutput); output = newOutput; } } Также, в программе используется вспомогательная функция getTravel(), которая используется для вычисления, куда поворачивать серво - влево, вправо или вообще ничего не делать. Функция просто возвращает значение: 0 - ничего не происходит, -1 поворот влево, +1 поворот право. int getTravel() { // -1 = Влево; +1 = Вправо if (errorAVG < (deadband * -1)) { return 1; } else { if (errorAVG > deadband) { return -1; } else { //Ничего не делаем return 0; } } } Видео работы трекера: Конечно, это простой солнечный трекер и может служить основой для более сложных устройств. К примеру можно сделать более лучшую фильтрацию входных переменных, добавить ПИД-регулирование, в схему добавить второй сервопривод для перемещения солнечной панели по вертикали и получения максимального КПД. Оригинал статьи на английском языке (перевод Колтыков А.В.)
Добавил: Павел (Admin) Автор: Неизвестно Вас может заинтересовать:
|
|||
| ||||
|