25 дек. 2010 г.

Разрабатываем ядро для компонентов исполнительного уровня "умного дома"

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

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

Начнем с радиомодуля. Вначале я хотел использовать уже полностью собранные и готовые (микроконтроллер + трансивер + антенна) радиомодули, совместимые с протоколом ZigBee или чем-нибудь подобным. Они могли служить в качестве ядра для устройств системы - все необходимое уже внутри них. Примеры подобных модулей - RC2300 или XBee.
Но меня остановила цена этих модулей. Отдавать порядка тысячи рублей за модуль, который будет заниматься лишь передачей показаний датчика температуры или освещенности - это на мой взгляд весьма расточительно.
Далее, я предполагал использовать отдельные микросхемы с SoC (System on Chip), предоставляющими и микроконтроллер и IEEE-802.15.4/ZigBee-совместимый трансивер. Еще рассматривался вариант использования отдельных микросхем трансиверов, без микроконтроллеров.
В качестве примера SoC с МК и трансивером внутри можно привести CC2530 от TI или JN5139 от Jennic. А отдельные трансиверы - это CC2420 или AT86RF230 от Atmel.
Как видно, цена этих микросхем уже вполне приемлемая - порядка 300 рублей за кристалл. Но тут внезапно выплыла другая проблема - так как вся система будет собираться вручную - то для пайки компонентов на плату будет использоваться паяльная станция. Производственные станки, крепящие компоненты на плату по заданной программе, мне увы недоступны. Следовательно, для используемых компонентов приветствуется простота монтажа. А ни один из рассмотренных мною компонентов таким качеством не обладает. Все микросхемы выполнены в корпусе QFN:
Корпус QFN (http://i.eicom.ru:8080/i/catalog/645/313-20-QFN.jpg)
Как видно, подобный корпус не имеет торчащих наружу выводов - есть лишь контактные площадки по бокам, причем некоторые модули (например CC2530) лишены и их - контактные площадки расположены под чипом. Все это, при размерах микросхемы порядка 7...8 миллиметров делает трудновыполнимым или вообще невозможным для меня, припаивание этих компонентов на плату руками, при помощи паяльника. В промышленных условиях, подобные микросхемы припаивают при помощи легкоплавкого припоя и специального фена. Естественно, у меня нет подобного оборудования, ни денег на него, да и возможны трудности с самостоятельным, штучным изготовлением печатных плат.
Опечалившись от нежелания производителей сделать ZigBee-совместимый трансивер в корпусе с обычными, "традиционными" выводами, я стал смотреть в сторону обычных радиотрансиверов, предполагая реализовать на досуге простейший стек протоколов, поддерживающий адресацию, шифрование данных и соединения типа "точка-точка" и "звезда". К счастью, удача улыбнулась мне и я нашел дешевый радиомодуль - радиотрансивер + вся обвязка для него + встроенная печатная антенна. Называется он TR24A, стоит мало, имеет уже готовый и работающий драйвер (где-то на просторах Интернета), контакты модуля видны невооруженным глазом и к ним легко получить доступ жалом паяльника. Данный модуль общается с микроконтроллером через SPI.

Теперь перейдем к выбору микроконтроллера. Понятно, что это не должно быть что-то обладющее большой производительностью. Ведь задача микроконтроллера в устройстве исполнительного уровня системы - принимать управляющие команды и отправлять данные для управляющего компьютера, а также заниматься обеспечением работы управляющих механизмов и снятием данных с датчиков. Вполне хватит какого-нибудь AVR, PIC или MCS51.
В связи с вышеперечисленным, выбираемый микроконтроллер должен иметь два интерфейса SPI (один исключительно для радиомодуля - с ним бывали проблемы, когда к SPI цеплялся не только радиомодуль), интерфейс I2C (как и предыдуший интерфейс, он весьма распространен - может быть как и в датчике, так и в каком-нибудь исполнительном устройстве). Желательно наличие UART'а - хотя бы для целей отладки. Также желательно наличие какого-нибудь простенького 8/16-разрядного АЦП - может пригодиться, если вдруг для снятия показаний температуры я стану использовать термопару или что-то в этом роде.
Я забил все свои пожелания в поисковик на gaw.ru и получил небольшой набор, состоящий из микроконтроллеров Atmel Corp, а также еще меньший набор из микроконтроллеров от SiLabs.
Из AVR'ов мне приглянулись микроконтроллеры в корпусах TQFP44 - корпус удобен для пайки паяльником, да и контроллеров с меньшим количеством выводов просто не было. C MCS51 та же история - либо QFN32, либо LQFP32.
Количество подходящих микроконтроллеров уменьшилось еще сильнее: вот AVR, а вот MCS51.
Окончательный выбор - микроконтроллер C8051F930-GQ архитектуры MCS51. Данная архитектура мне немного известна (благодаря лабораторным по "Организации и архитектуре ЭВМ", "Информационно-управляющим системам" и "Интерфейсам периферийных устройств" :) ). Кроме того, данный чип имеет наименьшее количество выводов из рассмотренных - корпус LQFP32:
Корпус LQFP32
В чипе есть ровно один интерфейс UART (а не 2 или 5), 2 SPI и 1 I2C - как по заказу! Кроме того, потребляемый чипом ток выгодно отличается от тех же AVR'ов - 4.1 мА против 20 мА.
Архитектура MCS51 позволяет использовать уже наработанный мною (и не мною) программный код, а также различные схемотехнические решения из стенда SDK1.1. Например схему подключения питания или драйвера RS-232...
Схема подключения питания к ADuC812 в стенде SDK1.1

Для сохранения управляющей программы можно использовать Flash-память программ в чипе. Памяти там аж 64 килобайта, тогда как, например, моя программа для SDK1.1 - "электронные часы", в которой был целый набор драйверов для RTC, I2C, UART, таймера №0 и клавиатуры (~2000 строк кода) занимала всего 9.9 килобайт.
Flash-память может перезаписываться при помощи инструкции MOVX, что будет полезно при обновлении программы "по воздуху". Кроме того, Flash можно перепрограммировать прямо в системе, используя для этого интерфейс C2. Что особенно ценно, выводы этого интерфейса выведены отдельно от остальных. Бывали случаи, когда радиомодули TR24A сгорали, когда к тому же SPI-интерфейсу подключали еще и программатор. В данном случае, подобная ситуация невозможна в принципе.

Теперь перейдем к схемотехнике. Я набросал небольшую схемку подключения радиомодуля к микроконтроллеру по интерфейсу SPI. Ну и плюс кнопка и светодиод для целей отладки.

Принципиальная схема отладочной платы для ядра исполнительного устройства
Линии интерфейса SPI микроконтроллера подключаются напрямую к соответствующим контактам TR24A. Различные сигналы (FIFO_FLAG, PKT_FLAG) радиомодуля подключены напрямую к выводам микроконтроллера, чтобы можно было контролировать их состояние в выполняющейся программе. Питания микроконтроллера и радиомодуля общее.
На вход питания поставлен конденсатор на 47 мкФ, чтобы сглаживать провалы напряжения. Для этих же целей между 3 вольтами и землей на входе микроконтроллера стоит пара конденсаторов на 100 нФ (согласно этой статье).
Интерфейс C2 разведен в соответствии со схемой из этого документа, случайно найденного в Сети. Теперь микроконтроллер можно программировать прямо в схеме, использую программатор FlashBlaster2, схема которого весьма проста и лежит на сайте производителя.