Що для Вас Розумний Дім?
У статті "Універсальне Ethernet-пристрій для управління будинком" я зробив невеликий огляд відносно недорого рішення, що дозволяє опитувати різні датчики і кнопки, а також управляти різними навантаженнями (лампи, електроприлади, нагрівачі). У цьому матеріалі я хотів би продовжити розмову про використання мережі Ethernet в Розумному Будинку.
Всілякі готові IP-менеджери типу IP Power або NetPing при всіх перевагах мають і свої недоліки. По-перше, це, звичайно ж, ціна. По-друге, відсутність зі зрозумілих причин вихідних кодів прошивки і неможливість в повній мірі змінювати логіку роботи пристрою. Якщо з ціною все більш-менш зрозуміло, (хочеться зробити пристрій своїми руками як мінімум в 5-7 разів дешевше), то щодо логіки слід пояснити.
Отже, я хотів зробити пристрій, яке б мало вміло:
Очевидно, що описаний вище базовий функціонал не існує в доступних на ринку готових продуктах.
Для створення такого пристрою я застосував мікроконтролер Atmega168 (а пізніше Atmega328) від компанії Atmel, який має на борту 16Кб Flash для програмного коду і мікросхему ENC28J60 від Microchip, яка займається підтримкою мережі Ethernet і з'єднана з МК за допомогою інтерфейсу SPI.
Схема пристрою від Guido Socher (tuxgraphics)
Чому були обрані ці мікросхеми. По-перше, досить проста принципова схема пристрою. По-друге, низька вартість компонентів. По-третє, Atmega168 і ENC28J60 доступні в DIP-корпусах і мають по 28 ніг. Це означає, що зібрати такий пристрій можна самостійно вдома без спеціальних навичок і устаткування. Щоб ще спростити схему пристрою, застосовується RJ-45 роз'єм MAG-Jack з вбудованим трансформатором. Фактично все, що потрібно для складання пристрою - це МК, інтерфейсний чіп, роз'єм, кварцовий генератор і пара резисторів.
В результаті вийшло ось таке мініатюрний пристрій c розмірами 75х40 мм. Але фактично це Web-сервер з потужними функціональними можливостями.
Що б ви думали це таке? Це Web-сервер.
Для програмування пристрою можна використовувати найпростіший програматор типу USBasp.
Зліва програматор (потрібен тільки для завантаження прошивки, праворуч - модуль
Тестова прошивка. Управління виходом через Web
Головна ідея полягає в тому, щоб мати можливість кожен порт мікроконтролера налаштовувати індивідуально, використовуючи Web-інтерфейс. Таким чином, будь-який порт з доступних можна налаштувати як вхід (кнопки, датчики), як вихід (лампи, прилади) або як АЦП (всілякі сенсори, в разі, якщо порт МК має вбудований АЦП). Тим самим я як би поділяю готовий прилад на дві частини - ядро і модуль розширення з клемами, до якого підключаються кінцеві пристрої і датчики. Наприклад, до сьогоднішнього дня мені потрібно було 10 входів для кнопок і 3 виходи для управління лампами. Але з'явилося нове завдання і тепер потрібно 9 входів і 4 виходи. Все, що необхідно, це змінити підключення до модуля розширення і виконати перенастроювання девайса за допомогою будь-якого браузера, але ніяких змін в програмному коді ядра, перепрошивки, програматора це не зажадає. З іншого боку в будинку може функціонувати кілька пристроїв, що мають різну конфігурацію входів і виходів, але абсолютно однакову прошивку. У цьому сенсі індивідуально настроюється по Etnernet в візуальному режимі функція кожного порту по суті замінює традиційне програмування і прошивання, які вимагають додаткових знань, обладнання та головне - часу.
В описуваному мною пристрої є 13 вільних портів. В даний момент всі порти мають назви, асоційовані з портами МК (D0, D1 і т.д.), це було зручно для розробки, але в подальшому можна відмовитися від такої нумерації на користь якої-небудь більш традиційною.
Перелік доступних для управління і настройки портів контролера
Клікнувши на назву порту ми потрапляємо в режим настройки. Як я вже говорив, кожен порт можна конфігурувати як IN (вхід), OUT (вихід) і ADC (АЦП).
Зауважу, що всі налаштування зберігаються в EEPROM (незалежну пам'ять), тобто після виключення пристрою зберігаються.
Якщо ми сконфігуріруем порт як OUT (вихід), то в Web-інтерфейсі з'явиться можливість побачити поточний стан виходу State. яке може приймати значення OFF (вимкнено) або ON (включено), а також можливість тут же включити або вимкнути підключене навантаження.
У разі, якщо ми настроєм порт як ADC (АЦП), ми можемо побачити значення від 0 до 255, яке характеризує стан датчика.
Однак найцікавіші настройки у порту в режимі IN (вхід).
Значення State очевидно - поточний стан входу. Решта вимагає окремого пояснення.
Основна проблема багатьох пристрій Розумного Дому полягає в тому, що вони не можуть самі повідомляти майстра / сервера / контролеру про спрацювання будь-якого входу. Зазвичай майстер, в ролі якого в моєму випадку виступає сервер (ПК), сам з певною періодичністю опитує пристрою. У багатьох випадках частота опитування не має вирішальної ролі, але тільки не у випадку з вимикачами світла. Уявіть собі ситуацію, коли після натискання на вимикач, світло включається із затримкою (при використанні механізмів, подібних latch в 1-wire) або зовсім не включається (ми потрапили в момент між опитуваннями). Таким чином, щоб повноцінно працювати з вимикачами світла, необхідно в циклі кілька разів на секунду опитувати кожен вимикач. Це створить пристойний трафік в будь-якого роду мережі.
У цьому сенсі логічним бачиться інший підхід. Пристрій сам визначає факт натискання кнопки, повідомляє про це сервера і запитує його що йому робити. Саме така логіка і закладена в прошивку нашого Ethernet-пристрої.
Отже, кнопка, спрацювала, МК зафіксував натискання (до речі, в прошивці реалізований ефективний програмний алгоритм захисту від брязкоту контактів - Debouncing) і по протоколу HTTP зв'язується з сервером, повідомляючи йому потрібну інформацію. Протокол HTTP обраний не випадково. З одного боку це в деякій мірі гарантує доставку пакета, адже HTTP працює поверх TCP, з іншого боку, що більш важливо, значно полегшує, як мені здається, програмування на стороні сервера. Адже у нас вже працює домашній Web-сервер. працює на Apache!
Лог Apache. Пристрій повідомляє серверу про зміну стану входу 0 (D0)
Нам необхідно лише написати найпростіший PHP-скрипт, який відповідає на запит пристрою.
Якщо спрацював вхід "0", повідомити пристрою у відповідь "6: 2". Але що це означає ця команда?
Команда пристрою складається з двох полів, розділених двокрапкою.
Перше поле (6) - номер порту від 0 до 12 (у нас 13 входів / виходів)
Друге поле (2) - дія. Можливі варіанти (0 - вимкнути, 1 - включити, 2 - переключити з вкл на викл або навпаки)
Важливо зауважити, що сервер може послати пристрою відразу кілька команд.
Наприклад, "6: 2, 5: 1", між якими ставиться крапка з комою, що буде означати "Вихід 6 переключити, вихід 5 включити". В одній відповіді сервера може міститися до 13 подібних команд. Просто, чи не так?
Але що якщо в нашій домашній взагалі мережі зовсім немає сервера або ж він з якихось причин недоступний або несправний? Не проблема! Повернемося до налаштування входу.
Тут в поле Cmd в тому ж самому форматі, наприклад "6: 2" прописується команда, яку виконає пристрій якщо:
1) Сервер не прописаний в конфігурації пристрою
2) Сервер прописаний, але не відповідає протягом 3 секунд
Таким чином, якщо говорити, наприклад, про управління світлом, ми можемо використовувати цей пристрій як саме по собі, без будь-яких серверів. так і в парі з сервером. де команди, описані в Cmd виступають в ролі сценарію за замовчуванням. Ми в жодному разі не залишимося без світла. Те ж саме можна сказати і щодо більш критичних варіантів застосування, пов'язаних з безпекою і системами захисту. Є сервер - запитуємо, немає сервера - вирішує питання самостійно.
Але що робити, якщо у нас в мережі два таких пристрої, а за сценарієм при спрацьовуванні входу на першому влаштуванні, повинен переключиться вихід на іншому? Наприклад, датчик протікання в одному місці, а кран з приводом в іншому? Для цього існує останнім поле Eth:
Управляти пристроєм можна не тільки через Web-браузер або за допомогою скриптів, але і через будь-які програми типу wget, curl, адже для передачі інформації використовується URL рядок і GET-запити типу
що мені здається дуже зручним, тому що дозволяє використовувати величезну кількість всіляких інструментів, утиліт і полегшує інтеграцію Ethernet-пристрої в систему розумного будинку, на чому б вона не будувалася.
Анітрохи не складніше отримати поточний стан порту.
За даним запитом Ethernet-пристрій видасть тільки стан (ON, OFF або значення АЦП) без будь-якої зайвої інформації. Команду "get" зручно використовувати в програмах на сервері. Так, наприклад, щоб вважати стан АЦП пристрою, достатньо всього одного рядка на PHP!
Для компіляції і заливки прошивки в Linux потрібно всього три пакети: власне сам компілятор gcc-avr, бібліотеки для роботи з AVR і програма, що працює з програматором, широко відома "дудка" avrdude
Щоб скомпілювати прошивку, потрібно розпакувати архів (внизу статті) і виконати команду make.
Прошивка программатором USBasp здійснюється за допомогою команди
На поточний момент все, про що написано в статті, займає в пам'яті мікроконтролера всього 15252 байт.
Ще одне фото пристрою в момент розробки. Стенд для налагодження і експериментів.
Налагоджувальний стенд. Ethernet-пристрій, програматор
Кнопки, змінний резистор для налагодження АЦП
Діоди і сімістори (до речі, від ключа 1-wire) для тестування виходів
Прошивка для Atmega328
Програмування фьюз - ДУЖЕ відповідальний процес, так як легко можна порушити працездатність мікроконтролера.
atmega32u4 від ENC тактується. (Можна вичитати з неї все).
Може прошивку як то перекомпіліровать під atmega32u4 потрібно?
Або закинути цю ідею?
Всі інші схемотехнічні варіанти наведені тут, з полтика запускалися.
Схему перевіряв кілька разів, ніби все ок. Підкажіть в чому може бути проблема? Є підозра на неробочий разїем або мікросхему ENC. Як можна діагностувати пристрій ще?
Може ваш погляд з боку допоможе? Дякуємо!
П.С. Дякую за статті! Завжди із задоволенням заходжу на ваш сайт.