宜昌老张

超声波传感器与舵机结合实现扇面测距

0
阅读(3814)

    上图是labview前面板,显示出舵机带动超声波传感器在5个角度上,测量的距离。即30度、60度、90度、120度和150度。

 实验用的Arduino设备购买于DFrobot官方旗舰店: http://dfrobot.taobao.com/

    先谈谈传感器和舵机如何安装,请看图和注释:

1、超声波智能传感器


2、传感器支架


 

3、传感器与支架的装配


 

    传声波传感器两个探头要使劲顶到支架的两个孔里,并且探头一定要部分伸出支架的两个橡皮孔以外,如果不这样做,超声波的声波路径就会被支架橡皮孔挡住。

    我后来又做了个实验,结果证明传感器的两个探头还是从相反的方向压入支架,才是正确的安装方法,否则超声波的声波路径还是会被支架跟前的平面挡住,看来超声 波传感器的声波路径并不是在一个平面上,而是有一定夹角扫描范围,是60度夹角。我这个实验,没出问题,是由于传感器被舵机架高了,支架跟前没有障碍。而 且传声波传感器两个探头使劲顶到支架的两个孔里后,就拔不出来了!晕!

4、舵机


 

    上图舵机旁边有几个舵机连接盘,各种形状都有,塑料的,上面有均布的小孔,是自攻螺钉的引导孔,还有若干个自攻螺钉。用自攻螺钉把一个合适的舵机连接盘与超声波支架通过支架的过孔固连起来,舵机连接盘与舵机的输出轴是通过小齿花键套接,舵机连接盘可以从舵机的输出轴拔出,重新调整超声波支架与舵机的相对位置。

5、超声波支架与舵机的装配


 

    装配要达到的要求是当Arduino软件给舵机输出90度角时,超声波支架与舵机机身成垂直方向,这可以用上面所讲的机械的办法来调整它们的位置,由于小齿花键的齿数是有限的,所以可能做不到支架与舵机机身垂直,那就采用软件补偿的方法,比如我的Arduino程序的初始角度不是30度,而是加了5度的补偿,35度,大家可以仔细看程序,这样做就可以做到当Arduino软件给舵机输出90度角时,超声波支架与舵机机身成垂直方向。用机械或软件的方法调整吧。

 

 下位机Arduino程序的编程思想是:

 

    通 过一个For结构,驱动舵机从30度转到150度,一共转动5个角度,步长为30度,接着又一个For结构,驱动舵机从150度到30度,步长也是30 度。每一个角度位置,通过执行传感器测距子程序ultrasonic( ),获得传感器测得的距离,然后马上把该角度位置标志和16位被测距离信息上传到labview处理。注:30度角度位置的标志为0,以此类推150度角 度位置的标志为4。

 

Arduino程序:

 

#include <Servo.h> //舵机头文件
Servo myservo;  // 设置舵机名
int val=35;    // 舵机角度变量
int USValue = 0;//定义存放超声波测量距离
int ledpin =11;  //定义灯作显示,小于30CM,灯亮
boolean flag=true;
int pos=0;//设置角度标志,
//0为30度,1为60度,2为90度,3为120度,4为150度
//向超声波传感器发出的命令数组
byte DMcmd[4] = {0x22, 0x00, 0x00, 0x22};
//超声波传感器返回的四个字节的变量
byte header;
byte highbyte;
byte lowbyte;
byte sum;



//初始化
void setup()
{
  Serial.begin(9600);  //串口波特率设置         
  pinMode(ledpin,OUTPUT); //初始化,把灯熄灭
  digitalWrite(ledpin,HIGH);
  myservo.attach(9);  // 连接舵机到数字接口9
  myservo.write(val);
  delay(200);    //等待舵机,到达转动位置
}



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



//主程序
void loop()
{
  for (int i=0; i <=3; i++)
 //舵机从30度,旋转5个角度,即30、60、90、120、150度
 {
   ultrasonic();  //超声波测距
   Serial.print(pos,BYTE);//向上位机输出角度标志
   Serial.print(highbyte,BYTE);//向上位机输出被测距离
   Serial.print(lowbyte,BYTE);//  
   pos+=1;//角度标志加1
   val+=30;//舵机实际转角加30度
   myservo.write(val);  // 根据角度值,驱动舵机   
    delay(500);    //等待舵机,到达转动位置
 }
  for (int i=3; i >= 0; i--)
 //舵机从150度,旋转5个角度,即150、120、90、60、30度
 {
    ultrasonic();  //超声波测距
    Serial.print(pos,BYTE);//向上位机输出角度标志
    Serial.print(highbyte,BYTE);//向上位机输出被测距离
    Serial.print(lowbyte,BYTE);//  
    pos-=1;//角度标志减1
    val-=30;//舵机实际转角减30度
    myservo.write(val);  // 根据角度值,驱动舵机   
    delay(500);    //等待舵机,到达转动位置   
  }
}

上位机labview的框图程序:


 

    Labview 框图程序中有一个条件结构,如果舵机角度标志为1,则30度角度位置的超声波测距信息显示在“标签”为“30度”的数值显示控件上,以此类推,如果舵机角 度标志为4,则150度角度位置的超声波测距信息显示在“标签”为“150度”的数值显示控件上,这个条件结构有5个分支。labview前面板显示在文 章第一图。

Arduino和labview程序打包成RAR格式文件,下载:

17749601874734.rar