Двухосевой солнечный трекер на Arduino

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

В данном случае прототип солнечного трекера собирался на базе 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. Для удобства и эстетики ноги фоторезисторов припаяны к контактам двух трёхжильных изолированных проводов (один контакт остался неиспользуемым и спрятан). Все схемотехнические детали можно рассмотреть на схеме ниже.

image

image

Фигура третья: паяльная


Что-либо подробно описывать тут не несёт особого смысла, поэтому просто прилагаю фото используемых материалов и полученную в результате макетную плату.

image

image

image

Фигура четвёртая: с новым кодом!


Общий алгоритм работы заключается в обработке данных с фоторезисторов при помощи АЦП. Имеем 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);   
}

Результат работы


image



Заключение – что бы я сейчас изменил в проекте


  1. Усовершенствование алгоритма работы: зависимость градуса поворота от разницы значений, получаемых с фоторезисторов, то есть поворот сразу на несколько градусов.
  2. Идеально перпендикулярное крепление фоторезисторов к платформе.
  3. Bluetooth для отсутствия проводов – конечно, идея неплоха, но потребует значительной доработки конструкции и приобретения второй ардуины.
  4. Использование сервоприводов с металлическими шестернями (надёжность и более уверенные повороты не помешают, особенно если таки добавить к конструкции солнечную панель и использовать её по назначению).
Поделиться публикацией

Похожие публикации

Комментарии 15
    +1
    Отличная штука для владельцев солнечных панелей. Потом надо разработать крепкую раму и рычаги управления — там ветровая нагрузка мощная. Несколько панелей будут, как парус.
    Должен получится подобный гелиотрекер
    image
      0
      Еще один железный проект из песочницы с тегом «БГУИР». Студенты свои курсовые выкладывают?
        0
        Да, эхо прошедшего семестра…
        +6
        Раз уж я потратил время на то что бы зайти и прочитать «это», поведясь на заголовок, то потрачу время на критику.

        Ну даже если учесть, что выкладывание такого примитива — это на уровне «мама, смотри какую я картинку накалякал», то это:
        1. Работа не имеющая НИКАКОГО практического смысла (см. далее почему).
        2. Разработка уровня школьников средних и старших классов. Слово «курсовая» оочень удивляет.

        Сервопривод, в том виде в котором он упомянут совершенно не годится для данной практической реализации:
        — Даже в такой игрушечной конструкции серва скорее всего будет потреблять на удержание больше, чем получать от панели, с которой может справится. Легко проверить привесив панель хотя бы 100x100 мм и замерив ток удержания при ее наклонном положении.
        — Сервоприводы такого типа большими не бывают (максиму 10кг/см на оси. Если больше — то цена просто зашкаливает). И они не для таких целей предназначены.

        Вот если была бы сделана конструкция на основе скажем стеклоподъемников (дешево и червяный привод, не требующий удержания двигателем) + самодельный или дешевый энкодер (или датчик положения, да хоть на том же переменном резисторе) и написана программа управления всем этим, то это было бы ближе к понятию «курсовая».

        А так, за такой примитив с принципиальными ошибками в постановке задачи, я бы больше 2 не поставил бы.
          +2
          Можно сказать больше: применение микроконтроллера тут вообще излишне…
            0
            Как же тогда управлять поворотами панели?
              +2
              Что ж вы, ведь для следящей системы ТАУ изучать нужно, ПИДы какие-то ставить, ведь можно и микроконтроллер поставить.

              А если серьезно — следящие системы — достаточно старая тема, они были еще тогда, когда калькулятор размером с комнату был, и ничего — справлялись.
                0
                Фоторезисторы напрямую управляют транзисторами в сервах.
                  0
                  Внеклассное чтение — Проект «Голубь» http://www.yugzone.ru/articles/project-pigeon.htm
                    0
                    Одно слов — ОФИГЕТЬ! Голуби управляют ракетами о_О
              +2
              Господа, не колите автора в сердце сразу! Для песочницы это вполне и не плохо. Я уверен, парень порадует сообщество интересными статьями. Дайте время!
                0
                Пищалка на схеме подключена неправильно. Она просто висит на питании и ничем не управляется.
                И да, фоторезисторы должны перекрывать углы обзора друг друга, просто смотреть в разные стороны! перегородка там лишняя…
                  +1
                  Запитывать сервоприводы от Arduino — не очень хорошая идея. По крайней мере, на UNO видна «просадка» напряжения. Лучше использовать автономный источник питания. Только «землю» платы и приводов соединить вместе.
                    +3
                    Ну видосик с слежением за фонариком смотрится весьма интересно. Прям как живое :)
                    Задача слежения за фонариком — решена. А вот для отслеживания солнца такой подход мне кажется не самым лучшим. На видео этого не видно, но думаю что если фонарик зафиксировать, то сервоприводы все равно будут пытаться найти оптимум, хотя уже в него попали. Для задачи слежения за солнцем это излишне.

                    > Усовершенствование алгоритма работы: зависимость градуса поворота от разницы значений, получаемых с фоторезисторов, то есть поворот сразу на несколько градусов.

                    Для слежения за солнцем? Для слежения за источником света — это да. Тут уж лучше сразу реализовывать PID алгоритм. Но возникнет вопрос подбора оптимальных параметров.

                    Для решения реальной задачи сопровождения солнца я бы предпочел использовать не «умное» решение, которое «ищет» максимум, а расчет требуемых углов исходя из текущих координат и точного времени. А подстроечные параметры — это ориентация вашей «платформы» относительно горизонта и южного азимута. Ну во всяком случае это мне так видится.
                    Учитывая стоимость реальных панелей, их вес и реальных сервоприводов, то очень даже может получиться что проще ставить больше панелей, чем дорогих следящих систем. Увы.
                      0
                      Отличная реализация, есть много нюансов которые нужно учитывать, погода, сила ветра, птицы итд… Но мне нравится.

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

                      Самое читаемое