четверг, 15 сентября 2011 г.

Мысли про акваконтроллеры и изобретения велосипедов

Как у человека, который по профессии разработчик всяких там встраиваемых систем на микроконтроллерах и компьютерах, у меня не могла не зародиться крамольная мысль: "а не сделать ли мне железку для управления моим аквариумом?". Эдакая мысль первый раз зародилась около года назад, когда я впервые попал на аквафорум и бегло просмотрел тамошний раздел самоделок автоматики. Естественно народ уже давно эту тему обсуждает, кто-то что-то делает и вообще тут америку не надо открывать. Можно только изобрести очередной велосипед.

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

Поэтому я решил записать свои мысли про создание нового акваконтроллера сюда в этот блог (все равно его кроме меня никто не читает). Если мои намерения таки воплотятся во что-то материально-работающее, то будет хорошо. А нет — так просто голову очищу (по заветам GTD).

(Дабы не утомлять случайных нетехнических посетителей всякими кровавыми деталями, основное тело статьи под катом).

Общее описание

В аква-контроллерах основа всего — это управление различными нагрузками, чаще всего 220В, по времени (таймеры времени), либо по показаниям различных датчиков (температура, pH).

Простое управление нагрузками по таймеру легко реализуется на имеющихся в магазинах электромеханических либо электронных таймерах. Это вполне себе хорошее решение, если нужно управлять только одной нагрузкой (например, освещением). Можно даже поставить два, если хочется иметь ступенчатое управление освещением. Но где два, там и три, и т.д. Стоимость одного-двух таких таймеров будет заметно меньше или сравнимо со стоимостью изготовления собственного контроллера, зато сразу и без долгой и нудной отладки собственной программы. Габариты одного-двух электронных таймеров впрочем весьма немаленькие, да еще и места в розетке они занимают прилично. Вобщем один, с натягом два таймера, для управления освещением лучше брать готовые. Сейчас у меня стоят электронные разных китайских фирм, в одном таймере очень часто слетают настройки, что уже начинает доставать, но не так сильно. Я использую именно электронные, чтобы при пропадании света время не сбивалось.

Отсюда: минимальное количество выходов в контроллере должно быть 2-3, максимальное — до 8/16. Давайте прикинем зачем так много. По моим мыслям:

Ступенчатое управление светом (до 3х групп ламп, больше не имеет смысла) — 2-3 выхода.
Отключение фильтра на время кормления и уборки в аквариуме — 1 выход.
Подача CO2 из баллона — 1 выход.
Включение аэрации в темное время — 1 выход.
Управление нагревателем по датчику температуры — 1 выход.
Автоматическая подача удобрений — 1 выход.

Итого: 8 выходов — это вполне реально. Либо ~4 шт, если отдельные функции не нужны.
Я считаю, что конструкция должна быть гибкой (2/4/6/8).

Дополнительно нужен выход для включения вентилятора (охлаждение аквариума либо проветривание под крышкой) по таймеру либо по датчику температуры. Выход с управляемым напряжением 5-12 В.

Возможно? еще управление автоматической кормушкой (220В? 12В? 5В?).

У других аквариумистов еще есть потребность в имитации лунных фаз (морские аквариумы?), имитаций рассвет/закат. Контроллер должен допускать расширение в будущем.

Датчики:
  • температура — чаще всего используется DS18B20. Нужно от 1 до 4х датчиков. Оптимально 2.
  • измерение pH — аналоговый вход с предусилителем сигнала
  • измерение редокс-потенциала или проводимости
  • датчик протечки воды либо датчик уровня воды

Дополнительные органы управления:
  • горячая кнопка (1-2 шт) — например, для временного отключения фильтра на время кормления.
  • тумблер для отключения оборудования (кроме света) на время уборки в аквариуме.

Индикаторы, органы управления:

для меня лично очень важно иметь связь с компьютером, с выходом на USB. Поэтому всякие дополнительные пульты с дисплеями и кнопками — это необязательная штука. Более того, правильно настроенный контроллер не будет нуждаться в ежедневном внимании, поэтому дисплей и кнопки будут удорожать конструкцию. Однако, для массового использования без таких приятных мелочей не обойтись, поэтому в своем контроллере я предпочитаю сделать выносной/отдельный пульт управления. Даже можно в двух вариантах: с ЖКИ дисплеем и кнопками для настройки программ, и просто с семисегментными индикаторами и горячей кнопкой для индикации температуры и/или времени.

Почему пульт управления/индикатор должен быть отдельным?

Основа контроллера — это управление выходами + часы реального времени. Силовую часть лучше иметь всю в одной коробке, а не тянуть от базовой платы с пультом потом жмых проводов к коробке управления выходами. Связь же между базовой платой и пультом управления можно осуществить по 3м проводам (питание, земля, сигнал) — тонким и ни к чему не обязывающим проводом. Опять же — даже без пульта базовая плата будет работать по своей программе.

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

Вобщем пока что я не придумал ничего нового, кроме внешней шины для расширения функций и подключения пульта.

Открытая разработка

Для меня впрочем очевидно, что успех разработки такого контроллера может обеспечить только открытая разработка. Я с 2005 года участвую в открытых проектах, и представляю себе как это происходит. Абсолютное большинство разработок, что я увидел на аквафоруме, имеют закрытые исходники, и доступны только бинарные файлы для прошивки контроллеров. Для меня — это тупиковый путь. Вся разработка должна вестись открыто, под GPL лицензией, чтобы некто ушлый не решил быстренько что-то подшаманить и выдавать за свое. Я так понимаю, большинство, кто разрабатывает аква-контроллеры либо сознательно не хочет выкладывать исходники в открытый доступ из соображений сохранения всецелого контроля над своим детищем, либо не считает, что кто-то кроме них захочет что-то усовершенствовать. Открытая разработка может и должна стать конкурентным преимуществом в новом проекте. Плюс так есть шанс привлечь к проекту людей не только из украино-русской аквариумной тусовки, а из-за рубежа также.

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

Учитывая открытость проекта, необходимо сразу нацеливаться на кросс-платформенность (я вобщем по другому себе и не представляю). Т.е. разработка прошивки для управляющего микроконтроллера должна вестись на основе gcc (например, avr-gcc для процессоров AVR одинаково хорошо работает на Windows и Linux). А управляющая программа для компьютера также должна быть изначально кросс-платформенной. Лично я для этих целей буду использовать Python + PyQt4 — это мощная проверенная связка кросс-платформенных инструментов для быстрого построения качественных GUI-программ.

Хостинг проекта. Да, я прекрасно знаю, что git и github — впереди планеты всей, однако на сегодняшний день я предпочту bzr + launchpad. Просто потому, что я их очень хорошо знаю, и для такого проекта их возможностей более чем достаточно. Поскольку на первых порах проект разрабатывать я буду сам один (и в дальнейшем вобщем-то помощь других скорее случайна и эфемерна), поэтому надо выбирать те инструменты, с которыми мне сейчас удобнее работать. В будущем, если оно настанет, проект можно будет сконвертировать в git-формат и перенести на github. Если это на самом деле будет нужно.

Железо

Теперь по железу. Железо я выбираю то, с которым я уже знаком, это значительно ускорит процесс разработки. Никакой оптимизации по стоимости деталей я делать не собираюсь — во главе угла стоит именно удобство разработки и дальнейшего расширения и доработки изделия.

Устройство должно быть способно переживать пропадание питающего напряжения без потери хода часов. Для этого либо используют батареи/аккумуляторы для резервного питания главного процессора, либо используют внешние часы реального времени со своей литиевой батареей (DS1307). Я выбираю вариант с внешними часами на микросхеме DS1307. Я уже имею опыт работы с этой микросхемой и знаю ее возможности. Кроме всего прочего у нее внутри есть небольшое ОЗУ куда можно складывать оперативные данные, полезные для отслеживания текущего состояния, если нужно чтобы эти данные могли пережить blackout.

Процессор — AVR ATmega без вариантов. Имею большой опыт, много наработок. Низкоуровневые драйвера практически все готовы. Процессор нужно брать с 2-мя UART (связь с копьютером, обмен по внешней шине), с АЦП, ШИМ и ног не жалеть. Также нужно иметь запас памяти программ для возможности будущего расширения. Под такие параметры подходит либо линейка ATmega164/324/644 TQFP-44 (16K/32K/64K памяти программ при одинаковом расположении ног), либо пара ATmega64/ATmega128 TQFP-64 (64K/128K памяти программ). Я думаю, что правильнее начинать разработку на самом жирном процессоре ATmega128, а затем если нужно, то адаптировать под меньшие. Разница в цене между 128й мегой и более мелкими настолько несущественна, что лучше брать сразу её.

Связь с компьютером. Я считаю, что целесообразно иметь 3 варианта для связи с копьютером:
  1. Чистый USB выход (внутри ставим чип FTDI FT232). По стандарту кабель USB может быть длиной до 5 м, что вполне достаточно, особенно если для управления использовать ноутбук.
  2. Выход на RS-232 с опциональным переходом на USB (чип FTDI). Кабель RS-232 можно будет иметь любой разумной длины (30м? 100м? pourqoi pas?). Либо если кто-то использует старый компьютер с COM-портом.
  3. Выход на RS-485 для объединения нескольких контроллеров в мини-сеть с единственной точкой подключения к управляющему компьютеру (переходник с RS-485 на USB на основе FTDI). Длина сегментов сети также в разумных пределах (квартира/магазин/офис) не лимитируется.
Исходя из таких требований базовая плата будет иметь просто 5В выход UART, а нужный адаптер будет устанавливаться либо снаружи, либо внутри изделия под конкретного заказчика.

Внешняя шина. Строим по принципу шины LIN. Линии UART Tx/Rx сводятся в одну, активный ноль формируется транзистором, неактивная единица — подтяжкой к питанию. Все устройства таким образом включаются по схеме "общий коллектор". Устройств тогда может быть несколько, включая несколько разных пультов/индикаторов (что по-моему удобно и соответствует ранее озвученной концепции: пульт — вещь опциональная). Питание по шине целесообразно пускать 12В, однако выбор 5В тоже может быть оправдан для упрощения конструкции. Инженер во мне говорит, что 12В — это правильно. 5В полезно только если мы пытаемся сэкономить. Останавливаемся на 12В. Я думаю, что для удобства можно было бы использовать аудио-разъемы типа Jack как для наушников. Там как раз 3 контакта. При отладке внешних устройств можно использовать специальный переходник для подключения к компьютеру через USB.

Связь с датчиками температуры. Несмотря на то, что на одну шину 1-Wire можно вешать много датчиков DS18B20, но я считаю, что для упрощения обслуживания и настройки контроллера намного целесообразнее иметь отдельные шины под каждый датчик, чтобы не иметь хлопот с настройкой серийных номеров датчиков. Плюс в таком случае их можно легко и просто менять местами. Цена вопроса: копейки на отдельные разъемы. Однако такие разъемы должны отличаться от разъема внешней шины, поскольку питающее напряжение и протокол обмена отличается. Использовать 1-Wire для внешней шины неинтересно, поскольку при этом сложнее организовать отладку изделия с компьютера (нужен более специальный переходник).

Управление силовыми выходами — по зарекомендовавшей себя схеме на оптосимисторах. Опционально — управление через реле. Для индикации включения симисторов/реле использовать светодиоды. Лучше 2 цвета — зеленый для отображения состояния по программе, красный для индикации того, что управление каналом перехвачено в ручном режиме. Опять же — опционально, кому не надо, тот не ставит.

Аналоговые усилители — отдельной платкой. Может быть даже рассмотреть вариант вынесения в качестве внешнего устройства и подключить по внешней шине.

В качестве приятных бонусов я хочу заложить на плату возможность установки 1-2 EEPROM типа 24C512 (64KB) или 24C1024 (128KB) для ведения журнала событий. Подключаются по I2C как и DS1307. Цена этих микросхем — тоже копейки. Памяти хватит на ограниченное число записей, но постараемся упаковать так, чтобы хотя бы 2 недели умещалось (уехали вы в отпуск, а потом вернулись и посмотрели что и как было без вас).

Для внешних пультов нужно брать дешевые мелконогие ATmega 8 или 48 с одним UART и можно без АЦП/ШИМ. Можно даже и другой проц, протокол будет открытый, любой сможет сделать то, что ему хочется.

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

Программа для компьютера

Напоследок пару слов про программу для компьютера. Я бы хотел иметь интерфейс отличный от чисто технарского подхода настройки выходов/входов с кучей табличек и галочек. Я себе вижу дружелюбный интерфейс, рассчитанный на обычных людей, не побоюсь этого слова "на домохозяек", где в главу угла поставлена ориентировка на первичное привязывание номеров каналов к реальным устройствам, и затем последующая настройка работы в терминах устройств, а не в терминах каналов. Должна быть возможность наглядно (в виде графиков и диаграмм, а также текстовых описаний) представлять настройки на одном экране, а также сохранять и загружать настройки из файла. Так чтобы разные пользователи могли делиться настройками. Это должно прибавить определенной социальности контроллеру.

Кроме того, мы сразу закладываем поддержку нескольких контроллеров в программу. Для этого во-первых в самих контроллерах должна быть возможность устанавливать адрес/серийный номер/имя аквариума, а во-вторых программа должна позволять работать с несколькими контроллерами/аквариумами, если они объединены в сеть.

Также ранее мы упоминали возможность установки EEPROM в контроллере для ведения журнала. Естественно, наша управляющая программа должна иметь возможность загрузки и последующей визуализации событий журнала.

Еще один немаловажный фактор. Поскольку я нацелен на удобный интерфейс программы с привязкой к устройствам/аквариумам, то вполне реально добавить также поддержку управления 2х рядом стоящих аквариумов от одного контроллера (если выходов управления хватает). В программе компьютера настройки для каждого аквариума должны удобно редактироваться, не смешиваясь с настройками для другого аквариума. Это вполне реализуемо.

Этапы реализации

Несколько слов о реализации проекта. Очевидно, что если пытаться реализовать всё и сразу, то скорее всего проект не взлетит. Поэтому разработку следует разбить на ряд мелких но выполнимых шагов, чтобы по окончанию каждого шага иметь работоспособную версию изделия для проверки на реальном аквариуме и для повторения другими (привет, Agile).

На нулевом этапе — разработать схему, спаять макет основной платы + связь с компьютером. В процессор прошить bootloader, все рабочие версии программ загружаются в процессор с компьютера без программатора, только через bootloader. С этого момента начинается собственно разработка боевой программы для контроллера и компьютера.

На первом этапе — необходимо запустить работу с часами реального времени и управление выходами по установленным настройкам. Также необходимо написать заготовку управляющей программы для компьютера для управления контроллером вручную для наладки и отладки, а также для съема телеметрии/журнала работы для анализа. Поддержка кнопки "кормление" и переключателя "уборка". С этого момента изделие способно выполнять функцию таймера времени, настройки выполнять с компьютера.

На втором этапе — разработать плату пульта управления, реализовать протокол обмена по внешней шине, разработать программу для пульта управления, а также добавить поддержку пульта в основную плату. С этого момента изделие можно настраивать с пульта.

На третьем этапе — реализовать поддержку датчиков температуры DS18B20: драйвер для работы с 1-Wire, съем показаний, вывод показаний на дисплей и на компьютер. С этого момента изделие может выполнять функцию термометра.

На четвертом этапе — реализовать алгоритм управления устройствами по показаниям датчика температуры. Добавить в пульт и в программу для компьютера необходимые функции для настройки привязки датчиков к каналам управления и выбора алгоритма управления. С этого момента изделие может поддерживать заданную температуру по показаниям датчика.

После этого мы имеем вполне годное изделие, которое можно дорабатывать в соответствии с собственными нуждами, пожеланиями пользователей или под заказ конкретного пользователя. Далее порядок добавления функций не имеет особого значения, приведу далее в виде списка.
  • реализация журнала событий в энергонезависимой памяти + поддержка в компьютерной программе (и возможно в пульте)
  • работа с аналоговыми сигналами (pH-метр, редокс-потенциал) и формирование управляющих воздействий по их показаниям
  • дополнительные возможности по восстановлению после пропадания питания, например, задержка на несколько десятков секунд или несколько десятков минут включения ламп освещения (для ЛЛ или МГ)
  • разработка упрощенных пультов/индикаторов для индикации температуры/времени (для установки в/на крышки)
  • поддержка в программе для компьютера для удобной настройки в варианте: один контроллер – два аквариума.
  • всё остальное о чем я сейчас забыл упомянуть.
Заключение

Проект вполне реализуем, я уверен. На первых этапах (нулевой-первый) помощь сторонних разработчиков может быть полезна, но не обязательна. На последующих этапах помощь будет только приветствоваться. На реализацию первых этапов необходимо будет затратить около месяца, включая подбор и покупку элементов, разводку платы и изготовления её утюгом, а также для формирования начального скелета программы. На полную разработку — как жизнь сложится. В любом случае счет будет идти на месяцы.

Однако затевать такой сложный и долгоиграющий проект не имея возможности в дальнейшем расширении возможностей — просто нет смысла. Описанная конструкция имеет несколько возможных векторов для расширения:
  • большой микроконтроллер, с большим числом выводов, много памяти
  • внешняя шина для добавления внешних устройств
  • объемная EEPROM для хранения журналов
  • связь с компьютером + возможность объединения нескольких контроллеров в сеть
Обратная связь

Если вы хотите поругать мои идеи — не стесняйтесь, пишите комментарии. Критика помогает увидеть пробелы в расуждениях на ранних этапах.

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

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

2 комментария:

  1. ідея не погана, старт проекту відбувся?
    П.С. Мені не подобаються Atmel контролери тим що компанія почала "лупити" ціни, можна пробувати стартувати проект на STM8/32 - відносно нові контролери з багатою переферією і дешеві як борщ, заодне розширення досвіду, але є один мінус - потрібно більше часу на реалізацію проекту якщо ви не працювали з даними мікроконтролерами.

    ОтветитьУдалить
  2. Я предпочитаю именно авр из-за того, что под них у меня уже накоплен хороший опыт и библиотеки. Пока что проект находится в стадии рисования схемы, а другие домашние дела не дают заняться вплотную реализацией.

    Использовать STM -- может быть интересно, но учитывая, что нужно будет потратить массу времени на изучение как процессора так и инструментария к нему, то как-то сразу это и останавливает.

    ОтветитьУдалить