Digitrode
цифровая электроника вычислительная техника встраиваемые системы
Система слежения за солнцем на Arduino
При проектировании систем преобразователей энергии на основе солнечных панелей следует учитывать расположение этих панелей относительно солнца. Поскольку солнечные лучи могут падать под некоторым углом на фотоприемный элемент, то есть быть не прямыми, то система будет вырабатывать не так много энергии, как хотелось бы, то есть ее КПД может быть не самым высоким. Для того, чтобы панели всегда были направлены в сторону солнца и ловили прямые солнечные лучи, применяют специальные системы слежения за солнцем.
В одной из статей мы рассмотрели простую систему автоматического отслеживания траектории движения солнца. Но такую систему можно сделать программируемой, то есть не на основе аналоговых компонентов, а на базе микроконтроллера. Поможет нам в этом, конечно же, плата Arduino UNO.
Все что нам потребуется кроме платы Arduino: один сервомотор, два светочувствительных резистора и два резистора номиналом 10 КОм.
На изображении ниже представлена схема проекта системы слежения за солнцем на основе платы Arduino.
Стандартные сервопривода имеют желтый провод, который используется для управления вращением. Этот провод должен быть соединен с выводом 9 платы Arduino UNO. Два светочувствительных резистора (LDR), которые подключаются к выводам A0 и A1, должны быть расположены примерно так же, как в статье об аналоговой системе слежения за солнцем. Если ход серводвигателя не очень плавный, то попробуйте добавить конденсатор 470мкФ/10В между линией питания и землей.
Ниже представлен код функционирования системы слежения за солнцем на основе платы Arduino. Этот скетч довольно простой и достаточно комментирован. Для управления серводвигателем в нем используется библиотека Servo.h.
Сначала мы присваиваем переменной pos значение 90, чтобы при запуске устройства установить исходное положение сервомотора в 90 градусов (среднее положение). Переменная tolerance используется для создания небольшого запаса по регулированию, иначе регулирование положения солнечной панели будет безостановочным.
В функции setup() мы устанавливаем контакты, с которыми соединяются светочувствительные резисторы, на вход и положение серводвигателя в 90 градусов. После этого ждем 2 секунды и переходим в основной цикл программы loop(). В нем мы считываем значения, полученные от наших датчиков, и меняем положение солнечной панели в зависимости от этих значений.
Источник
Солнечный трекер
Солнечный трекер — система, предназначенная для слежения за перемещением солнца, чтобы получить максимальный КПД от солнечных батарей.
Концепция трекера предельно проста — по двум датчикам контроллер заставляет серводвигатель поворачивать платформу с солнечной батареей в ту сторону, где больше света.
Домашний прототип рабочего трекера показан на фото ниже:
В проекте используется два датчика-фоторезистора, которые направлены в разные стороны от плоской поверхности на 45°, т.е. относительно друг-друга фоторезисторы сориентированы на 90°. На сами датчики надеты колпачки, чтобы поток света, падающий на них был узконаправленным.
В проекте используется контроллер Arduino. Контроллер периодически считывает значения с двух датчиков и сравнивает их. Если значения с датчиков одинаковы, значит панель наведена на солнце. В случае, если значение одного из датчиков отличается от другого, контроллер дает команду на серводвигатель для поворота платформы. Команда на серво работает до тех пор, пока значения с датчиков не сравняются.
Для предотвращения чрезмерного поворота платформы присутствуют программные лимиты поворота, которые в случае необходимости можно отключить. Также, в коде программы предусмотрена константа deadband, при разности с датчиков меньше значения этой константы, контроллер не будет давать команду на поворот серводвигателя. Т.о. предотвращается дергание платформы (джиттер).
Также, на всякий случай добавлено 2 переменные позволяющие сгладить значения от датчиков. Это помогает отфильтровать «выбросы» и шум.
Скетчи для Arduino
В начальной секции программы описываются подключаемые библиотеки (в нашем случае servo.h), определяются пины и константы
В следующей части кода описывается функция Setup(). Данная функция выполняется только один раз при запуске программы или после сброса контроллера. Здесь вы можете вывести в Serial Monitor какие либо данные для отладки, или как в приведенном ниже примере сделать «прогон» серводвигателя по всей траектории до лимитов.
Финальная часть кода выполняется в циклической функции loop(). Здесь считываются значения с датчиков, производятся все расчеты и выдаются команды на серводвигатель.
Также, в программе используется вспомогательная функция getTravel(), которая используется для вычисления, куда поворачивать серво — влево, вправо или вообще ничего не делать. Функция просто возвращает значение: 0 — ничего не происходит, -1 поворот влево, +1 поворот право.
Конечно, это простой солнечный трекер и может служить основой для более сложных устройств. К примеру можно сделать более лучшую фильтрацию входных переменных, добавить ПИД-регулирование, в схему добавить второй сервопривод для перемещения солнечной панели по вертикали и получения максимального КПД.
Источник
Солнечная панель на Arduino, отслеживающая местоположение Солнца
В этой статье мы рассмотрим проектирование солнечной панели на основе платы Arduino, отслеживающей местоположение Солнца (следующей за Солнцем) с целью максимизации количества энергии, вырабатываемой солнечной панелью (поскольку она всегда будет развернута в сторону света). Схема нашего устройства будет основана на использовании двух фоторезисторов (LDR — Light dependent resistor) для обнаружения света и сервомотора для автоматического поворота солнечной панели в направлении солнечного света.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Сервомотор sg90 (купить на AliExpress).
- Солнечная панель.
- Фоторезистор (2 шт.) (купить на AliExpress).
- Резистор 10 кОм (2 шт.) (купить на AliExpress).
- Батарея (от 6 до 12 В).
Как будет работать проект
В этом проекте фоторезисторы будут работать в качестве детекторов света. Когда на фоторезистор начинает падать свет его сопротивление уменьшается. Поэтому фоторезисторы так часто используются в различных детекторах света или темноты. По этой ссылке вы можете посмотреть все проекты на нашем сайте, использующие фоторезисторы.
В нашем проекте два фоторезистора будут помещены на обоих концах солнечной панели, а сервомотор будет использоваться для поворота солнечной панели. Сервомотор будет поворачивать солнечную панель в направлении того фоторезистора, чье сопротивление будет меньше, что будет означать что на него падает больше солнечного света. Если на оба фоторезистора будет падать одинаковое количество солнечного света, сервомотор не будет поворачивать солнечную панель. То есть сервомотор будет пытаться повернуть солнечную панель в такое положение, чтобы оба фоторезистора имели примерно одинаковое сопротивление, что будет означать что на них падает примерно одинаковое количество солнечного света. Если же сопротивление одного фоторезистора становится меньше чем сопротивление другого, то сервомотор будет поворачивать солнечную панель в направлении этого фоторезистора. Более детально все эти процессы можно посмотреть в видео, приведенном в конце статьи.
Сборка конструкции
Для сборки конструкции нашего проекта необходимо выполнить следующую последовательность шагов.
Шаг 1. Возьмите небольшой кусок картона и сделайте в нем отверстие на одном из его концов. В дальнейшем мы будем вставлять в него шуруп чтобы зафиксировать сервомотор.
Шаг 2. Соедините вместе два небольших куска картона в форме буквы «V» с помощью клея. Прикрепите их к солнечной панели как показано на следующем рисунке.
Шаг 3. Затем прикрепите нижнюю часть этих скрепленных в форме буквы «V» кусков картона к тому куску картона, в котором вы ранее сделали отверстие.
Шаг 4. Затем через сделанное отверстие прикрепите к этому куску картона сервомотор с помощью шурупа (обычно данный шуруп идет в комплекте с сервомотором когда вы покупаете его).
Шаг 5. Теперь поместите сервомотор на другой кусок картона. Размер этого куска картона должен быть больше чем предыдущих использованных кусков картона чтобы на него могли поместиться собранная макетная плата с батареей.
Шаг 6. Прикрепите фоторезисторы по обоим сторонам солнечной панели с помощью клея. Припаяйте соединительные провода к их выводам, в дальнейшем к ним нужно будет подсоединять резисторы.
Шаг 7. Теперь поместите плату Arduino, батарею и макетную плату на лист картона и сделайте соединения, показанные на схеме, приведенной далее в этой статье. Финальный вид нашей конструкции показан на следующем рисунке.
Работа схемы
Схема устройства представлена на следующем рисунке.
В рассматриваемой нами конструкции солнечной панели, следующей за Солнцем, плата Arduino запитывается от батареи 9V, а вся остальная часть схемы запитывается от Arduino. Рекомендованное напряжение для питания платы Arduino составляет от 7 до 12 Вольт (хотя на самом деле можно подавать от 6 до 20 Вольт), поэтому наши 9 Вольт вполне укладываются в этот диапазон. Соедините положительный вывод батареи к контакту Vin платы Arduino, а отрицательный вывод батареи – к земле платы Arduino.
Затем соедините положительный контакт сервомотора с контактом 5V платы Arduino, а землю сервомотора – с землей Arduino. Сигнальный контакт сервомотора подсоедините к цифровому контакту 9 платы Arduino. Более подробно о подключении сервомотора к плате Arduino можно прочитать в этой статье.
Далее соедините один контакт фоторезистора с одним концом сопротивления 10 кОм и также соедините этот конец к контакту A0 платы Arduino, а другой конец резистора подсоедините к земле, а другой контакт фоторезистора – к 5V Arduino. Аналогично и для другого фоторезистора, только с использованием контакта A1 платы Arduino.
Исходный код программы
При написании программы для нашей солнечной панели, следующей за Солнцем, первым делом необходимо подключить библиотеку для сервомотора. Далее инициализируем переменную для хранения начальной позиции сервомотора. Также инициализируем переменные для считывания данных с фоторезисторов и контакт, к которому подключен сервомотор.
#include //подключение библиотеки для работы с сервомотором
Servo sg90; //даем имя нашему сервомотору, назовем его sg90
int initial_position = 90; //переменная для хранения начальной позиции сервомотора
int LDR1 = A0; //контакт, к которому подключен первый фоторезистор
int LDR2 = A1; // контакт, к которому подключен второй фоторезистор
int error = 5; //переменная для хранения ошибки
int servopin=9;
Команда sg90.attach(servopin) «подсоединяет» сервомотор к контакту 9 платы Arduino. Далее устанавливаем контакты, к которым подключены фоторезисторы, в режим ввода данных. Затем устанавливаем сервомотор в начальную позицию (90 градусов).
void setup()
<
sg90.attach(servopin); // присоединяет сервомотор к контакту 9
pinMode(LDR1, INPUT); // на ввод данных
pinMode(LDR2, INPUT); // на ввод данных
sg90.write(initial_position); //поворачиваем сервомотор в начальную позицию (90 градусов)
delay(2000); // задержка 2 секунды
>
Затем мы будем считывать значения с фоторезисторов и сохранять их в переменных R1 и R2. Далее мы будем вычислять разницу между этими значениями чтобы определить направление, в котором мы будем поворачивать серводвигатель. Если разница между ними будет равна 0 это будет означать что на оба фоторезистора будет падать одинаковое количество света, поэтому солнечную панель в этот момент времени поворачивать нет необходимости. Ранее мы объявили переменную для хранения ошибки и ее значение равно 5, назначение ее будет следующим – если разница между значениями двух фоторезисторов будет меньше значения этой переменной (5), то сервомотор не будет двигаться (изменять свое положение). А если больше – то сервомотор будет вращать солнечную панель в направлении того фоторезистора, на который падает больше света. То есть значение этой переменной как бы регулирует чувствительность нашего устройства и определяет ту минимальную границу, при превышении которой нам следует начинать вращать серводвигатель.
int R1 = analogRead(LDR1); // считывание значения с фоторезистора 1
int R2 = analogRead(LDR2); // считывание значения с фоторезистора 2
int diff1= abs(R1 — R2); // расчет разницы между значениями с фоторезисторов
int diff2= abs(R2 — R1);
if((diff1
//если разница меньше величины ошибки/погрешности (error) то не делаем ничего
> else <
if(R1 > R2)
<
initial_position = —initial_position; //поворачиваем серводвигатель в направлении 0 градусов
>
if(R1
<
initial_position = ++initial_position; //поворачиваем серводвигатель в направлении 180 градусов
>
>
Вот мы и разобрали принцип работы программы согласно которой наша солнечная панель будет поворачиваться вслед за Солнцем словно подсолнух. В нашем проекте мы использовали маломощную солнечную панель с малым весом, поэтому и сервомотор нам подошел маломощный, но вы на основе этого проекта можете сделать систему с полноценной солнечной панелью, но и сервомотор для нее понадобится уже помощнее.
Далее приведен полный текст программы.
Источник