5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 12720|回复: 52
打印 上一主题 下一主题

mwc mega 超声波定高

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-12-11 12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波模块支持GPIO和串口两种模式,一开始用GPIO模式
  1.   digitalWrite(TrigPin,HIGH);
  2.   delayMicroseconds(50);
  3.   digitalWrite(TrigPin,LOW);

  4.   Time_Echo_us = pulseIn(EchoPin,HIGH,40000);
复制代码
结果发现在没有收到超声波信号的时候puseIn方法延时非常厉害,严重影响了其他传感器的测量,后来改用串口模式
  1. unsigned int hl = 0;
  2. unsigned int ll = 0;
  3. unsigned int Len_mm = 0;

  4. static uint32_t currentTime = 0;
  5. static uint32_t rcTime  = 0;
  6. static uint16_t previousTime = 0;
  7. static uint16_t cycleTime = 0;

  8. void setup(){
  9.   Serial.begin(9600);
  10.   Serial3.begin(9600);
  11. }

  12. void loop(){
  13.   if(currentTime>rcTime){//50Hz
  14.     rcTime = currentTime + 20000;
  15.     Serial3.write(0X55);
  16.   }
  17.   else{
  18.     if(Serial3.available()>=2){
  19.       hl=Serial3.read();
  20.       ll=Serial3.read();
  21.       Len_mm = (hl*256+ll)/10;
  22.       if((Len_mm >1)&&(Len_mm<4000) ){
  23.         Serial.print("OK:");
  24.         Serial.print(Len_mm,DEC);
  25.         Serial.println("cm");
  26.       }else{
  27.         Len_mm = 0;
  28.       }
  29.       Serial3.flush();
  30.     }
  31.   }


  32.   currentTime = micros();
  33.   cycleTime = currentTime - previousTime;
  34.   previousTime = currentTime;
  35. }

复制代码
这段代码也是按mwc的传感器测量思路,测试频率50HZ
初步测试感觉比较成功,测量速度很快,下一步准备添加到MWC中

欢迎继续阅读楼主其他信息

沙发
 楼主| 发表于 2012-12-11 12:49 | 只看该作者
本帖最后由 abccbef 于 2012-12-12 08:50 编辑

已经搞定,0到2.5米内高度采用超声波,超过范围的使用气压计,在multiwii_dev_r1240上修改完成首先在config中定义一个自己的超声波,因为mwc自带的是i2c的超声波,SRF08就是
  1.       /* Sonar */ // for visualization purpose currently - no control code behind
  2.       //#define SRF02 // use the Devantech SRF i2c sensors
  3.       //#define SRF08
  4.       //#define SRF10
  5.       //#define SRF235
  6.       #define US100  //add by abccbef.  The US100 use Serial3 with 9600.
复制代码
sensor传感器代码里面增加
  1. #elif defined(US100)  //add by abccbef
  2. inline void Sonar_init() {}
  3. inline void Sonar_trig() {//这个是触发测量
  4.   SerialWrite(3,0X55);
  5.   //Serial3.write(0X55);
  6. }
  7. inline void Sonar_update() {//检测测量数据
  8.   while(SerialAvailable(3)>2){
  9.     SerialRead(3);
  10.   }
  11.     if(SerialAvailable(3)==2){
  12.       //hl=Serial3.read();
  13.       //SerialRead(3);
  14.       hl=SerialRead(3);
  15.       //debug[0]=hl;
  16.       ll=SerialRead(3);
  17.       //debug[1]=SerialAvailable(3);
  18.       //debug[1]=ll;
  19.       sonarAlt = (hl*256+ll)/10;//这个就是声纳高度了
  20.       //debug[2] = SerialRead(3);
  21.       //debug[3] = SerialRead(3);
  22.       if((sonarAlt >1)&&(sonarAlt<250) ){
  23.         //sonarAlt
  24.       }else{
  25.         sonarAlt = 0;
  26.       }
  27.       //Serial3.flush();
  28.     }  
  29.    
  30. }// add end
复制代码
IMU里面重算高度,本来还准备用俯仰及翻滚角度来修正声纳高度的,好像还有点问题
  1.   EstAlt = (EstAlt * 6 + BaroAlt * 2) >> 3; // additional LPF to reduce baro noise (faster by 30 μs)
  2.   //add by abccbef


  3.     // Attitude of the estimated vector
  4.     //angle[ROLL]  =  _atan2(EstG.V.X , EstG.V.Z) ;
  5.     //angle[PITCH] =  _atan2(EstG.V.Y , EstG.V.Z) ;
  6.     //debug[1] = 123;
  7.     //debug[3] = 456;
  8.    
  9.     if(/*abs(angle[ROLL]*10)<90 && abs(angle[PITCH]*10)<90 &&*/ sonarAlt >1  && sonarAlt <250){
复制代码
MultiWii中loop主循环中增加
  1.   if (currentTime > rcTime ) { // 50Hz
  2.     rcTime = currentTime + 20000;
  3.     computeRC();
  4. //////////////////////////////////add by abccbef
  5.   #if defined(US100)
  6.     Sonar_trig();
  7.   #endif
  8. //////////////////////////////
复制代码
def中还得修改一下
  1. #if defined(SRF02) || defined(SRF08) || defined(SRF10) || defined(SRC235) || defined(TINY_GPS_SONAR) || defined(US100)
  2.   #define SONAR 1
  3. #else
  4.   #define SONAR 0
  5. #endif
复制代码


3
发表于 2012-12-11 12:59 | 只看该作者
占位先~小机子超声波有点用~大机子就算了……直接气压
4
发表于 2012-12-11 13:03 | 只看该作者
看不懂~~~~
5
发表于 2012-12-11 14:24 | 只看该作者
楼主学电子器件
6
发表于 2012-12-11 14:38 | 只看该作者
收藏等楼主跟新
7
 楼主| 发表于 2012-12-11 14:53 | 只看该作者
selith 发表于 2012-12-11 12:59
占位先~小机子超声波有点用~大机子就算了……直接气压

本身带气压计,但是气压计误差较大,在2米一下高度时使用超声波,超过两米用气压
8
发表于 2012-12-11 14:55 | 只看该作者
abccbef 发表于 2012-12-11 14:53
本身带气压计,但是气压计误差较大,在2米一下高度时使用超声波,超过两米用气压

本身的气压焊掉,扩展高精的就行了……
9
发表于 2012-12-11 17:16 | 只看该作者
一样啊,帮忙搞下呗
10
发表于 2012-12-11 19:47 | 只看该作者
哥们给你提个醒
不要用直接IO口操作方式搞超声波
因为超声波是声速,一个来回2米距离差不多需要11.8毫秒,越远越久
直接操作IO口要等待超声波返回,会严重拖慢程序
不知道串口方式是不是超声波模块独立测量之后把数据放在寄存器等待调用
如果是这样就没问题了
11
发表于 2012-12-11 20:47 | 只看该作者
觉得自带的气压计就够了。。。。毕竟声波的距离有限制。怎么说,也是各有各的好处吧。
12
 楼主| 发表于 2012-12-12 08:59 | 只看该作者
目前已完工作:
1、0号串口通过蓝牙从机模块连接蓝牙手机
2、2号串口通过蓝牙主机模块连接蓝牙GPS
3、3号串口连接超声波
13
 楼主| 发表于 2012-12-12 09:00 | 只看该作者
zhiyiyg 发表于 2012-12-11 14:24
楼主学电子器件

我是学食品工程的,目前在电脑公司做点小软件开发
14
发表于 2012-12-12 17:44 | 只看该作者
顶 这个不错
15
发表于 2012-12-12 20:00 | 只看该作者
kissghost 发表于 2012-12-11 19:47
哥们给你提个醒
不要用直接IO口操作方式搞超声波
因为超声波是声速,一个来回2米距离差不多需要11.8毫秒, ...

恩,应该用port寄存器和中断。
16
发表于 2012-12-12 20:09 | 只看该作者
顶,mwc也能用上超声波了
17
发表于 2012-12-14 09:02 | 只看该作者
路過幫頂上
18
发表于 2012-12-14 09:43 | 只看该作者
没看懂,路過幫頂上
19
发表于 2012-12-14 11:28 | 只看该作者
楼主 有没有较全的代码传一下吧
我手里有个MEGA 2560的海盗飞控 一直没动
想改刷MWC的程序了 求个程序和代码
20
发表于 2013-1-15 16:24 | 只看该作者
标记下 学习了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表