Генерация кода для Arduino (чтение аналогового входного сигнала)¶
В этом примере мы сгенерируем код для Arduino, который будет принимать на вход измерение входной аналоговой величины и использовать этот входной параметр для управления яркостью "бортового" светодиода.
Введение¶
Для этой демонстрации, кроме платы Arduino нам понадобится переменный резистор (потенциометр). Мы воспользуемся Troyka-модулем от производителя Amperka. Этот потенциометр имеет сопротивление 10 кОм и позволяет изменять напряжение на сигнальном выходе примерно от 0 вольт до напряжения питания Arduino (как правило, 5 вольт).
Как правило, у любого аналогового потенциометра есть три выходных контакта, которые мы соединим с платой Arduino следующим образом:
- контакты питания V (voltage) и G (ground) – к пинам 5V и GND платы Arduino
- контакт S (signal) – к пину A0 (нулевой аналоговый вход)
Описание модели Engee¶
Ниже приведен общий вид модели analog.engee
, из которой мы будем генерировать код. Она состоит из одной подсистемы.
За один цикл расчета модель принимает входные данные через порт in_ANALOG_PORT
и рассчитывает две выходные переменные: out_LED_BUILTIN
и param_WAIT_MS
.
Входная переменная имеет диапазон значений от 0 до 1023 (данные приходят от 10-битного АЦП), поэтому сперва мы масштабируем ее до диапазона от 0 до 1. Преобразование типов происходит автоматически. Компонент Multiport Switch
попеременно возвращает нам то длительность включения, то длительность отключения светодиода. После него стоит блок Gain
, где задержка умножается на 30, и блок Saturation
, который препятствует передаче отрицательных значений на выход param_WAIT_MS
.
Интерфейс Модель-Arduino¶
Платформо-зависимая часть этого кода, которая хранится в файле sketch_analog_custom/sketch_analog_custom.ino
, реализует следующий интерфейс:
- считывает уровень напряжения на входе
A0
платформы Arduino и передает это 10-битное значение на вход модели, - принимает от модели состояние светодиода (включенное или выключенное) и включает, либо выключает подключенный к диоду цифровой выход,
- принимает от модели время задержки в миллисекундах, которое должно пройти с завершения выполнения кода нашей модели до следующего выполнения.
Мы могли бы генерировать ШИМ другими способами:
- вызовом встроенной в Arduino функции
analogWrite
, - или через сравнение желаемой величины с пилообразным сигналом.
Генерация кода¶
Следующая ячейка позволяет из модели analog.engee
сделать код, который будет помещен в папку sketch_analog_custom/analog_code
.
engee.generate_code( "$(@__DIR__)/analog.engee",
"$(@__DIR__)/sketch_analog_custom/analog_code" )
Полученные на выходе файлы *.c
и *.h
уже размещены в нужной подпапке проекта. Файл analog.c
мы подключаем к платформо-зависимой части кода при помощи команды include
.
Передача данных в сгенерированный код и обратно осуществляется при помощи структур analog_U
и analog_Y
. Поля этих структур носят те же названия, что и порты на схеме Engee.
Чтобы получить более лаконичный код, попробуйте отключить автоматическую простановку комментариев в настройках модели (вкладка "Генерация кода").
Перенос модели на Arduino¶
Чтобы перенести проект на Arduino нужно выполнить следующие шаги:
- Скачать каталог
sketch_analog_custom
из файлового браузера; - Распаковать архив на вашем локальном компьютере;
- Открыть файл
sketch_analog_custom.ino
и в Arduino IDE нажать на кнопкуUpload
.
В результате мы получили возможность при помощи потенциометра регулировать скважность ШИМ-сигнала, который поступает на светодиод, а значит и его яркость. Таким же образом можно управлять сервоприводами, насосами и различными усилителями (осторожно с ограничениями на расход тока, подключение трех и более сервоприводов лучше выполнять через дополнительный источник питания, минуя стабилизацию напряжения Arduino).
Заключение¶
Мы убедились, что в Engee можно создавать полноценные алгоритмы для встраиваемых систем – принимать данные, выполнять их обработку и при помощи выходных значений управлять электроникой, подключенной к аппаратной платформе.
Генерация кода – критически важный инструмент для реализации модельно-ориентированного подхода к разработке, где часть кода встраиваемой системы может быть разработана как модель, протестирована в модельном окружении и проведена через полунатурное тестирование.