Программирование Arduino с помощью MATLAB&Simulink

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

 Simulink это среда разработки цифровых систем с помощью моделирования. Из широкой библиотеки блоков (математика, логика, обработка сигналов, видеообработка и т.д.) собираются схемы с возможностью запуска во времени. Я когда был в Штатах, узнал, что многие университеты обучают студентов программировать именно Arduino (как доступное и простое оборудование). Так вот обучают программированию они именно используя Simulink с помощью генератора С кода, заточенного по широкий список процессоров - Embedded Coder. Естественно заинтересовало и после раскопок удалось выявить следущее:

У себя на сайте MathWorks посвятило программированию целую страничку http://www.mathworks.com/academia/arduino-software/arduino-simulink.html. Выглядит это следующим образом:

1) Создаем в Simulink алгоритм, который хотим запустить на процессоре

2) Устанавливаем специальную библиотеку (процедура установки автоматизирована) для связи с устройством: http://www.mathworks.com/matlabcentral/fileexchange/30277. Эта библиотека содержит в себе блоки для связи с портами отладочной платы (и примеры):

* Digital Input
* Digital Output
* Analog Input
* Analog Output
* Serial Read
* Serial Write 

3) Снимаем необходимые сигналы с помощью блоков Input, обрабатываем с помощью библиотек Simulink и выдаем результаты на подключенное оборудование с помощью Output.

4) Запускаем автоматическую генерацию кода и ждем заливки прошивки на плату (через Arduino IDE 0018 и выше).

 

Получается очень удобно, т.к. программировать уметь не нужно (нужно всего лишь настроить сам генератор кода под конкретный процессор), связь с перифирией заложена в вышеуказанные блоки, а логика обработки собирается из интуитивно понятных блоков (!!!!! и может быть проверена до создания/написания кода, т.е. промоделирована). Поддерживается среда Stateflow для разработки конечных автоматов и машин состояний. 

Еще один интересный момент. Поддерживается технология PIL (processot-in-the-loop), когда вся схема запускается в Simulink в режиме моделирования, а некоторая ее часть (та, что предназаначена для реализации на цифре) крутится на отладке. Результаты работы поступают обратно в Simulink для визуализации.

Опробовали систему :) Сделали простенькую видео следящую систему: камера на моторчике, мотор управляется с Arduino, видео обрабатывается в Simulink. Камера отслеживает зеленый мячик, катающийся по столу. 

Итого: было бы здорово, если бы наши ВУЗы смогли бы готовить студентов (по системам управления, например) с таким подходом. По крайней мере так делают за бугром.

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Это, кстати, очень интересная тема. Только надо Simulink знать. Я в свое время поставил поковырял (без умных книг) ничего особенно не понял и забросил. Правда и надобности особой не было. Хотя это было давно лет 5 назад, с тех пор может он стал попонятнее.

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

 По Simulink есть онлайн курсы (бесплатные). Только регистрация нужна.

http://www.mathworks.com/academia/student_center/tutorials/slregister.html

А так огромное количество видео семинаров как работать со средой в открытом доступе. Даже ютуб каналы есть, в том числе и на русском.

kikia99
Offline
Зарегистрирован: 22.03.2011

на огороде разбить огород и внем еще один огород (Среда ардуино предельна просто и достаточна ) Вы симулировать эмулировать будите два дня а код написать минуту 

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

kikia99 пишет:

на огороде разбить огород и внем еще один огород (Среда ардуино предельна просто и достаточна ) Вы симулировать эмулировать будите два дня а код написать минуту 

Уважаемый пользователь kikia99,

 

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

  • Хорошо бы сначала понять и продумать логику работы. Это решается с помощью моделирования. Для этого нужен инженер, который понимает в предметной области и проверяет алгоритм. Инженер по dsp, управлению и т.д.
  • После проверки логики можно кодировать. Только кодировать руками - опять вносить ошибки, но уже не ошибки в алгоритм, а в код. Все таки не зря, различные монстры авиа и авто внедрили автоматическую генерацию кода. А так, тот же самый специалист (который понимает в предметной области) сам программирует процессор.
  • Можно представить ситуацию, когда количество кода перевалит за 10k строк. А потом, потребуется его еще и сертифицировать. Сертифицировать ручной код :) - этого я бы не пожелал и врагу.
  • А если нужно будет переписать код под другой процессор? Будем заново писать с новой оптимизацией кода ? Не проще ли просто в одном комбобоксе выбрать другой тип процессора и не меняя модель получить из нее код, оптимизированный под новый процессор?

Попробуйте представить  хотя бы на пару минут, что у Вас есть возможность все проверить до реализации на железе.

  • Проиграть несколько вариантов алгоритма с разными коэффициентами, просто меняя параметры блоков или сами блоки.
  • Проиграть и в фиксированной, и в плавающей точке (из плавающей можно автоматически перейти в фикс).
  • Провести дискретизацию (опять же автоматически) и понять правильно Вы ее проводите или нет.
  • Модель позволяет прогнать любые тестовые воздействия.

Вопрос о написании кода за минуту. Вот есть сервопривод с нагрузкой. Нужно управлять им с определенным качеством (время регулирования). Управлять будет ПИД регулятор (один из самых простых алгоритмов). Задача - настроить ПИД для этого сервопривода. Как решить эту задачу за минуту я не представляю.

Управление сервоприводами шикарно ложиться на Arduino. Разработка подразумевает, что у нас есть специалист в предметной области, а не кодер.

Решение, которое видится мне:

1) Подаем тестовые воздействия на сервопривод через Arduino для последующей идентификации. Решаем задачу идентификации - получаем модель привода.

2) Получив модель сервопривода, отлаживаем алгоритм управления. Один из десятков (ПИД, нечеткая логика, нейросеть, регулятор с моделью предсказания, частотный синтез закона управления, линейно квадратичная оптимизация и т.д.). Не пишем на С. Работаем с простыми блоками. 

3) Переводим алгоритм управления в дискретный вид.

4) Переносим алгоритм на Arduino.

5) Проверяем управление моделью сервопривода в режиме PIL, а затем настоящим сервоприводом.

Вот такой вот огород.

kikia99
Offline
Зарегистрирован: 22.03.2011

долго читал столько букв )))))  а можно пример как Вам помогла эта среда только конкретно без воды на уши ?

 

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

Экспортировал модель в html странички - можно смотреть простым браузером.

Положил модель в архив http://db.tt/Bt5crCW. Этот архив запаролен, пароль вышлю на почту (не готов совсем уж в открытый доступ  работу выкидывать). За паролем обращайтесь сюда denis.zhegalin на softline точка ру

Для прсомотра этих страничек, необходимо установить плагин для IE от Adobe: http://www.adobe.com/svg/viewer/install/

Распаковываете архив и запускаете ярлык, либо файл index.html в IE. Откроется модель. Эта система следит за мячиком катающимся по столу. Камера висит на движке. Алгоритм управления двигателем крутится на Arduino (подсистема motor hardware, сам алгоритм управления скрыт, видно только блоки связи с платой (эмуляция компорта) PWM выдает управляющее воздействие, и получаем аналоговую обратную связь о текщем положении привода). Алгоритм распознавания образа зеленого мячика обсчитывается на PC  в Simulink (подсистема BallTrack). Подсистема Supervisory Control решает есть ли необходимость поворачивать камеру за мячом или нет (реализовано с помощью конечных автоматов). Самый первый блок в модели считывает информацию непосредственно с камеры, т.е. видео сигнал.

 

 

kikia99
Offline
Зарегистрирован: 22.03.2011

какой com то там деятель, ястно все с тобой туфтолог  

на тебе твой секретный алгоритм кто делает тому скрывать то нечего http://robocraft.ru/blog/arduino/477.html

 

(COM17 PWM выдает управляющее воздействие, и с того же COM17 получаем аналоговую обратную связь о текщем положении привода) ТАКОЕ ЕЩЕ ПРИДУМАТЬ НУЖНО ТЫ РЕАЛЬНО ТАЛАНТ 

Alexander
Offline
Зарегистрирован: 25.04.2010

Очень интересно, а мне можно пароль на почту pochta{на}arduino точка ru.

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Давайте будем более ласковы друг другу! 

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

kikia99 пишет:

какой com то там деятель, ястно все с тобой туфтолог  

на тебе твой секретный алгоритм кто делает тому скрывать то нечего http://robocraft.ru/blog/arduino/477.html

 

(COM17 PWM выдает управляющее воздействие, и с того же COM17 получаем аналоговую обратную связь о текщем положении привода) ТАКОЕ ЕЩЕ ПРИДУМАТЬ НУЖНО ТЫ РЕАЛЬНО ТАЛАНТ 

Последний раз отвечаю на оскорбления в свой адрес. Надеюсь администрация форума, примет соответствующие меры. 

Плата подключена по USB к PC.  Необходимо указать порт, на котором висит плата. Этот порт в моем случае 17. Не думал, что это так сложно понять.

kikia99
Offline
Зарегистрирован: 22.03.2011

Пора остановится! Каждому своё! с уважением Adessit

Alexander
Offline
Зарегистрирован: 25.04.2010

denis.zhegalin пишет:

Экспортировал модель в html странички - можно смотреть простым браузером.

Положил модель в архив http://db.tt/Bt5crCW. Этот архив запаролен, пароль вышлю на почту (не готов совсем уж в открытый доступ  работу выкидывать). За паролем обращайтесь сюда denis.zhegalin на softline точка ру

Для прсомотра этих страничек, необходимо установить плагин для IE от Adobe: http://www.adobe.com/svg/viewer/install/

Распаковываете архив и запускаете ярлык, либо файл index.html в IE. Откроется модель. Эта система следит за мячиком катающимся по столу. Камера висит на движке. Алгоритм управления двигателем крутится на Arduino (подсистема motor hardware, сам алгоритм управления скрыт, видно только блоки связи с платой (эмуляция компорта) PWM выдает управляющее воздействие, и получаем аналоговую обратную связь о текщем положении привода). Алгоритм распознавания образа зеленого мячика обсчитывается на PC  в Simulink (подсистема BallTrack). Подсистема Supervisory Control решает есть ли необходимость поворачивать камеру за мячом или нет (реализовано с помощью конечных автоматов). Самый первый блок в модели считывает информацию непосредственно с камеры, т.е. видео сигнал.

С разрешения Denis.Zhegalin выкладываю немного иформации об этом проекте на связке Arduino+MATLAB&Simulink:

Оборудование:

  • Arduino Board
  • ProtoShield
  • USB Type A to Type B Cable
  • Webcam
  • Hitec HS-422
  • H-Bridge IC

Все собрано наглядно в прозрачном пластиковом корпусе. На фотографии я так понял нету камеры только.
Сборка Matlab Simulink Arduino

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

 красиво) Хорошо иметь доступ к резаку акрила...

SiD
Offline
Зарегистрирован: 02.01.2012

Очень интересная тема !!!

Если вас не затруднит напишите как устанавливать  блоки для ARduino в  Матлабе ,Я новичек в матлабе и несколько запутался!!!

 

 

 

 

denis.zhegalin
Offline
Зарегистрирован: 29.06.2011

 http://www.mathworks.com/academia/arduino-software/ - это офф ресурс, повященный Arduino&MATLAB

Список необходимого софта для программирования Arduino: http://www.mathworks.com/academia/arduino-software/arduino-simulink.html, триал можно запросить на sl-matlab.ru

Вот это основной пакет с библиотекой блоков, размещенный на сообществе пользователей: 

http://www.mathworks.com/matlabcentral/fileexchange/30277

И, далее, внутри пааки в корне лежит readme.txt. Инструкция по шагам расписана.

 

ntdfish
Offline
Зарегистрирован: 10.06.2012

Тема заглохла или есть живые? Кто-то сейчас занимается связкой матлаб+ардуино?

Мне очень нравятся математические возможности матлаба, но смущает, что родная библиотека под сам матлаб работает только через USB. А хочется мобильности! Кто-то использовал xbee, wifi или bluetooth для связи с компом? Вроде это возможно, но не пойму будет ли связь с ардуино выполняться в том же формате и качестве или надо подключаться через стандартные команды серийного порта?

Симулинк вроде как заливает программу и дальше связь не нужна. В эту сторону еще не копал...

denilson
Offline
Зарегистрирован: 08.11.2012

При подключении к Матлабу проблем нет. При подключении к Симулинку выдается ошибка.

>> arduino.Prefs.setBoard('uno')
??? Reference to non-existent element of a cell array.

Error in ==> Prefs>Prefs.parseBoardsFile at 227
                lhs = parsedLines{i}{1}{1};  % can be of the
                form xx.yy.zz

Error in ==> Prefs>Prefs.setBoard at 66
            boards = arduino.Prefs.parseBoardsFile(boardsFile);

Здесь сказано http://www.mathworks.com/matlabcentral/fileexchange/authors/234855, что можно игнорировать ошибку, но затем в модели указать тип. Как это делается?

 

ntdfish
Offline
Зарегистрирован: 10.06.2012

Хороший вопрос, но я с симулинком там и не поработал. Я где то в свое время нашел такой документ SIMULINK working_with_arduino_hardware и успешно руководствовался им при подключении меги в симулинке. А что за проект если не секрет?

Кстати радио-модуль APC220 для связи с ардуиной попробовал. Работает зараза! :)

laputakoshte
Offline
Зарегистрирован: 12.10.2012

Удалено модератором

ntdfish
Offline
Зарегистрирован: 10.06.2012

laputakoshte пишет:
Долгое время искал подходящую тему для моего вопроса.

Наверное надо поискать еще лучше. Не в обиду будет сказано потому как тема Матлаба это одно, а программаторы это другое.

laputakoshte
Offline
Зарегистрирован: 12.10.2012

Программаторы.......хорошо спасибо там спрошу!

denilson
Offline
Зарегистрирован: 08.11.2012

Возникла проблема с mega2560 и simulink (r2012a), а именно, подавая на вход +5, я не вижу этого сигнала в осциллографе. Показывает 0. При этом я вижу изменения входа в матлабе. А вот в симулинке - нет. Выхода отрабатывают правильно: пишу единицу в них - единица появляется. А вот как смотреть данных с входов?

aam24
Offline
Зарегистрирован: 25.02.2013

Кстати радио-модуль APC220 для связи с ардуиной попробовал. Работает зараза!

Через IDE настроил его, а вот с SIMULINK не могу подружить. Реализую проект управления импеллерной авиамоделью с симулинка (пакет Arduino IO). По проводам уже результат есть. Бьюсь теперь с APC220. 

aam24
Offline
Зарегистрирован: 25.02.2013

Если кому интересно предлагаю сотрудничество по проектам SIMULINK+Arduino.  Как специалист по системам управления полетом поддерживаю denis.zhegalin. подтверждаю что тема реальная, если ее развить. За небольшую стоимость плат(китайских аналогов) возможно создание различных программно-аппаратных устройств различного назначения вполне приличного уровня.

denilson
Offline
Зарегистрирован: 08.11.2012

Конечно, интересно. Давайте развивать. У меня идет тяжеловато - дискретные сигналы получить на осциллографе удалось, но они появляются с задержкой.

ntdfish
Offline
Зарегистрирован: 10.06.2012

Товарищи, все это очень интересно, только времени не хватает.

Отписывайтесь пожалуйста о ваших успехах.

Я тоже пробовал APC220, но у меня была связка с самим матлабом. Действительно зараза работала. Глубокого анализа не проводил, но когда комп и ардуина стояли рядом, задержка была незначительная.

aam24
Offline
Зарегистрирован: 25.02.2013

та же проблема (с временем). Подскажите какие выставляли настройки APC220? какую библиотеку использовали для связки matlab+arduino? 

Я использую Arduino IO package  . Matlab R2010b. Плата DFRuino Romeo All-in-one. Реализовал управление 10 сервами на модели импеллерного самолета. Осталось разобраться с моторами импеллеров и выпуском шасси. Проект необходим для демонстрации возможности различных алгоритмов автоматического управления полетом. То есть система управления - в блоках simulink, датчики и исполнительные механизмы на борту авиамодели. 

Проблемы: 1) Камень преткновения - управление по воздуху. Дело в том что APC 220 по сути эмулирует com-порт. MATLAB его видит, пингует, но связь не проходит. Через IDE-интерфейс вроде простейшие пакеты по нему передаются и принимаются. а матлаб не инициализирует com.

2) сервы шумят. вроде питание на них отдельно подаю требуемое...лишка по напряжению боюсь подать.

aam24
Offline
Зарегистрирован: 25.02.2013

по поводу задержки - в simulinke ставлю в настройках моделирования: Fixed step, метод вычисления ode1 (Euler), шаг дискретизации 0.02 (то есть 50 Гц). Этот же шаг должен стоять во всех дискретных блоках модели, а также на блоках передачи сигналов в ардуино. На эти блоки сигнал должен приходить дискретный!!!!!! Даже если вся модель состоит из блоков для непрерывных систем перед передачей сигнала на плату необходимо обработать его (например простейшим Zero-Order Hold, естественно с тем же шагом дискретизации). Здесь же сигналы корректируются по амплитуде, знаку, для того чтобы серва отрабатывала нужным образом. вводится необходимая фильтрация и т.д.

Вот простым языком примерно так.

Чуть не забыл. Имеется возможность менять скорость моделирования если это необходимо (например блок Real-nime pacer). Если здесь поставить (1), то моделирование будет приближено к реальному времени, то есть передача сигнала на плату будет соответствовать реально-протекающему времени в модели, соответственно можно его увеличивать и уменьшать. либо убрать ограничение (inf). Однако все упирается в быстродействие компьютера. Если имеются сложные вычисления и большое число каналов передачи данных возможны задержки. Если есть необходимость могу рассказать подробнее.

denilson
Offline
Зарегистрирован: 08.11.2012

aam24 пишет:

Чуть не забыл. Имеется возможность менять скорость моделирования если это необходимо (например блок Real-nime pacer).

Такого блока не нашел. Есть Real-time Synchronization.

denilson
Offline
Зарегистрирован: 08.11.2012

aam24 пишет:

по поводу задержки - в simulinke ставлю в настройках моделирования: Fixed step, метод вычисления ode1 (Euler), шаг дискретизации 0.02 (то есть 50 Гц). Этот же шаг должен стоять во всех дискретных блоках модели, а также на блоках передачи сигналов в ардуино. На эти блоки сигнал должен приходить дискретный!!!!!!

Шаг ставить только в моделях или еще и во вкладке Solver? Второй вариант у меня выкидывает ошибку. Поставил auto (а в блоках 0,02), то все работает, но с той же задержкой.

aam24
Offline
Зарегистрирован: 25.02.2013

denilson пишет:

Такого блока не нашел. Есть Real-time Synchronization.

Пардон, Real-time pacer конечно. Это блок из библиотеки Arduino IO Library.

aam24
Offline
Зарегистрирован: 25.02.2013

denilson пишет:

Шаг ставить только в моделях или еще и во вкладке Solver? Второй вариант у меня выкидывает ошибку. Поставил auto (а в блоках 0,02), то все работает, но с той же задержкой.

Лучше везде ставить одинаковое значение. Ошибка скорее всего из-за того что где-то (в каком-то дисретном блоке) значение отличается. auto во вкладке solver нежелательно ставить, так как конечная задача моделирования - получить дискретный сигнал с фиксированной частотой и передать его на arduino. 

denilson
Offline
Зарегистрирован: 08.11.2012

aam24 пишет:

denilson пишет:

Такого блока не нашел. Есть Real-time Synchronization.

Пардон, Real-time pacer конечно. Это блок из библиотеки Arduino IO Library.

Вот такая ошибка вылезает: The corresponding 'msfun_realtime_pacer.tlc' file for the MATLAB S-function 'msfun_realtime_pacer' in block 'work_version/Real-Time Pacer1' must be located in the current working directory, the MATLAB S-function directory 'C:\ArduinoIO\examples', or the directory 'C:\ArduinoIO\examples\tlc_c'

А где взять этот файл msfun_realtime_pacer.tlc?

denilson
Offline
Зарегистрирован: 08.11.2012

Подаю 1 на вход. Задержки нет, а вот когда снимаю сигнал, задержка появляется.

aam24
Offline
Зарегистрирован: 25.02.2013

 

denilson

Очень похоже что вы пути к папке ArduinoIO не прописали. Выполните все действия по установке которые в readme-файле прописаны (запуск install_arduino.m). Ну или на крайний случай вручную ЛКМ на папке ArduinoIO, Add to path - selected folders and subfolders. файл msfun_realtime_pacer.tlc находится в папке C:\ArduinoIO\simulink.

RainMan
Offline
Зарегистрирован: 21.06.2011

очень интересная тема! А, может кто-либо пошагово (с сылками) хотябы начать двигать остальных?

Например, для начала ткнуть ссылкой на нужный Симулинк, описать  как настроить под Ардуину. Где взять нужные библиотеки и как из прикрутить 

ntdfish
Offline
Зарегистрирован: 10.06.2012

RainMan пишет:

очень интересная тема! А, может кто-либо пошагово (с сылками) хотябы начать двигать остальных?

Например, для начала ткнуть ссылкой на нужный Симулинк, описать  как настроить под Ардуину. Где взять нужные библиотеки и как из прикрутить 

Иди на сайт матлаба, там все черным по белому рассписано. Есть библиотеки для матлаба и симулинка. Дано описание по установке.

denilson
Offline
Зарегистрирован: 08.11.2012

Похоже, дело не в этом. Как я понял, ArduinoIO заточена по Uno, а у меня Mega. Установку ArduinoIO сделал так же, как в readme. Какая плата у вас?

ntdfish
Offline
Зарегистрирован: 10.06.2012

У меня тоже мега. Порой зависал обмен данными и сериал порт переставал отвечать. Помогала перезагрузка. А в остальном все было нормально.