Создание собственной сети самодельных устройств на базе Arduino (Часть 1) +2



Добрый день, хабравчане! Сегодня расскажу вам про интеграцию Arduino с ПК на Windows и другими устройствами. Дело было уже в 2018 году, ко мне наконец-то приехали мои платы Arduino самых разных моделей.

Я давно хотел собрать умный дом, и решил использовать именно эту платформу. Почему? Ну я довольно хорошо знаю 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):

  1. vilgeforce
    /#18779245

    Преобразователи TTL<->RS485 на каждом устройстве и вопрос, тащемта, решен…

  2. piup
    /#18779281 / +1

    А что? Так можно было? Я тоже накупил целый мешок ардуиномодулей. Тоже мечтаю из них умнодом собрать. Дайте и мне инвайт, что-ли?

  3. red_dragon
    /#18779671 / +2

    Денис Попов вернулся?

  4. Serge78rus
    /#18780911

    как известно, прошивки под Arduino пишутся именно на изменённых плюсах.
    Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
    Я просто не мог воспринять среду разработки Arduino IDE. Пришлось привыкать.
    По смыслу очень похоже на «я залпом выпил стакан водки и меня стошнило, пришлось привыкать постепенно». Может стоит прислушаться к своим инстинктам и, вдоволь намигавшись светодиодом, забросить среду Arduino и использовать для разработки что нибудь без этих «измененных плюсов»?

    • REKTOR_RG
      /#18784535

      Ну прости, я новичок. Но начал изучение Arduino не с мигающего светодиода, а с чего-то посерьёзней.

      Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
      Ну сорян, ошибся, со всеми бывает. Просто реально похожие языки. Я даже слышал, что его называли «C Arduino».

      • Serge78rus
        /#18784767

        Просто реально похожие языки.
        Что значит похожие, если это и есть C++? То, что в Ардуино используется странное расширение .ino, вовсе не делает это каким то другим особым языком. Это C++, для компиляции проектов внутри Arduino IDE используется компилятор C++ из gcc (g++) для AVR.

        • REKTOR_RG
          /#18786265

          Спасибо, что немного открыл мне глаза на мир. Просто я правда верил, что это изменённый C++. Дело в том, что недавно я ходил на курс робототехники, и там мне сказали, что это просто переделанный C++ и не слова про компилятор. И как теперь верить всем этим крутым курсам? В общем, спасибо, исправлюсь.

  5. BasiC2k
    /#18784517

    Добавлю несколько своих мыслей в тему статьи.
    Считаю, что в «Умном Доме» должна быть смешанная система управления. При наличии в сети мастера (например ПК), все девайсы получают broadcast о его наличии и ждут от него команд. При отсутствии мастера (отсутствует сигнал broadcast), устройства могут напрямую влиять на работу друг друга (например, выключатель — исполнительный механизм) т.е. без посредника.
    Вариант с мастером позволяет реализовать сложную логику работы устройств. Вариант без мастера — только базовую функциональность.
    Сеть должна быть децентрализованной, скорее всего — радиоканал. Все узлы могут работать в качестве репитера сигнала. При выходе из строя узла, функциональность репитера должна переходить другим узлам.
    Это «как я вижу». Готов услышать конструктивную критику, свой «умный дом» уже не за горами.

    • REKTOR_RG
      /#18784561

      Сеть должна быть децентрализованной, скорее всего — радиоканал.
      Если честно, я никогда не любил беспроводные соединения в умных домах. Главное достоинство умного дома, как ни крути — безопасность. Радиосигнал же легко глушится даже самодельными глушилками. Ладно там ещё беспроводная аудиосистема и датчики температуры, но вешать всё на радио/WiFi/BlueTooth ни кому не советую.

  6. OloloUndefined
    /#18784519

    позволяет поднять на устройстве простой WEB-сервер с простыми PHP-скриптами

    ORLY ??? PHP скрипты на ардуине ???

    • REKTOR_RG
      /#18784567

      А почему бы и нет? Ну не на C# же писать для неё. Почти любой Web-сервер поддерживает JavaScript и PHP. Так почему бы не воспользоватся этим для создания удобной системы «Умный Дом» и вообще любой сети с внешним управлением?

      • vasyavoron
        /#18786579

        А не подскажете пару веб серверов с PHP для ардуино, ну или один хотя бы?

        • REKTOR_RG
          /#18786587

          Я напутал немного. PHP на простой ардуине не сделать.

    • REKTOR_RG
      /#18786397

      Прости, напутал немного. PHP на простой ардуине не сделать. Я просто перепутал обычную ардуину и ардуино Tian. Есть другая идея — Arduino шлёт запросы на внешний сервер, на котором PHP скрипты всё и делают.

  7. hensew
    /#18784521

    Начинал я примерно так-же, но лет 6 назад. Результат можно посмотреть на Github, проект Enviriot.
    Для затравки:

    • GUI и сервер написаны на C#, сервер может работать на Linux через mono
    • Устройства для связи с сервером используют MQTT-SN протокол от IBM
    • На физическом уровне реализованы Ethernet и последовательный порт для общения с компьютером, а так-же RS485 и радиоканал между устройствами. Устройство может работать как гейт и ретранслятор.
    • Поддерживаются AVR и STM32 микроконтроллеры.
    • Для продвинутых — на STM32 есть встроенный интерпретатор.


    Если тема интересна, буду рад сотрудничеству.

    • REKTOR_RG
      /#18786637

      Тема интересная, но насчёт радиоканала — не знаю. Нет у меня доверия к беспроводной связи в сети, которая далеко не в последнюю очередь отвечает за безопасность.
      Радиоканал можно перехватить, заглушить, прослушать. Я конечно не параноик, но не хотелось бы, чтобы какой-то хакер ради прикола (или ради других целей) управлял моим умным домом.
      Но в целом у радиоканала есть и преимущества в виде отсутствия кучи проводов по всему дому.
      Я подумаю на эту тему. Вот только средств на реализацию всего этого пока не хватает. Пока мне доступна только теория и разработка будущего проекта.

  8. cpm
    /#18784523

    Я просто не мог воспринять среду разработки Arduino IDE.

    Для vs есть прекрасное расширение, которое внезапно называется Arduino IDE for Visual Studio.