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

в 7:19, , рубрики: 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. Использование сервоприводов с металлическими шестернями (надёжность и более уверенные повороты не помешают, особенно если таки добавить к конструкции солнечную панель и использовать её по назначению).

Автор: lexa62

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js