Перевод поста Leonardo Laguna Ruiz и Johan Rhodin "Using Arduinos as SystemModeler Components".
Скачать файл с моделями, рассмотренными в посте, можно здесь здесь.
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.
С помощью новой бесплатной библиотеки ModelPlug library для Wolfram SystemModeler можно подключать Arduino для моделирования в SystemModeler. Arduino легко сопрягаются с компонентами входа и выхода, так что смело можно включать их в модели SystemModeler чтобы управлять, скажем, лампочками, датчиками, переключателями, запускать сервоприводы и тому подобное. С помощью библиотеки ModelPlug можно свободно совмещать программные и аппаратные компоненты в моделировании и использовать Arduino как плату для сбора данных.

После загрузки библиотеки из SystemModeler Library Store следует её установить; всё, что потребуется — дважды кликнуть по пакету и принять лицензионное соглашение. С этой библиотекой можно подключать любые Firmata-совместимые платы к SystemModeler. То есть любые платы Arduino.
В этом посте я использовал Arduino Uno. Простейший пример, который я смог придумать — мигание светодиода, который находится на плате.

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

Модель в SystemModeler, которая использует компоненты ModelPlug — цифровой контакт и Arduino
Затем можно разместить светодиод на макетную плату и соединить с девятым контактом Arduino:

Схема подключения внешнего светодиода к девятому контакту Arduino Uno
Если подсоединить синусоиду к аналоговому выходу платы, то сигнал из действительных значений конвертируется в напряжение, которое необходимо подавать на контакт светодиода.

Синусоида в качестве входного сигнала светодиода
Можно увидеть, как светодиод то светит в полную яркость, то не светит вообще, изменяя яркость по синусоиде. И всё это не требует никакого «кодинга под Arduino».
На изображении ниже приведены четыре разных варианта: в первом мы подсоединяем смоделированный вход к смоделированному выходу, во втором сигнал от модели подсоединён к аппаратной части (как было показано в двух предыдущих примерах), в третьем сигнал от аппаратной части подсоединён к модели, в четвёртом — все составляющие — аппаратные.

Ниже в таблице я привёл четыре варианта.

Для каждого варианта весьма полезной будет библиотека ModelPlug
Первый вариант, когда на входе и выходе — модели, применим сразу после установки SystemModeler, и в большинстве случаев — это всё, что нужно. Вот почему я не выделил его в таблице. Если на входе и выходе аппаратные компоненты, то ими можно управлять и обрабатывать/фильтровать сигналы через SystemModeler. На мой взгляд, самый интересный вариант — когда некоторые составляющие симулируются, а другие представлены в физическом воплощении. Рассмотрим несколько примеров, где компоненты симулируются, а данные поступают от физических устройств.

Тут я настроил свою плату Uno считывать данные с 14-го контакта. Я подключил светочувствительный резистор, который будет определять освещённость.

Плата Uno с фоторезистором, подключённым к аналоговому входу
В моей модели в SystemModeler я подключаю этот аналоговый сигнал с 14-го контакта к другому компоненту.

Этот компонент будет получать значения от светочувствительного резистора и сравнивать их с пороговым значением. Если значение будет больше, чем 0.02 и время симуляции превысит 5 секунд, то симуляция завершится.

Сравнение значения освещенности с пороговым, результат — ответ на вопрос — завершится ли симуляция?
Если я ненадолго закрою рукой светочувствительный резистор, то он перестанет получать свет, значение станет меньше, чем 0.02 и симуляция закончится.
Вот пример, когда на входе и выходе представлены физические устройства: вместо того, чтобы использовать сигнал от светочувствительного резистора для завершения симуляции, я могу использовать фильтр низких частот из SystemModeler. Затем следует провести масштабирование, чтобы сервопривод мог проворачиваться в диапазоне от -90° до 90°. Когда я закрываю светочувствительный резистор рукой, то он поворачивается в одну сторону, а если нет — в другую.

Аналоговый сигнал, который подаётся на сервопривод посредством программных компонентов
В предыдущем примере показано, что связь через ModelPlug можно реализовать не только между какими-то аппаратными системами — можно использовать компоненты, которые задаются в виде моделей. Вместо того, чтобы подключать резисторы и конденсаторы для фильтрации низких частот или вместо того, чтобы писать программу, которая будет фильтровать сигнал, я использую модель фильтра. Это сильно ускоряет прототипирование.
Рассмотрим ещё более наглядный пример. Возьмём программную модель побольше и соединим её с аналоговым входом. Будем использовать модель инвертированного маятника, который катится на тележке. Система состоит из двигателя, механизмов, трёхмерных компонентов маятника и тележки, и все они являются программными компонентами. Подключим к этой модели сигнал от акселерометра, который соединён с Arduino. В модели, представленной ниже, аналоговый сигнал подаётся слева. Первый фильтр высоких частот будет фильтровать стационарные значения сигнала, а фильтр низких частот будет сглаживать сигнал.

На верхушке маятника разместим силовой компонент, который преобразует аналоговый сигнал в силу, которая приложена к верхушке маятника.

Механическая система с приложенной силой
И, наконец, подсоединим акселерометр к аналоговому контакту.

Акселерометр, подключённый к инвертированному маятнику
Вот, если быстро двигать туда-сюда акселерометр, то получатся помехи, а система управления маятником должна будет попытаться адаптироваться. Интересно, получится ли так быстро туда-сюда двигать маятник, чтобы перевернуть его?
Библиотека ModelPlug бесплатна и скачать её можно в SystemModeler Library Store. Она работает на Mac, Windows и Linux.
Вы можете попробовать пробную версию SystemModeler. Есть так же варианты с лицензией для студентов или для домашнего использования. Всё оборудование, представленное в этой статье, укладывается в бюджет в 50 долларов.
Скачать файл с моделями, рассмотренными в посте, можно здесь здесь.
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.
С помощью новой бесплатной библиотеки ModelPlug library для Wolfram SystemModeler можно подключать Arduino для моделирования в SystemModeler. Arduino легко сопрягаются с компонентами входа и выхода, так что смело можно включать их в модели SystemModeler чтобы управлять, скажем, лампочками, датчиками, переключателями, запускать сервоприводы и тому подобное. С помощью библиотеки ModelPlug можно свободно совмещать программные и аппаратные компоненты в моделировании и использовать Arduino как плату для сбора данных.

После загрузки библиотеки из SystemModeler Library Store следует её установить; всё, что потребуется — дважды кликнуть по пакету и принять лицензионное соглашение. С этой библиотекой можно подключать любые Firmata-совместимые платы к SystemModeler. То есть любые платы Arduino.
В этом посте я использовал Arduino Uno. Простейший пример, который я смог придумать — мигание светодиода, который находится на плате.

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

Модель в SystemModeler, которая использует компоненты ModelPlug — цифровой контакт и Arduino
Затем можно разместить светодиод на макетную плату и соединить с девятым контактом Arduino:

Схема подключения внешнего светодиода к девятому контакту Arduino Uno
Если подсоединить синусоиду к аналоговому выходу платы, то сигнал из действительных значений конвертируется в напряжение, которое необходимо подавать на контакт светодиода.

Синусоида в качестве входного сигнала светодиода
Можно увидеть, как светодиод то светит в полную яркость, то не светит вообще, изменяя яркость по синусоиде. И всё это не требует никакого «кодинга под Arduino».
На изображении ниже приведены четыре разных варианта: в первом мы подсоединяем смоделированный вход к смоделированному выходу, во втором сигнал от модели подсоединён к аппаратной части (как было показано в двух предыдущих примерах), в третьем сигнал от аппаратной части подсоединён к модели, в четвёртом — все составляющие — аппаратные.

Ниже в таблице я привёл четыре варианта.

Для каждого варианта весьма полезной будет библиотека ModelPlug
Первый вариант, когда на входе и выходе — модели, применим сразу после установки SystemModeler, и в большинстве случаев — это всё, что нужно. Вот почему я не выделил его в таблице. Если на входе и выходе аппаратные компоненты, то ими можно управлять и обрабатывать/фильтровать сигналы через SystemModeler. На мой взгляд, самый интересный вариант — когда некоторые составляющие симулируются, а другие представлены в физическом воплощении. Рассмотрим несколько примеров, где компоненты симулируются, а данные поступают от физических устройств.

Тут я настроил свою плату Uno считывать данные с 14-го контакта. Я подключил светочувствительный резистор, который будет определять освещённость.

Плата Uno с фоторезистором, подключённым к аналоговому входу
В моей модели в SystemModeler я подключаю этот аналоговый сигнал с 14-го контакта к другому компоненту.

Этот компонент будет получать значения от светочувствительного резистора и сравнивать их с пороговым значением. Если значение будет больше, чем 0.02 и время симуляции превысит 5 секунд, то симуляция завершится.

Сравнение значения освещенности с пороговым, результат — ответ на вопрос — завершится ли симуляция?
Если я ненадолго закрою рукой светочувствительный резистор, то он перестанет получать свет, значение станет меньше, чем 0.02 и симуляция закончится.
Вот пример, когда на входе и выходе представлены физические устройства: вместо того, чтобы использовать сигнал от светочувствительного резистора для завершения симуляции, я могу использовать фильтр низких частот из SystemModeler. Затем следует провести масштабирование, чтобы сервопривод мог проворачиваться в диапазоне от -90° до 90°. Когда я закрываю светочувствительный резистор рукой, то он поворачивается в одну сторону, а если нет — в другую.

Аналоговый сигнал, который подаётся на сервопривод посредством программных компонентов
В предыдущем примере показано, что связь через ModelPlug можно реализовать не только между какими-то аппаратными системами — можно использовать компоненты, которые задаются в виде моделей. Вместо того, чтобы подключать резисторы и конденсаторы для фильтрации низких частот или вместо того, чтобы писать программу, которая будет фильтровать сигнал, я использую модель фильтра. Это сильно ускоряет прототипирование.
Рассмотрим ещё более наглядный пример. Возьмём программную модель побольше и соединим её с аналоговым входом. Будем использовать модель инвертированного маятника, который катится на тележке. Система состоит из двигателя, механизмов, трёхмерных компонентов маятника и тележки, и все они являются программными компонентами. Подключим к этой модели сигнал от акселерометра, который соединён с Arduino. В модели, представленной ниже, аналоговый сигнал подаётся слева. Первый фильтр высоких частот будет фильтровать стационарные значения сигнала, а фильтр низких частот будет сглаживать сигнал.

На верхушке маятника разместим силовой компонент, который преобразует аналоговый сигнал в силу, которая приложена к верхушке маятника.

Механическая система с приложенной силой
И, наконец, подсоединим акселерометр к аналоговому контакту.

Акселерометр, подключённый к инвертированному маятнику
Вот, если быстро двигать туда-сюда акселерометр, то получатся помехи, а система управления маятником должна будет попытаться адаптироваться. Интересно, получится ли так быстро туда-сюда двигать маятник, чтобы перевернуть его?
Библиотека ModelPlug бесплатна и скачать её можно в SystemModeler Library Store. Она работает на Mac, Windows и Linux.
Вы можете попробовать пробную версию SystemModeler. Есть так же варианты с лицензией для студентов или для домашнего использования. Всё оборудование, представленное в этой статье, укладывается в бюджет в 50 долларов.