Светофор на ARDUINO#
В руководстве рассматривается реализация модели светофора при помощи блоков библиотеки Автоматика платформы REPEAT VISION. Описывается процесс генерации исходного С-кода (см. описание кодогенерации) модели и его перенос на физическую плату Arduino UNO.
Рассмотрим основные этапы проектирования:
Подсказка
Создание модели облегчает разработку алгоритма работы светофора.
Предлагается рассмотреть задачу управления светофором на плате Arduino UNO на базе микроконтроллера ATmega328H-AU. Известно, что один цикл светофора (см. рис. 1 ниже) представляет собой следующую последовательность:
красный цвет горит в течение 10 секунд;
в последние 3 секунды загорается желтый цвет;
затем включается зеленый цвет и работает продолжительностью в 10 секунд;
после зеленый мигает один раз за 5 секунд;
включается желтый на 3 секунды;
цикл завершается.
Рис. 1 Временная диаграмма работы светофора#
Подсказка
Для того, чтобы сразу перейти от теории к практике, предлагается
Cкачать файл модели
1. Создание модели#
Выберем из библиотеки блок Сигнал пила (см. рис. 2 ниже). Он понадобится для наглядной демонстрации срабатывания каждого цикла работы светофора. Общее время цикла составляет 28 [с], поэтому в свойствах блока укажем, что период равен 28 [с], высота составляет 28 шагов, а фазу и минимальное значение пилы поставим равными нулю.
Рис. 2 Блок Сигнал пила#
Разделим один цикл программы на три фазы, первая – работа красного светодиода, вторая – работа желтого светодиода, третья – работа зеленого светодиода. Соберем логику каждой фазы цикла.
1.1. Первая фаза – красный светодиод#
Логика работы красного светодиода ограничивается условием, что он не должен гореть больше 10 [с]. Используем блоки Меньше или равно и Константа (см. рис. 3 ниже). Управляющий сигнал подаем с блока Сигнал пила, а в Константе задаем значение 10, тогда на выходе сравнивающего блока мы получаем сигнал, который работает в диапазоне значений от 0 до 10 включительно.
Рис. 3 Первая фаза цикла светофора#
1.2. Вторая фаза – желтый светодиод#
Вторая фаза описывает работу желтого светодиода (см. рис. 4 ниже). Как видно из временной диаграммы желтый цвет встречается два раза за один цикл, к тому же он включается на 3 [с] в конце работы красного светодиода. Как и в первой фазе, управляющий сигнал подается с блока Сигнал пила. Разберем подробнее процесс включения желтого сигнала. Он включается на 7-й секунде от начала цикла, работает 3 [с], выключается на 15 [с], затем заново включается на 3 [с]. Исходя из этого, логика модели будет состоять из блоков Константа, Больше или равно, Меньше или равно, Логическое И, Логическое ИЛИ, Разветвитель и делиться на два проверочных условия.
Первое условие формируется для отработки первых 3 [с]. Зададим одной Константе значение 7, момент времени на котором включается желтый цвет, соединим ее с блоком Больше или равно и через Разветвитель на этот же блок подадим значения Сигнала пила. Теперь подадим с Разветвителя связь на блок Меньше или равно, на второй вход подадим значение Константы 10. Выходы со сравнивающих блоков передадим на блок Логическое И, на выходе блока будет логическая 1 только тогда, когда оба входных сигнала достигают необходимых временных значений.
Второе условие запускает желтый светодиод на 3 [с] в конце цикла. Принцип построения такой же, как и у первого, только одной Константе присваивается значение 25, а другой 28. Соединим оба условия через блок Логическое ИЛИ, который срабатывает только на один из сигналов.
Рис. 4 Вторая фаза цикла светофора#
Важно
При создании пользовательских блоков (см. рис. 5 ниже), внутри них нельзя использовать блоки GO TO и GO FROM, поскольку они не регистрируют внешнее воздействие на блок.
Рис. 5 Пользовательский блок «ЖЕЛТЫЙ светодиод»#
Пример наполнения пользовательского блока «ЖЕЛТЫЙ светодиод», рис. 6:
Рис. 6 Внутренняя структура пользовательского блока#
1.3. Третья фаза – зеленый светодиод#
Третья фаза – 10 [с] беспрерывной работы зеленого светодиода и 5 [с] на одно мигание (см. рис. 7 ниже). Зеленый включается на 10-й секунде работы всего цикла, на 20-й секунде он потухает и совершает одно мигание в течении 5 [с]. Состояние также можно поделить на два условия. В первом условии построим похожую логику на условие второй фазы, когда задается промежуток времени с 10-й по 25-ую секунду. Второе условие выключает светодиод на 20-й секунде и запускает при помощи блока Генератор прямоугольных импульсов единичное мигание, значения блока: а = 2000 [мс], b = 1000 [мс], с = 1, d = 0 [мс]. Оба условия регулируются через блок Переключатель, который выполняет функцию ключа.
Рис. 7 Третья фаза цикла светофора#
1.4. Запуск и проверка модели#
Зададим время моделирования системы 100 [с], для увеличения скорости работы уберем настройки синхронизации с реальным временем. Шаги интегрирования и дискретизации установим равными 1000 [мс] каждый. Проверим собранную модель, для этого запустим ее и выведем графики блока Сигнал пила (см. рис. 8 ниже) и трех блоков, завершающих каждую фазу светодиодов:
красный светодиод - блок Меньше или равно (см рис. 9 ниже);
желтый светодиод - блокЛогическое ИЛИ (см рис. 10 ниже);
зеленый светодиод - блок Переключатель (см рис. 11 ниже).
Рис. 8 Сигнал с блока Сигнал пила#
Рис. 11 Сигнал для зеленого светодиода#
2. Создание исходников С-кода модели в REPEAT VISION#
В REPEAT VISION есть возможность автоматической генерации исходного кода С (см. описание кодогенерации) для собранной модели, данная функция реализуется при помощи кнопки Сгенерировать С исходники(см. рис. 12 ниже).
Поставим блоки Выходной контакт USDS на выход каждого состояния, присвоим им соответствующие имена RED, YELLOW, GREEN.
Примечание
В данные переменные будем записывать значения сигналов управления светодиодами.
Блоки Входной контакт USDS и Выходной контакт USDS необходимы для создания переменных, которые будут являться входными/выходными переменными в сгенерированных исходниках. Имя, указанное в свойствах этих блоков, затем будет использоваться в исходниках, что упрощает их интеграцию в пользовательский проект.
Примечание
В данном примере выходные контакты имитируют соединения с пинами управляющей платы.
При успешной генерации исходников создаётся архив, содержащий следующие файлы:
Файл с расширением
.cсодержит функцию, описывающую работу модели за один шаг расчёта, и все необходимые переменные;В заголовочном файле с расширением
.hобъявляются все необходимые переменные и библиотеки для расчета.
Рис. 12 Кнопка Сгенерировать С исходники#
3. Создание проекта Arduino#
В среде Arduino IDE создаем новый скетч с именем «sketch_svetofor.ino», затем к нему в папку добавляем сгенерированные файлы из REPEAT VISION. Они автоматически откроются в среде. Из файла с расширением .с берем строку #include."svetofor.h", она выполняет роль библиотеки, которая описывает поведение модели на языке C.
В функции
void setup()определим выходные пины для каждого светодиода:
#include "svetofor.h"
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT); // GreenOUT
pinMode(3,OUTPUT); // YellowOUT
pinMode(4,OUTPUT); // RedOUT
}
В функции
void loop()составим основное тело программы, где функцияsvetofor(), берется из исходника с расширением.c:
void loop() {
// put your main code here, to run repeatedly:
svetofor();
digitalWrite(2,GREEN>0&&(RED==0)&&(YELLOW==0));
digitalWrite(3,YELLOW>0);
digitalWrite(4,RED>0);
delay(controldtt*1000); // задержка по времени на 1000 миллисекунд = 1 секунда
}
Переменная controldtt является временем расчета шага, по умолчанию имеет значение 1. Проверка скетча осуществляется по кнопке Verify, в результате выводится сообщение о том, что он проверен и использует определенное количество памяти устройства.
4. Сборка схемы на Arduino UNO#
Для создания физической схемы (см. рис. 13 ниже) понадобятся:
три светодиода;
три подтягивающих резистора по 220 [кОм];
5 соединительных проводов типа «папа-папа»;
arduino UNO;
кабель USB «А-В».
Рис. 13 Схема светофор на Arduino UNO#
5. Проверка результатов#
Подключаем физическую систему к компьютеру и запускаем компиляцию скетча. В результате отрабатывается последовательность работы светофора (см. рис. 14 ниже).
Рис. 14 Симуляция светофора#
6. Выводы#
По итогу выполненной работы:
Был реализован процесс работы светофора на платформе REPEAT VISION;
Были рассмотрены возможности приложения по автоматизированной генерации С исходников;
Благодаря таким способностям REPEAT VISION удалось собрать физическую модель светофора на базе Arduino UNO и запустить ее в работу за счет исходников проекта.