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

Добрый день, хабравчане! Сегодня расскажу вам про интеграцию 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. Из всех рассмотренных вариантов этот самый дешёвый и простой в реализации.



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

Думаю, на этом первую часть можно и завершить. До встречи!
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 19
    +3
    Преобразователи TTL<->RS485 на каждом устройстве и вопрос, тащемта, решен…
      +6
      А что? Так можно было? Я тоже накупил целый мешок ардуиномодулей. Тоже мечтаю из них умнодом собрать. Дайте и мне инвайт, что-ли?
        +6
        Денис Попов вернулся?
          0
          как известно, прошивки под Arduino пишутся именно на изменённых плюсах.
          Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
          Я просто не мог воспринять среду разработки Arduino IDE. Пришлось привыкать.
          По смыслу очень похоже на «я залпом выпил стакан водки и меня стошнило, пришлось привыкать постепенно». Может стоит прислушаться к своим инстинктам и, вдоволь намигавшись светодиодом, забросить среду Arduino и использовать для разработки что нибудь без этих «измененных плюсов»?
            –1
            Ну прости, я новичок. Но начал изучение Arduino не с мигающего светодиода, а с чего-то посерьёзней.
            Интересно, откуда пошло это устойчивое заблуждение, кочующее из уст в уста? О каких «изменённых плюсах» может вообще идти речь, если среда разработки Arduino для компиляции использует не что иное, как gcc?
            Ну сорян, ошибся, со всеми бывает. Просто реально похожие языки. Я даже слышал, что его называли «C Arduino».
              0
              Просто реально похожие языки.
              Что значит похожие, если это и есть C++? То, что в Ардуино используется странное расширение .ino, вовсе не делает это каким то другим особым языком. Это C++, для компиляции проектов внутри Arduino IDE используется компилятор C++ из gcc (g++) для AVR.
                0

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

            0
            Добавлю несколько своих мыслей в тему статьи.
            Считаю, что в «Умном Доме» должна быть смешанная система управления. При наличии в сети мастера (например ПК), все девайсы получают broadcast о его наличии и ждут от него команд. При отсутствии мастера (отсутствует сигнал broadcast), устройства могут напрямую влиять на работу друг друга (например, выключатель — исполнительный механизм) т.е. без посредника.
            Вариант с мастером позволяет реализовать сложную логику работы устройств. Вариант без мастера — только базовую функциональность.
            Сеть должна быть децентрализованной, скорее всего — радиоканал. Все узлы могут работать в качестве репитера сигнала. При выходе из строя узла, функциональность репитера должна переходить другим узлам.
            Это «как я вижу». Готов услышать конструктивную критику, свой «умный дом» уже не за горами.
              –1
              Сеть должна быть децентрализованной, скорее всего — радиоканал.
              Если честно, я никогда не любил беспроводные соединения в умных домах. Главное достоинство умного дома, как ни крути — безопасность. Радиосигнал же легко глушится даже самодельными глушилками. Ладно там ещё беспроводная аудиосистема и датчики температуры, но вешать всё на радио/WiFi/BlueTooth ни кому не советую.
              0
              позволяет поднять на устройстве простой WEB-сервер с простыми PHP-скриптами

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

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

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


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

                      Всё верно. Я использую в основном RS485, радиоканал если провода протянуть проблематично. Например уличный датчик с питанием от солнечной батареи:
                      image
                      Пока мне доступна только теория и разработка будущего проекта.

                      В Enviriot реализовано от железа до логики. Для визуализации я пользуюсь сторонним решением.
                      Посмотрите, вдруг что полезное найдётся. Лицензия BSD позволяет. Или присоединяйтесь, будем рады.
                    0
                    Я просто не мог воспринять среду разработки Arduino IDE.

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

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое