在这个Arduino和Matlab教程中,我们将学习如何使用Matlab GUI(图形用户界面)来控制Arduino板。我们将制作一个Matlab Gui,两个按钮用于打开和关闭LED和轴,用于绘制来自光电池(偏见电阻)的模拟输入。
这是一步一步一步的视频教程,易于遵循。此外,在视频下方您可以找到本教程所需的组件和视频中示例的源代码。
本教程所需的组件
您可以从以下任何网站获取组件:
- Arduino Board .................................亚马逊/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 {:});
示例1中的错误(第42行)
gui_mainfcn(gui_state,varargin {:});
再试一次,以便完全相同,如视频中所述。此外,您的MATLAB和插件的版本也可能是问题,因为它们已发布MATLAB 2015的新Arduino插件。
这就是我们在净特殊的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)
read_button%frefle handle(见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%处理手柄和用户数据的结构(见Guidata)
全球a k;
x = 0;
对于k = 1:1:handles.xsamples
b = a.readDigitalPin (2);
x = [x,b];
绘图(x,'linewidth',2);网格;
轴([0 Handles.xsamples 0 500]);
暂停(0.01);
结尾
以及弹出的错误消息(当我在Edit_Text GUI中键入值时):
评估UIControl回调时出错
未定义的函数或变量'data1'。
IOTESTMATFLOW> EDIT_TEXT_SAMPLES_CALLBALL中出现错误(第93行)
句柄。xSamples = str2double (hObject data1);
gui_mainfcn(第95行)错误
feval(varargin {:});
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;//流量计传感器连接到Digial Pin 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();//禁用中断
Flow =(NBTOPSFAN * 60/7.5);//(脉冲频率x 60)/ 7.5q,=流量
serial.println(流量);
延迟(1000);
// ---------------------
/ *变量声明和初始化* /
静态int s = -1;/* 状态 */
静态INT引脚= 13;/ *通用PIN码* /
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){
PIN = VAL-97;/ *计算PIN * /
s = 41;/ *接下来我们需要从串行* /
}
别的 {
s = 1;/ *如果值不是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 * /
#f定义(__ avr__)||定义(__ PIC32MX__)
开关(val){
案例48:
analogreference(默认);
打破;
案例49:
analogreenere(内部);
打破;
案例50:
analogreference(外部);
打破;
默认值:/ *无法识别,无动作* /
打破;
}
#万一
s = 1;/*我们完成了这个,所以下一个状态是-1 */
打破;/* s=341 take care of */
/ * s = 400往返示例函数(返回输入)* /
案例400:
/*第二个值(val)可以是任意值*/
/ *这是一个返回ASCII的辅助功能
它的第一个论点的价值。它被提供为
想要添加自己代码的人* /
/ *您自己的代码进入此处而不是串行打印* /
serial.println(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.。
如果你知道如何,你可以解释我如何实现这一点吗?
谢谢