Arduino和Matlab GUI教程

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

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

本教程所需的组件


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

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

电路原理图


电路原理图 -  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 {:});

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

      • 德扬Nedelkovski

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

  1. 阿尔伯特

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

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

    再次,谢谢你分享它!

    回复
  2. 维贾伊

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

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

    回复
      • 真的很感激你的时间。非常感谢!
        你能把你的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 ++;//这个功能测量上升和下降沿
        }

      • 德扬Nedelkovski

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

  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年最佳入门级示波器为初学者和爱好者

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

受到推崇的

8个最好的Arduino入门工具包,适合2019年初学者

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

受到推崇的

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

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