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

2010-8-31 17:11 4841 5 6 分类: MCU/ 嵌入式

b81102cf-5ab4-43f4-ad6a-56b47836f90a.jpg


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


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


1、超声波智能传感器


c231abac-054a-4bfe-be6a-873c7e33797a.jpg


2、传感器支架


d07e749d-9513-45e3-bf0e-5100151bc3f2.jpg


3、传感器与支架的装配


ce4ff436-4f4e-408c-8d02-74857df154c6.jpg


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


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


4、舵机


5af4725e-2de0-4015-8085-f9586e619f7d.jpg


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


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


5636a956-f153-454e-9880-39c10f1cb465.jpg


装配要达到的要求是当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,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=65525;  //
          }
          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的框图程序:


ed1aeb96-aafb-4da0-ab0f-68f9cfc9f92f.jpg


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


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



 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1211942 2010-8-27 19:07

做的很好,值得学习,有需要以上器材的可以联系我dfrobot.taobao.com
相关推荐阅读
用户374501 2011-10-22 21:38
用LabVIEW前面板遥控乐高NXT机械手车
乐高NXT套件自带的软件是NXT-G软件,它是以国家仪器公司的LabVIEW软件为核心架构的,NXT-G软件界面简单易懂,但要进行复杂功能的程序开发,还需采用更高阶的开发平台,如NI公司的LabVI...
用户374501 2011-10-18 17:20
键盘遥控NXT机器人的LabVIEW编程详解
键盘遥控乐高NXT机器人:图1 基于LabVIEW的键盘遥控NXT机器人示意图视频请观看:  程序下载:键盘遥控labview程序.rar      要用键盘遥控乐高NXT机器人,首先需把键盘的按键...
用户374501 2011-10-09 11:39
乐高Technic伐木车8049驾驶部分电控改造
    最近我购买了乐高Technic伐木车8049套件,大多数买乐高科技套件的LEGO爱好者,到不是为了照着搭建手册体验下套件的魅力,主要还是为了套件里的零件,“零件”圈里人的说法是“肉”,也就是说...
用户374501 2011-09-25 18:42
用Matlab软件为乐高NXT机器人编程
要在matlab环境下给NXT机器人编程,你必须拥有Matlab R2008以上版本,还必须安装德国亚琛大学开发的NXT Toolbox组件。我的版本Matlab 2009a,32位的版本,64位版...
用户374501 2011-08-29 20:40
开博周年,用微软机器人软件MSRS编程实例来纪念
去年,大概这个时间段,我开始在EDN写博客,其实在这以前我也在其他论坛和博客网写些东西,后来我想还是找个技术博客大站来长期保留我的文章,同时也可以分享些东西给其他同仁,于是选择了EDN,哈哈,我的选择...
用户374501 2011-08-27 17:23
用微软机器人软件MSRS给NXT控制器编程
Microsoft Robotics Studio可以使你在PC机上创建程序来远程控制机器人,在这个软件所支持众多公司的机器人控制器中,当然也支持乐高迷手头的NXT控制器。所以赶快去安装免费的微软...
我要评论
1
5
关闭 站长推荐上一条 /3 下一条