查看: 7552|回复: 9

MU视觉传感器模块试用——hzpyj

[复制链接]
  • TA的每日心情
    无聊
    2020-10-2 17:20
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2017-2-4 21:37 | 显示全部楼层 |阅读模式
    本帖最后由 hzpyj 于 2017-2-6 14:45 编辑

       收到的MU视觉传感器模块尺寸还算小巧,外形尺寸约31mm×31mm,厚度约8.5mm(含镜头)。
       随模块附带有2.54mm间距的单排排针,需要自己按需焊接。到手我就都焊上了。
       2.png
       1.png
      
      板子的设计时间是2017年1月 版本V2.0.2

      电源、串口、SPI、舵机接口一目了然

    通过附带的MicroUSB线缆连接MU视觉传感器模块的Micro USB接口,连上电脑USB口进行初步的熟悉、设置等工作。

    在连接电脑后,需点按一下模块的Mode按钮,此时指示灯转变为紫色。电脑端会自动检测到新硬件,并安装驱动。
      
       3.png
      
       4.png
       
      
      
      
      
      
      
      



    Win7系统下需单独安装相应驱动才能正确识别。
       5.png
      

    Snap2.png
    无法识别

      
      成功识别

      
      为了更好的安装驱动减少麻烦提供以下地址去下载吧( 因为论坛限制上传容量)http://share.dzkf.cn/down/down.php?downid=27042&id=0 里面有32位及64位的驱动。安装前请不要插上模块,切记切记!! 我已经被折腾死了,安装这个后总算是OK了。

    Win10系统下则比较方便了,直接能识别为USB串口
      
      
        6.png
      

    此时我们可以通过串口软件对模块进行设置或查询状态了。


    发送指令:CMD+SENSOR_SETUP<回车>
    模块进入SETUP模式,指示灯同时转变为黄色

    发送查询指令:CMD+SENSOR_STATUS<回车>
    模块输出当前的设置信息内容:
      Current Settings:
      CMD+VISION_STATUS=ENABLE
      CMD+VISION_TYPE=FACE
      CMD+USB_STATUS=ENABLE
      CMD+UART_STATUS=ENABLE
      CMD+UART_BAUD=115200
       and Data bits:8 Stop bits:1 Parity:NONE
      CMD+SERVOX_STATUS=DISABLE
      CMD+SERVOX_INITANGLE=90
      CMD+SERVOX_REVERSE=DISABLE
      CMD+SERVOY_STATUS=DISABLE
      CMD+SERVOY_INITANGLE=90
      CMD+SERVOY_STEP=10
      CMD+SERVOY_REVERSE=DISABLE
      
      里面的包含了模块的图像识别状态、串口信息、舵机控制状态等。
      

    我们还可以通过CMD+SENSOR+HELP<回车>获得更多的指令提示。这样就不用死记硬背指令代码了。
      ============Welcome!!!============
      MU - An Intelligent Vision Sensor
      All Commands:
      
      CMD+SENSOR_SETUP
      CMD+SENSOR_HELP
      CMD+SENSOR_RESET
      CMD+SENSOR_STATUS
      CMD+SENSOR_EXIT
      CMD+VISION_STATUS=ENABLE or DISABLE
      CMD+VISION_TYPE=LINE or BALL or BODY or  FACE
      CMD+USB_STATUS=ENABLE or DISABLE
      CMD+UART_STATUS=ENABLE or DISABLE
      CMD+UART_BAUD=1200~576000
      CMD+SERVOX_STATUS=ENABLE or DISABLE
      CMD+SERVOX_STEP=-100~100 (integer)
      CMD+SERVOX_INITANGLE=0~180 (integer)
      CMD+SERVOX_REVERSE=ENABLE or DISABLE
      CMD+SERVOY_STATUS=ENABLE or DISABLE
      CMD+SERVOY_STEP=-100~100 (integer)
      CMD+SERVOY_INITANGLE=0~180 (integer)
      CMD+SERVOY_REVERSE=ENABLE or DISABLE
      
      Each Command requires "Carriage Return"  and "Line Feed" at the end
      
      Each command can be use "?" to  return current setting:
      
      CMD+VISION_TYPE=?
      
      Current Vision Type is: BODY
      
      More information can be found at  http://www.morpx.com
      
      ============Morpx.Inc.============
      
      浏览了一遍指令,为了方便对模块进行测试,发现可以通过CMD+USB_STATUS=ENABLE 打开USB调试模式,直接通过USB串口查看输出的数据。
      

    立马进入测试!!
    模块有效识别时,指示灯显示为蓝色,否则为红色。不过经过测试,此不能完全用来判断模块是否识别成功,还是以实际数据信息为真吧。

    CMD+VISION_TYPE=BALL<回车>
    拿来个网球,固定位置测试了一组数据(蓝灯稳定,不闪烁)
      
       7.png


      FF FE 01 06 39 37 2E 2D 3F
      FF FE 01 0B 0B 37 2B 23 2E
      FF FE 01 0B 77 37 2B 26 31
      FF FE 01 0A B3 35 2B 23 2E
      FF FE 01 0B 47 34 2B 1E 28
      FF FE 01 0A 8F 33 2B 23 2E
      FF FE 01 0A 2D 37 2B 23 2E
      FF FE 01 0A 47 35 2C 24 2F
      FF FE 01 0A FB 38 2B 23 2E
      FF FE 01 0B 79 38 2C 24 2F
      
      根据以上数据分析判断,模块对球的识别时,数据变化还是蛮大的,可能是因为有二:一是摄像头采用的广角镜头;二是球面的弧度。
      

    CMD+VISION_TYPE=LINE<回车>
    在纸面上随机画了一条直线带拐弯(L形)。在直线上识别出来的数据还是可以的。
      FF FE 01 03 E8 44 10 1C 0B
      FF FE 01 03 E8 42 0E 1A 09
      FF FE 01 03 E8 41 0D 19 08
      FF FE 01 03 E8 43 0E 1A 09
      FF FE 01 03 E8 41 0D 19 08
      FF FE 01 03 E8 44 10 1C 0B
      FF FE 01 03 E8 3C 17 14 12
      FF FE 01 03 E8 41 0D 19 08
      FF FE 01 03 E8 43 0A 1E 08
      FF FE 01 03 E8 44 0B 1B 05
      
      在直线拐弯处,识别还是很OK的。
    针对线的识别进行以下多次的测试:
    不同线粗、不同的高度,不同的角度,在单独一条线的状态下,模块对线在视距内的识别程度相当高。但同时多条线情况下,识别会有漂移,特别是抬高高度时,多条线出现在视距情况下的时候。
      
       Snap1.png 增加测试了激光线条识别效果还是杠杆的。


    此模块用于巡线小车那是一点问题都没有了。没有模块的还不下手?!

    CMD+VISION_TYPE=FACE<回车>
    脸的识别,从数据看还是相对稳定的,但此数据是在距离脸大约10cm以内测得的。再远则稳定度偏差了。
      FF FE 01 33 78 41 32 1E 28
      FF FE 01 33 78 42 33 1F 29
      FF FE 01 33 78 3F 33 1F 29
      FF FE 01 33 78 3F 33 1F 29
      FF FE 01 33 78 44 31 21 2B
      FF FE 01 33 78 44 31 21 2B
      FF FE 01 33 78 44 31 21 2B
      FF FE 01 33 78 42 2F 1E 28
      FF FE 01 33 78 43 34 20 29
      FF FE 01 33 78 44 35 21 2B
      
      
      






    评分

    参与人数 1金币 +5 贡献 +1 收起 理由
    michael_llh + 5 + 1 很给力!

    查看全部评分

  • TA的每日心情
    无聊
    2020-10-2 17:20
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2017-2-4 22:00 | 显示全部楼层
    本帖最后由 hzpyj 于 2017-2-20 11:39 编辑

    舵机测试!!!!!大BUG!!!!
    通过指令开启X轴、Y轴舵机后,默认缺省设置,插上舵机,舵机会动,但再按mode键,对不起,永远都进不了SETUP模式了。短按mode按钮,只能看到紫色短闪一下,直接恢复正常模式。
    CMD+SERVOX_STATUS=ENABLE
    CMD+SERVOX_INITANGLE=90
    CMD+SERVOX_STEP=10
    CMD+SERVOX_REVERSE=DISABLE
    CMD+SERVOY_STATUS=ENABLE
    CMD+SERVOY_INITANGLE=90
    CMD+SERVOY_STEP=10
    CMD+SERVOY_REVERSE=DISABLE
    设置的舵机参数

    X轴2路舵机均会动,90°位置也正确; Y轴全部不会动,只在复位或上电时有动作声。


    因为无法进入SETUP模式了。后继无法再修改参数及设置。


    ======================2017.02.08=========================
    官方对BUG进行了修正,按照固件更新方法进行了更新
    Snap2.png
    新固件虽然解决的以上问题,但也没有让你有什么感觉!为什么……  请看下面

    UART Status is ENABLE
    Servo X and Servo Y Status are DISABLED automatically


    串口开启后,XY舵机就自动关闭了。

    尝试开启舵机,对不起!串口你就没得玩了。它马上又把串口给关了。

    这算什么意思!!虽然我暂时不使用舵机,关不关倒也无所谓,但似乎针对一个产品不能如此粗暴的处理BUG吧。
    因为官方没有针对新固件更新内容的任何说明,只说有封闭部分功能

    ============== 2月15日 =================== 官方更新了固件。针对固件的更新也进行了说明。这才像个对产品负责的样子。虽然这是个测试版本。
    Mu_For_Maker_V0_1_3_20170215_e.rar (188.83 KB, 下载次数: 12)
  • TA的每日心情
    擦汗
    2017-8-16 16:44
  • 签到天数: 229 天

    [LV.7]常住居民III

    发表于 2017-2-5 11:37 | 显示全部楼层
    厉害厉害                     
  • TA的每日心情
    开心
    2019-7-17 13:13
  • 签到天数: 264 天

    [LV.8]以坛为家I

    发表于 2017-2-5 12:05 来自手机 | 显示全部楼层
    感谢楼主,入门必看,少走弯路。补充一点,短按mode健,非常短,几乎就是碰一下。否则进不了setup。
  • TA的每日心情
    奋斗
    2019-6-20 09:44
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2017-2-6 09:59 | 显示全部楼层
    我们还需不断进步
  • TA的每日心情
    奋斗
    2018-12-14 14:19
  • 签到天数: 30 天

    [LV.5]常住居民I

    发表于 2017-2-7 11:17 | 显示全部楼层
    厉害厉害,不明觉厉
  • TA的每日心情
    无聊
    2020-10-2 17:20
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2017-2-20 11:27 | 显示全部楼层
    本帖最后由 hzpyj 于 2017-2-20 11:40 编辑

    ==========  2017.02.19 ============
    初步完成了巡线小车。当然还是需要修改的,但基本达到既定要求了。
    走直线偏离会自动调整归位。曲线暂时好不成熟。




    根据实际的数据分析,提交些个人在过程中的知识点供大家参考:
    Snap1.jpg
    这是要讲解的知识点示意图(线模式),

    1、X轴:指横向轴,MU视觉传感器是以50为中心点,左右分各50。实际数据以此划分,可以判断当前的偏移量。
    2、Y轴:暂时没用到,应该是景深的意思,即距离感。
    3、左、右斜趋势:是小车在巡线中可能偏移的情况示意。但实际控制点却仅仅是最后的顶点位置。
        下面说下怎么用:
        小车巡线,往往因为轮差导致小车逐渐偏移位置,但偏移量过大,则小车找不到线了。
         如果在运行中我们就把某条趋势进行采点存储,则我们就能知道小车的运行偏移趋势,在小车找不到线的时候让其对数据进行分析,进行偏移补偿,则小车又会回到正确的巡线路径上。

    [mw_shl_code=bash,true]#include "VisionSensor.h"

    /*小车运动代码*/
    //++++++++此为扩展板已有定义,无法更改
    int INA = 4;      //电机A正反转控制端
    int PWMA = 5;     //电机A调速端
    int INB = 7;      //电机B正反转控制端
    int PWMB = 6;     //电机B调速端

    //++++++++小车运行变量定义
    int value_L, value_R;
    int L_run;
    int R_run;    //小车电机驱动运行值
    int x1, x2, x3, x_temp;

    VisionSensor MU(Serial, 115200);


    //===========  电机动作  ===============//
    //低速前进
    void go()
    {
      value_L = L_run ;
      value_R = R_run ;
      Go_run();
    }

    //左转弯
    void left()
    {
      value_L = 0 ;
      value_R = 170 ;
      Serial.println("left");
      Go_run();
      delay(300);
    }

    //右转弯
    void right()
    {
      value_L = 170 ;
      value_R = 0 ;
      Serial.println("right");
      Go_run();
      delay(300);
    }

    //停止
    void stop()
    {
      value_L = 0 ;
      value_R = 0 ;
      analogWrite(PWMA, value_L);     //PWM调速
      analogWrite(PWMB, value_R);
    }

    //后退
    void back()
    {
      value_L = L_run ;
      value_R = R_run ;
      digitalWrite(INA, LOW);         //反转
      digitalWrite(INB, LOW);         //
      analogWrite(PWMA, value_L);     //PWM调速
      analogWrite(PWMB, value_R);
    }

    //电机驱动
    void Go_run()
    {
      digitalWrite(INA, HIGH);        //HIGH为前进,LOW为后退
      digitalWrite(INB, HIGH);
      analogWrite(PWMA, value_L);     //PWM调速
      analogWrite(PWMB, value_R);
      //  digitalWrite(PEER,0);
    }

    void setup()
    {
      pinMode(INA, OUTPUT);
      pinMode(INB, OUTPUT);
      Serial.begin(115200);
      MU.begin();   //initialize
    }



    void L_R()
    {
      //================ 右斜趋势 ===========
      if ((x1 > x2) && (x2 > x3)) {     //左偏移趋势

        if (x3 < 50) { //在X轴左侧,右拐
          if ((50 - x3) < 20)   //小幅右转
          { right();
          }
          else {
            if ((x3 - 50) > 20) { //趋前
              L_run = 150;
              R_run = 120;
              go();
            }
          }
        }
        //==================== 左斜趋势 ==========
        if ((x1 < x2) && (x2 < x3)) {     //右偏移趋势

          if (x3 < 50) { //在X轴左侧,右拐
            if ((50 - x3) < 20) {  //趋前
              L_run = 120;
              R_run = 150;
              go();
            }
            else {
              if ((x3 - 50) > 20) { //小幅左转
                left();
              }
            }
          }
        }
      }
    }

    void loop()
    {
      int M;

      MU.search();

      if (MU.valid() > 0)
      {
        if (MU.detected() == true)
        {
          if (MU.getWidth() > 5) {
            x1 = MU.getX();
            delay(10);
            x2 = MU.getX();
            delay(10);
            x3 = MU.getX();

            Serial.print("Width");
            Serial.println(MU.getWidth());

            Serial.print("X:");
            Serial.print(x1);
            Serial.print("=");
            Serial.print(x2);
            Serial.print("=");
            Serial.println(x3);


            if ((x3 > 40) || (x3 < 60))  {
              L_run = 190;
              R_run = 190;
              go();
              delay(500);
            }

            if (x3 < 30)  {
              M = 50 - x3;
              Serial.print("M:");
              Serial.println(M);
              if (M >= 8) {
                left();
              }
            }
            else {
              if ( x1 > 60) {
                M = x1 - 50;
                Serial.print("M==");
                Serial.println(M);
                if (M >= 8) {

                  right();
                }
              }
            }
          }
        }
        else {
          stop();
          L_R();
        }
      }
      else {
        stop();
        L_R();
      }

    }[/mw_shl_code]

    以上仅供参考,大牛们一定有更好的方法。



  • TA的每日心情
    奋斗
    2019-6-20 09:44
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2017-3-1 14:04 | 显示全部楼层
    非常详细,赞!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    求助!arduino编译esp32s的板子失败
    求助!arduino编译esp32s
    新安装的mac系统和arduino IDE,开发板都安装好了,测试的代码为示例Blink,可一直编译
    开个帖子,记录我造小车的过程   欢迎大家批评指正
    开个帖子,记录我造小车的
    目的:想做一个可以远程控制的小车车,放在家里在公司都可 以控制的。控制:MEGA2560+
    (开源)微信小程序控制esp8266,可远程
    (开源)微信小程序控制es
    流程说明:首先要使esp8266能够联网,能联网就可以控制,使用示例程序,修改WIFI、
    【Arduino】168种传感器模块系列实验(158)---QMC5883L三轴罗盘
    【Arduino】168种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Arduino 使用Mega2560和LCD1602做的多级菜单显示功能
    Arduino 使用Mega2560和LC
    新手小白一枚,最近在做课程设计。看了社区的一个帖子后自己根据原文作者思路写的,按
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表