Arduino和Matlab GUI教程

在这个Arduino和Matlab教程中,我们将学习如何使用Matlab GUI(图形用户界面)来控制Arduino板。我们将制作一个Matlab Gui,两个按钮用于打开和关闭LED和轴,用于绘制来自光电池(偏见电阻)的模拟输入。

这是一步一步一步的视频教程,易于遵循。此外,在视频下方您可以找到本教程所需的组件和视频中示例的源代码。

本教程所需的组件


您可以从以下任何网站获取组件:

必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

电路原理图


电路原理图 -  Matlab Gui

在此处下载MATLAB文件:

24回复

      • 儿子nguyen.

        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 {:});

      • 德扬Nedelkovski

        再试一次,以便完全相同,如视频中所述。此外,您的MATLAB和插件的版本也可能是问题,因为它们已发布MATLAB 2015的新Arduino插件。

  1. 阿尔伯特

    伟大的工作,谢谢您出版和分享您的知识!

    我正在用Arduino Mega和MATLAB进行一个类似的项目,但我想通过以太网电缆使用UDP协议直接连接两个组件。我已经尝试了所有我能看到的谷歌,但我不能得到解决方案。如果程序和这个差不多,你可能知道怎么做吧?我不想用复制粘贴我的代码来烦你,我认为它们应该或多或少还行。

    再次,谢谢你分享它!

    回复
  2. Vijay.

    嗨Dejan,
    谢谢你的代码。
    我对阅读按钮功能有疑问。行x = [x,b]是什么;暗示。我无法理解它。你能帮我么?

    回复
  3. 好日子先生,
    我的项目类似于上面所示的教程。
    但是,我正在使用流量传感器,使用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代码吗?
    谢谢!

    回复
      • 真的很感激你的时间。太感谢了!
        您是否有可能将您的Arduino素描发送给您的教程?

        基本上我的代码是在草图的顶部和底部。
        中间是“再见”的代码。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))
        返回脚本类型(0 adio。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 * /

        } /*如果串行可用*/

        } / *结束循环语句* /

        void rpm() //这是中断调用的函数
        {
        nbtopsfan ++;//这个功能测量上升和下降沿
        }

      • 德扬Nedelkovski

        我一直在使用默认的Arduino素描adioe.pde。对不起,我无法帮助你这个,因为我无法单独为每个人进行代码。我的教程的重点是提供尽可能多的知识,以便他们能够为他们的项目制作一些新的东西。bet188me

  4. 苏拉杰

    我做到了。我还有一个HCSR04超声波距离传感器。它只有数字输入/输出。它与Arduino IDE有效,但在Matlab中没有任何内容。你能找到一种绘制距离与时间变量的方法吗?

    回复
  5. ANA.

    你好!
    我正试图用arduino做一个普京。有几个LED,应该由用户选择的时间。我想制作一个接口,用户进入持续时间。你能帮助我吗?我怎样才能做到这一点?

    非常感谢你。

    ANA.

    回复
    • 德扬Nedelkovski

      您可以使用Arduino和处理IDE来做。它会更容易,看起来更好,然后使用matlab。查看我的教程,以使用Arduino和处理IDE。

      回复
  6. 埃米尔

    你好
    我想用matlap g u i连接ardiuno来控制领导和关闭
    我想使用8个开关输出和4个数字输入
    任何人都可以帮助我。谢谢你所有人

    回复
  7. ratrimo.

    你好 !

    AKA Arduinoio包是否在Matlab 2015B上运行良好?提前感谢您的回复

    回复
  8. 雍金

    感谢您分享你的知识。
    你能告诉我你的arduino代码吗?
    或者您不需要单独的Arduino代码?

    回复
  9. 雍金

    谢谢你的教程。我有一个问题要问。
    无线连接(蓝牙)是否可以实现?
    例如,我使用蓝牙模块(HC-05)从Arduino Uno获取传感器数据。我看到了类似的演示,https://www.youtube.com/watch?v=0agscd5qm5s.
    如果你知道如何,你可以解释我如何实现这一点吗?
    谢谢

    回复

留下一个回复

您的电子邮件地址不会被公开。

受到推崇的

2019年初学者和爱好者的最佳进入级示波器

初学者和爱好者最好的示波器

受到推崇的

2019年最佳Arduino入门套件

8个最好的arduino初学者工具包

受到推崇的

用于初学者和爱好者的最佳3D打印机 -  3D打印

初学者和爱好者的最佳3D打印机