Привет, GT.


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


  1. Компактными — чтобы не увеличивать размеры устройств
  2. Экономичными — чтобы долго работать даже на батарейках
  3. Дешёвыми — чтобы их использование имело какой-то экономический смысл

К всеобщему счастью, сейчас таких средств появилось достаточно много — начиная с в той или иной степени удачных попыток адаптации старого доброго Wi-Fi к этим требованиям (я сейчас в большей степени про устройства класса battery-powered Wi-Fi, от ESP8266 до QCA 4004 и TI CC3200) и заканчивая специализированными протоколами, изначально сделанными под данные требования: в первую очередь ZigBee, Z-Wave и 6LoWPAN.


Наиболее гибким, удобным и перспективным из этого является 6LoWPAN (а если вы слышали произносимое с придыханием слово «Thread», то он собственно поверх 6LoWPAN и работает) — и, собственно, мы как раз и занимаемся разработкой модулей и устройств с использованием 6LoWPAN.


Но сетевые протоколы — это, очевидно, лишь половина беды. Вторая половина — «железо», на котором они будут работать.



Модули 868 МГц нашей разработки на TI CC1310


В последнее время возникла мода клеить этикетку «IoT» буквально на всё, что хоть как-то умеет работать с «беспроводкой» — начиная с Arduino с нацепленными BLE- или Wi-Fi-шилдом и заканчивая всевозможными морально устаревшими чипами, к которым десять лет назад выпустили «официальный» стек ZigBee. У человека, который впервые в это погружается, голова закружится достаточно быстро и с неприятно большой скоростью.


Мы в своей работе однозначно определились с выбором платформы на обозримое будущее — это последнее поколение SoC Texas Instruments серии SimpleLink, чипы CC1310, CC2630 и CC2650.


Под хабракатом — объяснение, почему выбор именно таков и почему мы считаем его правильным.


Итак, сначала немного модифицируем требования — чтобы они описывали именно чип:


  1. Энергоэффективность. Чип должен уметь минимум три режима — глубокий сон с сохранением памяти и пробуждением от внешнего прерывания, режим «спящего роутера» (радиоканал работает, всё остальное просыпается, если в радиоканал что-то прилетело) и обычную работу
  2. Компактность. Так как IoT приходится встраивать в самые неожиданные места, то чип в LQFP-100 с его 2,5 см² занимаемой площади — это плохой вариант, не позволяющий сделать компактное решение.
  3. Стоимость. Она не обязательно должна быть трёхгрошовой, но она должна быть разумной. Впрочем, 15-долларовые монстры обычно отсеиваются уже на предыдущем пункте.
  4. Программная поддержка, то есть в нашем случае — Contiki или, лучше, RIOT OS. Конечно, вы можете взять FreeRTOS и начать впиливать в неё сетевой стек с IPv6 самостоятельно, но это занятие не для слабых духом.

Линейка SimpleLink в её последней инкарнации состоит из четырёх основных моделей:


Модель Корпус Память CPU RF CPU Сопроцессор Радио 802.15.4 BLE
CC1310 QFN-48, QFN-32 128 кб flash + 20 кб RAM Cortex-M3 Cortex-M0 16-bit SC < 1 ГГц Есть Нет
CC1350 QFN-48, QFN-32 128 кб flash + 20 кб RAM Cortex-M3 Cortex-M0 16-bit SC < 1 ГГц + 2,45 ГГц Есть Есть
CC2630 QFN-48, QFN-32 128 кб flash + 20 кб RAM Cortex-M3 Cortex-M0 16-bit SC 2,45 ГГц Есть Нет
CC2650 QFN-48, QFN-32 128 кб flash + 20 кб RAM Cortex-M3 Cortex-M0 16-bit SC 2,45 ГГц Есть Есть

Теперь пойдём по пунктам списка — почему нам нравится именно эта линейка, а не какая-то другая.


Энергоэффективность. Помимо обычных для всех микроконтроллеров режимов сна — их здесь несколько штук, от «умри всё живое» с потреблением масштаба 0,1 мкА до Idle с сохранением памяти, регистров и тикающими часами при потреблении 1 мкА, у последнего поколения «цецешек» появились сразу несколько забавных особенностей.


Во-первых, это три (три, Карл!) процессорных ядра. Основное — Cortex-M3 на 48 МГц, при его работе суммарное энергопотребление будет около 2,5 мА в отсутствие активности по радио. Оно, в общем, такое же, как у всех прочих MCU на ARM.


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


Третье ядро — специализированный 16-битный Sensor Controller Hub, нечто с неафишируемой архитектурой и генератором прошивок. Это микропотребляющее ядро, отвечающее за значительную часть периферии, включая АЦП — можно, например, ловить различные события на аналоговых входах и при их наступлении будить основное ядро, а потом и радио, а потом и весь остальной мир. SC также умеет работать с сенсорными кнопками, таймерами, I²C, SPI и UART (sic!). Всё это — при выключенном основном ядре и с потреблением микроамперного масштаба.


Наконец, у всех чипов линейки есть встроенный DC/DC (sic!). Фокус в том, что радиочасть чипов питается пониженным напряжением — и в прежние годы приходилось либо ставить внешний DC/DC, либо мириться с потерями на встроенном LDO. CC13xx/CC26xx позволяют выбирать один из трёх вариантов — полностью внешнее питание, встроенный DC/DC или встроенный LDO. В случае с DC/DC внешних элементов — один дроссель.


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


Компактность. Все чипы есть в трёх QFN-корпусах — 7x7, 5x5 и 4x4 мм. Корпуса в значительной степени совместимы между собой по ножкам — понятно, что сделать 2450 МГц и 868 МГц универсальной платой вы не сможете из-за сильно разного согласования антенн, но если вам надо разработать линейку универсальных модулей, задача перехода между разными чипами сильно упрощается.


Между собой корпуса отличаются количеством GPIO — 31, 15 или 10. Для большинства проектов разумным компромиссом представляется чип 5x5 мм, но тут не могу не заметить, что из-за отсутствия их в продаже в конце прошлого года мы все свои модули сделали на чипах 7x7 мм.


Стоимость. Розничный ценник на чипы в России — в районе $6—7 (отдельные герои, конечно, и по $12 за штуку продают, но 6-7 — это тот ценник, по которому мы регулярно и спокойно берём, когда нужно штук десять-двадцать чипов), официальный оптовый ценник на сайте TI на полную катушку опускается до $2,5.


Это не дёшево и не дорого. С учётом возможностей чипов — оптимальный средний уровень; можно найти чипы дешевле, но они будут проще. Можно найти дороже, но их возможности в 99 % случаев будут не нужны. Можно делать на чудесах китайской промышленности, но я в целом не думаю, что вы мечтаете отвечать за стабильность работы какой-нибудь SCADA-системы на крупном промышленном объекте, сделав её на ESP8266.


С готовыми модулями на этих чипах дело несколько сложнее — до недавнего времени единственным вариантом приобретения был набор разработчика за $299 и дополнительные радиомодули к нему по $99 пара. Сейчас появился LaunchPad за $29.


Наши собственные модули в поштучной рознице стоят $20 — хотя тут правильнее сказать «будут стоить», так как пока идёт разработка прошивки и некоторых связанных сервисов, мы их продаём только по прямой договорённости, например, дружественным интеграторам и другим заинтересованным лицам.


Оптовая цена такого модуля при достаточно крупной партии легко падает до $10. Опять же, вполне разумное соотношение цена/качество.


Программная поддержка. Всё сложно. Тут, если честно, вообще у всех всё сложно — я ещё не встречал тех, у кого было бы просто.


Для своих чипов TI выпускает родную TI RTOS, в которой есть хорошая поддержка наличествующей периферии — но нет сетевых стеков. А сетевой стек — это то, что отличается IoT от не IoT.


Традиционно в IoT используют Contiki OS — и так поступаем и мы. Формально она поддерживает эти чипы. Но… но…


В конце прошлого года «из коробки» фактически не работал ни 6LoWPAN в Contiki, ни 6lbr на гейте (он же сервер 6LoWPAN-сети). После их починки выясняется, что имеющийся в Contiki уровень приложений… в общем, его там почти нет, если говорить коротко. После написания кода для нужных нам вещей — обычный в общем-то набор датчиков, GPIO, АЦП и т.п. — где-то 95 % реализации уровня приложений оказались нашими.


Ещё хуже ситуация с драйверами, то есть прослойкой между тем самым уровнем приложений и собственно периферией чипа — «из коробки» был драйвер UART и GPIO (только на выход), а также драйвер кнопок на GPIO, который работал так, что лучше бы его не было. Таймеры, ШИМ, АЦП, прерывания на GPIO, нормальное подавление дребезга кнопок, i²C, в конце концов — всё это мы написали уже сами.


Особенно весело было с таймерами и ШИМ, потому что на тот момент даже в документации TI информация по работе с ними была, скажем так, отрывочной (но тут спасибо саппорту TI — ответы они давали в течение нескольких дней, даже если они были политически неудобными: например, чтобы написать драйвер ШИМ, надо было читать документацию от другого чипа, а примеры кода брать чуть ли не от третьего).


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


Как вы уже догадались, поддержку полноценного Idle с выборочным отключением ненужной периферии (включая радиомодуль) мы делаем сами. Уже почти сделали.


Наконец, радиоканал неплохо бы шифровать. Уровень приложений — чтобы не украли данные, уровень сети — чтобы не забили канал простейшей DoS-атакой с валидными заголовками и мусором в теле. Шифрования в Contiki не то чтобы нет совсем — но то, что есть в открытом доступе, находится в зачаточном состоянии. В общем, считайте, что его нет.


При этом у Contiki есть существенно более свежий конкурент — RIOT OS. Но в RIOT пока что нет поддержки данных чипов.



Модуль управления 75-Вт светодиодной лампой: вкл/выкл, диммирование 0-10 В, контроль целостности двух светодиодных линеек


Вместо заключения. У читателя, дошедшего до этого момента, в уме остаётся только один вопрос — почему мы не бросим эту затею и не займёмся чем-нибудь попроще?


Потому что, увы, при всех громких и пафосных речах про наступающее засилье «Интернета вещей» ничего попроще нет.


Во-первых, нет чипов с возможностями, сравнимыми с CC1310 и CC2650 — по вычислительной мощности, по периферии, по возможностям энергосбережения… Есть чипы дешевле и проще, которыми можно успешно решать какие-то отдельные частные задачи — например, приёмопередатчики со встроенным ядром 8051 можно взять раза в два-три дешевле. Вот только 8051 — это, например, не совсем то ядро, на котором вы захотите поднимать mesh-сеть или даже писать обработку какого-нибудь сложного набора датчиков, чтобы не грузить радиоканал сырыми данными. То же самое касается и всевозможных вариантов ESP8266 — отличная штука для любительских поделок, но сеть управления уличным освещением на Wi-Fi я представляю довольно плохо хотя бы потому, что Wi-Fi на улице не является безлицензионным (а ещё хуже я её себе представляю, принимая во внимание всевозможные взбрыки китайской прошивки этого ESP и её любовь к зависаниям).


Во-вторых, как я уже говорил, это — довольно типичное состояние промышленного «Интернета вещей» в наши дни. Как только кто-нибудь начнёт рассказывать вам про «настоящий IoT-проект за вечер» — нажмите пару раз page down, там будет не IoT, а очередная умная розетка из ардуины с BLE-шилдом.


В-третьих, у нас есть надежда принести в отрасль IoT свежую струю доступных, понятных и стабильно работающих устройств с технологическим уровнем, соответствующим 2016, а не 2006 году. Сейчас мы довольно плотно работаем с несколькими системными интеграторами и производителями конечных устройств по вопросам интеграции поддержки сетей 6LoWPAN в их проекты и продукцию — и, разумеется, уже имеем допиленную и стабильную Contiki OS, с поддержкой всей нужной нам периферии, драйверами различных датчиков и прочим обвесом.


Однако в планах на лето у нас несколько большее — сделать платформу CC2650 + Contiki = 6LoWPAN доступной для любителей и образования (а подготовка студентов, понимающих, что такое IoT — это отдельная больная тема в связи с тотальным отсутствием современных и хоть в какой-то степени открытых IoT-платформ, пригодных для обучения). Мы уже начали предоставлять свои устройства под различные мероприятия (да, про датчики влажности почвы надо не забыть рассказать отдельно, это интересная тема), и у нас есть определённые планы по выпуску в свободную продажу набора быстрого прототипирования Unwired Kit.


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


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