5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 一步一步实现,超声波直升机高度锁定 [打印本页]

作者: 切风40.83    时间: 2011-3-24 04:50
标题: 一步一步实现,超声波直升机高度锁定
前言:
大家会觉得我的进度很慢。 是的,进度确实慢 主要是以下2点原因。
1. 我是学生,以学业为主,有好多作业。由于在海外留学,有好多生活上的事情都得自理。 有时候还得照顾别的同学。
2. 我的专业是机械工程,单片机都是自学的。现在还没有一个像样的中文的学习网站,我学到的知识都是从国外论坛上学到的。

公开自己的代码,不是幼稚的表现。
我发帖不图名,不图利。 只为了能把我学到的东西跟大家分享。 更希望有人能从我的帖子中得到启发,做出更好的东西贴出来,能够互相学习。我能学到这些东西,也是应为别人把源代码公开出来。  

这个帖子是我学习的过程。最新的东西永远都放在最后。

[ 本帖最后由 切风40.83 于 2011-11-6 14:08 编辑 ]
作者: 切风40.83    时间: 2011-3-24 04:52
以后打算用它控制4轴飞碟的油门, 这样玩FPV就方便了。
作者: yhp200302    时间: 2011-3-24 08:49
这个要顶 等结果
作者: 毁灭者    时间: 2011-3-24 12:36
:em22:
作者: crazyboyyy    时间: 2011-3-24 20:51
噪声早就把超声波淹没了
作者: ideastone    时间: 2011-3-24 21:02
这是哪门子的语言,子函数呢?
作者: 切风40.83    时间: 2011-3-25 00:20
我用的是 Ardoino Duemilanove。 是一种AVR 开发板。 我的方法是用超声波传播的时间 直接映射一个相应的伺服电机角度,这样的话 会是整个系统最终达到平衡。
作者: 切风40.83    时间: 2011-3-25 02:25
为了方便大家看效果 我还是决定把视频发到YOUKU上面。 估计明天才能审核好。
作者: 切风40.83    时间: 2011-3-25 03:16
http://v.youku.com/v_show/id_XMjUzNDM3NDQ0.html


视频来啦
作者: yhp200302    时间: 2011-3-25 08:17
视频看不到哦 顶起来
作者: 切风40.83    时间: 2011-3-25 08:52
http://v.youku.com/v_show/id_XMjUzNDM3NDQ0.html
那就试试这个链接
作者: boyazy    时间: 2011-3-25 11:25
厉害
作者: 切风40.83    时间: 2011-3-27 07:36
喔哦 今天审核速度极快啊, 谢谢了啊, 哈哈。

http://v.youku.com/v_show/id_XMjUzOTcwNzgw.html
作者: 切风40.83    时间: 2011-3-27 07:36
差点忘了分享程序



#include <Servo.h>
Servo myservo;
const int echo = 2;
const int trig = 13;
const int sw = 3;
const int th = 4;


void setup()
{
  Serial.begin(9600);
  pinMode(echo,INPUT);
  pinMode(trig,OUTPUT);
  int sensorValue = digitalRead(echo);
  int swValue = digitalRead(sw);
  int thValue = digitalRead(th);
  myservo.attach(9);
}

void loop()
{
  long duration, inches, cm ,hold ,power;
  digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(12);
  digitalWrite(trig,LOW);
  duration = pulseIn(echo,HIGH);
  hold = pulseIn(sw,HIGH);
  power = pulseIn(th,HIGH);
   // convert the time into a distance
  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.print(duration);
  Serial.print("-");
  Serial.print(hold);
  Serial.print("th=");
  Serial.print(power);
  Serial.println();
  
  if (hold>1500)
{
  duration = map(duration, 0, 10000, 135, 45);
  myservo.write(duration);
}
else
{map(power, 1090, 1900, 135, 45);
myservo.write(power);
}
  
}

long microsecondsToInches(long microseconds)
{

  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{

  return microseconds / 29 / 2;
}
作者: 机器鸟    时间: 2011-3-27 14:19
支持ccpm控制方式?有效距离是多少?这个控制小车没问题,直机不是那么简单。
作者: 342136967    时间: 2011-3-27 14:26
不知道可靠性怎样,机体倾斜时的误差、过草地时出错等等
作者: lq35    时间: 2011-3-27 14:51
:em26: :em26:
作者: 735369269    时间: 2011-3-27 15:17
:em26: :em26:
作者: 兔哥    时间: 2011-3-27 17:15
这个距离能有多远啊,看你的测试视频都不超过50CM
作者: crazyboyyy    时间: 2011-3-27 19:55
那个iphone控制的四轴就是类似的结构
作者: 切风40.83    时间: 2011-3-28 02:25
回复关于CCPM控制的问题, 想支持CCPM不复杂, 现在我只是控制油门。也就是电调。目前要做的就是再加个缓慢降落的程序,然后测试电调和马达,看看效果如何。

回21楼 :  倾斜不超过30°是绝对没问题的,我用纸头试过。


回24楼: 距离取决于超声波传感器,我现在用的传感器是3m范围的。所以可以控制3米之内的高度。 我最多看到过5米的传感器。 如果要飞很高的话就只能用气压计了,我觉得。
作者: 切风40.83    时间: 2011-3-29 04:50
今天测试了马达的控制效果 稍后上视频。
作者: 切风40.83    时间: 2011-3-29 05:25
看不见视频 试试这个链接

http://v.youku.com/v_show/id_XMjU0NDgwMjM2.html

建议打开音响,听听看马达的工作线性如何。
作者: yhp200302    时间: 2011-3-30 12:01
等待楼主的高级东西
作者: 鸟蚊子    时间: 2011-3-30 13:05
现在很多东西都要自己做,四轴厂家跟驴拉屎一样,今天拉点,明天拉点,就不能学学人家iphone控制的四轴吗?一次到位,而且价格实惠!人家那四轴除了要买个手机贵点,空机才两千多大洋!现在市场上卖的什么这四轴那四轴都什么玩意!!!还要那么贵!!!还有脸说!!!还好意思要那么贵!!!张口闭口说研发费花了 多少,成本多少,开玩笑!当广大模友都是好忽悠的吗?!破东西没多少技术含量还弄的跟高科技似的!一个气压仪多少钱,一个几个传感器多少钱?加进去厂家都破产了?!神马玩意!!!
强烈支持楼主自主开放的精神!!!:em26:
作者: xjxboy    时间: 2011-3-30 13:39
强人,
作者: crazyboyyy    时间: 2011-3-30 19:37
标题: AR.Drone 是超声波测高+ccd防飘

作者: 切风40.83    时间: 2011-4-1 02:37
CCD防飘 不知道怎么弄, 先吧超声波定高弄好在说吧。
今天测试了4个马达一起工作,一切情况正常。 但是一旦把USB 连接线拔掉就不能控制了。 在定高模式下 马达会乱转。谁能告诉我这是咋回事???
作者: crazyboyyy    时间: 2011-4-1 13:39
好控! 乱转是不是被干扰了啊 usb插上时接地良好 不接地时就会有各种问题
作者: 切风40.83    时间: 2011-4-4 01:42
有可能 ,现在我唯一的办法就是 在不接USB接口的时候 读取传感器的数据。 然后再分析问题。 估计得用到液晶屏幕。
作者: 高鼻子    时间: 2011-4-4 09:10
到是在网上见到一个 控制 3D机 悬停的,高度固定:em24:

顶楼主的技术贴

你的控制是不平滑的,尝试一下PI控制

[ 本帖最后由 高鼻子 于 2011-4-4 09:24 编辑 ]
作者: 模速电玩    时间: 2011-4-5 03:49
静态数据和动态数据差别很大,就像前面的兄弟说的那样,噪声的影响很大,滤波很重要
作者: 切风40.83    时间: 2011-4-18 23:17
先不考别的问题,这东西本身误差在1CM 之内。 实际运用的时候,飞机有个1CM 的高度偏差 根本感觉不出来。
作者: wsdouzi    时间: 2011-4-19 10:02
:em17: 高科技呀
作者: 40560335    时间: 2011-4-19 10:30
别搞了,这东西不准的,完全受天气影响,用大气压传感器还行!~
作者: psl333333    时间: 2011-4-19 10:47
厉害!
作者: 切风40.83    时间: 2011-4-20 10:57
今天查到原因了, 超声波传感器电压不够。 现在在设计电路板,到时候所有的东插到电路板上就可以测试了。


我只是室内飞飞,室外的话开始得靠气压计。
作者: 普通用户    时间: 2011-4-20 13:14
用倒车雷达

[ 本帖最后由 普通用户 于 2011-5-27 10:22 编辑 ]
作者: 切风40.83    时间: 2011-4-21 08:14
板子做好了,还差个稳压三极管没装上去。
作者: 切风40.83    时间: 2011-5-25 04:49
好久没更新了,前一整子准备期末XX,这帖子嘛 找了半天才找找的。
我当上不知道怎么搞的 居然没想过用ESC供电。 今天直接从接收机上拉了两根线做ARDUINO 和 ultrasonic range finder 的电源。效果良好,直接解决问题。

另外 我还从新做了个机身 很酷吧。
作者: gdku    时间: 2011-5-25 10:10
很有型~!
作者: 切风40.83    时间: 2011-5-26 06:27
线都接好了,马上就可以测试了。但是明天校长,某些领 导 和 其他学校的领 导要来我实验室参观。教授叫我不要测试,要是弄坏了明天就没得展示了(美国的教育制度也差不多嘛)。 上个图庆祝一下,择日再飞。
作者: 兔哥    时间: 2011-5-26 08:16
有没有搞出气压计版本啊
作者: 切风40.83    时间: 2011-5-27 10:32
用气压计 不如用 GPS 。
作者: 普通用户    时间: 2011-5-27 10:35
没那么高精度的气压计、有也装不下,装的下也买不起,买的起也买不到
作者: 切风40.83    时间: 2011-5-28 11:57
http://v.youku.com/v_show/id_XMjcwNzUyMjEy.html最新测试视频,现在有时间了 可以快速发展了。

http://v.youku.com/v_show/id_XMjcwNzUyMjEy.html
[wmv]http://v.youku.com/v_show/id_XMjcwNzUyMjEy.html[/wmv]
作者: abao    时间: 2011-5-29 17:07
:em26:
作者: 切风40.83    时间: 2011-6-2 01:04
如果不行的话 就用PID 控制。
作者: 栋栋    时间: 2011-6-14 10:31
你把测得的10个数据取平均值,可以更稳定的控制飞机。
作者: dongfang    时间: 2011-6-16 18:07
原帖由 切风40.83 于 2011-6-2 00:48 发表
昨天试飞过了, 最终我还是把 超声波传感器放到了机体的中间,否则机体倾斜会导致过大的误差。

另外 测试的时候 调到高度锁定模式之后 发现飞机 上下抖动的很厉害。 估计是感度太高的原因。


不管你懂不懂C语 ...

LZ这个问题有些无语了...请先调试出超声波传感器的例程。
map(duration, 0, 5000, 90, 65)是一个简单的变换函数,记得是吧一个90到65之间的值变换到0~5000之间,也就是转换成超声测出的距离。你要稳定在一个高度上,比如1米,你就尽量使map(duration, 0, 5000, 90, 65)-1000在0附近。
关于delay(10)我没仔细读你的代码,但应该是越小,甚至去掉,才是最好的。
作者: tony.asdf    时间: 2011-6-21 05:10
挺好,应该可以用在四轴上
作者: 切风40.83    时间: 2011-6-21 08:23
回复:dongfang

关于电子方面的知识都是我自学的,没有系统性的学过,都是要用什么就自学什么。请理解 并多多指教。

这个变换函数的意思是吧 0,5000 之间的数字变成 90 到 65

因为我没有自己写输出 PWM 信号的程序, 而是用 伺服电机的数据库, 所以90到65 实际上表示伺服电机转动的角度。
由于现在这个信号输给了电调,电调的情况和伺服电机肯定是有点区别的。伺服电机有20毫秒的工作周期,电调我就不知道了。 您建议我去掉delay(10) 是不是出于这个原因?


duration 的值 等于 声音从超声波传感器发出到返回的时间, 这个时间的单位是毫秒。 输出值为5000的时候 飞碟大概是3米高。(现在感觉声音传播速度是有点慢)。 所以说使用超声波传感器是需要花掉单片机一点时间的。 如果测量几次再判定输出值的话怕来不及做修正。
作者: 切风40.83    时间: 2011-6-21 08:35
目前我又对程序进行了改进,只要拨开关,飞碟就会在当前飞行高度锁定。

测试结果还是一样,飞碟会上下抖动。

我现在在等一块重一点的电池到货,增加点重量或许会减小抖动。 现在我用的电池是 11.1V 2600mah 25C ACE的电池, 容量小 重量轻。因为我飞这只飞碟 油门永远不会超过30%(四个电调都是25A,你懂的), 所以油门控制不够细腻 而且飞的时间太短。 重的电池一到 说不定就解决问题了。
作者: alexetea    时间: 2011-6-21 23:13
这个超声波测距~~~距离不过10来米,精确度0.1米左右,以前用过
作者: archfly    时间: 2011-6-21 23:29
高人
作者: dongfang    时间: 2011-6-22 12:41
原帖由 切风40.83 于 2011-6-21 08:35 发表
目前我又对程序进行了改进,只要拨开关,飞碟就会在当前飞行高度锁定。

测试结果还是一样,飞碟会上下抖动。

我现在在等一块重一点的电池到货,增加点重量或许会减小抖动。 现在我用的电池是 11.1V 2600mah  ...

就是前面说的那个式子,实际上,给多少油门,不仅取决于模型现在的高度,与目标高度的差距,还与目前的模型正在以什么速度上升下降有关。超声波传感器的更新频率还是太低了。要做得好,就上CCD:地面平台上放几个红外LED管,CCD用高速红外敏感的,拍一张照片就能把静止姿态全部解出来了。
作者: 切风40.83    时间: 2011-6-22 23:22
回复 65 楼 dongfang

现在的程序流程是这样的:  

手动起飞  →  手动切换模式 → 记录当前油门值X → 记录当前高度Y → 等20毫秒


循环 { → 记录当前高度 Y1 →      Y1 = Y1 - Y     →     用map 函数 处理 Y1    →      X1 = X + Y1      →     电调输出 X1  → 等待20毫秒 }

现在 通过试验 对等待20毫秒 进行修改会达到些效果
调太高会抖得快幅度小   调太低会抖得慢幅度大  
我猜抖动的问题不是调这个时间。   或者我猜错了,只是没找到这个时间调节的平衡点

[ 本帖最后由 切风40.83 于 2011-6-22 23:29 编辑 ]
作者: 切风40.83    时间: 2011-6-22 23:31
罢了, 我把这时间去掉试试
作者: wkn    时间: 2011-6-22 23:56
不懂,帮顶!
作者: dongfang    时间: 2011-6-23 09:54
原帖由 切风40.83 于 2011-6-22 23:22 发表
回复 65 楼 dongfang

现在的程序流程是这样的:  

手动起飞  →  手动切换模式 → 记录当前油门值X → 记录当前高度Y → 等20毫秒


循环 { → 记录当前高度 Y1 →      Y1 = Y1 - Y     →     用map 函数 ...


我觉得你做的,和我说的已经差不多了,只是X1 = X + Y1 这里,需要调整为X1 = X + Y1*Z,Z的大小需要测试得知。
另外,X本身最好也是细微变化的,以适应电池电量下降的情况。
作者: 切风40.83    时间: 2011-6-24 09:03
对 电池电量也是个问题,满电的时候 和 贫电的时候 X 的值是不一样的。
作者: 想飞的老菜鸟    时间: 2011-6-24 10:21
学习......
以后用得着:em21:
作者: yybyhn6f    时间: 2011-6-24 14:56
不错
作者: 切风40.83    时间: 2011-7-25 09:04
回复71楼: 又想多了,贫电就应该降落。如果高度不能锁定了,说明该充电了。
作者: bobmaxiao    时间: 2011-7-25 09:33
可不可以问一下,楼主是学什么的,在美国哪个大学?我是学EEE的,接触的东西差不多,但是我才大一,希望以后能多联系。p.s.我做过跟APM有关的东西。

[ 本帖最后由 bobmaxiao 于 2011-7-25 09:34 编辑 ]
作者: werwolf    时间: 2011-7-26 11:46
标题: 回复 7楼 crazyboyyy 的帖子
滤波啊!!!
作者: werwolf    时间: 2011-7-26 11:51
标题: 回复 42楼 40560335 的帖子
那个……你被人怎么坑了?他卖你什么了?
作者: werwolf    时间: 2011-7-26 11:53
标题: 回复 42楼 40560335 的帖子
那个……你被人怎么坑了?他卖你什么了?
还有啊,气压传感器不是更受天气影响么?
季节天气都会影响气压的啊!!怎么能放弃AGL而去选气压计来测高呢?
厂家都是说自主起降要配超声波高度计,难道生产商那么不靠谱?
作者: psl333333    时间: 2011-7-26 12:37

作者: 切风40.83    时间: 2011-10-25 09:44
继续!

现在发现定高必须严格按照PID 算法控制   按照我的算法,这飞碟总是有点上下颠簸。

拨开关之后20ms
测量距离:ode
测量油门值:ch3
油门输出:ch3

进入循环后
测量当前高度:de
de = de - ode + d*(pde - de);
hi = (de - ode)/de;

powerout = map( de, -3000, +3000, 10, -10) + map( hi, -3000, 3000, 10, -10) + ch3;

pde = de;
dh = dh + de;

输出油门值: powerout



明天试试看咯!
作者: 板帅    时间: 2011-10-25 11:48
有文化真好。
作者: 切风40.83    时间: 2011-10-26 06:05
77楼帮我出气了,谢了呵呵。
作者: 一直在路上    时间: 2011-10-26 22:55
顶一个,还有事请教您呢。
作者: 切风40.83    时间: 2011-10-28 05:50
马达和桨都换掉了,新程序也装上去了。 目前测试用的函数 如下。

      de = de - ode;
      dh = (de - ode)/de;
      powerout = map( de, -3000, 3000,  2, -3) + map(hi, -3000, 3000, 1, -1);
      powerout = ch3 + powerout;
      pde = de;
      hi = hi + dh;

现在四轴能坚持70秒定高飞行,会有一定的上下颠簸,范围在10cm之内,70秒之后会降低高度。估计是电池电量有点不足。以后会考虑吧参数p 和 i 调高点。目前d 相当于0。 如果以后需要的话 就把d 也加上。 目前看下来好像不需要。
作者: 切风40.83    时间: 2011-10-29 04:58
搞了半天 算法还是有问题,最近脑子有点糊涂了。以下是正确的PID 离散算法。

      de = de - ode;//  + (pde - de);
      dh = de/(de+ode);
      powerout = map( de, -3000, 3000, 2, -3) + map(hi, -3000, 3000, 2, -1);
      powerout = ch3 + powerout;
      pde = de;
      hi = hi + dh;
作者: 切风40.83    时间: 2011-10-29 05:39
现在能在室外有风的情况下 坚持两分钟

      de = (de - ode)/2;//  + (pde - de);
      dh = de/(de+ode);
      powerout = map( de, -3000, 3000, 4, -3) + map(hi, -3000, 3000, 5, -2);
      powerout = ch3 + powerout;
      pde = de;
      hi = hi + dh/2;


大家顶一顶啊,应为找不到第二个像我这样分享程序的人了。
作者: 切风40.83    时间: 2011-11-4 06:43
现在能悬停超过两分钟 才掉高度

      de = (de - ode)/2;//  + (pde - de);
      dh = de/(de+ode);
      powerout = map( de, -3000, 3000, 4, -4) + map(hi, -3000, 3000, 14, -4);
      powerout = ch3 + powerout;
      pde = de;
      hi = hi + dh/4;


看到红色的数字没,这是对I 的限制。 越大 悬停时间有越长,同时发生危险的可能性也就越大。
作者: borneol    时间: 2011-11-4 13:29
不出意外。。。会继续半途而废~~ :em15:
作者: luys    时间: 2011-11-6 17:17
定高:em26: 不错
作者: 切风40.83    时间: 2011-11-10 08:28
更新几张照片 以免这帖子沉掉。 现在这个超声波定高程序和刚开始乱搞相比已经不错了。 动力也换掉了。

[ 本帖最后由 切风40.83 于 2011-11-10 08:31 编辑 ]
作者: 624417303    时间: 2011-11-13 11:01
:loveliness: 虽然不懂,顶楼主,愿视频尽快出现~
作者: 一直在路上    时间: 2011-11-13 16:24
楼主好人 。
作者: javajtg    时间: 2011-11-18 14:48
过程挺艰苦啊,
   顶一个
作者: saber    时间: 2011-11-18 16:16
向蝙蝠学习~~:em26:
作者: feng235    时间: 2011-11-28 17:56
继续顶楼主,论坛从创立到现在,估计没有几个能像楼主这样,把自己的整个制作过程,自己成果,代码公开出来,就凭楼主的这份精神,也必须顶,给楼主一份动力!
作者: 624417303    时间: 2011-11-28 18:09
:em15: 这个过程很辛苦,会碰到很多的难题,楼主一定要挺过去啊。:em19: :em26:
作者: mltttt    时间: 2011-11-29 22:46
从头看到尾 感觉闭门造车 请别误会 我也有此经历 看个阿凡达电影就要做蝎式战机 那经历 很刻骨很铭心 我没接触过航模 只有一点点电机的基本知识 我公司是做编码器 传感器的 我只是办公室的 根本与我没关系 天天上班天天听 也就懂点了  等做出来的时候发现造价可以买3个成品4轴了 呵呵 现在好了感觉入魔之后 能学到好多知识(只限DIY) 最后希望楼主加油 与人分享是美德 100楼留言了 没有一个说你笨 等等等的扁低你    因为无私是大爱

[ 本帖最后由 mltttt 于 2011-11-29 22:47 编辑 ]
作者: groovy    时间: 2011-11-30 08:14
真的很不错
作者: dangerxue    时间: 2011-11-30 11:06
up
作者: 红绿灯1230    时间: 2011-11-30 23:29
只是玩家,搞不懂
作者: sfhong2006    时间: 2011-12-7 22:46
帮顶,这么 好的帖子别沉了、、、
作者: zengxushen    时间: 2011-12-7 23:18
顶起,别沉了。楼主加油
作者: yj06    时间: 2011-12-10 02:50
:em19: 好贴  的顶起来学习。。。:em15:
作者: sjg3857    时间: 2012-1-26 12:44
楼主高手 好人 我也想把我的四轴做个超声波定高 只是本人绝对新手 请您出个详细教程吧 谢谢了
作者: 编程飞行    时间: 2012-2-6 11:01
好东西:em26: 革命未成功,同志尚需努力

[ 本帖最后由 编程飞行 于 2012-2-6 11:10 编辑 ]
作者: 可乐不加冰    时间: 2012-2-28 21:51
楼主强人!学习了!帮忙顶。
作者: saintxu    时间: 2012-3-19 17:01
我一直对这个感兴趣的,买了arduino Mega等。不过自己真的智商有限,做点机械的还行。逻辑性的编程太难。支持你。buddy
作者: Gh0st-man    时间: 2012-3-19 20:01
支持楼主,精神可嘉。。
作者: honghes    时间: 2012-4-5 18:50
顶你,精神很重要,中 国多点你这样的人就不一样了
作者: tmxkpzl    时间: 2012-4-14 22:56
用Arduino有点吃力吧,建议楼主直接用STM32做个飞控,成本也很低,还有一个,那个超声波的可探测距离很有限且不是太精确!!




欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://5imx.com./) Powered by Discuz! X3.3