В данном случае прототип солнечного трекера собирался на базе Arduino. Для вращения платформы в горизонтальной и вертикальной оси используются сервоприводы, угол поворота которых зависит от мощности падающего на фоторезисторы света. В качестве корпуса используется всеми любимый советский металлический конструктор.
Нелишним будет упомянуть, что всё это делалось как курсовой проект, поэтому я не стал заниматься приобретением и креплением собственно, самой солнечной панели и аккумулятора, так как их наличие не имеет отношения к работе трекера. В оправдание могу сказать, что возможности советского металлического конструктора необъятны, так что прикрутить к нему небольшую солнечную панель для зарядки телефона не составит особенного труда, если возникнет такое желание.
Итак, что использовалось при сборке:
- Arduino MEGA 2560 R3
- Сервопривод Tower SG90 — 2x
- Фоторезистор MLG4416 (90mW; 5-10kOhm/1.0MOhm) — 4x
- Звонок пьезоэлектрический KPR-G1750
- Металлический конструктор
- Резистор выводной 10 kOhm; 0,25W; 5% — 4x
- Печатная макетная плата, корпус, шнуры для соединения
Mega использовалась исключительно по причине её наличия в шкафу на момент утверждения темы проекта, если учитывать покупку всех элементов с нуля, то в данном случае вполне себе хватит и Uno, но выйдет, конечно, дешевле.
Внезапно оказавшийся в списке спикер потребовался для пущего эффекта высокотехнологичности. Дело в том, что сервоприводы могут поворачиваться только на 180 градусов, да большего нам и не требуется, при учёте того, что следим мы за солнцем. Но при тестировании работы проекта, когда за солнцем в две минуты демонстрации особо не последишь, оказалось, что неплохо было бы сигнализировать, в какой момент стоит перестать размахивать фонариком, потому что сервопривод достиг мёртвой зоны. Для этого и был добавлен вышеупомянутый звонок.
Итак, начнём собирать трекер. Для начала разделим предстоящий фронт работ на условные четыре этапа: сборка подставки для солнечных панелей и крепление сервоприводов, крепление к собранной конструкции светочувствительных элементов, пайка и написание кода для Arduino.
Фигура первая: конструкторская
Путём интенсивного поиска была найдена парочка примеров конструкции подобных устройств. Наибольшего внимания удостоились два:
- www.youtube.com/watch?v=SvKp3V9NHZY – победитель в номинации «Подача материала» проиграл в надёжности и практичности устройства: конструкция представляет собой соединение двух сервоприводов напрямую.
- www.instructables.com/id/Simple-Dual-Axis-Solar-Tracker — собственно, отсюда и была взята основная идея моей конструкции, за исключением материала и общего внешнего вида поворотного корпуса.
Сборка из металлического конструктора была сопряжена с определёнными трудностями: пришлось подогнать дрелью отверстия для подключения сервоприводов, а также надёжно приклеить их к платформам в двух плоскостях. То, что получилось, показано на видео ниже.
Фигура вторая: схемотехническая
Главной задачей крепления фоторезисторов было даже не их подключение, а обеспечение разделения света для каждого из четырёх элементов. Понятно, что оставить их без каких-нибудь перегородок было нельзя, так как тогда значения, получаемые с фоторезисторов, были бы примерно одинаковы и поворота бы не получилось. Тут, к сожалению, возможности металлического конструктора подвели, главным образом из-за наличия во всех деталях отверстий. Найти подходящей металлической детали не получилось, поэтому мой солнечный трекер обзавёлся инновационной перегородкой из картона. Несмотря на достаточно убогонький вид, своё предназначение она выполняет отлично.
Фоторезисторы к корпусу прикреплены вполне надёжно, единственное, с чем стоило бы поработать – это с аккуратностью их расположения на платформе: сейчас они смотрят вверх недостаточно перпендикулярно, что может расстраивать перфекционистов и слегка портить точность поворота.
Немного схемотехники: подключение светочувствительных элементов осуществляется по схеме делителя напряжения, для чего потребовались указанные в списке элементов выводные резисторы. Все фоторезисторы припаяны к общему контакту, подключенному к пятивольтному выходу питания Arduino. Для удобства и эстетики ноги фоторезисторов припаяны к контактам двух трёхжильных изолированных проводов (один контакт остался неиспользуемым и спрятан). Все схемотехнические детали можно рассмотреть на схеме ниже.
Фигура третья: паяльная
Что-либо подробно описывать тут не несёт особого смысла, поэтому просто прилагаю фото используемых материалов и полученную в результате макетную плату.
Фигура четвёртая: с новым кодом!
Общий алгоритм работы заключается в обработке данных с фоторезисторов при помощи АЦП. Имеем 4 элемента, то есть 4 показания, находим среднее показание по левой стороне ((верхний левый + нижний левый) / 2), аналогично по правой, верхней и нижней сторонам. Если разница по модулю между левой и правой стороной больше порога, то осуществляем поворот в сторону с большим средним значением. Аналогично для верха и низа. Особые плюшки в коде: можно задавать вручную чувствительность срабатывания и максимальный и минимальный угол в двух плоскостях. Листинг рабочего кода приведён ниже.
#include <Servo.h>
Servo horizontal;
int servoh = 90;
int servohLimitHigh = 180;
int servohLimitLow = 0;
Servo vertical;
int servov = 45;
int servovLimitHigh = 180;
int servovLimitLow = 0;
int ldrlt = A2; //LDR top left - BOTTOM LEFT
int ldrrt = A3; //LDR top rigt - BOTTOM RIGHT
int ldrld = A1; //LDR down left - TOP LEFT
int ldrrd = A0; //ldr down rigt - TOP RIGHT
int buzz_pin = 10;
int buzz_tone = 20;
int tol = 50;
void setup()
{
Serial.begin(9600);
pinMode(buzz_pin, OUTPUT);
horizontal.attach(31);
vertical.attach(30);
horizontal.write(servoh);
vertical.write(servov);
}
void loop()
{
int lt = analogRead(ldrlt); // top left
int rt = analogRead(ldrrt); // top right
int ld = analogRead(ldrld); // down left
int rd = analogRead(ldrrd); // down rigt
int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right
int dvert = abs(avt - avd); // check the diffirence of up and down
int dhoriz = abs(avl - avr);// check the diffirence of left and right
Serial.print("avt: ");
Serial.print(avt);
Serial.print(" ");
Serial.print("avd: ");
Serial.print(avd);
Serial.print(" ");
Serial.print("avl: ");
Serial.print(avl);
Serial.print(" ");
Serial.print("avr: ");
Serial.println(avr);
Serial.print("h: ");
Serial.print(servoh);
Serial.print(" ");
Serial.print("v: ");
Serial.print(servov);
Serial.print(" ");
if (dhoriz > tol)
{
if (avl > avr)
{
if (servoh - 1 >= servohLimitLow) servoh--;
else beep(150);
}
else if (avl < avr)
{
if (servoh + 1 <= servohLimitHigh) servoh++;
else beep(150);
}
horizontal.write(servoh);
}
if (dvert > tol)
{
if (avt > avd)
{
if (servov + 1 <= servovLimitHigh) servov++;
else beep(100);
}
else if (avt < avd)
{
if (servov - 1 >= servovLimitLow) servov--;
else beep(100);
}
vertical.write(servov);
}
}
void beep(unsigned char delayms){
analogWrite(buzz_pin, buzz_tone);
delay(delayms);
analogWrite(buzz_pin, 0);
delay(delayms);
}
Результат работы
Заключение – что бы я сейчас изменил в проекте
- Усовершенствование алгоритма работы: зависимость градуса поворота от разницы значений, получаемых с фоторезисторов, то есть поворот сразу на несколько градусов.
- Идеально перпендикулярное крепление фоторезисторов к платформе.
- Bluetooth для отсутствия проводов – конечно, идея неплоха, но потребует значительной доработки конструкции и приобретения второй ардуины.
- Использование сервоприводов с металлическими шестернями (надёжность и более уверенные повороты не помешают, особенно если таки добавить к конструкции солнечную панель и использовать её по назначению).
Комментарии (15)
mmMike
25.01.2016 11:27+6Раз уж я потратил время на то что бы зайти и прочитать «это», поведясь на заголовок, то потрачу время на критику.
Ну даже если учесть, что выкладывание такого примитива — это на уровне «мама, смотри какую я картинку накалякал», то это:
1. Работа не имеющая НИКАКОГО практического смысла (см. далее почему).
2. Разработка уровня школьников средних и старших классов. Слово «курсовая» оочень удивляет.
Сервопривод, в том виде в котором он упомянут совершенно не годится для данной практической реализации:
— Даже в такой игрушечной конструкции серва скорее всего будет потреблять на удержание больше, чем получать от панели, с которой может справится. Легко проверить привесив панель хотя бы 100x100 мм и замерив ток удержания при ее наклонном положении.
— Сервоприводы такого типа большими не бывают (максиму 10кг/см на оси. Если больше — то цена просто зашкаливает). И они не для таких целей предназначены.
Вот если была бы сделана конструкция на основе скажем стеклоподъемников (дешево и червяный привод, не требующий удержания двигателем) + самодельный или дешевый энкодер (или датчик положения, да хоть на том же переменном резисторе) и написана программа управления всем этим, то это было бы ближе к понятию «курсовая».
А так, за такой примитив с принципиальными ошибками в постановке задачи, я бы больше 2 не поставил бы.alexcom
25.01.2016 11:33+2Можно сказать больше: применение микроконтроллера тут вообще излишне…
Seredin
25.01.2016 14:01Как же тогда управлять поворотами панели?
kahi4
25.01.2016 14:24+2Что ж вы, ведь для следящей системы ТАУ изучать нужно, ПИДы какие-то ставить, ведь можно и микроконтроллер поставить.
А если серьезно — следящие системы — достаточно старая тема, они были еще тогда, когда калькулятор размером с комнату был, и ничего — справлялись.
Uris
25.01.2016 14:07+2Господа, не колите автора в сердце сразу! Для песочницы это вполне и не плохо. Я уверен, парень порадует сообщество интересными статьями. Дайте время!
Alexeyslav
25.01.2016 17:37Пищалка на схеме подключена неправильно. Она просто висит на питании и ничем не управляется.
И да, фоторезисторы должны перекрывать углы обзора друг друга, просто смотреть в разные стороны! перегородка там лишняя…
qwertyhp
25.01.2016 18:05+1Запитывать сервоприводы от Arduino — не очень хорошая идея. По крайней мере, на UNO видна «просадка» напряжения. Лучше использовать автономный источник питания. Только «землю» платы и приводов соединить вместе.
uazure
25.01.2016 18:07+3Ну видосик с слежением за фонариком смотрится весьма интересно. Прям как живое :)
Задача слежения за фонариком — решена. А вот для отслеживания солнца такой подход мне кажется не самым лучшим. На видео этого не видно, но думаю что если фонарик зафиксировать, то сервоприводы все равно будут пытаться найти оптимум, хотя уже в него попали. Для задачи слежения за солнцем это излишне.
> Усовершенствование алгоритма работы: зависимость градуса поворота от разницы значений, получаемых с фоторезисторов, то есть поворот сразу на несколько градусов.
Для слежения за солнцем? Для слежения за источником света — это да. Тут уж лучше сразу реализовывать PID алгоритм. Но возникнет вопрос подбора оптимальных параметров.
Для решения реальной задачи сопровождения солнца я бы предпочел использовать не «умное» решение, которое «ищет» максимум, а расчет требуемых углов исходя из текущих координат и точного времени. А подстроечные параметры — это ориентация вашей «платформы» относительно горизонта и южного азимута. Ну во всяком случае это мне так видится.
Учитывая стоимость реальных панелей, их вес и реальных сервоприводов, то очень даже может получиться что проще ставить больше панелей, чем дорогих следящих систем. Увы.
YakovOnline
28.01.2016 11:59Отличная реализация, есть много нюансов которые нужно учитывать, погода, сила ветра, птицы итд… Но мне нравится.
shuvaevgl
Отличная штука для владельцев солнечных панелей. Потом надо разработать крепкую раму и рычаги управления — там ветровая нагрузка мощная. Несколько панелей будут, как парус.
Должен получится подобный гелиотрекер