Документация Engee
Notebook

Генерация кода для Arduino (чтение аналогового входного сигнала)

В этом примере мы сгенерируем код для Arduino, который будет принимать на вход измерение входной аналоговой величины и использовать этот входной параметр для управления яркостью "бортового" светодиода.

Введение

Для этой демонстрации, кроме платы Arduino нам понадобится переменный резистор (потенциометр). Мы воспользуемся Troyka-модулем от производителя Amperka. Этот потенциометр имеет сопротивление 10 кОм и позволяет изменять напряжение на сигнальном выходе примерно от 0 вольт до напряжения питания Arduino (как правило, 5 вольт).

image_2.png

Как правило, у любого аналогового потенциометра есть три выходных контакта, которые мы соединим с платой Arduino следующим образом:

  • контакты питания V (voltage) и G (ground) – к пинам 5V и GND платы Arduino
  • контакт S (signal) – к пину A0 (нулевой аналоговый вход)

image.png

Описание модели Engee

Ниже приведен общий вид модели analog.engee, из которой мы будем генерировать код. Она состоит из одной подсистемы.

image.png

За один цикл расчета модель принимает входные данные через порт 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.

In [ ]:
engee.generate_code( "$(@__DIR__)/analog.engee",
                           "$(@__DIR__)/sketch_analog_custom/analog_code" )
Out[0]:
"Created directory - /user/start/examples/codegen/arduino_analog/sketch_analog_custom/analog_code"

Полученные на выходе файлы *.c и *.h уже размещены в нужной подпапке проекта. Файл analog.c мы подключаем к платформо-зависимой части кода при помощи команды include.

Передача данных в сгенерированный код и обратно осуществляется при помощи структур analog_U и analog_Y. Поля этих структур носят те же названия, что и порты на схеме Engee.

Чтобы получить более лаконичный код, попробуйте отключить автоматическую простановку комментариев в настройках модели (вкладка "Генерация кода").

Перенос модели на Arduino

Чтобы перенести проект на Arduino нужно выполнить следующие шаги:

  1. Скачать каталог sketch_analog_custom из файлового браузера;
  2. Распаковать архив на вашем локальном компьютере;
  3. Открыть файл sketch_analog_custom.ino и в Arduino IDE нажать на кнопку Upload.

В результате мы получили возможность при помощи потенциометра регулировать скважность ШИМ-сигнала, который поступает на светодиод, а значит и его яркость. Таким же образом можно управлять сервоприводами, насосами и различными усилителями (осторожно с ограничениями на расход тока, подключение трех и более сервоприводов лучше выполнять через дополнительный источник питания, минуя стабилизацию напряжения Arduino).

Заключение

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

Генерация кода – критически важный инструмент для реализации модельно-ориентированного подхода к разработке, где часть кода встраиваемой системы может быть разработана как модель, протестирована в модельном окружении и проведена через полунатурное тестирование.

Блоки, использованные в примере