На днях из Америки приехало два любопытных устройства: микрокомпьютер electric imp и оптический датчик уровня углекислого газа в воздухе K30. Каждый из них любопытен по-своему, расскажу немного о каждом из них и о их соединении.
Electric imp
Импы — это вид бесенят в немецком фольклёре. А также сокращение от Interface Message Processor, одного из проектов-предшественников Интернета. Создатели системы признают обоих предшественников. В жизни эта штука оказалась довольно покладистой, хорошо документированной платформой для разработки embedded приложений.
Статью-обзор интернет анонсов можно почитать в статье на хабре, я постараюсь рассказать о конкретике, и тонкостях, которые выяснились в процессе работы.
Как всё устроено.
Бабушка кормит импов, source: Wikipedia
Система состоит из трёх частей:
1. Сам imp. Его все видели на фотках, эта та самая SD-карточка со светодиодами внутри и фотодиодом на «верхнем» (противоположном к контактам) торце, через который в него прописывается конфигурация wifi-ной сети.
Повторю основные характеристики начинки «SD-шки»:
Процессор: | Cortex M3 32 bit |
Wifi: | b/g/n (!), WEP, WPA, WPA2, WPS, WPS-PIN. |
I/O: | 6 ножек, которые можно сконфигурировать для GPIO или встроенных RS-232, I2C, SPI, ШИМ и АЦП. Есть встроенные счетчик импульсов и обработка прерываний по событиям на первой ноге. Назначение ножек можно менять в процессе выполнения программы. |
Напряжение питания — 3.3V, максимум — 3.6V, логика не 5V tolerant. На моей платке с разъемом стоит стабилизатор напряжения, поэтому питать её можно любым напряжением, но сигналы должны быть 3.3V.
Производительность импа — отдельная, любопытная тема. ARM обещает для Cortex-M3 12.5 DMIPS/mW, что бы это ни значило. Я хочу в ближайшие дни померять производительность процессора и wifi импа какими-нибудь тестами, буду благодарен читателям, которые подскажут мне где искать общепринятые speed тесты для embedded платформ. Ну или просто посоветуют, как это лучше сделать.
Программируется имп на языке squirrel, о котором я не могу сказать ничего плохого. Это такой «скриптовый C». Т.е. синтаксис — от С, динамические типы, автоматическое управление памятью — от скриптов. Интерпретатор и компилятор байткода имеют размер 7К строк на C++. Интерпретатор можно скачать в виде исходника под linux или установить из macport-ов на маке. Классы, относящиеся к самому imp-у описаны в девелоперской вики
2. Impee, «импуемый». Это разъем, в который вставляется imp. Каждый разъем имеет чип-идентификатор импуемого (ATSHA204), который участвует в шифровании трафика от импа к Планировщику. В планировщике в виде прямоугольничков отображаются именно impee, а не импы. И ваш код, или как они его называют, «прошивка» (firmware), закачивается при включении impee с любым вставленным импом. То есть импы можно свободно переставлять местами, если сохранённая конфигурация wifi позволит им подключиться к сети. Сразу после включения и установления связи во вставленный имп зальют прошивку, которая в Планировщике связана с этим impee. После заливки прошивки связь с интернетом может отключаться, имп будет продолжать работать, но связи с внешним миром, соответственно, не будет. Закачки firmware из локальной сети нет и делать они её не будут.
3. Планировщик (Planner). Это тот самый облачный сервис, который упоминают все обзоры electric imp-a. Бесплатный для девелоперских импов, а других я в продаже пока не видел.
Выполняет две независимые функции: создание и редактирование прошивок для импов и объединение импов и вимпов (виртуальных импов). Виртуальные импы на текущий момент — это модули, исполняемые на сервере electricimp.com, написанные самими электрическими имповцами. Свой код загружать в качестве виртуального импа пока нельзя. Сейчас есть ровно 10 вимпов, из них практически полезных — три: отправка и приём HTTP запроса, а также публикация данных на сервисе cosm.com.
Программирование imp-а
Последовательность запуска работающего ипма выглядит так.
1. Импа надо commission, ввести в эксплуатацию. Для этого его надо вставить в разъем (impee), вспышками (blink up) передать в него конфигурацию wifi-ной сети. Живьем это выглядит примерно так:
2. После этого в Планировщике появится новый голубой прямоугольник, соответствующий impee. В менюшке можно будет выбрать прошивку, предназначенную для этого устройства.
3. Прошивку надо написать и отладить. Это можно делать прямо в соответствующем интерфейсе планировщика. Он разделен на две части, в верхней пишется код, в нижней выводятся сообщения об ошибках и логи работы импа.
Мой кодик для imp-a, получающий и публикующий на cosm.com данные от датчика CO2, а также скриншот редактора в пларировщике с логом вывода imp-a. Обратите внимание, что в коде нет процедур, относящихся к общению с cosm-ом. Это общение происходит через интерфейс output, к которому в планировщике подключён виртуальный имп (vimp), на скриншоте выше он салатового цвета.
Датчик CO2
Измерять уровень CO2 в помещении интересно по трём причинам.
Во-первых, сам по себе этот газ в повышенных концентрациях неполезен. Слабое превышение приводит к ощущению несвежей головы и спёртого воздуха. Существенное повышение уровня CO2 (до 0.2 — 0.5%) приводит к учащённому сердцебиению, потере концентрации и легкой тошноте. Уровни больше 0.5% считаются токсичными, свыше 4% — опасными для жизни.
Во-вторых, в системах вентиляции датчики CO2 используются в роли «канарейки в шахте». Оказывается, что как правило, повышенные уровни CO2 сопровождаются повышенными уровнями других загрязнителей воздуха, например фенолов и природных газов. Т.е. датчик CO2 можно рассматривать, как общий «датчик качества воздуха».
В третьих, CO2 удобно измерять оптическим методом (NDIR), что даёт исключительно хорошую временную, температурную и селективную (т.е. нечувствительность по отношению к другим примесям) стабильность.
Датчик K30 — это самый дешёвый (65$) измеритель уровня CO2, устроенный по принципу nondispersive infrared sensor (NDIR, en.wikipedia.org/wiki/Nondispersive_infrared_sensor). Можно сказать, что NDIR-сенсор — это спектрометр, измеряющий поглощение света единственной длины волны в зависимости от концентрации измеряемого газа. Для CO2 используется инфракрасный светодиод с длиной волны 4 микрометра.
Помимо аналогового выхода датчик умеет общаться с внешним миром по протоколам I2C и RS-232. Я не сумел подключиться к нему по i2c, ни imp-ом, ни ардуиной уно. При этом код для ардуины я взял из даташитов производителя, но ни одного байта принять (и кажется даже успешно послать, что совсем удивительно) от датчика не удалось. У меня нет логического анализатора, поэтому точной диагностики я не получил, но больше всего похоже было на несоответствие реализаций протокола i2c датчиком и контроллерами. Документация интерфейса i2c импа дополнительно тоже врёт — метод write возвращал -2, хотя должен был -1 для неуспешной отправки, в общем я решил обратиться к старому доброму RS232.
К сожалению, общаться с датчиком надо по тяжёлому промышленному протоколу ModBus. К счатью, даташит приводит волшебную строку байтов, которую надо послать, чтобы прочитать данные измерений CO2. Так что я не стал глубоко вникать в промышленные протоколы, послал волшебную строку и получил нормальный ответ!
Сейчас уровень углекислого газа в помещении, где лежат мои имп и датчик можно посмотреть тут. Сейчас датчик периодически находится в состоянии «кишки наружу» и отключается от косма, но надеюсь, когда вы будете читать эту статью, он будет online.
Выводы
Мне electric imp очень понравился за оригинальность и продуманность концепции, а также безглючность. Его облачная часть, включая документацию, пока носит следы бурной доработки, но надеюсь, что дело у ребят пойдёт и мы сможем использовать импов там, где это уместно и удобно: в домашней автоматизации, роботах и системах мониторинга.
Датчик углекислого газа K30 удобен и надёжен, если общаться с ним по интерфейсу RS-232. I2C требует отладки, я не единственный, кто столкнулся с этой проблемой.
Автор: variomap