С данной проблемой столкнулся когда задумался автоматизировать свой дом. Требования были не сложные и их можно было решить не строя полноценную сеть, но хотелось сделать что то универсальное, а не костыли на изоленте. Сама задача как подружить контроллеры, так чтоб они видели не только свою периферию, но и "соседа". Все эти датчики температуры, влажность, освещенности, протечек, считыватели rfid-карт, да и просто входы/выходы. При этом не мешали друг другу и были децентрализованы, т.е. не имели "главного" контроллера который бы всем управлял.
Долго думал как проще и надежнее построить сеть на базе модулей Arduino и вот решение готово. Статья выходит с большим запозданием и на данный момент уже реализовано два типа интерфейса:
- WiFi на базе ESP8266.
По подключению этих интерфейсов будут отдельные статьи, здесь я постараюсь описать сам принцип и общий подход к организации и настройки сети между контроллерами Arduino.
И так приступим.
Для организации сети нам понадобятся:
- модули Arduino Mega и/или Nano;
- интерфейсный модуль WiFi (ESP8266);
- источники питания;
- исполнительные механизмы и датчик (по вкусу).
Далее с помощью программы "Mega&Nano конфигуратора", задаем параметры для работы модулей в сети.
Для этого нам нужно задать только один параметр - сетевой адрес:
По умолчанию модуль имеет адрес номер "1". Максимальное количество модулей в сети я ограничил до 16. Для большего числа модулей не хватило памяти, но думаю для дома и 16-ти хватит. Так что в блоке "Настройка устройства", задаем два разный адреса для двух модулей, можно так же задать название устройству. Название устройства ни на что не влияет, служить только для пониманию к какому модулю вы подключились.
Теперь сама настройка соединения:
Во вкладке периферия выбираем адрес модуля, у которого мы запросим данные нужные нам данные. Данные бывают двух видов: бинарные (состояния портов ввода/вывода, состояние пороговых триггеров, статусы счетчиков, ... ) и числовые (значения полученные от датчиков, входов АЦП/ADC).
Разберем настройки, представленные на данном рисунке.
Первое поле это адрес устройства у которого мы будем запрашивать данные. Всего мы можем запросить 16 "статусов". Надо только помнить, что числовые значения будут считаться нашими собственными, т.е. будут подменены.
Пример 1: у нашего контроллера нет подключенного термометра, а у модуля с адресом "3", есть. Мы запрашиваем параметр "DS_1" (значение первого термометра ds18b20) и контроллер воспринимает его как свой собственный термометр. Таким образом, можно значение одного термометра раздать другим контроллерам.
Пример 2: Мы запрашиваем параметр "An_1" (значение первого АЦП/ADC), его данные также встраиваются в наш контроллер, как будто мы получили значение от собственного модуля АЦП/ADC.
Пример 3: Мы запрашиваем параметры "In_1" и "OUT_1" (In_1 - состояние входа 1, OUT_1 - состояние выхода 1), тут все по-другому. Эти состояние мы будем "видеть" в нашем контроллере, как "EX02" (In_1) и "EX04" (OUT_1). И мы можем их использовать в своей логике:
Выход 2 изменит состояние при появлении сигналов EX02 или EX04, которые в свою очередь привязаны к состояниям входа In_1 и выхода OUT_1 контроллера с адресом "3".
Единственное ограничение это, то что у контроллера есть только 16 внешних статусов EX01-EX16 и не желательно использовать один и тот же статус для получения данных от разных контроллеров.
В заключении приведу перечень доступных данных:
- TxH - верхний пороговый триггер термометра ds18b20;
- TxL - нижний пороговый триггер термометра ds18b20;
- CхTH - верхний пороговый триггер термометра DHT11;
- CхTL - нижний пороговый триггер термометра DHT11;
- CхHH - верхний пороговый триггер датчика влажности DHT11;
- CхHL - нижний пороговый триггер датчика влажности DHT11;
- AnхH - верхний пороговый триггер аналогового входа;
- AnхL - нижний пороговый триггер аналогового входа;
- Cntх - статус счетчика;
- Tmr1 - программный таймер 0.5 секунды;
- Tmr2 - программный таймер 1 секундa
- Tmr3 - программный таймер 10 секунд
- Tmr4 - программный таймер 1 минута
- In_х - состояние входа;
- AL_х - статус будильника;
- M_хх - статус маркера;
- OUTхх - состояние выхода;
- SMSх - статус SMS сообщений;
- RF_x - статус RFID-ридера;
- DS_x - значение термометра ds18b20;
- DT_x - значение термометра DHT11;
- DH_x - значение датчика влажности DHT11;
- An_x - значение аналогового входа.
x - номер входа/выхода или устройства.
Вот вкратце и все что надо чтоб объединить несколько модули Arduino Mega и/или Nano в полноценную сеть.