FLProg — объединение плат Arduino в информационное кольцо

3a51f29ccc5049a5a4ab47a96141f675.png

Начиная с версии 1.10.5, программа FLProg позволяет объединять несколько плат Arduino в кольцевую UART сеть. Сначала рассмотрим, как это происходит. Платы соединяются между собой в соответствии со схемой, изображённой на заглавной иллюстрации. Предположим, что плата 1 отсылает через UART пакет данных содержащий идентификаторы платы, переменной, а так же значение переменной. Плата 2 принимает данный пакет и если данные из этой переменной ей не нужны, то просто отправляет этот пакет дальше. Если в соответствии с программой значение данной переменной необходимо контроллеру, то значение из пакета копируется во внутреннюю переменную, и пакет так же отправляется дальше по кольцу.
Когда таким образом пакет, пройдя всё кольцо, вернётся к плате, отправившей его, передача пакета прекратится.
Таким образом, данные из пакета доступны любой плате подключённой к кольцу, и инициатором отправки пакета так же может быть любая из плат.
Схема тестового стенда:

fdab35082e3f46c9904e0f1401c857f6.PNG

Логика работы следующая:

  • Arduino №1 получает данные о температуре и влажности c датчиков.
  • Arduino №2 отображает температуру с датчика DS18B20.
  • Arduino №3 отображает температуру и влажность с датчика DHT-22.


Что бы избежать гневных комментариев о том, что такая логика не нужна и является бредом, уточню, что данный проект чисто учебный и предназначен для объяснения принципов передачи данных через информационное кольцо. Для этого внесём еще немного бреда в логику работы.

  • Цифровое значение температуры от датчика DS18B20 ловит Arduino№3, затем преобразует его в строку и отправляет в кольцо. Эту строку ловит Arduino№2 и отображает на дисплее.
  • Цифровое значение температуры от датчика DHT-22 ловит Arduino№2, затем преобразует его в строку и отправляет в кольцо. Эту строку ловит Arduino№3 и отображает на дисплее.
  • Цифровое значение влажности от датчика DHT-22 ловит Arduino№3, затем преобразует его в строку и отображает на дисплее.


Итак, начнём.
Открываем программу FLProg и создаём проект для Arduino№1. На первую плату кидаем блок сканирования шины OneWare (библиотека элементов, папка «Разное»). Этот блок по переднему фронту на входе En производит сканирование шины OneWare и при нахождении на них датчиков складывает обнаруженные адреса в привязанные массивы. Для параметрирования блока вызываем редактор блока (двойной клик на блоке).

7fcfca96c6c04b70bb499b56fde394b7.PNG

  1. Сначала создаём новую шину OneWare.
    845fa26496594bb3a63bb41e27ddd91a.png
  2. Затем создаём массив. Поскольку датчик у нас на шине планируется один, создаём один массив.
    9c0ee5295da94ee7aadcca350a90eb47.png


Теперь организуем схему запуска этого блока один раз при старте программы. Для этого соберём такую схему.

1aa4304d8d7d48b1964b79769f29acf5.PNG

R — Триггер находится в папке «Триггеры» библиотеки элементов. Он служит для выделения переднего фронта импульса подаваемого на вход. На его выходе будет импульс длительностью один цикл программе при переходе уровня на входе от низкого к высокому.
Затем создаём новую плату и перетаскиваем на неё датчик температуры DS18×2x (библиотека элементов, папка «Датчики»). Вызываем редактор блока и параметрируем датчик.

fac98a6e39da4acd86f52448c57a6445.PNG

  1. Из выпадающего списка выбираем ранее созданную шину OneWare на пине 4
  2. Выбираем режим задания адреса «Массив»
  3. Выбираем ранее созданный массив «Датчик»
  4. Выставляем периодический режим опроса датчика, с частотой опроса раз в 1 сек.

Теперь полученное с датчика значение необходимо отправить в кольцо.
В программе FLProg подключить контроллер к кольцу можно двумя способами. В данном проекте для Arduino№1 рассмотрим первый способ — через блоки отправки переменной в кольцо.
Вытащим на плату блок «Отправка переменной в кольцо» (библиотека элементов, папка UART), и вызовем для него редактор блока.

3fbfaea4b20e4543840360df2199de67.PNG

  1. Сначала добавляем контроллер к кольцу.
    3908348e852046a09e853869d59d130a.PNG
    В открывшемся окне необходимо выбрать порт подключения к кольцу, скорость порта, и задать имя устройства в кольце. Так же для удобства работы с проектом желательно создать файл списка переменных кольца, через который будут синхронизироваться все контроллеры, участвующие в нём.
  2. Затем создаем переменную, которая будет передаваться в кольцо
    569d40ed63974de785e9827eeefeaa83.PNG
    В окне создания переменной необходимо задать имя переменной и её тип.
  3. После этого задаём периодический режим отправки переменной, с периодом в 1 сек.

После параметрирования блока соединяем блоки датчика и отправки между собой и устанавливаем на входе En блока отправки переменной константу true.

d7ce2023d30940d7bb081a7ab4f9f6d9.PNG

Создаём новую плату и перетаскиваем на неё датчик DHT-22 (библиотека элементов, папка «Датчики»). Вызываем редактор блока и параметрируем датчик.

7bee751eb3ec46d588302ab3cb00afea.PNG

  1. Выбираем пин подключения датчика
  2. Выбираем тип датчика
  3. Задаём наличие выходов температуры и влажности
  4. Задаём периодический способ опроса датчика с периодичностью в 1 секунду

Затем перетащим на третью плату два блока отправки переменной в кольцо, в настройках блоков выберем существующее кольцо, и создадим в каждом из них по переменной.

2cf63216bc62405f8528d3e464002a46.PNG

b5763884c4a8416c946122756b1517ab.PNG

Поле чего соединим блоки между собой, и поставим константы true на входы En блоков отправки переменных.

584c4e364da54dc0ba1a0a0f31dd479e.PNG

С проектом для Arduino№1 закончили. Должна получится такая схема:

db1f246b356d419ca3ca27c2906c1ca6.PNG

Теперь создаём новый проект для Arduino№2.
Сразу подключаем плату к кольцу. Здесь воспользуемся вторым методом, через дерево проекта. Раскрываем дерево до ветки «Коммуникации» включительно и делаем клик правой кнопкой по пункту «Кольца». В появившемся контекстном меню выбираем пункт «Добавить кольцо».

67fffe6d4afb480b950739d2f3b47cfd.png

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

26057e9bf0294c66aaa8ea5561e0bb60.PNG

378ac7e1c3b14f478b7c63d6dc6b58dd.PNG

Все параметры кольца можно изменить через дерево проекта, вызывая контекстное меню на соответствующих ветках.
Согласно алгоритму Arduino№2 ловит переменную о температуре от датчика DHT-22, превращает её значение в строку и отправляет в кольцо. Для этого перетащим на схему блок «Получение переменной из кольца» (библиотека элементов, папка «UART»)и вызовем для него редактор.

c5ca14e468694acea500d4ab4959b854.PNG

В редакторе выберем кольцо и соответствующую переменную.
Затем перетащим на схему блок «Преобразование строк» (библиотека элементов, папка «Конвертация типов») и соединим вход этого блока с выходом блока «Получение переменной из кольца»

51f8312cb5f44b6aaa04249d66057170.PNG

После чего вызовем редактор для блока «Преобразование строк».
6859b1a790c6411db7b9d1e9fcac5549.PNG

Поскольку на входе этого блока значение типа Float, у нас есть возможность задать количество знаков после запятой при преобразовании в строку. Я думаю, одного знака после запятой нам хватит.
Затем вытаскиваем на схему блок «Отправка переменной в кольцо» (библиотека элементов, папка UART), и помощью редактора выбираем кольцо, и создаем новую переменную, которая будет отправляться в кольцо. Так же выставляем периодический режим отправки, с периодом в 1 сек.

accf450ac582496fa14bcf4ba4afebf3.PNG

aaecd072009d4608a2588590e8d862b5.PNG

После чего соединяем блоки между собой и устанавливаем константу true на входе En блока отправки переменной.

8bd67ceec79e42048bc3875e324e30fa.PNG

Создадим новую плату и перетащим на неё блок «Получение переменной из кольца» (библиотека элементов, папка «UART»)и вызовем для него редактор. В редакторе выберем подключенное кольцо. Поскольку в соответствии с алгоритмом значение для отображения на дисплее нам готовит Arduino№3, создадим новую переменную, которую нам этот контроллер будет отправлять.

036dfd6af1b54c81a4a5c9dbf92f7103.PNG

Теперь перетащим на схему блок «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»), и вызовем для него редактор и запараметрируем его.

7c585698cf7348768b9eb87f8b5938a9.PNG

  1. Создадим новый дисплей
  2. Зададим подключение согласно схеме
  3. Зададим параметры дисплея
  4. Настроим отображение данных с входа блока
  5. Настроим отображение по центру первой строки

После этого соединим блоки и установив константу true на входе En блока дисплея.

b1cb21e495c241b8ad6142475183670c.PNG

С проектом для Arduino№2 закончили. Должна получится такая схема:

27a3c182a3484ef0b95c067c1e0e115f.PNG

Создаем проект для Arduino№3.
Подключаем контроллер к кольцу любым из вышеуказанных способов. При подключении выбираем созданный ранее файл переменных кольца.

1b174c4b026a427087a23450943eb2c1.PNG

Согласно алгоритма, контроллер Arduino№3 ловит значение температуры с датчика DS18B20 от Arduino№1 и преобразует его в строку и отправляет эту строку в кольцо для Arduino№2. Все необходимые переменные для этого у нас уже существуют. Поэтому, аналогично Arduino№2. перетаскиваем на схему блоки «Получение переменной из кольца» (библиотека элементов, папка «UART»), «Преобразование строк» (библиотека элементов, папка «Конвертация типов») и блок «Отправка переменной в кольцо» (библиотека элементов, папка UART). После чего параметрируем их.
«Получение переменной из кольца»

425ac124816d4ead9bb5e4ad2438b1cf.PNG

«Преобразование строк»

d7fe22fd23f34c35ad0b90cc730d3ae3.PNG

«Отправка переменной в кольцо»

aa08c974349541dd84af0570e38aa438.PNG

После этого собираем их в схему

f04f4518e22f4f1d908c95842e8a5837.PNG

Создаём новую плату для отображения температуры с датчика DHT-22. Так же аналогично Arduino№2 перетаскиваем «Получение переменной из кольца» (библиотека элементов, папка «UART») и «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»). Параметрируем их.
«Получение переменной из кольца»

710f694ca74342b5adef06dd2c98e764.PNG

«Дисплей на чипе HD44780»

62a9725286784bcdbff6d1c30ae915d7.PNG

Соединяем между собой.

f79683bc39904acbbd0a5860166d8e91.PNG

Создаём новую плату для отображения влажности.
Так же перетаскиваем на плату блок «Получение переменной из кольца» (библиотека элементов, папка «UART») и параметрируем.

3f3cf64bdc5845138200ccba36ebc039.PNG

Затем перетаскиваем блок «Преобразование строк» (библиотека элементов, папка «Конвертация типов»), соединяем его с блоком «Получение переменной из кольца» и то же параметрируем.

bfb2a017047046deb103392c313896f0.PNG

0cd337c474fa413791b94a43647cd206.PNG

Ну и в последнюю очередь перетаскиваем блок «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»). При параметрировании блока выбираем уже существующий дисплей и выводим значение влажности по центру второй строки.

641c4ff6ce1d488aa434c0fd7e9b53d2.PNG

Соединяем блоки между собой.

8e19099f999847948e7f9021cfd458d3.PNG

Создание программы для Arduino№3 законченно.
Конечный результат.

f42196a9bd5e4b9d92fe89af4576f4e4.PNG

Спасибо за внимание.

© Geektimes