• Регистрация
GrY
GrY -0.17
н/д

Как реализовать быстрый обмен данными между MATLAB (или Simulink) и Arduino с помощью Bluetooth?

22.10.2019
Интересует возможность написать верхний уровень для робота в MATLABe, а нижний уровень в Arduino IDE. Перекопал в интернете много вопросов (в том числе на английских форумах) по этой тематике, но так...

Интересует возможность написать верхний уровень для робота в 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.

Теги

    22.10.2019

    Комментарии

    • Andrey Ermakov
      Andrey Ermakov +56.93
      25.10.2019 07:09

      К сожалению через HC -05 и виртуальный COM  на нем у вас не получится устойчивый обмен бытсрее 30мС.

      Рабочее время обмена 70-100мСек.

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

      • GrY
        GrY-0.17
        25.10.2019 07:26

        Вы смотрели приложенный файл? Просто остался вопрос, почему не всегда удаётся даже установить соединение для стабильного обмена данными с Arduino (приём/передача). Фактически в библиотеке Add-on a MATLAB Support Package for Arduino Hardware это же как-то реализовано.

        • Andrey Ermakov
          Andrey Ermakov +56.93
          25.10.2019 12:10

          Ну я не знаю что значит не удается устновить соединение, висит в бесконечном while?

          Возвращает какуюто ошибку?

          • GrY
            GrY-0.17
            25.10.2019 12:42

            Сложно объяснить. В половине случаев, com-порт нормлаьно считывает данные, но если отправить команду с помощью функции fprintf, он её проигнорирует и может зависнуть. При воторном подключении он вообще не подключится, выдав ошибку на подобие этой:

            Warning: Unsuccessful read: A timeout occurred before the Terminator was reached. 'serial' unable to read any data.

            И из-за этого, он может достаточно длительно игнорировать попытки подключения. Ну и собственно из опыта получается, что MATLAB плохо справляется с чередованием команд на чтение с передачей.

            • Andrey Ermakov
              Andrey Ermakov +56.93
              27.10.2019 17:36

              Понятно, завтра попробую протестировать. 

              Попробуйте еще просто отсылку  с помошью функций Read Write i Flush.

              Контролирую количество полученных байт через Api функции.

              • GrY
                GrY-0.17
                12.11.2019 07:51

                Что-то я так и не понял, что вы подразумевали под Read Write i Flush. И я не знаю, что за API функции, не приходилось сталкиваться.

                Протестировать у вас не получилось?