Начиная с версии 1.10.5, программа FLProg позволяет объединять несколько плат Arduino в кольцевую UART сеть. Сначала рассмотрим, как это происходит. Платы соединяются между собой в соответствии со схемой, изображённой на заглавной иллюстрации. Предположим, что плата 1 отсылает через UART пакет данных содержащий идентификаторы платы, переменной, а так же значение переменной. Плата 2 принимает данный пакет и если данные из этой переменной ей не нужны, то просто отправляет этот пакет дальше. Если в соответствии с программой значение данной переменной необходимо контроллеру, то значение из пакета копируется во внутреннюю переменную, и пакет так же отправляется дальше по кольцу.
Когда таким образом пакет, пройдя всё кольцо, вернётся к плате, отправившей его, передача пакета прекратится.
Таким образом, данные из пакета доступны любой плате подключённой к кольцу, и инициатором отправки пакета так же может быть любая из плат.
Схема тестового стенда:
Логика работы следующая:
- 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. На первую плату кидаем блок сканирования шины OneWire (библиотека элементов, папка «Разное»). Этот блок по переднему фронту на входе En производит сканирование шины OneWire и при нахождении на них датчиков складывает обнаруженные адреса в привязанные массивы. Для параметрирования блока вызываем редактор блока (двойной клик на блоке).
- Сначала создаём новую шину OneWire.
- Затем создаём массив. Поскольку датчик у нас на шине планируется один, создаём один массив.
Теперь организуем схему запуска этого блока один раз при старте программы. Для этого соберём такую схему.
R – Триггер находится в папке «Триггеры» библиотеки элементов. Он служит для выделения переднего фронта импульса подаваемого на вход. На его выходе будет импульс длительностью один цикл программе при переходе уровня на входе от низкого к высокому.
Затем создаём новую плату и перетаскиваем на неё датчик температуры DS18x2x (библиотека элементов, папка «Датчики»). Вызываем редактор блока и параметрируем датчик.
- Из выпадающего списка выбираем ранее созданную шину OneWire на пине 4
- Выбираем режим задания адреса «Массив»
- Выбираем ранее созданный массив «Датчик»
- Выставляем периодический режим опроса датчика, с частотой опроса раз в 1 сек.
Теперь полученное с датчика значение необходимо отправить в кольцо.
В программе FLProg подключить контроллер к кольцу можно двумя способами. В данном проекте для Arduino№1 рассмотрим первый способ – через блоки отправки переменной в кольцо.
Вытащим на плату блок «Отправка переменной в кольцо» (библиотека элементов, папка UART), и вызовем для него редактор блока.
- Сначала добавляем контроллер к кольцу.
В открывшемся окне необходимо выбрать порт подключения к кольцу, скорость порта, и задать имя устройства в кольце. Так же для удобства работы с проектом желательно создать файл списка переменных кольца, через который будут синхронизироваться все контроллеры, участвующие в нём. - Затем создаем переменную, которая будет передаваться в кольцо
В окне создания переменной необходимо задать имя переменной и её тип. - После этого задаём периодический режим отправки переменной, с периодом в 1 сек.
После параметрирования блока соединяем блоки датчика и отправки между собой и устанавливаем на входе En блока отправки переменной константу true.
Создаём новую плату и перетаскиваем на неё датчик DHT-22 (библиотека элементов, папка «Датчики»). Вызываем редактор блока и параметрируем датчик.
- Выбираем пин подключения датчика
- Выбираем тип датчика
- Задаём наличие выходов температуры и влажности
- Задаём периодический способ опроса датчика с периодичностью в 1 секунду
Затем перетащим на третью плату два блока отправки переменной в кольцо, в настройках блоков выберем существующее кольцо, и создадим в каждом из них по переменной.
Поле чего соединим блоки между собой, и поставим константы true на входы En блоков отправки переменных.
С проектом для Arduino№1 закончили. Должна получится такая схема:
Теперь создаём новый проект для Arduino№2.
Сразу подключаем плату к кольцу. Здесь воспользуемся вторым методом, через дерево проекта. Раскрываем дерево до ветки «Коммуникации» включительно и делаем клик правой кнопкой по пункту «Кольца». В появившемся контекстном меню выбираем пункт «Добавить кольцо».
Открывается уже известное нам окно параметров кольца. Нам опять необходимо ввести имя устройства в кольце и выбрать порт, через который устройство подключено к кольцу. Но теперь мы не создаем файл переменных кольца, а выбираем ранее созданный. При этом автоматически синхронизируются переменные между проектами.
Все параметры кольца можно изменить через дерево проекта, вызывая контекстное меню на соответствующих ветках.
Согласно алгоритму Arduino№2 ловит переменную о температуре от датчика DHT-22, превращает её значение в строку и отправляет в кольцо. Для этого перетащим на схему блок «Получение переменной из кольца» (библиотека элементов, папка «UART»)и вызовем для него редактор.
В редакторе выберем кольцо и соответствующую переменную.
Затем перетащим на схему блок «Преобразование строк» (библиотека элементов, папка «Конвертация типов») и соединим вход этого блока с выходом блока «Получение переменной из кольца»
После чего вызовем редактор для блока «Преобразование строк».
Поскольку на входе этого блока значение типа Float, у нас есть возможность задать количество знаков после запятой при преобразовании в строку. Я думаю, одного знака после запятой нам хватит.
Затем вытаскиваем на схему блок «Отправка переменной в кольцо» (библиотека элементов, папка UART), и помощью редактора выбираем кольцо, и создаем новую переменную, которая будет отправляться в кольцо. Так же выставляем периодический режим отправки, с периодом в 1 сек.
После чего соединяем блоки между собой и устанавливаем константу true на входе En блока отправки переменной.
Создадим новую плату и перетащим на неё блок «Получение переменной из кольца» (библиотека элементов, папка «UART»)и вызовем для него редактор. В редакторе выберем подключенное кольцо. Поскольку в соответствии с алгоритмом значение для отображения на дисплее нам готовит Arduino№3, создадим новую переменную, которую нам этот контроллер будет отправлять.
Теперь перетащим на схему блок «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»), и вызовем для него редактор и запараметрируем его.
- Создадим новый дисплей
- Зададим подключение согласно схеме
- Зададим параметры дисплея
- Настроим отображение данных с входа блока
- Настроим отображение по центру первой строки
После этого соединим блоки и установив константу true на входе En блока дисплея.
С проектом для Arduino№2 закончили. Должна получится такая схема:
Создаем проект для Arduino№3.
Подключаем контроллер к кольцу любым из вышеуказанных способов. При подключении выбираем созданный ранее файл переменных кольца.
Согласно алгоритма, контроллер Arduino№3 ловит значение температуры с датчика DS18B20 от Arduino№1 и преобразует его в строку и отправляет эту строку в кольцо для Arduino№2. Все необходимые переменные для этого у нас уже существуют. Поэтому, аналогично Arduino№2. перетаскиваем на схему блоки «Получение переменной из кольца» (библиотека элементов, папка «UART»), «Преобразование строк» (библиотека элементов, папка «Конвертация типов») и блок «Отправка переменной в кольцо» (библиотека элементов, папка UART). После чего параметрируем их.
«Получение переменной из кольца»
«Преобразование строк»
«Отправка переменной в кольцо»
После этого собираем их в схему
Создаём новую плату для отображения температуры с датчика DHT-22. Так же аналогично Arduino№2 перетаскиваем «Получение переменной из кольца» (библиотека элементов, папка «UART») и «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»). Параметрируем их.
«Получение переменной из кольца»
«Дисплей на чипе HD44780»
Соединяем между собой.
Создаём новую плату для отображения влажности.
Так же перетаскиваем на плату блок «Получение переменной из кольца» (библиотека элементов, папка «UART») и параметрируем.
Затем перетаскиваем блок «Преобразование строк» (библиотека элементов, папка «Конвертация типов»), соединяем его с блоком «Получение переменной из кольца» и то же параметрируем.
Ну и в последнюю очередь перетаскиваем блок «Дисплей на чипе HD44780» (библиотека элементов, папка «Дисплеи»). При параметрировании блока выбираем уже существующий дисплей и выводим значение влажности по центру второй строки.
Соединяем блоки между собой.
Создание программы для Arduino№3 законченно.
Конечный результат.
Спасибо за внимание.