资讯详情

Matlab和Arduino通信

所有附件下载地址:http://www.51hei.com/f/Arduino and Matlab.zip

Matlab广泛使用的数学软件。Arduino这也是一个非常受欢迎的开源硬件平台。两者一起玩也很酷。

特别是现在Matlab出了Arduino支援套件后,玩起来比以前的串口通信简单多了。

第一部分 Matlab Arduino Support package

第二部分 Simulink Arduino Support package

第三部分 Matlab的串口通信

第三部分 Simulink的串口通信

继续更新和编辑。

Part 1 Matlab Arduino Support package

这个支持包是为了实现Matlab与Arduino串口通信。Arduino提前在板上烧写的服务器程序(Server program),监控串口命令,必要时可返回结果。换句话说,Arduino板只需提前烧写一个程序,然后通过Matlab命令直接操作 作。

支持包支持学生版。Matlab。支撑控制板有UNO,Mega 2560,Duemilanove。

可以在Matlab下载官网,地址http://www.mathworks.de/hardware-support/arduino-matlab.html

点击下方的Requirement框里的“MATLAB Support Package for Arduino在新打开的网页右侧点击Download Submission即可

也可直接下载本贴附件ArduinoIO压缩包

下载后解压。解压文件中的解压文件pde/adiosrv/adiosrv.pde文件用Arduino IDE烧写到Arduino控制板上。

把matlab修改工作路径ArduinoIO文件夹。这样的配置就完成了。

现在来实验一下。用matlab完成一个简单的usb示波器

首先建立arduino和matlab代码如下

a = arduino('COM3');

matlab建立连接需要几秒钟

用一个1k欧洲可调电阻串联1k欧的电阻。如下图连接,楼主用的是AnalogRead pin 5

3f60cd3ac337e754b1990b1f6d999254.png

直接复制下面的代码Matlab可以操作命令框。

interval = 10000;

passo = 1;

t = 1;

x = 0;

while(t

b = a.analogRead(5)*10; % 把读到的值放大10倍

x = [x,b];

plot(x);

grid

t = t passo;

drawnow;

end

从a5阅读的值将实时绘制在图片上,效果如下图所示。可调电阻值可手动调节plot观察窗口的阻值变化。

下面试试支援套件GUI点亮或熄灭led

在这里使用digitalWrite(pin)设置了两个pushbutton。标签(tag)分别是led1和led2

在函数 _OpeningFcn 设置全局变量和初始化。

global a;

global led1_state;

global led2_state;

a = arduino('COM3');

a.pinMode(3,'output');

a.pinMode(4,'output');

a.pinMode(5,'input'); % 5读取3的状态

a.pinMode(6,'input'); % 6读取4的状态

led1_state = 0;

led2_state = 0;

在函数 led1_Callback添加以下代码

global a;

global led1_state;

if led1_state == 0

a.digitalWrite(3,1);

led1_state = a.digitalRead(5);

set(hObject, 'BackgroundColor',[0 0 1]);

else

a.digitalWrite(3,0);

led1_state = a.digitalRead(5);

set(hObject, 'BackgroundColor',[1 1 0]);

end

根据变量led1_state设置led1状态led状态,更新变量led1_state。更改按钮颜色

如果使用togglebutton,全局变量可以省略led1_state,可直接使用a.digitalWrite(3,(get(hObject,'Value)状态切换。

注:如果第二次执行时没有句子 a = arduino('COM3')删除或未清除变量a。会有错误

在函数led2_Callback在附件中类似。完整代码。

从上面的例子可以看出,a是一个arduino类。通过调用arduino类函数操作控制板。Arduino控制板看起来更像执行器。

其实Matlab Support Package for Arduino大部分操作函数和Arduino IDE编程非常相似。开始会很快,这部分不会做太多的例子。

更多支持包的操作函数见文件夹ArduinoIO下面的arduino.m文件。

我会在这栋楼里为大家整理,方便使用

Part2 Simulink Arduino Support package

这个套件其实更好玩。不用费心写代码。而是直接用simulink建立一个良好的过程,计算关系,你可以直接燃烧到控制板上,这已经成为一个模块化的编程。不幸的是,该套件只支持UNO和Mega 2560。

安装套件的过程有点麻烦

打开下面的地址,点击下面的地址。Get Support Package Now“ 将直接下载。也可在本楼附件下载。

http://www.mathworks.de/hardware-support/arduino-simulink.html

安装方法:

解压,点击下图Get Hardware Support Packages。然后选择刚才解压的文件夹,下一步

压缩包中的压缩包也可以直接使用arduino.mlpkginstall直接拖到matla命令框中。

然后按提示开始安装。

注意:安装需要一个matlab账号,建议您提前注册,学生身份账号可以使用。

打开simulink library左边可以看到Simulink Support Package for Arduino Hardware

点击可以看到熟悉的函数模块

现在放个小例子。新建一个simulink项目,

选一个Digital Output和一个Pulse Generator(在simulink/sources里面)

如下图所示。

设置下Pulse Geneartor。改变你需要的频率,占空比等。

双击Digital Output修改相应的pin number

设置后可以开始烧写。按下图打开配置窗口

选择相应的控制板型号

然后设置端口(可选自动或手动)设置波特率(相当于IDE编程时setup()函数中的Serial.begin())

点击保存完成设置。

回到simulink点击下图编辑窗口"Run"开始烧写

如果配置的arduino模型或端口不正确,烧写错误,点击"Run"下面的options重新配置。

Part 2不要做太多的介绍,应该是Arduino玩家熟悉的东西。

Simulink Support Package for Arduino:

Part 3 Matlab 串口通信

有时我们自己给Arduino编程序,希望在Matlab调用串口,读取数据。此时 Matlab Support Package for Arduino显然不合适。我们将在这里使用它Matlab串口对象在里面serial。例如,当我们需要使用它时Matlab处理摄像头图片,结合摄像头校准,摄像头识别,3D扫描后建模等。

还是以part1里面的简易示波器为例。

Arduino代码如下:

intanalogPin = 5;intval = 0;

void setup()

{

Serial.begin(9600);

}

void loop()

{

val =analogRead(analogPin);

Serial.println(val);

}

这里还是要实现Matlab的即时读取和画图。Matlab代码如下:

s = serial('COM3');%定义串口对象

set(s,'BaudRate',9600);%设置波特率s

fopen(s);%打开串口对象s

interval = 10000;%这里开始的代码很Part1里的代码类似

passo = 1;

t = 1;

x = 0;

while(t

b = str2num(fgetl(s));%用函数fget(s)从缓冲区读取串口数据,当出现终止符(换行符)停止。

x = [x,b];%所以在Arduino程序里要使用Serial.println()

plot(x);

grid

t = t+passo;

drawnow;

end

fclose(s);%关闭串口对象s

其他关于串口对象serial的函数之后更新

Part 4 Simulink 串口通信

既然和matlab通信,处理信号当然算是用simulink更方便了。不论是做实验还是研发都经常用到simulink和其他控制器来建模和采集数据分析。对于像我这样的*丝,可能也希望能用simulink和Arduino一起玩。

先说下Simulink如何从Arduino实时接收数据。和simulink配合的重点应该是分析、处理数据,而不是控制部分。

我们还是沿用Part1里面的analogRead。

先打开simulink library。点击左边的Instrument Control ToolBox。见下图

里面有Query Instrument、To Instrument、Serial Configuration、Serial Receive和Serial SendQuery Instrument和To Instrument配套使用

Serial Configuration、Serial Receive和Serial Send配套使用

先使用Serial Receive。选择一个Serial Receive。在Simulink/Sinks里面选择一个Display。如下图连接并设置。

主要讲下其中的几个重要配置。

Header留空。Terminator是串口输入的结尾控制符。因为Arduino程序里面用的是Serial.prinln(),也就是每个字符串都以换行符结 尾。所以这里我选择CR('\r'),表示每组数据读到结尾控制符,但不包含该控制符,也就是在CR('\r')之前的制定位数的数据会被读取。 Datasize要定义一个临时存放数据的矩阵。我使用的电位器为1k欧,电阻是一千欧,测量的是电阻两端的电压。也就是说测量范围是5V到 2.5V,analogRead()的返回值范围是0-1024对应0到5V,根据这里的情况,应该是1023到512。不包含'\r'的情况下,得到的 字符串应该是4到3位。所以暂时把Datasize(存放矩阵)矩阵设置为[4,1]。

Enable blocking mode勾选的情况下表示,读取输入数据时暂停其他模块。如果勾选,Serial Receive模块只有一个Output为Data,读取过程大概是这样,从Arduino发出的数据会不停的累积存到电脑缓存区。Serial Receive模块会按照数据进入的顺序读取。因为其他的操作只能在两次采样之间进行,所以这时读取数据不是实时的,而是有延迟的,随着时间延时越来越长。如果不勾选,则有两个Output为Data和Status,status只有两种值1或0,1表示有可用的数据,0表是没有可用的数据。因为不会暂停其他模块,模块意外的操作(模拟)可以看做是连续的,所以现在是实时的。

Action when data is unavailable(没有可读数据时的行为),有两个选项,Output last received value(可理解为输出最后进入缓存的数据)和Output Custom value(输出自定义值,选择该项时,可在下面的Custom Value进行设置,默认为零)。

设置完成后会出现提示框,是否立刻生成串口配置模块(Serial Configuration),该模块用通用的串口配置(Serial Receive和Serial Send)。如果不立刻生成,之后也要手动添加。

打开Serial Configuration可以进行波特率,串口号的设置。如下图

大部分都不解释了,都是基本的串口参数设置。

Flow Control(管理数据传输速度),两个选项none(没有)和hardware(硬件控制)

Time Out(超时),在每个仿真步等待数据的最大时间量。

配置完成后,运行。可以把仿真时间(simulation stop time,播放键旁边)设置大一点。

右边的图对应"1023",左边的对应"714"。左边图中第一位是10,前面说过Arduino程序里使用的是Serial.println。每一行串口数据起始位为LF('\n'),结束位为CR('\r')。LF('\n')对应的ASCii码就是10。更该Serial Receive模块里的Header以及Terminator都没有用。介绍一个比较偷懒的办法,在Arduino中修改代码:

val = analogRead(analogPin)

val = map(val, 5, 1023, 100, 999);  //把val的值修改到100至999的范围之间

这样就把值严格的控制在了3位。把datasize改为[3 1]。

现在来作图。Serial receive的Output不能直接和Scop连接,否则看到的是ASCii码的值被画到图中。按下图操作

大家也可以在附件下载压缩包。其中文件名为test1

可以把Serial receive里的Enable blocking mode勾选和不勾选,对比下效果。

相比之前的Serial receive现在使用的Query Instrument简单的多了。按下图连接下

打开Query Instrument的配置窗口。

三个标签,Hardware Configuration、Query、Instrument Initialisation。有的设置和Serial Receive一的

Hardware Configuration不多说了,基本的串口设置,波特率、串口号、缓冲区大小等。有一点说明下,在Interface可以看到这里可以选择通信方式,不止是Serial,例如还有TCPIP等等。Query Instrument是一个通用的接收查询模块。

Instrument Initialisation只在控制板需要一个初始信号的时候才需要

Query可以根据自己的需要选择,ASCii、Binary,Binblock

都是些基础知识,就不在帖子里多说了,不清楚的留言。(这个模块真的是很简单)

我们选择默认设置,也就是ASCii码。这样输出的是字符串,而且已经掐头去尾了,不需要担心数据位数。还能在简单一点么

字符串在simulink正式以ASCii码存放的,把所有元素按顺序”拼“起来就得到了我们需要的相应的值。这里用simulink/math operations/sum of Elements就可以了。

注意:如果一开始的值是1023(analogread的最大值),有的时候运行simulink会出错。目前还没查出原因。

大家也可以在附件的压缩包中找到对应的文件,文件名test

标签: arduino电位器串口监视器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台