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

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
楼主: 切风40.83
打印 上一主题 下一主题

一步一步实现,超声波直升机高度锁定

[复制链接]
81
 楼主| 发表于 2011-10-26 06:05 | 只看该作者
点击查看详情
77楼帮我出气了,谢了呵呵。

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

82
 楼主| 发表于 2011-10-26 06:11 | 只看该作者
int dh = 0;
int pde = 0;
int de = 0;
int ode = 0;
int hi = 0;


int power = 0;
int powerout = 0;

int const trig = 12;
int const echo = 13;

void setup(){

  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);

  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);

  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);

  Serial.begin(9600);
}


void loop(){

  long ch1, ch2, ch3, ch6;

  ch3 = pulseIn(5, HIGH);
  ch6 = pulseIn(6, HIGH);//receiver input


  if(ch6 > 1500){

    digitalWrite(trig,LOW);
    delayMicroseconds(12);
    digitalWrite(trig,HIGH);
    delayMicroseconds(12);
    digitalWrite(trig,LOW);
    ode = pulseIn(echo, HIGH); //[0,7000], ultrasonic ranger input
    hi = 0;




    digitalWrite(9, HIGH);
    delayMicroseconds(ch3);
    digitalWrite(9, LOW);


    while( ch6 > 1500 ) {

      digitalWrite(trig,LOW);
      delayMicroseconds(12);
      digitalWrite(trig,HIGH);
      delayMicroseconds(12);
      digitalWrite(trig,LOW);
      de = pulseIn(echo, HIGH); //[0,7000], ultrasonic ranger input
     
      de = de - ode  + (pde - de);
      dh = (de - ode)/de;
      powerout = map( de, -3000, 3000, 10, -10) + map(hi, -3000, 3000, 10, -10);
      powerout = ch3 + powerout;
      pde = de;
      hi = hi + dh;

      ch6 = pulseIn(6, HIGH);//receiver input

      digitalWrite(9, HIGH);
      delayMicroseconds(powerout);
      digitalWrite(9, LOW);
      delayMicroseconds(15000);
    }
  }

  else{
    digitalWrite(9, HIGH);
    delayMicroseconds(ch3);
    digitalWrite(9,LOW);
  }
}
83
发表于 2011-10-26 22:55 | 只看该作者
顶一个,还有事请教您呢。
84
 楼主| 发表于 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 也加上。 目前看下来好像不需要。
85
 楼主| 发表于 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;
86
 楼主| 发表于 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;


大家顶一顶啊,应为找不到第二个像我这样分享程序的人了。
87
 楼主| 发表于 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 的限制。 越大 悬停时间有越长,同时发生危险的可能性也就越大。
88
 楼主| 发表于 2011-11-4 07:55 | 只看该作者
89
发表于 2011-11-4 13:29 | 只看该作者
不出意外。。。会继续半途而废~~ :em15:
90
发表于 2011-11-6 17:17 | 只看该作者
定高:em26: 不错
91
 楼主| 发表于 2011-11-10 08:28 | 只看该作者
更新几张照片 以免这帖子沉掉。 现在这个超声波定高程序和刚开始乱搞相比已经不错了。 动力也换掉了。

[ 本帖最后由 切风40.83 于 2011-11-10 08:31 编辑 ]

294312_276140372418889_100000687866636_892953_2008800843_n.jpg (86.57 KB, 下载次数: 65)

294312_276140372418889_100000687866636_892953_2008800843_n.jpg

297126_276140552418871_100000687866636_892954_1656904603_n.jpg (93.18 KB, 下载次数: 61)

一共三个感度要改,还有6个限制参数。 一般陀螺仪最多就双感度调节。

一共三个感度要改,还有6个限制参数。 一般陀螺仪最多就双感度调节。

392771_283407711692155_100000687866636_920888_1891836124_n.jpg (131.84 KB, 下载次数: 59)

现在把红外壁障的线也接好了,由于有了之前的感度调节经验。调这个东西应该不复杂。

现在把红外壁障的线也接好了,由于有了之前的感度调节经验。调这个东西应该不复杂。
92
 楼主| 发表于 2011-11-13 06:24 | 只看该作者
完整的壁障+超声波定高代码:

      digitalWrite(trig,LOW);
      delayMicroseconds(12);
      digitalWrite(trig,HIGH);
      delayMicroseconds(12);
      digitalWrite(trig,LOW);
      de = pulseIn(echo, HIGH); //[0,7000], ultrasonic ranger input
     
      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;

      f = analogRead(0);
      b = analogRead(1);
      l = analogRead(2);
      r = analogRead(3);
      
      f = ch2 + map((b - f)*3,1000,-1000,-150,150);
      l = ch1 + map((r - l)*4,1000,-1000,-150,150);
      
      digitalWrite(7, HIGH);
      delayMicroseconds(f);
      digitalWrite(7, LOW);
      
      digitalWrite(8, HIGH);
      delayMicroseconds(l);
      digitalWrite(8, LOW);

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

[ 本帖最后由 mltttt 于 2011-11-29 22:47 编辑 ]
100
 楼主| 发表于 2011-11-30 01:09 | 只看该作者
这100楼还是我自己来盖。 楼上的给位都是志同道合的朋友。能结识你们真是荣幸。

现在国内还没有一个真正互相分享这些知识的环境。 如果你去arduino.cc 的论坛上去看看的话。 你会发现所有人都在分享自己的东西。 他们敢于把源代码贴出来,不怕源代码被别人抄袭,因为他们会互相抄袭,从而互相促进。 我学能够有机会学到这些东西 都是承蒙别人分享给我的结果。不光是这个网站,就连别的好多网站,如 DIY DRONS, AREOQUAD, 等等,都是这样。 照美国人这样发展下去的话,他们的人才储备量将会非常庞大。 这对于美国的可以发展是相当有利的。

希望不久的将来,我再次看到别人分享的时候 用的是中文,而不是英文。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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