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

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

共轴双桨自动驾驶直升机

[复制链接]
441
 楼主| 发表于 2008-8-21 19:16 | 只看该作者
原帖由 hanzhujiao 于 2008-8-21 18:01 发表
楼主加油啊!!!!小LAMA,大智慧!建议采用集成共用的方法减轻重量(我不懂具体怎么做,呵呵),LAMA实在太小.虽然现在还不懂,但也要顶起.将来选专业必选与电子有关的


呵呵,集成的方法以前用过。但是后来发现问题比较多。

首先是互相干扰,比如陀螺仪和稳压芯片,稳压芯片会产生热量影响陀螺仪的数据。
最最主要的,因为现在各部分还不算太稳定,所以把板子分开不管是修改错误还是焊接到调试,都比一次调整个一个大板来的方便。
分开还有一个好处,就是将来换别的飞机也不用担心不好安装,毕竟小板子占地面积小。

重量确实是一个问题,不过将来我可以用1.0mm厚度的电路板,会轻不少。
上次试验过0.6mm的厚度的电路板,似乎太薄了一点,稍微一受冲击就变形了。

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

442
发表于 2008-8-21 23:07 | 只看该作者
好久没看了
再次佩服
443
 楼主| 发表于 2008-8-22 12:52 | 只看该作者
今天调通了摄像头板上的SDRAM,不过由于线路的问题,原本计划安装32MB的SDRAM,实际只能使用16MB的了。但也够用了,只是用来存放摄像头的数据,1秒钟30万像素的摄像头也就9MB的数据。

希望48Mhz的ARM7处理速度能够达到15fps。
444
 楼主| 发表于 2008-8-23 13:59 | 只看该作者
非常简单的代码,实现了飞机机头的自动锁定。
根据加电时记录下的磁阻传感器信息,起飞后发现机头位置不正确,可以实现自动修正。

不过遗憾的是,磁阻传感器只能用来锁定机头位置,并不能帮助我更好地克服漂移。

上段视频:



[ 本帖最后由 c_nmusic 于 2008-8-23 15:50 编辑 ]
445
 楼主| 发表于 2008-8-23 21:40 | 只看该作者
下一步是完善PC端的控制软件,以前的版本改太乱了,准备重写。

加上游戏摇杆带舵量的控制,配合自动平衡功能。
还要加上摄像头支持,包括屏显,图像识别接口等等。
446
发表于 2008-8-25 20:45 | 只看该作者
偶像  简直是我的偶像
447
 楼主| 发表于 2008-8-25 21:27 | 只看该作者
电路板到了,这回做了25块,主要是给陀螺仪的X轴用的那个竖放的小板,顺便把一个小的电量指示器也做进去了。



体积非常小,比一个插头大不了多少。重2.7克



背面,本来预计有4个灯,但是没想到TinyAVR的PB5脚输出不可控,又不大敢将RESET引脚熔丝位禁用,所以只好用3个灯了。



装到飞机上的样子。

具有如下功能:
同时监控2芯电池的2个电芯。如果两个电芯电压差超过0.1V,则红灯闪烁报警。
每个电芯如果电压低于4V,则绿灯闪烁,电压距离3.6V安全放电电压越近,闪烁越快。
如果总电压低于7.6V,则红灯常亮。

装到LAMA上试验了一下,还是有点用的。就是马达一转电池电压就低下来了,等停转了又恢复了。
没法准确得出一个实际的电量。

不过总比没有强。
448
 楼主| 发表于 2008-8-25 22:09 | 只看该作者
原理图如下:



只使用了电阻串联分压的原理测量电压,最最简单的方法。
用了一片Tiny13V做处理器,IO口都用满了。
那个LIGHTR2不好使,大家注意一下。

随便写写的,大家不要见笑。

代码如下:
//--------------------------------
//
// AVR电量显示器
// cnmusic@163.net
//
// Version 1.0
//  第一版,使用电路1.0版本。
//
//--------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>

#define FEED_DOG   asm("wdr");
#define INT_ON    sei();
#define INT_OFF    cli();
#define TRUE    1
#define FALSE    0
typedef unsigned char  BYTE;
#define GL1  PB0
#define GL2  PB1
#define RL1  PB3
#define RL2  PB5
BYTE  g_nLED[5] = {0};   // 用来控制灯的闪烁
void Sleep(void)
{
asm("sleep");
while(1);
}
int abs(int n)
{
if (n > 0)
{
  return n;
}
else
{
  return -n;
}
}
void ADC_Initialize(void)
{
ADCSRA = 0x00;    // 禁用ADC
ADMUX = (1<<ADLAR);  // VCC 做参考电压. 数据左侧对齐
ADCSRA = (1<<ADEN);
}
void delay_nus(unsigned int n)       //N us延时函数
{
    for (;n>0;n--)
    {
     asm("nop");
}
}
BYTE ADC_GetChannelValue(BYTE adc_channel)
{
BYTE value;
ADC_Initialize();
ADMUX |= adc_channel;

ADCSRA |= (1<<ADSC);
delay_nus(100);
value=ADCH;
ADCSRA = 0x00;
return value;
}
// 延迟
void DoDelay()
{
int i = 16000;

for (;i>0;i--)
{
    asm("nop");
}
FEED_DOG;
}
void DoDelay2()
{
DoDelay();
DoDelay();
DoDelay();
DoDelay();
DoDelay();
DoDelay();
FEED_DOG;
}

// 灯闪烁
void FlashLED(BYTE nID,BYTE nSpeed)
{
if (nSpeed <= 0)
{
  nSpeed = 1;
}
if (g_nLED[nID] > nSpeed)
{
  PORTB |= (1<<nID);
  g_nLED[nID] = 0;
}
else
{
  PORTB &= ~(1<<nID);
  g_nLED[nID] ++;
}
}
int main()
{
int   nTotalBatteryV = 0;
int   nVBattery1 = 0;
int   nVBattery2 = 0;
BYTE  bLowBat = FALSE;
// PB0 GreenLight1
// PB1 GreenLight2
// PB3 RedLight1
// PB5 RedLight2
DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB3) | (1<<DDB5);
// 设置睡眠模式为Power-down模式。
MCUCR = (1<<SE)|(1<<SM1);
// 关中断
INT_OFF;
// 打开看门狗
asm("wdr");
// 看门狗的启动顺序
WDTCR |= (1<<WDCE) | (1<<WDE); //| (1<<WDE) | (1<<WDP2) | (1<<WDP1)|(1<<WDP0)|(1<<WDTIF)|(1<<WDTIE);

// 设置0.5秒必须触动一次看门狗
WDTCR = (1<<WDCE) | (1<<WDE) | (1<<WDTIE) | (1<<WDP2); //| (1<<WDP1)|(1<<WDP0)|(1<<WDTIE);//|(1<<WDTIF)|(1<<WDTIE);

INT_ON;  // 开中断
// 自检
// 灯全量
PORTB |= (1<<RL1);
PORTB |= (1<<GL1);
PORTB |= (1<<GL2);
PORTB |= (1<<RL2);
DoDelay2();
DoDelay2();

// 灯全关
PORTB = 0;
DoDelay2();
DoDelay2();
while (1)
{
  //----------------------------------------------------------------------------------------------
  // 10位ADC,只使用前8位,相当于0.012890625V电压 对应数据1
  // 为了避免浮点运算,我们将电压值扩大1000倍。
  //----------------------------------------------------------------------------------------------
  // 总电压 / 11 * 1 / (3300/256) = ADC1   // 2个分压电阻的阻值比为10:1,所以电压比为1:10,测量的电压为实际的1/11
  // -->
  // 总电压 = ADC1 * (3300 / 256) * 11   // 电压值扩大1000倍,便于运算,3.3V变3300
        //     = ADC1 * 141.796875
  //----------------------------------------------------------------------------------------------
  // 分电压 / 2 / (3300 / 256) = ADC2    // 因为并联分压,所以实际电压应该是*2的。
  // 分电压 = ADC2 * (3300 / 256) * 2
  //        = ADC2 * 25.78125
  //----------------------------------------------------------------------------------------------
  
  nTotalBatteryV = ADC_GetChannelValue(1);
  nTotalBatteryV *= 142;       // 四舍五入141.796875
  nTotalBatteryV += 140;       // 根据计算,测量后的电压距离实际的电池电压有0.14V的偏差
  nVBattery2 = ADC_GetChannelValue(2);
  nVBattery2 *= 26;
  nVBattery1 = (nTotalBatteryV - (int)nVBattery2);
  // 总电压监控,低于7.6V报警
  if (nTotalBatteryV < 7600)
  {
   bLowBat = TRUE;
  }
  else
  {
   bLowBat = FALSE;
  }
  FEED_DOG;
  if (!bLowBat)
  {
   // 总电压满足要求
   if (abs(nVBattery1 - nVBattery2) > 100)  // 0.1V压差报警
   {
    FlashLED(RL1,10);   // 2路电压不相同,红灯开始闪烁。
   }
   else
   {
    PORTB &= ~(1<<RL1);
   }
   // 根据电压距离截至电压的范围,闪烁LED。
   if ((nVBattery1 - 3600) < 400)     // 分电芯电压低于4V
   {
    FlashLED(GL1,(nVBattery1 - 3600)/100);  // 闪烁指示灯。TODO:闪烁的间隔计算有误
   }
   else
   {
    PORTB |= (1<<GL1);       // 分电芯电压高于4V,灯常亮。
   }
   if ((nVBattery2 - 3600) < 400)
   {
    FlashLED(GL2,(nVBattery2 - 3600)/100);
   }
   else
   {
    PORTB |= (1<<GL2);
   }
  }
  else
  {
   // 总电压低,绿灯全关,红灯亮
   PORTB |= (1<<RL1);
   PORTB |= (1<<RL2);
   PORTB &= ~(1<<GL1);
   PORTB &= ~(1<<GL2);
  }
  DoDelay();
}
}
449
 楼主| 发表于 2008-8-26 16:36 | 只看该作者


新的PC端地面站软件,只是非常粗糙的一个原形。

准备将飞机上的这些设备都用树形表示出来,便于进行配置。
450
发表于 2008-8-26 18:39 | 只看该作者
顶楼主了!!!!
451
发表于 2008-8-26 20:10 | 只看该作者
装的东西越来越多,会不会超重了?
452
 楼主| 发表于 2008-8-26 20:33 | 只看该作者
原帖由 kkk_t 于 2008-8-26 20:10 发表
装的东西越来越多,会不会超重了?


LAMA就只能这样了,目前已经不能再加电路板了。
一块电已经飞不了几分钟就不行了。

这次完善的控制软件,要能够做到利用ESKY的训练器控制飞机。
这样我换更大一点的艾特鹰眼共轴双桨试飞起来才比较安全。
那个370的电机配上那么大的桨,打到家具上可就不只一道痕迹那么简单了。
453
 楼主| 发表于 2008-8-28 15:55 | 只看该作者
今天做到了利用模拟器飞LAMA。还是用控手感比摇杆要好啊。
不过响应不够实时,大约有1秒左右的延迟。
飞机上的处理器任务太多了点,有些忙不过来了。
454
发表于 2008-8-28 17:01 | 只看该作者
换个好点的处理器,接着开发,呵呵
455
 楼主| 发表于 2008-8-28 19:51 | 只看该作者
只要调整一下处理优先级就可以了。
456
发表于 2008-8-29 18:52 | 只看该作者
感兴趣,关注。
457
 楼主| 发表于 2008-8-30 11:46 | 只看该作者
修改了代码,使用DMA方式,采用了双缓冲,将串口收到的数据进行处理。
效果那叫一个好!!

现在遥控器的操作实时性已经相当好了,大约有0.1秒左右的延迟吧。已经可以接受了。
458
发表于 2008-8-30 18:19 | 只看该作者
顶 太强了^^^^^
459
发表于 2008-8-31 00:53 | 只看该作者

强悍!!

今天一口气看完了,佩服!佩服!!太佩服了!!!
460
 楼主| 发表于 2008-9-3 09:20 | 只看该作者
最近一直在忙软件部分,现在配置可以通过界面修改,并且通过无线传回飞机上。
由中控电路板通过I2C总线写回驱动板处理器的EEPROM里,这样设置就是跟着飞机走了。

下面要上MD500试验,这个飞机载重能力比较强。不过似乎质量很一般,第一次试验舵机就都卡死了。:em25:
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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