原创 动手制作超声波测距仪

2011-10-23 17:01 2541 10 10 分类: 测试测量

Attachment.aspx?attachmentid=135129

     这个超声波型号为URM37 V3.2的测距传感器是一种智能传感器,所谓智能传感器就是信号采集,数字处理,和信息传送为一体。用户只要通过单片机TTL电平串口,向传感器发出四个字节的信息读取命令,传感器接收命令后,会向单片机发回四个字节的信息,这四个字节里有两个字节就是16位被测距离信息。如果高位字节和低位字节都是0xFF,这意味着测量无效,超出测量范围,否则,高位字节乘以256再加上低位字节就是被测距离,单位是厘米。

实验照片:

Attachment.aspx?attachmentid=135120

通过Labview前面板显示的距离信息与卷尺对比,测量比较精确。URM37V3.2超声波测距模块与单片机是通过TTL模式的串口连接的,只需四根线:VCC、GND、,具体接线图如下:

Attachment.aspx?attachmentid=135121

   其实这个智能传感器除了测距,还有一些附加的实用功能,这样我把它的说明书给大家看,请下载:

 

(2415.45 K) 该附件被下载次数 402

URM37V3.2超声波测距传感器与Arduino控制器的串口连线,可通过4根杜邦线一端插在传感器的引针上,另一端插在层叠在Arduino控制器的传感器扩展板的引针上。如图所示:

 Attachment.aspx?attachmentid=135122

注意:当通过USB,下载Arduino程序,传感器的RXD和TXD这两根杜邦线要拔掉,否则无法下载程序。

讲到这里,另外再提一个话题,Arduino用户需特别注意,我曾经出现过类似下载故障:

在使用Arduino的过程中,最令人头痛的估计就是bootloade毁坏,需要重新烧写bootloader了。最常见的一种情况就是,在Arduino IDE环境中下载程序的时候,较长时间没有反应,这时很多人就直接选择断开USB连接线或者电源,然后就会出现无法再上传程序的错误。其实出现这种情况时正确的做法是一直等到Arduino超时返回出错信息,直接断电的做法往往会导致bootloader毁坏。如果bootloader毁坏,唯一的办法就是通过ISP下载线重新烧写bootloader。

这个实验的Arduino程序的任务是:

向传感器发出“读取距离信息”的命令,再马上接收传感器返回的距离信息,并把两个字节的距离信息换算为十进制数据,如果该数据小于等于30厘米,则连接在控制器数字接口的LED灯亮,否则熄灭。然后把两个字节的距离信息上传给上位机的Labview软件,以便Labview前面板实时显示传感器所测距离。

int USValue = 0;//定义存放超声波测量距离
int ledpin =11;  //定义灯作显示,小于30CM,灯亮
boolean flag=true;
byte DMcmd[4] = {0x22, 0x00, 0x00, 0x22}; //距离命令

void setup() {
  Serial.begin(9600);  //串口波特率设置         
  pinMode(ledpin,OUTPUT); //初始化,把灯熄灭
  digitalWrite(ledpin,HIGH);
  delay(200);
}

void loop( )
{
  flag=true;
  for(int i=0;i<4;i++)
  {
    Serial.print(DMcmd,BYTE);//发送超声波测距命令
  }
  delay(75); //一个延时
  while(flag)
  {
      if(Serial.available()>0) //查询串口有无数据
      {
        byte header=Serial.read(); //0x22开始接收距离数据
        byte highbyte=Serial.read();//距离数据高8位
        byte lowbyte=Serial.read();//距离数据低8位
        byte sum=Serial.read();//sum校验和
         if(highbyte==255)  //数据无效
          {
            USValue=65525;  //
          }
          else
          {
            USValue = highbyte*256+lowbyte;
            if (USValue <=30)
            {//如果距离小于30厘米小灯亮起
               digitalWrite(ledpin,LOW);
            }//如果距离大于30厘米小灯熄灭
           else
             digitalWrite(ledpin,HIGH);
          }    
         Serial.print(highbyte,BYTE);//向上位机LABVIEW软件
         Serial.print(lowbyte,BYTE);//输出距离
         flag=false;
       }
    }
    delay(100); //
}

上位机Labview前面板:

Attachment.aspx?attachmentid=135148

上位机Labview框图程序:

Attachment.aspx?attachmentid=135149

从上图Labview框图程序看出,程序中“索引数组”VI,被索引出第4、5个元素就是超声波智能传感器提供的那两个字节的距离信息,为啥第4、5个元素是距离信息那?你仔细看看Arduino程序,每一次主程序,即void loop( )循环,它首先从串口向传感器发出了四个字节的距离采集命令,Arduino控制器与传感器连接的TTL模式的串口和Arduino控制器与PC机连接的串口是一个串口,接着主程序又向串口发出了采集到的两个字节的距离信息给Labview。所以每次void loop( )循环,Labview要读取六个字节,所以0~5个元素的数组里,第4、5个元素才是距离信息。

采用Labview、Arduino控制器和超声波智能传感器,象搭积木一样很快组建出自己的超声波测距仪。

实验时,把手掌当做障碍物,伸入到超声波传感器的视野里,前后晃动手掌,Labview前面板的滑动杆上的游标也跟着晃动,蛮有意思的!

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条