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

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

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

[复制链接]
41
发表于 2011-4-19 10:30 | 只看该作者
点击查看详情
别搞了,这东西不准的,完全受天气影响,用大气压传感器还行!~

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

42
发表于 2011-4-19 10:47 | 只看该作者
厉害!
43
 楼主| 发表于 2011-4-20 10:57 | 只看该作者
今天查到原因了, 超声波传感器电压不够。 现在在设计电路板,到时候所有的东插到电路板上就可以测试了。


我只是室内飞飞,室外的话开始得靠气压计。
44
发表于 2011-4-20 13:14 | 只看该作者
用倒车雷达

[ 本帖最后由 普通用户 于 2011-5-27 10:22 编辑 ]
45
 楼主| 发表于 2011-4-21 08:14 | 只看该作者
板子做好了,还差个稳压三极管没装上去。

206600_161940363867908_100001558366423_387601_5781557_n.jpg (64.39 KB, 下载次数: 98)

206600_161940363867908_100001558366423_387601_5781557_n.jpg
46
 楼主| 发表于 2011-5-25 04:49 | 只看该作者
好久没更新了,前一整子准备期末XX,这帖子嘛 找了半天才找找的。
我当上不知道怎么搞的 居然没想过用ESC供电。 今天直接从接收机上拉了两根线做ARDUINO 和 ultrasonic range finder 的电源。效果良好,直接解决问题。

另外 我还从新做了个机身 很酷吧。

IMG_0634--.jpg (80.34 KB, 下载次数: 75)

IMG_0634--.jpg
47
发表于 2011-5-25 10:10 | 只看该作者
很有型~!
48
 楼主| 发表于 2011-5-26 06:27 | 只看该作者
线都接好了,马上就可以测试了。但是明天校长,某些领 导 和 其他学校的领 导要来我实验室参观。教授叫我不要测试,要是弄坏了明天就没得展示了(美国的教育制度也差不多嘛)。 上个图庆祝一下,择日再飞。

247440_211919652174295_100000687866636_651757_4439369_n.jpg (50.59 KB, 下载次数: 89)

247440_211919652174295_100000687866636_651757_4439369_n.jpg

250448_211919605507633_100000687866636_651756_6291062_n.jpg (38.17 KB, 下载次数: 90)

250448_211919605507633_100000687866636_651756_6291062_n.jpg
49
发表于 2011-5-26 08:16 | 只看该作者
有没有搞出气压计版本啊
50
 楼主| 发表于 2011-5-27 10:32 | 只看该作者
用气压计 不如用 GPS 。
51
发表于 2011-5-27 10:35 | 只看该作者
没那么高精度的气压计、有也装不下,装的下也买不起,买的起也买不到
52
 楼主| 发表于 2011-5-27 23:33 | 只看该作者
新程序,打算用 夏普 的红外传感器壁障。

#include <Servo.h>
Servo myservo;
Servo roll;
Servo pitch;

int left;
int right;
int front;
int back;

// read analog input from IR ranger finder
int val1 = 1;
int val2 = 2;
int val3 = 3;
int val4 = 4;

const int echo = 12;
const int trig = 13;
const int sw = 3;
const int th = 4;
const int rollin = 5;
const int pitchin = 6;

void setup()
{
  
  pinMode(echo,INPUT);
  pinMode(trig,OUTPUT);
  pinMode(rollin,INPUT);
  pinMode(pitchin,INPUT);
  
  int sensorValue = digitalRead(rollin);
  int sensorValue = digitalRead(pitchin);
  int sensorValue = digitalRead(echo);
  int swValue = digitalRead(sw);
  int thValue = digitalRead(th);
  
  myservo.attach(9);
  roll.attach(8);//there must be somthing wrong here!!!
  // 8,7pin do not allow PWM output!
  // DO NOT FORGET CHANGE THE NUMBER,Before test.
  pitch.attach(7);
}

void loop()
  {  
  long rol, pit;
  
  rol = pulseIn(rollin,HIGH);
  pit = pulseIn(pitchin,HIGH);
  
  left = analogRead(val1);
  right = analogRead(val2);
  front = analogRead(val3);
  back = analogRead(val4);
  
  //left is from 0 to 1023,distance between 10cm and 80cm.see graph.
// rol is from 1000 to 2000
  
  rolling = lift - right; // rolling is from -1023 to +1023
  map(rolling, -1023, +1023, -150, 150);
  rol = rol + rolling;
  map(rol, -850, 2150, 0, 179);
  
  roll.write(rol);//maybe it need to be reviced. swtch left and right.
  
  pitching = front - back;
  map(pitching, -1023, +1023, -150, +150);
  pit = pit + pitching;
  map(pit, -850, 2150, 0, 179);//the samthing here.
  
  pitch.write(pitch);
   
  
   
  long duration, hold ,power;
  hold = pulseIn(sw,HIGH);
  if (hold>1500)  
  {
   
  digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(12);
  digitalWrite(trig,LOW);
  
  duration = pulseIn(echo,HIGH);
  duration = map(duration, 0, 2000, 45, 135);
  myservo.write(duration);
  delay(15);
  
  }
  
else {
   
   power = pulseIn(th,HIGH);
   power = map (power, 1000, 2000, 135, 45);
   myservo.write(power);
   delay(15);
   
}

}
53
 楼主| 发表于 2011-5-28 11:57 | 只看该作者
最新测试视频,现在有时间了 可以快速发展了。

http://v.youku.com/v_show/id_XMjcwNzUyMjEy.html
[wmv]http://v.youku.com/v_show/id_XMjcwNzUyMjEy.html[/wmv]
54
发表于 2011-5-29 17:07 | 只看该作者
:em26:
55
 楼主| 发表于 2011-6-2 00:48 | 只看该作者
昨天试飞过了, 最终我还是把 超声波传感器放到了机体的中间,否则机体倾斜会导致过大的误差。

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


不管你懂不懂C语言 ,请帮我看下红字的部分!的的回复可能对我有帮助。


  if (hold>1500)  
  {
  digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(12);
  digitalWrite(trig,LOW);
  duration = pulseIn(echo,HIGH);
  duration = map(duration, 0, 5000, 90, 65);//90 和 65 是两个数字是调节油门控制行程. 数字越大 油门就越大。最大行程不能超过45 和 135,超过了这个数值 不知道电调会不会出错。
  //Serial.print(duration);
  //Serial.println();
  myservo.write(duration);
  delay(10);//10表示感度,数字越大感度越大,单位是毫秒,不知道超过20会怎么样。
  }



这就好比调直升机的陀螺仪一样,不知道各位是怎么在陀螺仪上设置这两个数值的。现在我不敢轻举妄动,害怕再被螺旋桨割到。
56
 楼主| 发表于 2011-6-2 01:04 | 只看该作者
如果不行的话 就用PID 控制。
57
发表于 2011-6-14 10:31 | 只看该作者
你把测得的10个数据取平均值,可以更稳定的控制飞机。
58
发表于 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)我没仔细读你的代码,但应该是越小,甚至去掉,才是最好的。
59
发表于 2011-6-21 05:10 | 只看该作者
挺好,应该可以用在四轴上
60
 楼主| 发表于 2011-6-21 08:23 | 只看该作者
回复:dongfang

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

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

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


duration 的值 等于 声音从超声波传感器发出到返回的时间, 这个时间的单位是毫秒。 输出值为5000的时候 飞碟大概是3米高。(现在感觉声音传播速度是有点慢)。 所以说使用超声波传感器是需要花掉单片机一点时间的。 如果测量几次再判定输出值的话怕来不及做修正。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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