Arduino和Matlab GUI教程

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

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

本教程所需的组件


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

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

电路原理图


电路原理图 -  Matlab Gui

在这里下载Matlab文件:

24回复

      • 儿子nguyen

        undefined函数'arduino'用于输入'char'的输入参数。

        ■实施例1> example1_openingfcn(第66行)
        a = arduino('com10');

        GUI_MAINFCN(第221行)错误
        feval(gui_state.gui_openingfcn,gui_hfigure,[],guidata(gui_hfigure),varargin {:});

        示例1中的错误(第42行)
        gui_mainfcn(gui_state,varargin {:});

      • Dejan Nedelkovski.

        按照视频中描述的方法再试一次。此外,你的Matlab版本和插件可能是问题,因为他们已经发布了新的Arduino插件的Matlab 2015。

  1. 阿尔伯特

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

    我AMB与Arduino Mega和Matlab进行类似的项目,但我想通过使用UDP Protocole直接通过以太网电缆连接两个组件。我已经尝试了我看到谷歌的一切,但我无法得到解决方案。也许你知道如何做到这一点如果程序类似于这个,那么吗?我不想用我的代码的复制粘贴,我认为他们应该或多或少都不好。

    再次,谢谢你分享它!

    回复
  2. 维贾伊

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

    回复
  3. 好日子先生,
    我的项目类似于上面所示的教程。
    但是,我正在使用流量传感器,使用PWM数字引脚。
    所以我对代码进行了一些改变,但是我无法解决的错误。

    我在matlab上所做的改变:

    % - 在READ_BUTTON中执行按钮按下。
    功能read_button_callback(fhref,eventdata,handles)
    read_button的hObject句柄(参见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'。

    错误:iotestMatFlow>edit_text_samples_Callback (line 93)
    Handles.xsamples = str2double(fhref1,data1);

    gui_mainfcn(第95行)错误
    函数宏指令(变长度输入宗量{:});

    iotestMatFlow错误(第42行)
    gui_mainfcn(gui_state,varargin {:});

    @(fhrefdata)iotestmatflow('edit_text_samples_callback',frem,eventdata,guidata(fhebject)中出现错误

    评估UIControl回调时出错

    >>

    如果你能帮忙,我将不胜感激!
    能把你的arduino代码发邮件给我比较一下吗?
    谢谢!

    回复
      • 真的很感激你的时间。非常感谢!
        你能把教程的arduino草图发给我吗?

        基本上我的代码是在草图的顶部和底部。
        中间是来自Adioe.pde文件的代码。

        下面是我的arduino素描:

        不稳定的int NbTopsFan;//测量信号的上升边缘
        Int hallsensor = 2;//流量计传感器连接数字引脚2
        int flow;//读取传感器值

        // ------------------------

        / * MATLAB * /的模拟和数字输入和输出服务器* /
        /* Giampiero Campa, Copyright 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. 99)Pde…3马达。pde) * /

        / *将Mega的内部定义为1.1V(至于328)* /
        #f定义(__ avr_atmega1280__)||定义(__ AVR_ATMEGA2560__)
        #define内部内部1v1
        #万一

        void setup()
        {
        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引脚= 13;/*通用密码*/

        int val = 0;/ *从串行读取的通用值* /
        int agv = 0;/ *通用模拟值* /
        int dgv = 0;/ *通用数字值* /

        /*下面的指令经常检查是否有任何东西
        在串口上可用。什么都没有执行
        如果没有任何东西可以读取,则循环,但即将开始
        随着任何内容都可以使用,然后零件被编码
        执行if语句(这是真正的内容)*/

        if(serial.available()> 0){

        /*从串行中读取任何可用的内容*/
        val = Serial.read ();

        / *本部分基本上实现了一个状态机
        读取串行端口并仅进行一次过渡
        到一个新的状态,具体取决于以前的州
        和从串行端口读取的命令。
        有些命令需要串行的其他输入
        端口,因此它们需要2到3个状态转换(每个
        只要有新消息就会立即发布
        串行端口)要完全执行。一个命令之后
        完全执行状态是否会恢复到初始状态
        值s = -1 * /

        开关{

        / * s = -1意味着没有收到******************* * /
        案例1:

        / /计算下一个状态
        If (val>47 && val40 && s90 && s!=340 && s!=400)) {
        s = 1;
        }

        / *中断语句从交换机中取出,所以
        / *我们返回并等待新的串行数据* /
        打破;/ * s = -1(初始状态)照顾* /

        /* s=0或1表示CHANGE PIN MODE */

        案例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;/*如果值不是一个引脚,则返回-1 */
        }
        打破;/ * s = 40照顾* /

        案例41:
        /*第三个接收到的值表示模拟值*/
        模拟网(PIN,VAL);/ *执行模拟输出* /
        s = 1;我们完成了AO所以下一个状态是-1 */
        打破;/ * s = 41照顾* /

        /* 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照顾* /

        /* s=400往返示例函数(返回输入)*/

        案例400:
        / *第二个值(Val)真的可以在这里* /

        / *这是一个返回ASCII的辅助功能
        其第一个参数的值。它被提供为
        想要添加自己代码的人* /

        /*你自己的代码在这里而不是串行打印*/
        以(val);

        s = 1;/ *我们完成了AUX函数所以-1 * /
        打破;/* s=400 take care of */

        / * *******无法识别的状态,回到s = -1 ******* * /

        默认:
        / *我们永远不会到这里,但如果我们这样做意味着我们
        处于意想不到的状态,所以无论第二个是什么
        收到的价值我们离开这里并返回s = -1 * /

        s = 1;/*返回到初始状态,中断不必要的*/

        } / *结束开关状态S * /

        } / *结束如果串行可用* /

        } /*结束循环语句*/

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

      • Dejan Nedelkovski.

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

  4. 苏拉

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

    回复
  5. ANA.

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

    非常感谢你。

    ANA.

    回复
    • Dejan Nedelkovski.

      您可以使用Arduino和Processing IDE来实现这一点。这比使用Matlab更简单,看起来更好。查看我的教程来使用Arduino和Processing 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年初学者的8个最佳Arduino Starter Kits

初学者的8个最佳Arduino Starter Kits

受到推崇的

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

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