Гроубокс с числовым программным управлением (ЧПУ)

Возникла необходимость сделать настройку гроубокса максимально комфортной — удалённо, без программирования. Все исходные коды доступны по ссылкам в конце статьи. В статье будет упор на программную часть: прошивка гроубокса, графический интерфейс (GUI) для компьютера.

Результат выполнения G-кода не должен зависеть от его реализации, что делает гибким выбор электроники/ПО и переносимость настроек G-кода.

Потенциальное применение:

  • Любительское и промышленное выращивание растений.

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

Анатомия G-кодов

Подробное описание каждой команды — здесь.

Команды обозначены буквой E вместо G, чтобы не спутать с командами для 3D‑принтеров, но называть их буду по‑прежнему — G‑командами. G‑команды разделены на группы и позволяют:

  • Включать/выключать исполнительные устройства.

  • Снимать показания датчиков.

  • Включать/выключать и настраивать автоматику: циклы освещения и вентиляции, удержание влажности и т. д.

Автоматики — 3 варианта:

  • Циклическая с резким переключением периода (например, для периодического включения вытяжки).

  • Циклическая с плавной сменой периода (для имитации световых рассвета, дня, заката и ночи).

  • Климат-контроль: значение на исполнительном устройстве удерживается между минимальным и максимальным значением на основании показаний с датчика (для поддержания влажности, например).

Электроника

Использую:

  • Arduino Uno — годится для прототипирования и домашнего использования. При промышленном применении могут быть нюансы.

  • датчик влажности и температуры AM2320.

7bf869b3fe654bf51a167539e2097bf9.png

На картинке намерено не показаны схемы ключей и исполнительных устройств, так как они выбираются исходя из ваших потребностей и предпочтений.

Например, у меня такой вариант:

  • симисторный ключ для управления светом;

  • транзисторный ключ + реле для управления увлажнителем;

  • прожекторы и светодиодные лампы с цоколем E27 — белого света. Мощность — 13 Вт максимум;

15dd028a18ad5f5f4b7fc87db68f27a7.jpg

Вместо ардуинки и прошивки может быть Ваша собственная разработка, главное, чтобы G-код оставался прежним, ради совместимости.

Прошивка

Для ускорения разработки я временно откзался от использования часов реального времени: с каждым инкрементом минут (или при сбрасывании счётчика в ноль при переполнении буфера) проверяется необходимость смены периода у автоматики. Это доставляет некоторые неудобства:

  • При перезапуске микроконтроллера отчёт начнётся заново.

  • Если сохранять текущие минуты в постоянной памяти (EEPROM, Flash), то это выручит только при краткосрочном отключении электроэнергии.

  • У меня световой день настроен на 14 часов, следовательно, для синхронизации дня с реальностью я вынужден запустить гроубокс в 8:00.

Графический интерфейс

Написан на Python с применением PyQt6. Позволяет:

  • Создавать управляющие программы для разных растений и режимов их развития без программирования.

  • Загружать в гроубокс программы из G-кода.

  • Видеть показания датчиков, текущие настройки, текущие периоды и продолжительность.

Отправка команд в гроубокс осуществляется в отдельном потоке, чтобы интерфейс не зависал. При высоком таймауте (у меня 2.2 секунды на чтение) после нажатия на кнопку желательно подождать перед следующим нажатием, иначе может показаться, что интерфейс живёт своей жизнью, пока последовательно не исполнятся все команды.

За выполнение команд в потоке отвечает класс SerialWorkersManager модуля thread_tools.py — через него легко добавлять call-объекты (функции, методы и прочее) на выполнение в поток. Например:

from growbox.thread_tools import SerialWorkersManager
worker_manager = SerialWorkersManager()
worker_manager.add_and_start_worker(result_func, task_func, *args, **kwargs)

Программа устанавливается как пакет для Python:

pip install git+https://github.com/syeysk/sy-cnc-growbox-py

Встраивание программы

Для удобной работы с G-кодом написан модуль gcode_builder. Его можно использовать отдельно от графического интерфейса:

G-code будет выведен в консоль:

from growbox.gcode_builder import GrowboxGCodeBuilder  
  
gcode = GrowboxGCodeBuilder()
gcode.a_white_light.set(255)
gcode.s_temperature.get()

G-code будет отправлен в гроубокс:

from growbox.gcode_builder import GrowboxGCodeBuilder  
from serial.tools.list_ports import comports  
import serial  


port = None  
for port, desc, hwid in comports():  
    print(port)  
    break  
  
with serial.Serial(port, baudrate=9600, timeout=2, write_timeout=0.1) as opened_serial:  
    gcode = GrowboxGCodeBuilder(opened_serial)  
    print(opened_serial.read(100))  
    print(gcode.a_white_light.set(255))  
    print(gcode.s_temperature.get())

Использование программы

Чтобы запустить программу, достаточно в консоле набрать:

growbox

При запуске видим окошко:

34d5512fc0c1451e068ec999da424d21.png

Нажмём на «Создать управляющую программу», чтобы создать нашу первую программу из G-команд. Увидим окно с пустыми значениями:

0338277147ad953af0dd074a22068abf.png

Кнопки с чёрным овалом посередине — это кнопка редактирования (овал — это так отображён карандашик).

В нижнем поле отображаются G-команды, генерируемые при нажатии кнопок. В верхнем блоке можно установить значения исполнительных устройств, которые гроубокс будет устанавливать при старте (сохранение значений в постоянную память пока не реализовано). Так как мы включим автоматику, то оставим значения пустыми:

f238975936120ee20aa26f04c065caec.png

Включим автоматику, нажав на галочки:

00e1a753068ba4369d2fb3e6401b3b2b.png

Настроем автоматику «Резкий переход» для вытяжки:

eeeb482e58d8e715793996a9bbf45726.png

Это значит, что вытяжка будет включаться (значение = 255) на 1 минуту, при этом в выключенном (значение = 0) состоянии будет 719 минут, т. е. почти 12 часов.

Настроем автоматику «Плавный переход» для белого света:

5a488c401e7daa888a63bb9acdbbea31.png

Это значит, что свет будет включаться на 840 минут (14 часов), а выключен — на 600 минут (10 часов). Можно указать длительность рассвета и заката — тогда включение и выключение будет плавным. Это сработает, если у вас свет представлен 12-вольтовыми светодиодами, подключёнными через транзисторный ключ. Если через симистр и светодиодные прожекторы (как у меня), то свет будет мигать вместо плавного перехода.

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

Настроем автоматику «Климат-контроль» для увлажнителя:

4d359390a93e04ae6658d0aafaf87ae9.png

Тут всё просто: увлажнитель будет включаться при влажности менее 70% и выключаться при более 75%. Это для экзотических растений, любящих влажный тёплый климат.

Теперь сохраним нашу управляющую программу:

b1659a5e8729a3d1752e8efd9f199fe9.png

Сохранённый файл можем открыть:

f5a19e7c73e92aade65356e2d81773fd.png

И изменить настройки, если нужно.

Если в окне при запуске пуске нажмём «Подключиться по Serial», увидим окно настройки подключения:

4b3a6746a96cddc5c09b8d48806328e5.png

Выберем порт, скорость. Таймауты — в секундах. После нажатия на «ОК»:

8c538638e08fd91ea191f52df8123514.png

Увидим уже знакомое окошко, добавились блок с показаниями датчиков и кнопка обновления показаний. Теперь при нажатии кнопок будут отправляться в гроубокс соответствующие команды. Ещё можно загружать в гроубокс ранее составленные файлы с G-кодом. Достаточно нажать на соответсвующий пункт меню и выбрать файл:

187f9f2e0b19cac8046670f99f44272b.png

G-код, который мы только что составили, соответствует настройкам по-умолчанию в Arduino-прошивке гроубокса.

Вот так просто настраивать гроубокс под нужды разных растений.

О профилях растений

Профилем растения я управляющую программу для конкретного биологического вида или сорта. Профили будут отличаться для генеративного и вегетативного роста. Это приятно, если хотите выращивать растения разных сортов и видов, то достаточно выбрать готовый профиль и загрузить его в гроубокс, а не рутинно настраивать гроубоксы вручную, перечитывая множество научных работ.

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

Планы

G-код и прошивка:

  1. Добавить команды для сохранения и получения сторон поверхности гроубокса, чтобы автоматически расчитывать количество помещающихся стаканчиков.

  2. Указывать значения исполнительных устройств не в диапазоне 0–255 (шкала деления напряжения), а в виде единиц измерения (Люмен, градус Цельсия) — это сделает G-код более аппаратно независимым.

Электроника и прошивка:

  1. Добавление WiFi-модуля, чтобы вместо соединения по Serial использовать HTTP.

  2. 1-й вариант ключей для 220V: электромагнитное реле, управляющего каждым проводом (ноль, фаза, земля). Это позволит полностью убрать напряжение с проводов при отключении и избавиться свечения выключенных светодиодов. Закат/рассвет не получится.

  3. 2-й вариант ключей для 220V: ЦАП (внешний у дешёвых микроконтроллеров, внутренний — у подороже) + симистор, чтобы получить регулировку яркости без диммера. Не уверен, что сработает.

  4. Добавление новых исполнительных устройств: подогрев грунта, автоматизация полива, дальний красный и так далее.

  5. Добавить часы реального времени с синхронизацией через Интернет + добавление резервного питания.

  6. Сохранение значений исполнительных устройств в постоянную память, чтобы при отключенной автоматике они устанавливались при запуске гроубокса.

Графический интерфейс:

  1. Окно для построения управляющих программ агротехническими специалистами. Эдакое окно-мастер, в котором указываем фотопериодичность, реакцию на тень, климатическую зону и прочее, на основании чего сгенерируется G-код с дефолтным значениями. После чего их можно будет настроить более тонко.

  2. Сделать элементы управления симпатичными и дружелюбными.

Прочее, посложнее:

  1. Добавление мониторинга роста и здоровья растений.

  2. Учёт состояния окружающей среды вне гроубокса.

  3. Разработать профили растений под конкретный биологический вид и сорт растения.

Посткриптум и наблюдение

Наблюдения:

  • При подключении к UART «наживую» — микроконтроллер перезапускается.

  • Самое главное при выращивании растений: мощный белый свет, умеренный полив тёплой водой, хороший грунт, проветривание помещения. Это даст крупные листья и здоровые растения. Хитрая автоматика же даст комфорт обслуживания, повышенное содержание вторичных метаболитов, «знатные» плоды.

Ссылки

© Habrahabr.ru