Как реализовать быстрый обмен данными между MATLAB (или Simulink) и Arduino с помощью Bluetooth?
Интересует возможность написать верхний уровень для робота в MATLABe, а нижний уровень в Arduino IDE. Перекопал в интернете много вопросов (в том числе на английских форумах) по этой тематике, но так и не нашёл надёжного решения. Я знаю о существовании Add-ona MATLAB Support Package for Arduino Hardware, однако загрузка кода на Arduino требует слишком много времени, что доставляет значительные неудобства на этапе разработки управляющего кода. Также для робота используются библиотеки Arduino, которые отсутствуют в MATLABe. Кроме того, существует потребность получать данные с датчиков робота в режиме "реального времени". В качестве контроллера использую Arduino Due, передача данных должна осуществляться по Bluetooth (модуль Bluetooth HC-05).
Проблема заключается в том, что я не смог реализовать быстрый обмен данными между компьютером и Arduino, более того очень часто не удаётся вообще установить соединение. Использовал в коде команды serial и Bluetooth (Файл с кодом для обмена данными приложил). Задача заключается в передаче из MATLABa одного символа или одномерного массива из 8 переменных типа float, и получение от Arduino одномерного массива размером 23 переменных float. Хотелось бы, чтобы время передачи команды и получения ответа составляла 15-30 миллисекунд, так как потенциально заинтересован добавить например PID контроллер.
Если же это нельзя реализовать с помощью MATLAB кода, буду рад услышать, как можно реализовать это с помощью Simulink.
Ответы
К сожалению через HC -05 и виртуальный COM на нем у вас не получится устойчивый обмен бытсрее 30мС.
Рабочее время обмена 70-100мСек.
Для понятного времени обмена и удобной отладки можно использовать блок ComPort в Simulink, варьируя время шага расчета можно подобрать устойчивый режим работы.
Вы смотрели приложенный файл? Просто остался вопрос, почему не всегда удаётся даже установить соединение для стабильного обмена данными с Arduino (приём/передача). Фактически в библиотеке Add-on a MATLAB Support Package for Arduino Hardware это же как-то реализовано.
Ну я не знаю что значит не удается устновить соединение, висит в бесконечном while?
Возвращает какуюто ошибку?
Сложно объяснить. В половине случаев, com-порт нормлаьно считывает данные, но если отправить команду с помощью функции fprintf, он её проигнорирует и может зависнуть. При воторном подключении он вообще не подключится, выдав ошибку на подобие этой:
И из-за этого, он может достаточно длительно игнорировать попытки подключения. Ну и собственно из опыта получается, что MATLAB плохо справляется с чередованием команд на чтение с передачей.
Понятно, завтра попробую протестировать.
Попробуйте еще просто отсылку с помошью функций Read Write i Flush.
Контролирую количество полученных байт через Api функции.
Что-то я так и не понял, что вы подразумевали под Read Write i Flush. И я не знаю, что за API функции, не приходилось сталкиваться.
Протестировать у вас не получилось?