Я давно хотел собрать умный дом, и решил использовать именно эту платформу. Почему? Ну я довольно хорошо знаю C# и немного C++, а как известно, прошивки под Arduino пишутся именно на изменённых плюсах. К тому же платформа имеет цифро-аналоговый преобразователь, что упрощает работу с аналоговыми датчиками. В придачу платформа весьма известна и имеет большую модульную базу.
При всей своей любви к микроконтроллерам, я предпочитаю всё вычислять на винде, а вся моя сила в .NET приложениях. Это и стало моей проблемой. Я просто не мог воспринять среду разработки Arduino IDE. Пришлось привыкать. Однако простые проекты для разминки всё же работали в основном на ПК. Кого заинтересовала тема, прошу под кат!
Моим первым экспериментом стал простой обмен информацией по USB (последовательный порт), через который я отправлял пакеты с простыми командами для выполнения действий на микроконтроллере. Для примера использовал модель Arduino UNO.
Это – интерфейс программы для Windows. «Писк» — подача сигнала на пин (вывод Arduino) под номером 10 постоянного электрического сигнала, который запитывает подключённый мною зуммер. «LED» — подача постоянного тока на пин 13, который по умолчанию на контроллере подключен к встроенному светодиоду, который служит для отладки скетчей (прошивок).
Однако весь этот функционал лежит именно на контроллере.
Что же делает программа? Просто отправляет цифры в порт! «0» — значит отключить
светодиод, «1» — включить светодиод, «2» — отключить зуммер, «3» — включить
зуммер. Делается всё с использованием базовых элементов Windows Forms. Если
кому интересно, для обмена данными используется скорость 115200 бод. Благодаря
этому я могу без проблем просмотреть содержание сообщений от микроконтроллера в
Arduino IDE.
Я думаю, что многим сейчас захотелось узнать, что в прошивке микроконтроллера. Так-как это было относительно давно, искать код прошивки Arduino было не просто, но нужный файл всё-таки нашёлся!
int i = 0; // переменная для счетчика имитирующего показания датчика
int led = 13;
void setup() {
Serial.begin(115200); // установим скорость обмена данными
pinMode(led, OUTPUT); // и режим работы 13-ого цифрового пина в
качестве выхода
}
void loop() {
i = i + 1; // чтобы мы смогли заметить что данные изменились
String stringOne = "Info from Arduino ";
stringOne +=i; // конкатенация
Serial.println(stringOne); //отправляем строку на порт
char incomingChar;
if (Serial.available() > 0)
{
// считываем полученное с порта значение в переменную
incomingChar = Serial.read();
//в зависимости от значения переменной включаем или выключаем LED
switch (incomingChar)
{
case '1': digitalWrite(led, HIGH);
break;
case '0': digitalWrite(led, LOW);
break;
}
}
delay(300);
}
Однако это – только пример. Единственное – у данной системы должен быть хаб – то есть точка пересечения всех устройств. А это мгновенно разрушит всю децентрализацию системы.
Отсюда вывод – метод использования хаба подходит только для сбора информации и управления. Хаб нужен, например для выхода девайсов в интернет, но не как ключевая точка связи между ними.
Допустим связать все устройства сможем по I2C или по собственному протоколу. Но как скидывать данные в хаб? И вообще, что послужит хабом? Варианта 3:
- Хаб из роутера.
- Хаб из другой Arduino-платы.
- Хаб из Raspberry Pi.
Рассмотрим все по очереди. Итак, роутер. Начнём с того, что роутер нужен не простой, а с линуксом на борту и USB портом для подключения любой Arduino-платы из системы. Любой потому, что сеть будет состоять из огромного количества устройств и общего «чата», куда все устройства отправляют сообщения о своём состоянии. Из роутеров подойдёт например «Linksys E2100L 802.11b/g/n».
Как видим, данный роутер обладает USB-разъёмом, а по характеристикам видно, что всё крутится на линуксе. Лично им не пользовался, но по характеристикам нам подойдёт. И это НЕ реклама.
В случае с роутером, скидывать данные можно по последовательному порту, как и на Windows, а на линуксе запустить скрипт – обработчик сообщений (простите, если что-то не так называю, просто почти не знаком с линуксом).
Рассмотрим вариант 2. Ещё одна плата Arduino. Здесь уже не подойдут модели Nano, Mini, Micro. Нужна Arduino модели либо UNO, либо MEGA. Но просто так плату не подключить к сети. Как вариант использовать Arduino UNO WI-FI, или что надёжнее Arduino Yun или Tian. Проблемы последних – относительно долгая загрузка и цена, а по функционалу они смахиваю на всё тот-же роутер, ибо работают по линуксом.
Здесь лучше всего использовать так званный «Ethernet Shield». Это плата расширения для Arduino, которая одевается сверху и позволяет поднять на устройстве простой WEB-сервер с простыми PHP-скриптами для обработки информации от других устройств в сети.
Некоторые модели данной платы расширения оборудованы слотом под micro-sd карту памяти, что позволяет помимо удалённого управления вести также локальное логирование.
Вариант 3. Почти аналогичный предыдущему и меньше всего мне нравящийся. Использование микрокомпьютера Raspberry Pi. Именно компьютера. Согласитесь, вешать под эту задачу целый компьютер, пусть и очень слабый – лишняя трата ресурсов. Как денежных, так и вычислительных. Лично я бы если и использовал Raspberry Pi, то только как сервер видеонаблюдения или под готовую программу управления умным домом по типу «Major DoMo» и подобных. Также можно отвести её по такие задачи, как боты в мессенджерах и сложные алгоритмы контроля микроклиматом, ну или в самом маловероятном случае можно поселить туда искусственный интеллект.
Как видим, Raspberry Pi 3 имеет:
- 4 USB-порта;
- 1 Ethernet-порт;
- 1 HDMI-порт;
- Wi-Fi;
- Интерфейс DSI для подключения дисплея Raspberry Pi с сенсорным экраном;
- Слот для micro-sd карт.
И много чего ещё. Но несмотря на все достоинства, в качестве хаба Raspberry Pi не подойдёт.
Вывод: лично для меня в качестве хаба больше подходит Arduino UNO + Ethernet Shield. Из всех рассмотренных вариантов этот самый дешёвый и простой в реализации.
В такой конфигурации от хаба не зависит работоспособность системы. И пусть даже хаб выйдет из строя, на работоспособность самой сети это не повлияет. Сеть только потеряет выход в интернет.
Думаю, на этом первую часть можно и завершить. До встречи!
Комментарии (18)
piup
15.06.2018 17:30+1А что? Так можно было? Я тоже накупил целый мешок ардуиномодулей. Тоже мечтаю из них умнодом собрать. Дайте и мне инвайт, что-ли?
Serge78rus
16.06.2018 09:15как известно, прошивки под Arduino пишутся именно на изменённых плюсах.
Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
Я просто не мог воспринять среду разработки Arduino IDE. Пришлось привыкать.
По смыслу очень похоже на «я залпом выпил стакан водки и меня стошнило, пришлось привыкать постепенно». Может стоит прислушаться к своим инстинктам и, вдоволь намигавшись светодиодом, забросить среду Arduino и использовать для разработки что нибудь без этих «измененных плюсов»?REKTOR_RG Автор
17.06.2018 14:55Ну прости, я новичок. Но начал изучение Arduino не с мигающего светодиода, а с чего-то посерьёзней.
Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
Ну сорян, ошибся, со всеми бывает. Просто реально похожие языки. Я даже слышал, что его называли «C Arduino».
Serge78rus
17.06.2018 17:10Просто реально похожие языки.
Что значит похожие, если это и есть C++? То, что в Ардуино используется странное расширение .ino, вовсе не делает это каким то другим особым языком. Это C++, для компиляции проектов внутри Arduino IDE используется компилятор C++ из gcc (g++) для AVR.REKTOR_RG Автор
18.06.2018 09:38Спасибо, что немного открыл мне глаза на мир. Просто я правда верил, что это изменённый C++. Дело в том, что недавно я ходил на курс робототехники, и там мне сказали, что это просто переделанный C++ и не слова про компилятор. И как теперь верить всем этим крутым курсам? В общем, спасибо, исправлюсь.
BasiC2k
17.06.2018 14:48Добавлю несколько своих мыслей в тему статьи.
Считаю, что в «Умном Доме» должна быть смешанная система управления. При наличии в сети мастера (например ПК), все девайсы получают broadcast о его наличии и ждут от него команд. При отсутствии мастера (отсутствует сигнал broadcast), устройства могут напрямую влиять на работу друг друга (например, выключатель — исполнительный механизм) т.е. без посредника.
Вариант с мастером позволяет реализовать сложную логику работы устройств. Вариант без мастера — только базовую функциональность.
Сеть должна быть децентрализованной, скорее всего — радиоканал. Все узлы могут работать в качестве репитера сигнала. При выходе из строя узла, функциональность репитера должна переходить другим узлам.
Это «как я вижу». Готов услышать конструктивную критику, свой «умный дом» уже не за горами.REKTOR_RG Автор
17.06.2018 15:11Сеть должна быть децентрализованной, скорее всего — радиоканал.
Если честно, я никогда не любил беспроводные соединения в умных домах. Главное достоинство умного дома, как ни крути — безопасность. Радиосигнал же легко глушится даже самодельными глушилками. Ладно там ещё беспроводная аудиосистема и датчики температуры, но вешать всё на радио/WiFi/BlueTooth ни кому не советую.
OloloUndefined
17.06.2018 14:48позволяет поднять на устройстве простой WEB-сервер с простыми PHP-скриптами
ORLY ??? PHP скрипты на ардуине ???REKTOR_RG Автор
17.06.2018 15:16А почему бы и нет? Ну не на C# же писать для неё. Почти любой Web-сервер поддерживает JavaScript и PHP. Так почему бы не воспользоватся этим для создания удобной системы «Умный Дом» и вообще любой сети с внешним управлением?
REKTOR_RG Автор
18.06.2018 10:08Прости, напутал немного. PHP на простой ардуине не сделать. Я просто перепутал обычную ардуину и ардуино Tian. Есть другая идея — Arduino шлёт запросы на внешний сервер, на котором PHP скрипты всё и делают.
hensew
17.06.2018 14:48Начинал я примерно так-же, но лет 6 назад. Результат можно посмотреть на Github, проект Enviriot.
Для затравки:
- GUI и сервер написаны на C#, сервер может работать на Linux через mono
- Устройства для связи с сервером используют MQTT-SN протокол от IBM
- На физическом уровне реализованы Ethernet и последовательный порт для общения с компьютером, а так-же RS485 и радиоканал между устройствами. Устройство может работать как гейт и ретранслятор.
- Поддерживаются AVR и STM32 микроконтроллеры.
- Для продвинутых — на STM32 есть встроенный интерпретатор.
Если тема интересна, буду рад сотрудничеству.REKTOR_RG Автор
18.06.2018 10:56Тема интересная, но насчёт радиоканала — не знаю. Нет у меня доверия к беспроводной связи в сети, которая далеко не в последнюю очередь отвечает за безопасность.
Радиоканал можно перехватить, заглушить, прослушать. Я конечно не параноик, но не хотелось бы, чтобы какой-то хакер ради прикола (или ради других целей) управлял моим умным домом.
Но в целом у радиоканала есть и преимущества в виде отсутствия кучи проводов по всему дому.
Я подумаю на эту тему. Вот только средств на реализацию всего этого пока не хватает. Пока мне доступна только теория и разработка будущего проекта.
vilgeforce
Преобразователи TTL<->RS485 на каждом устройстве и вопрос, тащемта, решен…