Перевод поста Leonardo Laguna Ruiz и Johan Rhodin "Using Arduinos as SystemModeler Components".
Скачать файл с моделями, рассмотренными в посте, можно здесь здесь.
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.
С помощью новой бесплатной библиотеки ModelPlug library для Wolfram SystemModeler можно подключать Arduino для моделирования в SystemModeler. Arduino легко сопрягаются с компонентами входа и выхода, так что смело можно включать их в модели SystemModeler чтобы управлять, скажем, лампочками, датчиками, переключателями, запускать сервоприводы и тому подобное. С помощью библиотеки ModelPlug можно свободно совмещать программные и аппаратные компоненты в моделировании и использовать Arduino как плату для сбора данных.
![Set of icons Set of icons](https://habrastorage.org/getpro/habr/post_images/693/946/650/6939466503b9832ba2ca1ca3048e63f4.png)
После загрузки библиотеки из SystemModeler Library Store следует её установить; всё, что потребуется — дважды кликнуть по пакету и принять лицензионное соглашение. С этой библиотекой можно подключать любые Firmata-совместимые платы к SystemModeler. То есть любые платы Arduino.
В этом посте я использовал Arduino Uno. Простейший пример, который я смог придумать — мигание светодиода, который находится на плате.
![Arduino board Arduino board](https://habrastorage.org/getpro/habr/post_images/7bd/a04/9cb/7bda049cb9313114de371c3b567001c6.png)
Встроенный светодиод Arduino Uno выделен красным
Чтобы это сделать, я создал простую модель, в которой логический сигнал передаётся на 13-й контакт, который соответствует светодиоду. Частота мигания светодиода соответствует частоте сигнала.
![Blinking an LED Blinking an LED](https://habrastorage.org/getpro/habr/post_images/04c/a19/784/04ca19784f926907c6c122664a1669a1.png)
Модель в SystemModeler, которая использует компоненты ModelPlug — цифровой контакт и Arduino
Затем можно разместить светодиод на макетную плату и соединить с девятым контактом Arduino:
![Placing LED on breadboard Placing LED on breadboard](https://habrastorage.org/getpro/habr/post_images/d73/8ee/346/d738ee3468be3655552aaafee1166659.png)
Схема подключения внешнего светодиода к девятому контакту Arduino Uno
Если подсоединить синусоиду к аналоговому выходу платы, то сигнал из действительных значений конвертируется в напряжение, которое необходимо подавать на контакт светодиода.
![Dimming LED Dimming LED](https://habrastorage.org/getpro/habr/post_images/39e/418/56b/39e41856b33dc985ff1eaba510d5966a.png)
Синусоида в качестве входного сигнала светодиода
Можно увидеть, как светодиод то светит в полную яркость, то не светит вообще, изменяя яркость по синусоиде. И всё это не требует никакого «кодинга под Arduino».
На изображении ниже приведены четыре разных варианта: в первом мы подсоединяем смоделированный вход к смоделированному выходу, во втором сигнал от модели подсоединён к аппаратной части (как было показано в двух предыдущих примерах), в третьем сигнал от аппаратной части подсоединён к модели, в четвёртом — все составляющие — аппаратные.
![Simulated vs. real Simulated vs. real](https://habrastorage.org/getpro/habr/post_images/1b5/eb7/169/1b5eb716913a0c4527bf788e33de8237.png)
Ниже в таблице я привёл четыре варианта.
![Grid Grid](https://habrastorage.org/getpro/habr/post_images/195/d73/945/195d739450a9f2234550e6eaeac8b4e0.png)
Для каждого варианта весьма полезной будет библиотека ModelPlug
Первый вариант, когда на входе и выходе — модели, применим сразу после установки SystemModeler, и в большинстве случаев — это всё, что нужно. Вот почему я не выделил его в таблице. Если на входе и выходе аппаратные компоненты, то ими можно управлять и обрабатывать/фильтровать сигналы через SystemModeler. На мой взгляд, самый интересный вариант — когда некоторые составляющие симулируются, а другие представлены в физическом воплощении. Рассмотрим несколько примеров, где компоненты симулируются, а данные поступают от физических устройств.
![Input devices and simulated model Input devices and simulated model](https://habrastorage.org/getpro/habr/post_images/844/ae1/d3e/844ae1d3e612e0991cc3a17bc79cbb79.png)
Тут я настроил свою плату Uno считывать данные с 14-го контакта. Я подключил светочувствительный резистор, который будет определять освещённость.
![Light-dependent resistor Light-dependent resistor](https://habrastorage.org/getpro/habr/post_images/863/679/750/86367975021df9e41697239bda793139.png)
Плата Uno с фоторезистором, подключённым к аналоговому входу
В моей модели в SystemModeler я подключаю этот аналоговый сигнал с 14-го контакта к другому компоненту.
![Connect analog signal to another component](https://habrastorage.org/getpro/habr/post_images/5b0/7ea/e4b/5b07eae4b05d11f281552c6af88740df.png)
Этот компонент будет получать значения от светочувствительного резистора и сравнивать их с пороговым значением. Если значение будет больше, чем 0.02 и время симуляции превысит 5 секунд, то симуляция завершится.
![terminateSimulation terminateSimulation](https://habrastorage.org/getpro/habr/post_images/8db/d78/e0c/8dbd78e0c0c460402fa5c9afd29be816.png)
Сравнение значения освещенности с пороговым, результат — ответ на вопрос — завершится ли симуляция?
Если я ненадолго закрою рукой светочувствительный резистор, то он перестанет получать свет, значение станет меньше, чем 0.02 и симуляция закончится.
Вот пример, когда на входе и выходе представлены физические устройства: вместо того, чтобы использовать сигнал от светочувствительного резистора для завершения симуляции, я могу использовать фильтр низких частот из SystemModeler. Затем следует провести масштабирование, чтобы сервопривод мог проворачиваться в диапазоне от -90° до 90°. Когда я закрываю светочувствительный резистор рукой, то он поворачивается в одну сторону, а если нет — в другую.
![Inputs and outputs are hardware Inputs and outputs are hardware](https://habrastorage.org/getpro/habr/post_images/dea/0b4/93b/dea0b493bad6d911065cf6c6a438088b.png)
Аналоговый сигнал, который подаётся на сервопривод посредством программных компонентов
В предыдущем примере показано, что связь через ModelPlug можно реализовать не только между какими-то аппаратными системами — можно использовать компоненты, которые задаются в виде моделей. Вместо того, чтобы подключать резисторы и конденсаторы для фильтрации низких частот или вместо того, чтобы писать программу, которая будет фильтровать сигнал, я использую модель фильтра. Это сильно ускоряет прототипирование.
Рассмотрим ещё более наглядный пример. Возьмём программную модель побольше и соединим её с аналоговым входом. Будем использовать модель инвертированного маятника, который катится на тележке. Система состоит из двигателя, механизмов, трёхмерных компонентов маятника и тележки, и все они являются программными компонентами. Подключим к этой модели сигнал от акселерометра, который соединён с Arduino. В модели, представленной ниже, аналоговый сигнал подаётся слева. Первый фильтр высоких частот будет фильтровать стационарные значения сигнала, а фильтр низких частот будет сглаживать сигнал.
![Inverted pendulum system with filters Inverted pendulum system with filters](https://habrastorage.org/getpro/habr/post_images/cac/0fd/5bc/cac0fd5bcda2b2bad6e4821751ea98c5.png)
На верхушке маятника разместим силовой компонент, который преобразует аналоговый сигнал в силу, которая приложена к верхушке маятника.
![Mechanical system with force attached Mechanical system with force attached](https://habrastorage.org/getpro/habr/post_images/f66/174/fbe/f66174fbe8f5d010f6427f881a1d1af7.png)
Механическая система с приложенной силой
И, наконец, подсоединим акселерометр к аналоговому контакту.
![Accelerometer connected to inverted pendulum Accelerometer connected to inverted pendulum](https://habrastorage.org/getpro/habr/post_images/c48/df0/e6a/c48df0e6a293fe7bd2557e3a681d04b5.png)
Акселерометр, подключённый к инвертированному маятнику
Вот, если быстро двигать туда-сюда акселерометр, то получатся помехи, а система управления маятником должна будет попытаться адаптироваться. Интересно, получится ли так быстро туда-сюда двигать маятник, чтобы перевернуть его?
Библиотека ModelPlug бесплатна и скачать её можно в SystemModeler Library Store. Она работает на Mac, Windows и Linux.
Вы можете попробовать пробную версию SystemModeler. Есть так же варианты с лицензией для студентов или для домашнего использования. Всё оборудование, представленное в этой статье, укладывается в бюджет в 50 долларов.
Скачать файл с моделями, рассмотренными в посте, можно здесь здесь.
Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.
С помощью новой бесплатной библиотеки ModelPlug library для Wolfram SystemModeler можно подключать Arduino для моделирования в SystemModeler. Arduino легко сопрягаются с компонентами входа и выхода, так что смело можно включать их в модели SystemModeler чтобы управлять, скажем, лампочками, датчиками, переключателями, запускать сервоприводы и тому подобное. С помощью библиотеки ModelPlug можно свободно совмещать программные и аппаратные компоненты в моделировании и использовать Arduino как плату для сбора данных.
![Set of icons Set of icons](https://habrastorage.org/getpro/habr/post_images/693/946/650/6939466503b9832ba2ca1ca3048e63f4.png)
После загрузки библиотеки из SystemModeler Library Store следует её установить; всё, что потребуется — дважды кликнуть по пакету и принять лицензионное соглашение. С этой библиотекой можно подключать любые Firmata-совместимые платы к SystemModeler. То есть любые платы Arduino.
В этом посте я использовал Arduino Uno. Простейший пример, который я смог придумать — мигание светодиода, который находится на плате.
![Arduino board Arduino board](https://habrastorage.org/getpro/habr/post_images/7bd/a04/9cb/7bda049cb9313114de371c3b567001c6.png)
Встроенный светодиод Arduino Uno выделен красным
Чтобы это сделать, я создал простую модель, в которой логический сигнал передаётся на 13-й контакт, который соответствует светодиоду. Частота мигания светодиода соответствует частоте сигнала.
![Blinking an LED Blinking an LED](https://habrastorage.org/getpro/habr/post_images/04c/a19/784/04ca19784f926907c6c122664a1669a1.png)
Модель в SystemModeler, которая использует компоненты ModelPlug — цифровой контакт и Arduino
Затем можно разместить светодиод на макетную плату и соединить с девятым контактом Arduino:
![Placing LED on breadboard Placing LED on breadboard](https://habrastorage.org/getpro/habr/post_images/d73/8ee/346/d738ee3468be3655552aaafee1166659.png)
Схема подключения внешнего светодиода к девятому контакту Arduino Uno
Если подсоединить синусоиду к аналоговому выходу платы, то сигнал из действительных значений конвертируется в напряжение, которое необходимо подавать на контакт светодиода.
![Dimming LED Dimming LED](https://habrastorage.org/getpro/habr/post_images/39e/418/56b/39e41856b33dc985ff1eaba510d5966a.png)
Синусоида в качестве входного сигнала светодиода
Можно увидеть, как светодиод то светит в полную яркость, то не светит вообще, изменяя яркость по синусоиде. И всё это не требует никакого «кодинга под Arduino».
На изображении ниже приведены четыре разных варианта: в первом мы подсоединяем смоделированный вход к смоделированному выходу, во втором сигнал от модели подсоединён к аппаратной части (как было показано в двух предыдущих примерах), в третьем сигнал от аппаратной части подсоединён к модели, в четвёртом — все составляющие — аппаратные.
![Simulated vs. real Simulated vs. real](https://habrastorage.org/getpro/habr/post_images/1b5/eb7/169/1b5eb716913a0c4527bf788e33de8237.png)
Ниже в таблице я привёл четыре варианта.
![Grid Grid](https://habrastorage.org/getpro/habr/post_images/195/d73/945/195d739450a9f2234550e6eaeac8b4e0.png)
Для каждого варианта весьма полезной будет библиотека ModelPlug
Первый вариант, когда на входе и выходе — модели, применим сразу после установки SystemModeler, и в большинстве случаев — это всё, что нужно. Вот почему я не выделил его в таблице. Если на входе и выходе аппаратные компоненты, то ими можно управлять и обрабатывать/фильтровать сигналы через SystemModeler. На мой взгляд, самый интересный вариант — когда некоторые составляющие симулируются, а другие представлены в физическом воплощении. Рассмотрим несколько примеров, где компоненты симулируются, а данные поступают от физических устройств.
![Input devices and simulated model Input devices and simulated model](https://habrastorage.org/getpro/habr/post_images/844/ae1/d3e/844ae1d3e612e0991cc3a17bc79cbb79.png)
Тут я настроил свою плату Uno считывать данные с 14-го контакта. Я подключил светочувствительный резистор, который будет определять освещённость.
![Light-dependent resistor Light-dependent resistor](https://habrastorage.org/getpro/habr/post_images/863/679/750/86367975021df9e41697239bda793139.png)
Плата Uno с фоторезистором, подключённым к аналоговому входу
В моей модели в SystemModeler я подключаю этот аналоговый сигнал с 14-го контакта к другому компоненту.
![Connect analog signal to another component](https://habrastorage.org/getpro/habr/post_images/5b0/7ea/e4b/5b07eae4b05d11f281552c6af88740df.png)
Этот компонент будет получать значения от светочувствительного резистора и сравнивать их с пороговым значением. Если значение будет больше, чем 0.02 и время симуляции превысит 5 секунд, то симуляция завершится.
![terminateSimulation terminateSimulation](https://habrastorage.org/getpro/habr/post_images/8db/d78/e0c/8dbd78e0c0c460402fa5c9afd29be816.png)
Сравнение значения освещенности с пороговым, результат — ответ на вопрос — завершится ли симуляция?
Если я ненадолго закрою рукой светочувствительный резистор, то он перестанет получать свет, значение станет меньше, чем 0.02 и симуляция закончится.
Вот пример, когда на входе и выходе представлены физические устройства: вместо того, чтобы использовать сигнал от светочувствительного резистора для завершения симуляции, я могу использовать фильтр низких частот из SystemModeler. Затем следует провести масштабирование, чтобы сервопривод мог проворачиваться в диапазоне от -90° до 90°. Когда я закрываю светочувствительный резистор рукой, то он поворачивается в одну сторону, а если нет — в другую.
![Inputs and outputs are hardware Inputs and outputs are hardware](https://habrastorage.org/getpro/habr/post_images/dea/0b4/93b/dea0b493bad6d911065cf6c6a438088b.png)
Аналоговый сигнал, который подаётся на сервопривод посредством программных компонентов
В предыдущем примере показано, что связь через ModelPlug можно реализовать не только между какими-то аппаратными системами — можно использовать компоненты, которые задаются в виде моделей. Вместо того, чтобы подключать резисторы и конденсаторы для фильтрации низких частот или вместо того, чтобы писать программу, которая будет фильтровать сигнал, я использую модель фильтра. Это сильно ускоряет прототипирование.
Рассмотрим ещё более наглядный пример. Возьмём программную модель побольше и соединим её с аналоговым входом. Будем использовать модель инвертированного маятника, который катится на тележке. Система состоит из двигателя, механизмов, трёхмерных компонентов маятника и тележки, и все они являются программными компонентами. Подключим к этой модели сигнал от акселерометра, который соединён с Arduino. В модели, представленной ниже, аналоговый сигнал подаётся слева. Первый фильтр высоких частот будет фильтровать стационарные значения сигнала, а фильтр низких частот будет сглаживать сигнал.
![Inverted pendulum system with filters Inverted pendulum system with filters](https://habrastorage.org/getpro/habr/post_images/cac/0fd/5bc/cac0fd5bcda2b2bad6e4821751ea98c5.png)
На верхушке маятника разместим силовой компонент, который преобразует аналоговый сигнал в силу, которая приложена к верхушке маятника.
![Mechanical system with force attached Mechanical system with force attached](https://habrastorage.org/getpro/habr/post_images/f66/174/fbe/f66174fbe8f5d010f6427f881a1d1af7.png)
Механическая система с приложенной силой
И, наконец, подсоединим акселерометр к аналоговому контакту.
![Accelerometer connected to inverted pendulum Accelerometer connected to inverted pendulum](https://habrastorage.org/getpro/habr/post_images/c48/df0/e6a/c48df0e6a293fe7bd2557e3a681d04b5.png)
Акселерометр, подключённый к инвертированному маятнику
Вот, если быстро двигать туда-сюда акселерометр, то получатся помехи, а система управления маятником должна будет попытаться адаптироваться. Интересно, получится ли так быстро туда-сюда двигать маятник, чтобы перевернуть его?
Библиотека ModelPlug бесплатна и скачать её можно в SystemModeler Library Store. Она работает на Mac, Windows и Linux.
Вы можете попробовать пробную версию SystemModeler. Есть так же варианты с лицензией для студентов или для домашнего использования. Всё оборудование, представленное в этой статье, укладывается в бюджет в 50 долларов.