MATLAB 是多功能软件,可用于各种应用。在MATLAB之前的教程中,我们已经解释了如何使用MATLAB来控制直流电机,伺服电机和家用电器。在本教程中,我们将学习如何使用 MATLAB 进行串行通信。对于串行通信的接收端,我们在这里使用Arduino。
有两种方法可以在MATLAB和Arduino之间设置串行通信,一种是使用命令窗口,另一种是使用MATLAB GUI。两种方法的Arduino代码将保持不变。
所需组件
MATLAB 安装笔记本电脑(偏好:R2016a 或更高版本)
Arduino UNO
指示灯(任何颜色)
电阻器(330欧姆)
威廉希尔官方网站 图
对于在MATLAB和Arduino之间建立串行通信的两种方法,上面的威廉希尔官方网站 图将保持不变。
使用 MATLAB 命令窗口进行串行通信
这是在Arduino和MATLAB之间设置串行通信的简单方法。在这里,我们将简单地使用命令窗口将数据从 MATLAB 串行发送到 Arduino,然后 Arduino 读取传入的串行数据。然后,这种串行传输的数据可用于控制连接到Arduino的任何内容。在这里,我们将LED连接到Arduino,它将根据Arduino串行接收的数据打开和关闭。
首先,在Arduino UNO中上传给定的Arduino代码,然后在MATLAB编辑器窗口中开始编码。要打开新的编辑器脚本,请单击“新脚本”,如下图所示:
然后,将以下完整的 MATLAB 代码复制并粘贴到编辑器窗口中,以便在 MATLAB 和 Arduino 之间进行串行通信。
%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
在给定的代码中,以下命令用于定义 MATLAB 中的串行通信。确保com端口号是Arduino连接的端口号,并且在Arduino和MATLAB的代码中应设置相同的波特率。
x=serial('COM18','BAUD', 9600);
要打开串行端口,请使用以下命令,
fopen(x);
以下命令用于将数据从 MATLAB 串行发送到 Arduino,其中 x 用于调用串行,a 是用户输入的值。
fprintf(x,a);
我们使用while函数来创建无限循环,每当用户输入数字“2”时,循环就会中断。
while go
a= input('Press 1 to turn ON LED & 0 to turn OFF:');
fprintf(x,a);
if (a == 2)
go=false;
end
end
完成 MATLAB 编辑器脚本编码后,单击“RUN”以运行您的程序,如下图所示,
MATLAB 需要几秒钟来处理代码并开始串行通信,等到 MATLAB 在软件屏幕的左下角显示“BUSY”消息,如下图所示。
现在,您将看到用于发送用户输入的命令窗口,我们已经设置了默认消息,
'Press 1 to turn ON LED & 0 to turn OFF:'
发送“1”打开 LED,发送“0”关闭 LED,发送“2”中断操作。您可以为任何任务设置任何数字,您所要做的就是相应地更改Arduino代码。最后给出了完整的Arduino代码。
使用 MATLAB GUI 的串行通信
为了演示使用 MATLAB GUI 的串行通信,我们将使用 MATLAB 创建两个图形按钮来打开和关闭连接到 Arduino 的 LED。数据将从 MATLAB 串行发送到 Arduino,单击这些按钮以打开和关闭 LED。Arduino将包含从MATLAB接收串行数据并根据接收到的串行数据控制LED的代码。Arduino 代码将与前一个代码保持相同,唯一的区别是,以前我们通过 MATLAB 的命令窗口发送串行数据“1”和“0”,现在将在两个图形按钮上点击发送相同的数据。
要启动 GUI,请在命令窗口中键入以下命令
guide
将打开一个弹出窗口,然后选择新的空白GUI,如下图所示,
现在选择两个按钮来打开和关闭 LED,如下所示,
要调整按钮的大小或更改按钮的形状,只需单击它,您就可以拖动按钮的角。通过双击按钮,您可以更改该特定按钮的颜色,字符串和标签。我们自定义了两个按钮,如下图所示。
您可以根据自己的选择自定义按钮。现在,当您保存此代码时,将在 MATLAB 的编辑器窗口中生成一个代码。根据您希望使用 MATLAB GUI 由 Arduino 执行的任务编辑此代码。
将以下代码复制并粘贴到第 74 行以设置串行端口和波特率。
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);
其中,fopen(x) 用于打开串行端口进行串行通信。
向下滚动时,您将看到为 GUI 中的两个按钮创建了两个函数。现在,根据要在单击时执行的任务在两个函数中编写代码。
在LED-ON按钮的功能中,在功能结束之前复制并粘贴以下代码以打开 LED。正如你在下面的代码中看到的,fprintf(x,1) 用于将串行数据从 MATLAB 发送到 Arduino 串行。在这里,我们将“1”发送到Arduino串行,如果您检查Arduino代码,您会发现Arduino将通过使其13千引脚为高电平,当它的串行端口上收到“1”时。
global x;
fprintf(x,1);
在LED-OFF按钮的功能中,在功能结束之前复制并粘贴以下代码以关闭 LED。正如你在下面的代码中看到的,fprintf(x,0) 用于将串行数据从 MATLAB 发送到 Arduino 串行。在这一部分中,我们将“0”发送到Arduino串行,如果您检查Arduino代码,您会发现Arduino将通过使其13千引脚低电平,当它的串行端口上收到“0”时。
global x;
fprintf(x,0);
完成 MATLAB GUI 编码并根据威廉希尔官方网站 图设置硬件后,只需单击运行按钮即可在 .m 文件中运行编辑后的代码。
MATLAB 可能需要几秒钟才能响应,在 MATLAB 显示 BUSY 指示之前不要单击任何 GUI 按钮,您可以在屏幕的左下角看到,如下所示,
一切准备就绪后,单击 LED 打开和 LED 关闭按钮以打开和关闭 LED。当您按下 LED 亮起按钮时,13千Arduino 的引脚变为高电平,连接到此引脚的 LED 开始发光,当您按下 LED 关闭按钮时,13千Arduino的引脚变为低电平,使LED关闭。
Arduino Code for Serial Communication between MATLAB and Arduino
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 Code for Serial Communication using MATLAB GUI
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);
评论
查看更多