Светофор на ARDUINO#

В руководстве рассматривается реализация модели светофора при помощи блоков библиотеки Автоматика платформы REPEAT VISION. Описывается процесс генерации исходного С-кода (см. описание кодогенерации) модели и его перенос на физическую плату Arduino UNO.

Рассмотрим основные этапы проектирования:

flowchart LR A(Разработка модели/Model development) --> B("`Генерация исходного кода/Generating source code`") B("`Генерация исходного кода/Generating source code`") --> C(Оправка кода на контроллер/Sending code to the controller)

Подсказка

Создание модели облегчает разработку алгоритма работы светофора.

Предлагается рассмотреть задачу управления светофором на плате Arduino UNO на базе микроконтроллера ATmega328H-AU. Известно, что один цикл светофора (см. рис. 1 ниже) представляет собой следующую последовательность:

  • красный цвет горит в течение 10 секунд;

  • в последние 3 секунды загорается желтый цвет;

  • затем включается зеленый цвет и работает продолжительностью в 10 секунд;

  • после зеленый мигает один раз за 5 секунд;

  • включается желтый на 3 секунды;

  • цикл завершается.

Timing_diagram_of_traffic_light_operation

Рис. 1 Временная диаграмма работы светофора#

Подсказка

Для того, чтобы сразу перейти от теории к практике, предлагается
Cкачать файл модели

1.  Создание модели#

Выберем из библиотеки блок Сигнал пила (см. рис. 2 ниже). Он понадобится для наглядной демонстрации срабатывания каждого цикла работы светофора. Общее время цикла составляет 28 [с], поэтому в свойствах блока укажем, что период равен 28 [с], высота составляет 28 шагов, а фазу и минимальное значение пилы поставим равными нулю.

Sawtooth_wave_block

Рис. 2 Блок Сигнал пила#

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

1.1.  Первая фаза – красный светодиод#

Логика работы красного светодиода ограничивается условием, что он не должен гореть больше 10 [с]. Используем блоки Меньше или равно и Константа (см. рис. 3 ниже). Управляющий сигнал подаем с блока Сигнал пила, а в Константе задаем значение 10, тогда на выходе сравнивающего блока мы получаем сигнал, который работает в диапазоне значений от 0 до 10 включительно.

First_phase_of_the_traffic_light_cycle

Рис. 3 Первая фаза цикла светофора#

1.2.  Вторая фаза – желтый светодиод#

Вторая фаза описывает работу желтого светодиода (см. рис. 4 ниже). Как видно из временной диаграммы желтый цвет встречается два раза за один цикл, к тому же он включается на 3 [с] в конце работы красного светодиода. Как и в первой фазе, управляющий сигнал подается с блока Сигнал пила. Разберем подробнее процесс включения желтого сигнала. Он включается на 7-й секунде от начала цикла, работает 3 [с], выключается на 15 [с], затем заново включается на 3 [с]. Исходя из этого, логика модели будет состоять из блоков Константа, Больше или равно, Меньше или равно, Логическое И, Логическое ИЛИ, Разветвитель и делиться на два проверочных условия.

Первое условие формируется для отработки первых 3 [с]. Зададим одной Константе значение 7, момент времени на котором включается желтый цвет, соединим ее с блоком Больше или равно и через Разветвитель на этот же блок подадим значения Сигнала пила. Теперь подадим с Разветвителя связь на блок Меньше или равно, на второй вход подадим значение Константы 10. Выходы со сравнивающих блоков передадим на блок Логическое И, на выходе блока будет логическая 1 только тогда, когда оба входных сигнала достигают необходимых временных значений.

Второе условие запускает желтый светодиод на 3 [с] в конце цикла. Принцип построения такой же, как и у первого, только одной Константе присваивается значение 25, а другой 28. Соединим оба условия через блок Логическое ИЛИ, который срабатывает только на один из сигналов.

Second_phase_of_the_traffic_light_cycle

Рис. 4 Вторая фаза цикла светофора#

Важно

При создании пользовательских блоков (см. рис. 5 ниже), внутри них нельзя использовать блоки GO TO и GO FROM, поскольку они не регистрируют внешнее воздействие на блок.

Custom_block_yellow_LED

Рис. 5 Пользовательский блок «ЖЕЛТЫЙ светодиод»#

Пример наполнения пользовательского блока «ЖЕЛТЫЙ светодиод», рис. 6:

Internal_structure_of_custom_block

Рис. 6 Внутренняя структура пользовательского блока#

1.3.  Третья фаза – зеленый светодиод#

Третья фаза – 10 [с] беспрерывной работы зеленого светодиода и 5 [с] на одно мигание (см. рис. 7 ниже). Зеленый включается на 10-й секунде работы всего цикла, на 20-й секунде он потухает и совершает одно мигание в течении 5 [с]. Состояние также можно поделить на два условия. В первом условии построим похожую логику на условие второй фазы, когда задается промежуток времени с 10-й по 25-ую секунду. Второе условие выключает светодиод на 20-й секунде и запускает при помощи блока Генератор прямоугольных импульсов единичное мигание, значения блока: а = 2000 [мс], b = 1000 [мс], с = 1, d = 0 [мс]. Оба условия регулируются через блок Переключатель, который выполняет функцию ключа.

Third_phase_of_the_traffic_light_cycle

Рис. 7 Третья фаза цикла светофора#

1.4.  Запуск и проверка модели#

Зададим время моделирования системы 100 [с], для увеличения скорости работы уберем настройки синхронизации с реальным временем. Шаги интегрирования и дискретизации установим равными 1000 [мс] каждый. Проверим собранную модель, для этого запустим ее и выведем графики блока Сигнал пила (см. рис. 8 ниже) и трех блоков, завершающих каждую фазу светодиодов:

Signal_from_the_block_sawtoothWave

Рис. 8 Сигнал с блока Сигнал пила#

Signal_for_red_LED

Рис. 9 Сигнал для красного светодиода#

Signal_for_yellow_LED

Рис. 10 Сигнал для желтого светодиода#

Signal_for_green_LED

Рис. 11 Сигнал для зеленого светодиода#

2.  Создание исходников С-кода модели в REPEAT VISION#

В REPEAT VISION есть возможность автоматической генерации исходного кода С (см. описание кодогенерации) для собранной модели, данная функция реализуется при помощи кнопки Сгенерировать С исходники(см. рис. 12 ниже).

Поставим блоки Выходной контакт USDS на выход каждого состояния, присвоим им соответствующие имена RED, YELLOW, GREEN.

Примечание

В данные переменные будем записывать значения сигналов управления светодиодами.

Блоки Входной контакт USDS и Выходной контакт USDS необходимы для создания переменных, которые будут являться входными/выходными переменными в сгенерированных исходниках. Имя, указанное в свойствах этих блоков, затем будет использоваться в исходниках, что упрощает их интеграцию в пользовательский проект.

Примечание

В данном примере выходные контакты имитируют соединения с пинами управляющей платы.

При успешной генерации исходников создаётся архив, содержащий следующие файлы:

  • Файл с расширением .c содержит функцию, описывающую работу модели за один шаг расчёта, и все необходимые переменные;

  • В заголовочном файле с расширением .h объявляются все необходимые переменные и библиотеки для расчета.

button_Generate_C_sources

Рис. 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 «А-В».

Traffic_light_diagram_on_Arduino_UNO

Рис. 13 Схема светофор на Arduino UNO#

5.  Проверка результатов#

Подключаем физическую систему к компьютеру и запускаем компиляцию скетча. В результате отрабатывается последовательность работы светофора (см. рис. 14 ниже).

Traffic_light_simulation

Рис. 14 Симуляция светофора#

6.  Выводы#

По итогу выполненной работы:

  • Был реализован процесс работы светофора на платформе REPEAT VISION;

  • Были рассмотрены возможности приложения по автоматизированной генерации С исходников;

  • Благодаря таким способностям REPEAT VISION удалось собрать физическую модель светофора на базе Arduino UNO и запустить ее в работу за счет исходников проекта.