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

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

大家齐动手,跟我来做头部运动传感器。终于成功了,感谢Gale兄的辛苦!

[复制链接]
101
发表于 2008-5-20 11:05 | 只看该作者
角速度传感器 那么便宜? 玩玩是可以。

没想到楼主也会AVR单片机,我是每天都在www.ouravr.com 上乱逛。

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

102
 楼主| 发表于 2008-5-20 13:09 | 只看该作者
楼上的哥们潜的时间够长的啊!不怕憋着啊!!
103
发表于 2008-5-20 20:54 | 只看该作者
哈哈,已经完成一个初步的“锁头”了!现在可行性没有问题了,不过漂移得厉害,就是来回晃动几下后,锁定的方向会逐渐偏移,呵呵,有意思的东西,改进代码中。。。
104
发表于 2008-5-20 20:59 | 只看该作者
大哥 你的算法是用什么的啊 什么公式啊???
105
 楼主| 发表于 2008-5-20 21:20 | 只看该作者
原帖由 gale 于 2008-5-20 20:54 发表
哈哈,已经完成一个初步的“锁头”了!现在可行性没有问题了,不过漂移得厉害,就是来回晃动几下后,锁定的方向会逐渐偏移,呵呵,有意思的东西,改进代码中。。。

:em24: :em24: :em24:

:em24: :em24:

:em26: :em26: :em26: :em26:
106
发表于 2008-5-20 21:31 | 只看该作者
原帖由 xunicheng 于 2008-5-20 13:09 发表
楼上的哥们潜的时间够长的啊!不怕憋着啊!!


嘿嘿,憋很久了。

我就对动力电池和充电器这块感兴趣,对航模是一窍不通~

呵呵,偶尔玩玩单片机
107
发表于 2008-5-20 22:14 | 只看该作者
原帖由 tt-01 于 2008-5-20 20:59 发表
大哥 你的算法是用什么的啊 什么公式啊???

兄弟,我不是说了吗?用的就是初中物理或者高中物理学的公式l=1/2a*t*t,就是“距离等于加速度乘以时间的平方的一半”!只有基本的四则运算而已,进行轻微的代数运算后就是:

角度=二分之一的 (初始加速度+终止加速度) 乘以 (时间的平方)

用AVR的定时器得到时间,根据这段时间起始和结束时AD采样的电压得到初始加速度和终止加速度,然后就得到角度了。由于这个角度只是一个表征量,不带有量纲,因此还需要根据它的范围将它乘以一个系数,得到0~200的舵机信号量。

正在制作录像中。。。很有趣
108
发表于 2008-5-20 22:28 | 只看该作者
郁闷啊,没有地方发录像了!

已经把录像EMAIL给LZ了。
109
 楼主| 发表于 2008-5-20 23:03 | 只看该作者
我收
110
 楼主| 发表于 2008-5-20 23:42 | 只看该作者
正向应用,用于运动跟踪。




[ 本帖最后由 xunicheng 于 2008-5-20 23:52 编辑 ]
111
 楼主| 发表于 2008-5-20 23:50 | 只看该作者
反向应用,用于平衡补偿等。



[ 本帖最后由 xunicheng 于 2008-5-20 23:53 编辑 ]
112
发表于 2008-5-21 08:34 | 只看该作者
厉害,厉害
再弄弄就是个平衡仪呀
113
发表于 2008-5-21 09:38 | 只看该作者
哇,搞定了阿
114
发表于 2008-5-21 13:19 | 只看该作者
画了一个电路图,简要说明:
1、稳压、三个LED、AVR的ISP、晶振电路不用说了,注意晶振越高越好。M8可支持到16M,M8L支持到8M,实际M8L可以工作在12M
2、SENS1 2就是传感器
3、SERVO1 2是舵机接口,放标准100mil间距的插针,图中我画错了,舵机信号中间是VCC,顶端是SIGNAL,底端是GND!
4、AVR的ISP放单列100mil间距插针,这是一种非标准ISP接口,但是省空间,放在板边即可
5、设计了两个三极管的串口通讯电路,有这个串口,做改进和升级以及配置更容易,一般可以不焊
6、如LZ本意的PPM IN OUT接口


[ 本帖最后由 gale 于 2008-5-21 13:21 编辑 ]
115
发表于 2008-5-21 18:42 | 只看该作者
这个电路能接到发射机发射了么?另外单片机程序搞定没有?最好楼主能搞个板子大家做起来方便点
116
 楼主| 发表于 2008-5-21 20:02 | 只看该作者
刚看到,单位代理挂了,白天上不了大网只能在油田网转悠。

我会尽快画PCB,然后请Gale兄审查,然后打板,然后试验…………

好像还有很多工作要做啊!!
117
发表于 2008-5-21 21:15 | 只看该作者
gale  大哥程序能不能发过来让我参考一下。 我 AVR 菜鸟级别。。或者HEX文件发上来,我仿制一个。。。
118
发表于 2008-5-21 22:06 | 只看该作者
原帖由 xunicheng 于 2008-5-21 20:02 发表
刚看到,单位代理挂了,白天上不了大网只能在油田网转悠。

我会尽快画PCB,然后请Gale兄审查,然后打板,然后试验…………

好像还有很多工作要做啊!!

晚上调通了二维跟踪,录像上传在这个顶楼。
http://bbs.mx3g.com/viewthread.php?tid=19061&page=1&extra=page%3D1

但现在只能说是“调通”,不能说“调好”,还是一个非常粗糙的东西。

本来晚上想要调PPM发射接收的,结果时间来不及,明天要出差,二周以后继续调。

LZ,不知道你做板子要不要钱,如果是我业余制作,我会用二颗单片机!两路检测1颗单片机,PPM信号分析重组1颗单片机,这样精度最好,开发起来也容易。而对于非工厂制作来说,多个10块钱也无所谓。

源代码我是不保守的,之前的源码也发给LZ的,但是最头疼的问题就是,我不愿意承担答疑的责任。这个小项目我分为了几个模块:
PPM.C PPM.H
SERVO.C SERVO.H
FPV.C

下面是舵机驱动模块SERVO的完整源码
--------------------
SERVO.C
--------------------
#include "Servo.h"
#include "Delay.h"
#define SERVO1 0b00100000
#define SERVO2 0b00010000
volatile BYTE Servo1,Servo2;
/////////////////////////////////////////////////////
//
// 定时器0用于舵机信号发生器
//
//5.333us计数1个
//初值为0时1.365ms中断一次
#define COUNT20MS 15 //需中断15次约为20ms
#define COUNT1MS 187 //初值为187为1ms
volatile BYTE iSignalCount;
volatile BYTE iSignal;   //发送信号标志
#define IS_HEAD1 0
#define IS_SIG1  1
#define IS_HEAD2 2
#define IS_SIG2  3
#define IS_TAIL  4
SIGNAL (SIG_OVERFLOW0)
{
if(iSignal==IS_HEAD1)//发送舵机1的1ms信号头
{
  PORTC|=SERVO1;//舵机1信号电平拉高
  iSignal=IS_SIG1;  
  TCNT0=255-COUNT1MS;
}
else if(iSignal==IS_SIG1)//发送舵机1的0~1ms信号
{
  iSignal=IS_HEAD2;
  iSignalCount=COUNT20MS;
  TCNT0=255-Servo1;
}
else if(iSignal==IS_HEAD2)//发送舵机2的1ms信号头
{
  PORTC&=~SERVO1;//舵机1信号电平拉低
  PORTC|=SERVO2;//舵机2信号电平拉高
  iSignal=IS_SIG2;  
  TCNT0=255-COUNT1MS;
}
else if(iSignal==IS_SIG2)//是发送舵机2的0~1ms信号
{
  iSignal=IS_TAIL;
  iSignalCount=COUNT20MS;
  TCNT0=255-Servo2;
}
else//发送20ms延时
{
  PORTC&=~SERVO2;//信号电平拉低
  
  iSignalCount--;
  if(iSignalCount==0)
  {
   iSignal=IS_HEAD1;
  }
}
}
void ServoInit(void)
{
DDRC|=SERVO1|SERVO2;
//////////////////////////////////////////////////////////////////
//用定时器0作为舵机信号发生器
//12M主频下64分频=5.33us计1个数
TCCR0 = 0b00000011; //定时器/计数器0控制寄存器bit7~3保留,bit2~0时钟选择
      //000定时器计数器停止
      //001=CK 010=CK/8 011=CK/64 100=CK/256 101=CK/1024
      //110=外部T0脚,下降沿
      //111=外部T0脚,上升沿
//////////////////////////////////////////////////////////////////
//初始化舵机
Servo1=100;
Servo2=100;
//////////////////////////////////////////////////////////////////
//定时器中断开关
TIMSK|= 0b00000001; //定时器中断控制OCIE2.TOIE2.TICIE1.OCIE1A.OCIE1B.TOIE1.--.TOIE0

Delay100ms(10);//等待舵机稳定
sei();//打开中断才能启动舵机
}
-----------------------
SERVO.H
-----------------------
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#ifndef _BYTE_
#define _BYTE_
typedef unsigned char BYTE;
typedef unsigned int  WORD;
typedef unsigned long DWORD;
#endif
extern volatile BYTE Servo1,Servo2;
void ServoInit(void);

共100行代码
-------------------------------------------------------
该模块对外提供三个接口,一个是ServoInit,启动时需要调用它,然后其他程序只要设置Servo1 Servo2为0~200的值即可,模块自身会完成两路舵机的驱动。采用模块化程序设计之后,主程序专心于锁尾算法,结构就很清晰简单了。
119
发表于 2008-5-21 22:32 | 只看该作者
恩 谢谢啊。我也去仿制个玩玩
120
发表于 2008-5-22 11:11 | 只看该作者
快快快,哈哈哈

搞个板板出来就爽了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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