Солнце в коробке
«Это мой лучший друг: всегда в хорошем настроении и не задаёт лишних вопросов» — Леон о растении.
Не секрет, что зеленые друзья расползлись по подоконникам многих из нас, вот и мне захотелось вырастить у себя что-нибудь. Да не просто «что-нибудь», а что-нибудь плодоносящее. К сожалению, в квартирных условиях обеспечить необходимые для этого условия весьма непросто. Однако попытаться стоит. Так, и взбрела мне в голову мысль разработки устройства для решения этой задачи — умного гроубокса. Конечно, идея не нова, но найти что-нибудь интересное, да еще и настольного формата среди готовой продукции мне не удалось и захотелось соорудить кое-что своё. Дело дошло до версии 2.0 и вот, я готов поделиться полученными результатами.
Вначале был прототип.
Для проверки целесообразности идеи выращивания плодоносящих растений в закрытом пространстве я решил собрать основной функционал, пренебрегая аккуратностью корпусирования. Прототип состоял из следующих функциональных блоков:
[ функциональная схема устройства (версия 1.0) ]
Получилась весьма увесистая конструкция, внушительных размеров, тем не менее, работающая и пригодная для эксплуатации. В качестве корпуса использовался вырезанный деревянный бокс, напичканный бюджетной электроникой:
для освещения были выбраны светодиодные ленты красно-синего и тепло-белого спектров свечения; для вентиляции — стандартные 12 В кулеры; потенциометр — как регулятор скорости оборотов кулеров с возможностью отключения; датчик температуры и влажности с выводом на ЖК-дисплей; розетка с таймером на освещение и сетевой блок питания. Открытием стала система капельного автополива Blumat. Под спойлером фото первой версии гроубокса. Основная цель заключалась в получении плодов какого-либо сорта.
[ внешний вид гроубокса 1.0 ]
Собрав этого Франкенштейна, я отправил острых перцев с боевым названием «Огонёк» на разведку. Было интересно понаблюдать за полным циклом роста растений поэтому в начале марта я высаживал их семена, накрывая почву пленкой на несколько дней. Режимы освещения были следующими: во время роста световой день длился 18 часов, а во время цветения — 12. Примерно через три месяца я увидел первые цветочки. Опылять пришлось искусственно (кисточкой) из-за того, что завязи сами никак не образовывались. В итоге они успешно отцвели два раза за полгода — в начале лета и осенью.
[ цветение перцев и первый урожай ]
Как можно заметить, система контролировалась в полу ручном режиме, ни о какой автоматизации и сборе статистики речи и не шло. Однако, на мой взгляд, идея доказала свою работоспособность, и я стал готовиться ко второй версии.
Версия 2.0.
При разработке второй версии я первым делом взялся за аппаратно-программную составляющую, предполагая, что именно с ней будет больше всего проблем, и оставил вопрос корпусирования на потом. Забегая вперед, скажу: все оказалось ровно наоборот.
Про электронику
Функциональная схема, по сравнению с первой версией, претерпела несколько важных изменений: добавился датчик жидкости, а контроль и управление системой было решено перенести на WEB-интерфейс. В остальном, функционал сохранился, однако реализация существенно поменялась. Так, работа над новой версией началась с выбора электронных компонентов. Архитектура новой электронной начинки приведена на рисунке ниже. Блок питания на 48 В выбран из расчета применения цепей 3 Вт светодиодов.
[ структурно-функциональная схема электроники (версия 2.0) ]
Хост-плата
Для связи с внешним миром новый гроубокс имеет встроенный WEB-сервер. Честно говоря, до данного проекта я не имел никакого опыта разработки пользовательских интерфейсов (UI), но такой подход мне показался целесообразным из-за возможности отображения интерфейса как локально (браузером на дисплее), так и удаленно (в браузере подключенных устройств), ничего при этом не переписывая. Таким образом, на UI были возложены две группы задач:
Управление:
- настройками хост-платы;
- освещением;
- вентиляцией.
Мониторинг:
- состояния освещения (вкл\выкл);
- температуры и влажности;
- уровня воды (есть\нет);
- состояния вентиляции.
WEB-сервер располагается на хост-плате (см. структурно-функциональную схему), которая, в свою очередь, осуществляет обмен данными с остальными компонентами системы.
Признаюсь, в качестве первой реализации, я взял разработанную ранее платформу CNCU-01 на базе микроконтроллера STM32F407, где, подняв WEB-сервер, я уткнулся в проблему недостатка памяти для хранения картинок и html-страниц. Возможно, в целях энергоэффективности, я вернусь к этому варианту т.к. данные можно хранить на microSD карте, но пока я решил взять платформу на базе микропроцессора с Linux. Выбор пал на Khadas VIM1, как на плату с лучшим, по-моему мнению, соотношением функционала и стоимости. Основными критериями выбора были:
- работа с известными дистрибутивами (Ubuntu \ Debian \ Armbian);
- наличие eMMC для хранения образа ОС и данных;
- наличие отдельного разъема (помимо USB) для питания;
- нормальная работа при пассивном охлаждении;
- наличие UART, I2C, WiFi, ETH, HDMI, USB (900mA), GPIO.
Также преимуществом данного одноплатного компьютера было наличие широкого выбора уже собранных образов разных дистрибутивов Linux. В этом проекте я использовал Ubuntu LTS 18.04. Большинство необходимого уже было в составе образа, оставалось лишь все это настроить и запрограммировать. Первым делом потребовалось сконфигурировать шину I2C. По умолчанию частота SCK, выставленная производителем в 400 кГц, не подходила для моей длины линии (~5 м) — фронты тактовых сигналов оказывались заваленными из-за паразитной емкости провода и корректный обмен данными был невозможен. Выход был в понижении частоты до 100 кГц исправлением файла конфигурации платы — devicetreeblob (.dtb). Отдельно хочется отметить живой форум и тех. поддержку Khadas, оперативно реагирующую на возникающие вопросы.
Для реализации WEB-интерфейса мне понадобилось знакомство с HTML, CSS и JS. Усложнять их изучение постижением популярных фреймворков я не стал (да и времени на это не было), поэтому фронтенд получился пусть и уродливым внутри, зато, как по мне, миловидным снаружи (благо, с дизайном мне очень помогла девушка). Бэкенд представляет из себя связку NGINX WEB-сервера, FastCGI и С++ приложения. На момент написания статьи пользовательский интерфейс выглядит следующим образом:
[ WEB-интерфейс гроубокса 2.0 ]
Рабочие настройки и показания датчиков хранятся в sqlite базе данных. Визуализация температуры и влажности реализована при помощи модифицированной библиотеки Chart.js (мне потребовалась поддержка двух Y-осей). Режимы освещения и вентиляции задаются расписаниями — каждому устройству соответствует свой таймер и статическое значение рабочей мощности. Более хитрые алгоритмы автоматического управления пока находятся в разработке.
WiFi vs HDMI
Как говорилось ранее, гроубокс 2.0 задумывался как сетевое устройство: для регистрации в сети он поддерживает как статическое присваивание IP адреса, так и динамическое, но прежде, чем получить доступ к его WEB-серверу (UI), необходимо собственно этот адрес определить. Так, для пользователя стал необходим интерфейс для первоначальной настройки устройства, чтобы затем вывести его в локальную сеть. Кроме того, такой интерфейс пригодился бы для работы в оффлайн режиме.
Изначально, для решения этой задачи, я планировал использовать HDMI TouchScreen дисплей. UI отображался бы на дисплее через chromium в режиме киоска и управлялся бы при помощи виртуальной клавиатуры. Но все оказалось не так просто — сенсорная панель по умолчанию не поддерживалась в предлагаемых на сайте Khadas образах Ubuntu Desktop, однако, за пару дней общения на форуме, разработчики и сообщество помогли мне собрать новый образ с необходимыми модулями и тач заработал. Для реализации виртуальной клавиатуры в Ubuntu нашлось предостаточно готовых средств, среди которых я выбирал между florence и onboard. Данные клавиатуры позволяют гибко менять свой внешний вид, что дает возможность качественно настроить их под свое приложение.
Прим. Недавно разработчики Khadas опубликовали версию Ubuntu Desktop с поддержкой Gnome, где есть уже встроенная весьма удобная виртуальная клавиатура.
Тем не менее, несмотря на проделанную работу, все это мне не пригодилось. Очевидной проблемой при работе с дисплеем было повышенное энергопотребление хост-платы и больший ее нагрев из-за работы графического процессора. Без активного охлаждения с дисплеем работать все же не рекомендуется, а мне очень хотелось избежать лишних шумов кулера. Конец моим сомнениям пришел, как мне кажется, в виде знака. Дело в том, что пока я работал с одноплатным компьютером без дисплея он был запитан от блока питания 48 В через 48VDC-5VDC преобразователь. Я подозревал, что такое сочетание падения напряжения и тока потребления платы близки к максимальным возможностям преобразователя, но забыл об этом, когда стал подключать дисплей. Стоит уточнить, что дисплей запитывается от USB порта хост-платы. Таким образом, увлеченный кастомизацией виртуальной клавиатуры, вскоре я почуял характерный запах горелого пластика и экран отключился. Отключился, как оказалось, навсегда. DC-DC Преобразователь сгорел, успев, по видимости, выдать аномальный импульс на выход, убивший кулер хост-платы и матрицу дисплея. Одноплатный компьютер сначала тоже пал замертво и находился в коме минут 20, после чего входной самовосстанавливающийся предохранитель оправдал свое название, и плата ожила, чему я был несказанно рад. К несчастью, лишнего дисплея у меня не было, и произошедшее я воспринял как знак для пересмотра выбранного решения. Обнаружив, что большинство людей уже давно носит беспроводной дисплей смартфон в кармане, я подумал, что необходимости в еще одном дисплее в составе устройства на самом деле и нет. Вместо этого можно создать подключение «по воздуху» и транслировать UI на экран телефона. Так я и поступил. На выбор имелось два канала связи: Bluetooth и WiFi, но т.к. браузеры смартфонов, как известно, уже работают по WiFi, то на нем я и остановился, дабы не городить лишнее приложение. На хост-плате я настроил точку доступа (WiFi AP), к которой можно подключаться со смартфона и через браузер открывать WEB-интерфейс гроубокса. WEB-интерфейс, в свою очередь, имеет адаптивную версию для мобильных устройств. Такой подход мне показался оптимальным по удобству использования и трудозатратам. Кроме того, уход от решения с дисплеем избавил от необходимости прокладки в корпусе двух кабелей и снизил рабочую температуру одноплатного компьютера, что позволило перейти на пассивное охлаждение.
[ подключение смартфона к гроубоксу 2.0 ]
Фитосветильник и контроллер FLC-01
Избрав путь разработки «почти с нуля», я захотел поэкспериментировать с системой освещения, а в частности с излучаемым спектром. Так началась работа над светодиодным фито-светильником и контроллером для него.
Размеры освещаемой площади в этой версии стали 400×400 мм, поэтому в качестве корпуса фитосветильника я выбрал алюминиевый радиатор 300×400, с запасом, чтобы распределить светодиоды как можно свободнее. Радиатор крепится к конструкционному профилю и выполняет функцию верхней крышки бокса. На китайском рынке я нашел готовые алюминиевые панели для светодиодов подходящий габаритов. Их я закрепил на радиаторе, предварительно промазанном термопастой, и запаял светодиоды по схеме. Из расчета 250 реально излучаемых Вт на 1 облучаемый м2 (или 40 Вт / 0,16 м2 — в моем случае) я взял 41 трехваттный светодиод. Стоит уточнить, что я использовал 3 независимые группы светодиодов (красные 660 нм, синие 445 нм и белые 2900К/4000К), в которых падение напряжения на отдельном светодиоде отличается. Так, например, на синем светодиоде падает в районе 3,4 В, тогда как на красном — 2,4 В. Кроме того, насиловать светодиоды номинальным током в 700 мА я не стал и выбрал 350 мА в качестве рабочего значения (чтобы продлить им жизнь) при максимуме в 500 мА (максимум драйвера). По измерениям пришедших ко мне светодиодов получилась следующая таблица:
Исходя из вышесказанного, считаю максимальную реальную полученную мощность фитосветильника:
Pmax = 6 × (0,5 × 3,4) + 5 × (0,5 × 4,5) + 12 × (0,5 × 3,4) + 18 × (0,5 × 2,4) = 63,45 [Вт]
и реальную рабочую мощность при токе 350 мА:
Pраб = 6 × (0,35 × 3,4) + 5 × (0,35 × 4,5) + 12 × (0,35 × 3,4) + 18 × (0,35 × 2,4) = 44,42 [Вт]
При этом каждой линии светодиодов (красной, синей и белой) хватает 45 В для питания (3 В падает на драйвере для светодиодов, согласно документации), так что блока питания на 48 В 4.4 А как раз достаточно. Распределяя светодиоды, я старался обеспечить максимальную однородность излучаемого света. Получившееся в итоге представлено на фото ниже.
[ схема распределения светодиодов] [ вмонтированная в крышку лампа ]
Благодаря тому, что фито-светильник имеет независимые линии светодиодов разных спектров, имеется возможность изменять яркость каждой группы, тем самым управляя общим спектром излучения. Более того, при необходимости можно плавно уменьшать или увеличивать общую мощность относительно рабочей. Такой подход позволяет гибко настраивать свет под выращиваемую культуру растения и имитировать солнечные рассветы и закаты.
Для такого управления светодиодами понадобился специальный контроллер с трехканальным диммируемым светодиодным драйвером, да еще и с цифровым каналом связи. Собрать его я решил сам, не найдя ничего подходящего на рынке. В качестве драйверов для светодиодов были найден источники питания серии LDD-H, а именно LDD-500H на 500 мА. Конструкция платы разработанного контроллера позволяет установить любой необходимый драйвер этой серии, т.к. они имеют одинаковые корпуса и для них предусмотрены специальные посадочные места типа «кроватка». Таким образом, при желании можно еще повысить мощность фито-светильника, заменив драйверы на LDD-700H с током 700 мА. Мозгом же платы был выбран популярный микроконтроллер STM32F103. Именно он управляет светодиодными драйверами посредством ШИМ-сигналов, устанавливая тем самым выходной ток. Для связи контроллера с внешним миром поддерживается несколько каналов связи: UART, RS232 и Bluetooth 4.0 BLE (в зависимости от сферы применения).Bluetooth канал построен на основе модуля HM-10.Также контроллер имеет встроенный таймер включения и отключения драйверов светодиодов для установки длительности светового дня растений. Чтобы таймер не сбивался при перепадах напряжения питания, он работает на основе часов реального времени (RTC) и на плате установлен разъем под батарейку CR2032 для резервирования питания часов. Сама же плата питается в диапазоне 15…50 В, подавая входное напряжение в том числе и на светодиодные драйверы. В процессе эксплуатации от 48 В я столкнулся со значительным нагревом линейного стабилизатора напряжения LM317HVT и не стал дожидаться его выхода из строя, сделав отдельный вывод для питания логической части от DC-DC преобразователя на базе LM2596HV. В следующей ревизии платы планируется исправить данный недочет.
[ плата FLC-01: вид сверху ] [ плата FLC-01: вид снизу ]
Разработанная для контроллера прошивка позволяет регулировать выходной ток каждого драйвера в пределах от 0 до 100% с шагом 1%, то есть для рабочего значения в 350 мА необходимо выставить 70% (500×0.7). Протокол общения максимально прост (есть общая структура текущего состояния контроллера, нужно что-то поменять — пишешь ему об этом), и построен на формате JSON:
[ пример обмена данными ]
и даже имеет простенький GUI на Python3, если вдруг понадобится подключать контроллер к ПК.
[ графический интерфейс FLC-01 ]
Для управления по Bluetooth я использую Serial Bluetooth Terminal. Это оказалось не очень удобным в использовании (отдельное приложение все же предпочтительнее, однако его еще нет), но очень удобным при отладке, когда плата уже встроена, а подключиться и посмотреть происходящее надо. Для связи с хост-платой используется классический UART.
Соединительная плата (SensorsBoard)
Ни для кого не секрет, что у разных датчиков разные интерфейсы связи. Для своей системы я выбрал следующие сенсоры:
- датчик температуры и влажности SHT30 — питание 3.3 В, работает по I2C;
- бесконтактный датчик жидкости XKC-Y26-V — питание 12 В, подает на выход уровень питания если жидкость есть и GND — в противном случае;
- 4-pin кулеры Noctua NF-A12×15 — питание 12 В, скорость вращения регулируется ШИМ-сигналом.
Как видно из этого перечня, напрямую к хост-плате Khadas VIM1 можно подключить разве что датчик температуры-влажности т.к. кроме 3.3 В и 5 В на хост-плате напряжений нет. Для подключения датчика жидкости и вовсе нужен преобразователь 12 — 3.3 В чтобы подать сигнал на порт процессора. В связи с этим, потребовалось сделать еще одну плату для стыковки датчиков и кулеров с одноплатным компьютером. В качестве канала связи я использовал шину I2C, где ведущим устройством выступила хост-плата, а двумя ведомыми стали датчик SHT30 и мозг соединительной платы — уже известный микроконтроллер STM32F103. На этот раз задачей микроконтроллера стала генерация ШИМ-сигналов частотой 25 кГц для двух кулеров, скважность которых задается командами по I2C. Плату собрал дешево и сердито — на макетке, используя STM32-Bluepill. Питание осуществляется от общего блока питания 48 В поэтому на входе используется DC-DC преобразователь LM2596HV-ADJ на 12 В.
Не обошлось и без подводных камней даже в столь простой схеме. Когда я рассчитывал делитель напряжения 12 — 3.3 В я не учел один неочевидный момент — на выходе датчика жидкости уже был встроен токоограничивающий резистор. Этот резистор становился плечом моего делителя и значительно влиял на выходное напряжение. При помощи мультиметра я определил его номинал (20 кОм) и внес коррективы в схему. Выход данного делителя подается на входной порт хост-платы, поэтому для надежности я добавил стабилитрон на 3.3 В, который на схеме не показан.
[ схема подключения датчика жидкости ]
Про корпус
На этот раз я дал себе установку на максимальную повторяемость конечного изделия, стараясь минимизировать объемы доработок напильником ручной работы и искал наиболее подходящие готовые детали для корпуса на рынке. Такой подход, безусловно, не в лучшую сторону повлиял на стоимость изготовления, но облегчил процесс сборки и предоставил возможность поработать с новыми для меня материалами и технологиями.
Каркас было решено собирать из конструкционного алюминиевого профиля серии 20 с V-пазом. Работать с ним оказалось крайне приятно — все размеры подобраны, крепления аккуратно закручиваются и сходятся с пазами. Главное было заранее определиться с габаритами и набором необходимого крепежа. Так, проектирование корпуса началось с 3D-моделирования.Честно говоря, сперва я думал, что модель ограничится лишь каркасом и понадобится лишь для определения основных размеров и типов соединителей, но по мере проектирования стали проявляться неочевидные нюансы, о которых просто не задумываешься без картинки перед глазами. В итоге я стал моделировать каждую деталь и соединение, что помогло избежать многих ошибок в дальнейшем. В этом проекте я познакомился с Autodesk Inventor 2020 и остался очень доволен этой системой автоматизированного проектирования. В ней детали легко рисуются по эскизам, а затем объединяются в единую сборку модели. Кроме того, без лишних манипуляций я сразу мог подготовить нужную деталь для печати на 3D-принтере. Рабочая модель представлена на изображении ниже:
[ 3D-модель корпуса версии 2.0 ]
Внешние габариты конструкции: 440 Ш х 503 В х 540 Г[мм]
Пространство для растений: 400 Ш х 370 В х 400 Г [мм]
В качестве стенок используется прозрачное оргстекло. Чтобы излучаемый фито-лампой свет не выбивался наружу, оргстекло обклеено полузеркальной пленкой (коэффициент отражения 92%, пропускания 8%). Таким образом, становится возможным наблюдение за растениями при наличии света внутри бокса, а при отсутствии внутреннего освещения — бокс превращается в зеркальный.
[ эффект полупрозрачных стенок ]
Подача воды производится в подпольный бак объемом 10 л по выведенной нейлоновой трубке. Имея внешний диаметр 7 мм, она плотно втиснута в паз алюминиево профиля. Горлышко трубки пролезает через соединительный куб и выглядывает из края верхней крышки корпуса. Для удобства пополнения бака я напечатал своеобразную воронку под диаметр отверстия трубки.
К сожалению, мне не удалось найти подходящий сенсор уровня жидкости — для ультразвуковых не хватает высоты, а для поплавковых пришлось бы резать бак. Поэтому специально обученный бесконтактный датчик показывает сам факт наличия или отсутствия воды, а уровень можно косвенно определить по столбцу жидкости в прозрачной трубке, ведь в силу вступают законы сообщающихся сосудов.
[ система подачи воды ]
Немаловажной характеристикой гроубокса 2.0 для меня была громкость работы. Как известно, вентиляторы и блоки питания с активным охлаждением могут издавать раздражающее жужжание. Пытаясь максимально этого избежать, я поставил кулеры Noctua с адаптером Low Noise и блок питания с пассивным охлаждением, что обеспечило нужный эффект бесшумной работы.
Для закрепления плат на задней стенке я напечатал на 3D-принтере специальные крепления, которые приклеиваются к оргстеклу и имеют монтажные стойки под винтики. Таким образом, электроника за исключением датчиков расположилась в задней части корпуса (все провода брались с запасом поэтому вышло не так красиво, как хотелось бы):
[ расположение электроники на задней стенке ]
И напоследок небольшой демо-ролик получившегося устройства:
Итоги
Чем дальше проект развивается, тем интереснее он становится. Новые ответы порождают новые вопросы. У текущей версии все еще немало недостатков и особенностей, требующих доработок. Диапазон решаемых задач растет и, по понятным причинам, все сложнее удается с ним справляться в одиночку. Не знаю как далеко я зайду, но эксперименты продолжаются и надеюсь принесут плоды.
P.S. Высадил подопытную зелень в начале сентября — взошла за дне недели. Продолжаю наблюдения. Всем хорошего урожая!