在这个Arduino和Matlab教程中,我们将学习如何使用Matlab GUI(图形用户界面)控制Arduino板。我们将制作一个Matlab GUI,其中有两个按钮用于打开和关闭led,以及一个轴用于绘制来自光电管(光依赖电阻)的模拟输入。
这是一步一步一步的视频教程,易于遵循。此外,在视频下方您可以找到本教程所需的组件和视频中示例的源代码。
本教程所需的组件
您可以从以下任何网站获取组件:
- Arduino电路板 .................................亚马逊/Banggood/aliexpress.
- 面包板和跳线.........亚马逊/Banggood/aliexpress.
- 引领 ……………………………………………亚马逊/Banggood/aliexpress.
- 220欧姆电阻..........................亚马逊/Banggood/aliexpress.
- 光电灯泡....................................亚马逊/Banggood/aliexpress.
yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
电路原理图
在这里下载Matlab文件:
伟大的工作,谢谢
谢谢!
undefined函数'arduino'用于输入'char'的输入参数。
■实施例1> example1_openingfcn(第66行)
一个= arduino (COM10);
GUI_MAINFCN(第221行)错误
feval(gui_state.gui_openingfcn,gui_hfigure,[],guidata(gui_hfigure),varargin {:});
Example1中的错误(第42行)
gui_mainfcn(gui_state,varargin {:});
按照视频中描述的方法再试一次。此外,您的Matlab版本和插件可能是问题,因为他们已经发布了新的Arduino插件的Matlab 2015。
这就是我们在净特殊的X德国所需的东西
伟大的工作,谢谢您出版和分享您的知识!
我想用Arduino Mega和MATLAB进行一个类似的项目,但是我想使用UDP协议通过以太网电缆直接连接这两个组件。我尝试了我在谷歌上看到的所有方法,但我还是不能得到解决方案。如果手术过程和这个类似,也许你知道怎么做,对吧?我不想用我的代码的复制粘贴让你感到厌烦,我认为它们应该或多或少是ok的。
再次,谢谢你分享它!
谢谢!我没有尝试过类似的程序,所以我不能回答你的问题。
嗨Dejan,
谢谢你的代码。
我对阅读按钮功能有疑问。行x = [x,b]是什么;暗示。我无法理解它。你能帮我么?
它是一个数组,每个下一个元素都有上一个模拟读取“b”的值。然后该数组用于绘图。
这可能有助于更好地理解:https://www.mathworks.com/help/matlab/ref/plot.html#btzptin.
好日子先生,
我的项目类似于上面所示的教程。
但是,我正在使用流量传感器,使用PWM数字引脚。
所以我对代码进行了一些改变,但是我无法解决的错误。
我在matlab上所做的改变:
% - 在READ_BUTTON中执行按钮按下。
功能read_button_callback(fhref,eventdata,handles)
% hObject句柄read_button(见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%用句柄和用户数据来处理结构(参见GUIDATA)
全球a k;
x = 0;
对于k = 1:1:handles.xsamples
b = a.readDigitalPin (2);
x = [x,b];
绘图(x,'linewidth',2);网格;
轴([0处理。xSamples 0 500]);
暂停(0.01);
结尾
弹出的错误消息(当我在edit_text gui中输入一个值):
评估UIControl回调时出错
未定义的函数或变量'data1'。
edit_text_samples_Callback(第93行)错误
句柄。xSamples = str2double (hObject data1);
gui_mainfcn(第95行)错误
函数宏指令(变长度输入宗量{:});
iotestMatFlow错误(第42行)
gui_mainfcn(gui_state,varargin {:});
@(fhrefdata)iotestmatflow('edit_text_samples_callback',frem,eventdata,guidata(fhebject)中出现错误
评估UIControl回调时出错
>>
非常感谢您的帮助!
你介意把你的arduino代码发邮件给我,让我比较一下吗?
谢谢!
好吧,我不确定你是否正确地从传感器获取数据,以及为什么你没有改变任何东西的'data1'变量。
真的很感激你的时间。非常感谢!
你能把你的arduino草图发给我做教程吗?
基本上我的代码是在顶端和底部的草图。
中间是来自adioe的代码。pde文件。
下面是我的arduino素描:
不稳定的int NbTopsFan;//测量信号的上升边缘
int hallsensor = 2;//流量计传感器连接到数字引脚2
int flow;//读取传感器值
//——————————————————————————-
/ * MATLAB * /的模拟和数字输入和输出服务器* /
/* Giampiero Campa,版权所有2013 The MathWorks, Inc */
/ *此文件旨在与Matlab Arduino IO一起使用
但是,它可以在IDE环境中使用
(或任何其他串行终端)通过键入命令,如:
0E0:将数字引脚#4(e)分配为输入
0f1:指定数字引脚5 (f)作为输出
0n1:指定数字引脚13 (n)作为输出
1C:读取数字引脚#2(c)
1E:读取数字引脚#4(e)
2n0:设置数字引脚13 (n)低
2n1:设置数字引脚#13(n)高
2F1:设置数字引脚#5(f)高
2f0:设置数字引脚5 (f)低
4J2:将数字引脚#9(j)设置为50 = ASCII(2)超过255
4JZ:将数字引脚#9(j)设置为122 = ASCII(Z)超过255
3A:读取模拟引脚#0(a)
3F:读取模拟引脚#5(f)
R0:将模拟引用设置为默认值
R1:将模拟引用设置为内部
R2:设置模拟参考到外部
X3:返回输入(ascii(3))的往返示例
99:返回脚本类型(0 adio。pde…3电机。pde) * /
/ *将Mega的内部定义为1.1V(至于328)* /
#f定义(__ avr_atmega1280__)||定义(__ AVR_ATMEGA2560__)
#define内部内部1v1
#万一
无效的设置()
{
pinMode (hallsensor、输入);//初始化数字引脚2为输入
附着图(0,rpm,升起);//和中断附加
Serial.Begin(115200);//连接速度= 9600
}
void循环()
{
NbTopsFan = 0;//设置NbTops为0,准备进行计算
sei ();/ /允许中断
延迟(1000);//等待1秒
CLI();//禁用中断
流量= (NbTopsFan * 60 / 7.5);//(脉冲频率x 60) / 7.5Q, =流量
serial.println(流量);
延迟(1000);
//—————————————————————-
/ *变量声明和初始化* /
静态int s = -1;/* 状态 */
静态int pin = 13;/*通用密码*/
int val = 0;/ *从串行读取的通用值* /
int agv = 0;/ *通用模拟值* /
int dgv = 0;/ *通用数字值* /
/*下面的指令经常检查是否有任何东西
可通过串口获取。没有执行任何东西
如果没有任何东西可以读取,则循环,但即将开始
随着任何内容都可以使用,然后零件被编码
执行if语句(这是真正的东西)*/
if(serial.available()> 0){
/*从串行中读取任何可用的数据*/
val = Serial.read ();
/*这个部分基本上实现了一个状态机
读取串行端口并仅进行一次过渡
到一个新的状态,具体取决于以前的州
以及从串口读取的命令。
有些命令需要串行的其他输入
端口,因此它们需要2个或3个状态转换(每个都需要
只要有新消息就会发生
串行端口)要完全执行。一个命令之后
是否完全执行状态返回到初始状态
值s = -1 * /
开关(s) {
/ * s = -1意味着没有收到******************* * /
案例1:
/*计算下一个状态*/
if (val>47 && val40 && s90 && s!=340 && s =400) {
s = 1;
}
/ *中断语句从交换机中取出,所以
/ *我们返回并等待新的串行数据* /
打破;/ * s = -1(初始状态)照顾* /
/* s=0或1表示更改引脚模式*/
案例0:
/*第二个接收到的值表示引脚
从ABS('c')= 99,引脚2,到abs('|')= 166,引脚69 * /
if(val> 98 && val47 && val98 && val98 && val67 && val96 && val98 && val <167){
销= val - 97;/*计算pin */
s = 41;/ *接下来我们需要从串行* /
}
别的 {
s = 1;/*如果value不是pin则返回-1 */
}
打破;/ * s = 40照顾* /
案例41:
/*接收到的第三个值表示模拟值*/
analogWrite(销,val);/*模拟输出*/
s = 1;/*我们完成了AO,所以下一个状态是-1 */
打破;/* s=41 take care of */
/* s=90表示查询脚本类型:
(0 ADIO,1 ADIOENC,2 ADIOSRV,3台电机)* /
90年情况:
if(val == 57){
/ *如果发送的字符串是99通过串行* /发送脚本类型
serial.println(0);
}
s = 1;/*我们完成了这个,所以下一个状态是-1 */
打破;/ * s = 90拍摄* /
/ * s = 340或341表示模拟参考*************** * /
340年情况:
/*第二个接收到的值表示引用,
默认为0,1,2编码,内部
分别和外部。注意这个函数
被忽略的电路板没有AVR或PIC32 * /
#if (__AVR__) || defined(__PIC32MX__)
开关(val){
案例48:
analogReference(默认);
打破;
案例49:
analogreenere(内部);
打破;
案例50:
analogreference(外部);
打破;
默认值:/ *无法识别,无动作* /
打破;
}
#万一
s = 1;/*我们完成了这个,所以下一个状态是-1 */
打破;/* s=341 take care of */
/* s=400 round - trip示例函数(返回输入
案例400:
/*第二个值(val)可以是任意值*/
/ *这是一个返回ASCII的辅助功能
第一个参数的值。它是作为一个
想要添加自己代码的人* /
/*你自己的代码在这里代替串行打印*/
以(val);
s = 1;/ *我们完成了AUX函数所以-1 * /
打破;/* s=400被照顾*/
/* ******* 未识别的状态,回到s = 1 ******* */
默认:
/ *我们永远不会到这里,但如果我们这样做意味着我们
处于一种意想不到的状态,那么第二种是什么呢
收到的价值我们离开这里并返回s = -1 * /
s = 1;/*返回初始状态,中断不需要的*/
} / *结束开关状态S * /
} /*如果serial可用,则结束
} /*结束循环语句*/
void rpm() //这是中断调用的函数
{
nbtopsfan ++;//这个功能测量上升和下降沿
}
我一直在使用默认的Arduino素描adioe.pde。对不起,我无法帮助你这个,因为我无法单独为每个人进行代码。我的教程的重点是提供尽可能多的知识,以便他们能够为他们的项目制作一些新的东西。足彩网女欧洲杯
我做到了。我还有一个HCSR04超声波距离传感器。它只有数字输入/输出。它与Arduino IDE有效,但在Matlab中没有任何内容。你能找到一种绘制距离与时间变量的方法吗?
嗯,你必须组合那些两个教程或代码并制作一个代码,它将适用于您。我没有这样的组合。
你好!
我正试图用arduino做一个普京。有几个LED,应该由用户选择的时间。我想制作一个接口,用户进入持续时间。你能帮助我吗?我怎样才能做到这一点?
非常感谢你。
ANA.
您可以使用Arduino和处理IDE来实现这一点。它会更容易,它会看起来更好,然后使用Matlab。查看我的教程,了解如何使用Arduino和处理IDE。
你好
我想用matlap g u i连接ardiuno来控制领导和关闭
我想使用8个开关输出和4个数字输入
任何人都可以帮助我。谢谢你的所有
非常好的教程
你好!
Aka ArduinoIO包在Matlab 2015b上工作良好吗?提前感谢你的回复
不确定,我还没在那个版本上测试过。
感谢您分享你的知识。
能给我看看你的arduino代码吗?
还是不需要单独的arduino代码?
谢谢。检查我单独的Arduino和Matlab教程,以便更好地了解该通信如何工作。Arduino代码附带了Arduino IO套餐......
谢谢你的教程。我有一个问题要问。
无线连接(蓝牙)是否可以实现?
例如,我使用蓝牙模块(HC-05)从Arduino Uno获取传感器数据。我看到了类似的演示,https://www.youtube.com/watch?v=0agscd5qm5s.。
如果你知道如何,你可以解释我如何实现这一点吗?
谢谢你!