MATLAB представляет собой универсальное программное обеспечение, которое можно использовать для широкого множества разнообразных приложений. Ранее на нашем сайте мы уже рассматривали управление шаговым двигателем и двигателем постоянного тока с помощью MATLAB и Arduino, а также проект автоматизации дома на основе этих платформ. В этой же статье мы рассмотрим как использовать последовательную связь в системе MATLAB. В качестве приемника для последовательной связи мы будем использовать плату Arduino.
Существует два основных способа использования последовательной связи в MATLAB – с помощью окна команд (этот способ мы использовали в проекте управления сервомотором с помощью MATLAB) и с помощью MATLAB GUI (Graphical User Interface - графический интерфейс пользователя). Код программы для платы Arduino в обоих случаях будет одинаков. Если вы начинающий в этой тематике, то сначала рекомендуем прочитать статью о мигании светодиодом с помощью MATLAB и Arduino.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Установленная на компьютер математическая система MATLAB (предпочтительно версии R2016a или выше).
- Светодиод (любого цвета) (купить на AliExpress).
- Резистор 330 Ом (купить на AliExpress).
Схема проекта
Схема проекта для последовательной связи между MATLAB и Arduino представлена на следующем рисунке.
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.
Последовательная связь в MATLAB с помощью окна команд
Это самый простой способ установления последовательной связи между MATLAB и Arduino. В нем мы просто передаем данные из MATLAB в Arduino последовательно используя окно команд (command window), а затем плата Arduino считывает поступающие последовательные данные. Затем эти последовательно передаваемые данные можно использовать можно использовать для управления каким либо устройством, подключенным к Arduino – в этом проекте мы использовали для этой цели светодиод, который мы будем включать и выключать в зависимости от поступающих последовательных данных.
В этом случае загрузите в плату Arduino код программы, приведенный в конце статьи и можете начинать программирование в окне редактирования (Editor Window) в MATLAB. Чтобы открыть окно для нового скрипта нажмите на ‘New Script’ как показано на следующем рисунке.
Затем вставьте в окно редактирования следующий код программы (он служит для осуществления последовательной связи между MATLAB и Arduino):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
%MATLAB Code for Serial Communication between Arduino and MATLAB x=serial('COM18','BAUD', 9600); fopen(x); go = true; while go a= input('Press 1 to turn ON LED & 0 to turn OFF:'); fprintf(x,a); if (a == 2) go=false; end end |
В представленном коде программы команда
1 |
x=serial('COM18','BAUD', 9600); |
используется для установления последовательной связи в MATLAB. Убедитесь в том, что в ней записан именно тот номер COM порта компьютера, к которому подключена плата Arduino. Скорость передачи необходимо установить такую же как и в плате Arduino.
Чтобы открыть последовательный код используется команда
1 |
fopen(x); |
Следующая команда используется для передачи данных от MATLAB в плату Arduino последовательно, где x – это вызов последовательного порта, а a – это значение, которое вводит пользователь.
1 |
fprintf(x,a); |
Мы будем использовать функцию while для создания бесконечного цикла, выход из него будет осуществляться если пользователь введет цифру ‘2’.
1 2 3 4 5 6 7 8 9 |
while go a= input('Press 1 to turn ON LED & 0 to turn OFF:'); fprintf(x,a); if (a == 2) go=false; end end |
После того как вы запишите весь текст этого скрипта нажмите на кнопку ‘RUN’ чтобы запустить его на выполнение.
Системе MATLAB может потребоваться несколько секунд на запуск этого скрипта, не предпринимайте в это время никаких действий - до тех пор пока горит индикация BUSY (система занята) в левом нижнем углу экрана.
После запуска скрипта вы увидите окно команд, где пользователь может осуществлять ввод информации – вы увидите там приветственное сообщение, запрограммированное в рассмотренном нами скрипте.
1 |
'Press 1 to turn ON LED & 0 to turn OFF:' |
Введите ‘1’ чтобы включить светодиод, ‘0’ – чтобы выключить светодиод и ‘2’ чтобы завершить работу программы (скрипта). Вы можете использовать и любые другие символы для этого – но в этом случае необходимо будет изменить и код программы для платы Arduino (приведен в конце статьи).
Более подробно все эти процессы показаны на следующем видео.
Последовательная связь в MATLAB с использованием графического интерфейса
Для демонстрации возможностей последовательной связи в MATLAB с использованием графического интерфейса пользователя (MATLAB GUI) мы создадим в системе MATLAB две графические кнопки для включения и выключения светодиода, подключенного к плате Arduino. При нажатии этих кнопок данные будут передаваться последовательно от MATLAB к Arduino. Плата Arduino в зависимости от принятых данных будет включать или выключать светодиод. Код программы для платы Arduino будет такой же как и в предыдущем случае. Отличие будет состоять лишь в том, что в предыдущем случае мы вводили символы ‘1’ и ‘0’ в окне команд, а в этом случае они будут передаваться по последовательному каналу связи при нажатии графических кнопок.
Чтобы в MATLAB запустить графический интерфейс пользователя (GUI - Graphical User Interface) напечатайте в окне команд:
1 |
guide |
Откроется новое всплывающее окно, в нем выберите новый blank GUI как показано на следующем рисунке.
После этого поместите на рабочее поле редактора две кнопки для включения и выключения светодиода как показано на рисунке ниже.
Чтобы изменить размер или форму кнопки нажмите на нее один раз. После двойного нажатия на кнопку вы сможете изменить ее цвет, подпись и метку.
Мы кастомизировали (придали им облик) эти две кнопки следующим образом:
Вы можете оформить (кастомизировать) их по своему выбору. Когда вы сохраните этот созданный в графическом интерфейсе пользователя проект для него в окне редактирования MATLAB автоматически сгенерируется соответствующий код. В дальнейшем мы будем вносить изменения в этот код чтобы управлять включением/выключением светодиода из системы MATLAB.
Объяснение кода программы в MATLAB для осуществления последовательной связи
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Для данного проекта вы можете скачать готовые файл GUI (.fig) и файл с кодом программы (.m) (правый клик мышкой и выбирайте "сохранить объект как") и изменить их по своему усмотрению.
Скопируйте следующие строки и вставьте их в программу начиная со строки №74 чтобы установить последовательную связь с заданной скоростью.
1 2 3 4 5 |
clear all; global x; x=serial('COM18','BAUD', 9600); % убедитесь что COM порт и бодовая скорость % те же самые что и в Arduino IDE fopen(x); |
Функция fopen(x) в представленном фрагменте кода используется для открытия последовательного порта связи.
Далее в коде программы, созданном с помощью графического интерфейса, вы увидите две функции, созданные для обработки нажатий на две созданные кнопки. Теперь вам в эти функции необходимо дописать необходимый код.
В функцию для включения светодиода (LED-ON button’s function) скопируйте следующий приведенный фрагмент кода. В этом фрагменте кода функция fprintf(x,1) используется для передачи символа ‘1’ по последовательному каналу связи в плату Arduino. Если вы посмотрите код программы для платы Arduino, то вы увидите что при приеме ‘1’ по последовательному каналу связи она подает напряжение высокого уровня (HIGH) на свой 13-й контакт, то есть включает встроенный в плату светодиод.
1 2 |
global x; fprintf(x,1); |
В функцию для выключения светодиода (LED-OFF button’s function) скопируйте следующий приведенный фрагмент кода. В этом фрагменте кода функция fprintf(x,0) используется для передачи символа ‘0’ по последовательному каналу связи в плату Arduino. Если вы посмотрите код программы для платы Arduino, то вы увидите что при приеме ‘0’ по последовательному каналу связи она подает напряжение низкого уровня (LOW) на свой 13-й контакт, то есть выключает встроенный в плату светодиод.
1 2 |
global x; fprintf(x,0); |
После завершения внесения изменений в программу (в .m файл) нажмите кнопку для ее запуска.
Системе MATLAB может потребоваться несколько секунд на запуск этого файла, не нажимайте никакую кнопку на графическом интерфейсе до тех пор пока горит индикация BUSY (система занята) в левом нижнем углу экрана.
После успешного запуска программы вы можете нажимать созданные кнопки чтобы включать и выключать светодиод на плате Arduino (он подключен к ее 13-му контакту).
Исходный код программ
Код программы для Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
int value; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { if(Serial.available()>0) { value=Serial.read(); if (value == 1) { digitalWrite(13, HIGH); } if(value == 0) { digitalWrite(13, LOW); } } } |
Код программы для MATLAB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
function varargout = final(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @final_OpeningFcn, ... 'gui_OutputFcn', @final_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end handles.output = hObject; guidata(hObject, handles); function varargout = final_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; clear all; global x; x=serial('COM18','BAUD', 9600); % Make sure the baud rate and COM port is % same as in Arduino IDE fopen(x); function turnonled_Callback(hObject, eventdata, handles) global x; fprintf(x,1); function turnoffled_Callback(hObject, eventdata, handles) global x; fprintf(x,0); |