Світити завжди, світити скрізь. Початок

Напевно, це такий психічний розлад - прагнення будь-що реалізувати щось своє, бажано з нуля. Особливо приємно попередньо зруйнувати дотепер зроблене попередниками. Невгамовне бажання побудувати власний велосипед пояснюється і тим, що всі існуючі на поточний момент рішення обов'язково володіють фатальними недоліками - занадто мало коліс, надмірна кількість педалей, незручно рулити при посадці задом наперед і так далі. Тут включається буйна фантазія, і через деякий час світова громадськість виявляється ощасливлена принципово новим транспортним засобом, ексклюзивно адаптованим для двох рептилоїдів і одного єнота.

Це я власне до того, що мені завжди хотілося побудувати свою систему домашньої автоматизації. Напідключати купу датчиків і виконавчих пристроїв, налаштувати потрібну безпосередньо мені логіку роботи, і насолоджуватися затяжним виловом цікавих багів. Звичайно, можна скористатися готовими рішеннями. Зараз на ринку чимало цікавих пристроїв для «розумного будинку», а вже якщо підходити до питання монументально, то чому б не побудувати систему на базі промислових ПЛК і модулів введення-виведення? Завести все це добро в SCADA-систему... Досить привабливо. Але творчий свербіж не дозволяє скористатися багаторічними напрацюваннями сотень і тисяч інших людей, саме так починається капоейра на граблях.

Трохи здорового глузду у мене ще залишилося. До того ж, з шаф і з полиць на мене періодично з німим докором подивляються незакінчені пристрої, до яких я повинен дістатися «коли-небудь». Так що, треба поставити собі відносно реальну задачу, вирішення якої можна довести до логічного завершення. Отже, почнемо з управління освітленням у невеликій міській квартирі.

Відштовхуюся від таких тез:

1) Капітальний ремонт. У плані силової і слаботочної проводки руки повністю розв'язані.

2) Хребет системи - тільки дротової. Ні на Wi-Fi, ні на 433 МГц в критичних областях не покладаюся.

3) Мінімальне використання готових пристроїв і блоків. Для самоосвіти, прокачування навичок розробки, монтажу, програмування.

Тепер конкретизую.

1) Основне освітлення - світлодіодна стрічка. Лампочки відправляємо на звалище історії. Додаткове освітлення - люмінесцентні лампи. Це для пташок. Їх зір від нашого неабияк відрізняється, тому для того, щоб їм було добре і комфортно, застосовуються повноспектральні лампи з деякою кількістю ультрафіолету.

2) Включення-вимикання (для всіх освітлювальних приладів) і регулювання яскравості (для стрічок) повинні здійснюватися як вручну, так і програмно.

3) Для нештатних ситуацій необхідний «залізний» обхід системи. Грубо кажучи, «мізки» відрубалися - переходимо на ручне управління.

Зараз я зосереджений на другому пункті. Тут виділено такі завдання:

1) Формування списку виконавчих пристроїв. Всього два. Драйвер світлодіодної стрічки і «реле». У лапках - тому що за фактом воно симісторне.

2) Список керуючих пристроїв. Теж два. Регулятор з кнопкою і просто кнопка.

3) Вибір способу зв'язку. На ньому потрібно зупинитися детальніше.

Раз вже я вирішив, що будуть використовуватися дроти, то варіантів небагато. Можна використовувати Ethernet. Одна мережа, всі на TCP/IP. Привабливо. Але коли я собі уявив мікроконтролер з Ethernet і єдиною кнопкою, мені стало трохи сумно. Йдемо далі, в бік зменшення кількості проводів і мінімізації вимог до заліза. Готове рішення - DMX512. На низькому рівні RS-485, все досить просто в реалізації, але немає зворотного зв'язку. Що ще? CAN? Хороший промисловий варіант, але хочеться ще простіше. Modbus за RS-485? Вже тепліше. Але як же велосипедобудування? До того ж, я вже налаштувався на використання дешевих мікроконтролерів з мінімальною обв'язкою. І ось воно, рішення. Візьму-но я RS-485, та придумаю для нього свій ерзац-протокол. При цьому, правда, треба залишити шлях до відступу. Якщо закопаюся, то знову повернуся до розгляду Modbus.

Отже, мережа RS-485, майстер - комп'ютер (малинка, швидше за все), всі інші пристрої - ведені. У плані заліза - ATmega328 + MAX485. Контролер саме такий через наявність декількох штучок, при вдалому розкладі в «серійному» пристрої замінюється на ATmega8. Пакет складається з п'яти байт. Адреса пристрою, код команди, два регістри даних і контрольна сума. Ведучий відправляє пакет, всі ведені його приймають і розбирають. Якщо адреса збігається і контрольна сума вірна - виконуються певні дії і надсилається підтвердження. По-моєму, простіше вже нікуди.

За справу я вирішив взятися «з середини». Силова розводка і всякі пристрої захисту - це потім, оскільки тут все відносно зрозуміло. А ось у проектуванні та налагодженні нових для мене пристроїв буде багато веселих відкриттів, тому я починаю з заліза. А точніше - з двох пристроїв, регулятора і драйвера світлодіодної стрічки.

Регулятор

Механічний енкодер з кнопкою, мікроконтролер, адаптер RS-485. Спочатку реалізую зв'язок, потім власне обробку енкодера. Зв'язок працює наступним чином:

1) Під час включення пристрою значення регістрів встановлюються в 0. Пізніше будуть завантажуватися з EEPROM. Адреса забита в коді, і теж надалі буде зберігатися в енергонезалежній пам'яті (заглушка процедури зміна адреси є).

2) У процесі ініціалізації налаштовується режими роботи UART і таймера (використовується для припинення прийому за таймаутом)

3) На з'єднаних разом пінах ауд RE і DE адаптера MAX485 низький рівень - це режим прийому.

4) Очікування прийому першого пакету. Як дочекалися - запускаємо таймер і приймаємо ще чотири байти.

5) У разі успіху прийому п'ятибайтового пакета і коректної контрольної суми (це дійсно просто сума, не CRC) пакет можна парсити.

6) Під час збігу адреси в пакеті з адресою пристрою перевіряємо код команди (другий байт пакета), залежно від нього виконуємо необхідні дії (наприклад, записуємо в змінні значення третього і четвертого байта). У рамках описаної системи я називаю ці змінні регістрами пристрою.

7) Надсилаємо підтвердження: на ауд RE і DE високий рівень, роздільна здатність передачі, відправка пакета (з адресою майстра, якимось кодом команди і поточним значенням регістрів пристрою).

8) GOTO 3

Таймаут прийому відстежується просто: спочатку прапор таймауту - 0. Після переривання таймера він встановлюється в 1. Цей прапор перевіряється в циклі очікування чотирьох байтів пакета.

Тепер обробка енкодера. Принцип я почерпнув звідси.

Коротко - зберігаємо поточний стан енкодера, за перериванням таймера зчитуємо новий. Залежно від того, що змінилося - визначаємо, куди повернулася ручка і чи натискалася кнопка. Так що, в пункт 2 вищенаведеного списку додається ініціалізація Timer2 з розрахунком на те, що переривання відбуватиметься приблизно з частотою 1 кГц. Плюс, щоб гарантовано не заважати роботі UART, в процесі читання або запису в 0 виставляється прапор дозволу опитування енкодера (перевіряється в обробнику переривання другого таймера).

Власне, більше нічого регулятору вміти не потрібно.

Я не описую помилки в розводці та інші дрібні неприємності. Відмивати плату теж поки ні до чого - пару тичків паяльником вона ще отримає

Про граблі на даному етапі

З енкодером у мене була тільки одна неприємність. Вона взагалі була пов'язана з усіма пристроями. Періодично в мережі виникав зайвий нульовий байт, який сильно псував картину. За умови наявності відсутності осциллографу і логічного аналізатора, проблему довелося шукати теоретично. Виявилося достатнім підтягнути TX до Vcc, щоб при перемиканні «прийом-передача» не відбувалося непотрібних процесів.

Драйвер

Завдання зі зв'язком ми вже вирішили. Беремо те, що стосується RS-485 з реалізації регулятора і додаємо ШІМ на одному виході за допомогою Timer2. Перший регістр пристрою відповідає за яскравість, другий за включення і вимикання виходу як такого. У плані заліза - використовую вже перевірену схему з двох біполярних транзисторів (раніше були BC639 і BC640, зараз використовую SMD BCP53 і BCP56), на виході - IRF540. Цікавих приколів з драйвером не було, якщо не вважати таким глючне 12-вольтове джерело живлення, робота якого призводила до зависання всієї системи разом.

Тут теж чимало монтажного неподобства. Ранній прототип, що вже там.

Загальні зауваження щодо «заліза»

Мікроконтролери тактуються на 8 МГц без зовнішнього кварцу. Обв'язка по харчуванню складається з єдиного конденсатора на 100 нФ. Вивід ауд RST підтягнутий до харчування через резистор в 10 кОм. Я вже згадував про те, що стабільність роботи кардинально покращилася після підтяжки TX до лінії харчування. При спорудженні регулятора я не став покладатися на внутрішні підтягуючі резистори (на пінах, до яких підключений енкодер), а використовував зовнішні. Більше ніяких хитрощів (поки?) не знадобилося. Лінія RS-485 підтягнута до Vcc (A) і GND (B) через резистори в 560 Ом з боку провідного адаптера, з двох кінців термінована резисторами в 120 Ом.

Проект доступний на гітхабі, структура наступна:

- avr-dimmer - прошивка драйвера (проект Eclipse + AVR);

- avr-encoder - прошивка регулятора;

- host - софт майстра мережі (Python), про нього наступного разу;

- в корені лежать схеми (Eagle) і розводки друкарських плат (Sprint Layout 6).

Наступного разу я розповім про те, що відбувається на боці хосту (майстра мережі).

UPD. 2015-07-19 друга частина, в залізі теж є зміни.