北京快3玩法窍门

单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8882|回复: 14
打印 上一主题 下一主题
收起左侧

四轴毕设 -RT-Thread DBP飞控的开源了

  [复制链接]
跳转到指定楼层
楼主
本文出自:aircheese.me再次向作者致敬
简单说,这是一个我自己写的开源的小飞控。全?#30475;?#30721;开源,全?#30475;?#30721;简单,注释完整。飞控加上配套的四轴机体,就成了我的本科毕业设计,轻松帮我拿到学校的优秀毕业设计。

声明: 这篇小文章曾经在几个论坛发过,自己的博客搭起来后当然也少不了自己 self-plagiarism 一下。不过,如需转载请谨慎,?#19968;?#36861;到天涯海角。。
以上

虽然我的毕设题目是:《四轴飞行器的控制》,但飞行器的算法都是用最基本的算法,更复杂的是如何协调好各个任务。
而让我自己感到更加有价值的部分是如何在 RTT 上运行一个飞控并较好的协调各个模块的工。希望能给学习 STM32 和 RT-Thread 的同学一个参考,也希望 RTT 能越做越好。
四轴断断续续做了5个月,因为这几年都做类似的东西,所以做起来难度不大,我的目标是够用就行。而对于飞控,是我一直从大一到大四的学习研究过程,持续做了四年。
主要?#38382;?#22914;下:
[td]
?#38382;?/td>
空机重量390g
起飞重量(11.1V 2200mAh)550g
续航时间20分钟
载重能力200g
悬停力效率>10g/w
电机2206 kv1200
8043
单个电机最大推力290g
[td]
传感器型号
陀螺仪MAX21000
加速度计ADXL362
磁阻HMC5983
气压计MS5611
传感器全部使用 SPI 接口,软件利用 RTT 的 SPI 驱动,所以 ODR (Output Data Rate) 非常高。
[td]
?#38382;?/td>
陀螺仪ODR2kHz
姿态解算更新率1kHz
控制更新率1kHz
电调控制更新率1kHz
CPU 占用率50~70%*
*:取决于是否需要高速记录 log 到 SD 卡。
全机一共9个微控制器,主控芯片为 1 个 STM32F4,其他的为 STM32F1 (电调,电源管理,传感器终端,接收机 PPM 解码器等等),全部运行RTT,全部使用CAN BUS 通信。
飞控本身集成度?#32454;擼?#38598;成 10轴传感器,GPS,12路PWM输出,1路 PPM 输入,1路 UART,1路CANbus),在没有其他模块的情况下?#37096;?#20197;单独完成飞行任务。拓展模块包括电源板,电调板,各个传感器,PWM解码模块等,因为有了CAN Bus,使用很?#22870;悖?#35770;文内有详细说明。
电调为自制兼容 ESC32的 硬件(?#34892;?#24320;源模型兴趣组的群主提供了 ESC32 的原理图)
软件上在 ESC32 与硬件之间加入 RTT 层,劫持了PWM更新函数,从而实现控制数据流使用双向的
飞控 <-> CANBUS <-> RTT <-> ESC32
代替了传统单向的
飞控 -> PWM -> ESC32
数据沟通速度大幅度提高,信号延迟降低非常多(50Hz 对比 1000Hz),提供了反馈的能力。
论文里面提到几个新的思路,包括虚拟终端,大的PCB机架+电路,单总线在四轴上的应用,都是我在以前的制作?#26657;?#24863;觉非常不?#22870;?#21518;,提出的解决?#26728;福?#22312;?#23548;?#20013;也帮我省了很多精力去调试。
之后的文章,将根据论文逐步分析一些代码和思路。如果?#38405;?#26377;帮助,请使用页脚的RSS订阅链接RSS订阅链接订阅我的博客,谢谢。
演示视频链接


毕业论?#27169;?#20840;部程序,原理图:
游客,本帖隐藏的内容需要积分高于 10 才可浏览,您当前积分为 0


放两张图片感受下:

飞控系列文章:

在飞控中记录路径(KML)文件,并在谷歌地球上显示飞行轨迹还记得这段动画么,从飞控的 microSD 中直接点击一个路径文件,即可打开谷歌地图并显示出路径。并且这个文件是由飞控在飞行过程中实时生成的,不需要额外的编辑,使用起来非常?#22870;恪?br />
因为 typecho 的原因,没办法上传大于 1M 的 GIF 动画。效果请看视频:youtube youku 1:35 处开始

想要在飞控中记录这个谷歌地球的描述文件,是非常简单的。
1. 背景知识谷歌地球/地图 (google earth / google map) 使用的描述文件为 .kml 文件。本质上为 xml 文件。XML 大家应该熟悉了
可扩?#36129;?#35760;语言(英语:eXtensible Markup Language,简称: XML),是一?#30452;?#35760;语言。标记指计算机所能理解的信息符号,通过此?#30452;?#35760;,计算机之间可?#28304;?#29702;包含各种信息的文章?#21462;?#22914;何定义这些标记,既可以选择国?#37322;?#29992;的标记语言,?#28909;鏗TML,?#37096;?#20197;使用像XML这样?#19978;?#20851;人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩?#36129;?#35760;语言、可扩展样式语言(XSL)、XBRL和XPath?#21462;1]
上面说了一堆,意思就是说,.kml 呢,?#23548;?#19978;就是一个文本文件,里面用文本记录各种描述,?#28909;?#32447;,颜色图形,位置等?#21462;?br /> Google earth/map 开发手册里面有详细的 kml 文件的开法指南。
英文在这中文在这
其实,要做这个路?#37117;?#24405;文件,并不需要去翻手册。
2. 这样是不是很简单窍门就在这: 在描述路径的时候,.kml 文件的头和尾都可以是固定不变的,唯一变化的是,路径中各个点的经纬度值。
这么说?#22270;?#21333;了吧?我们的飞控只需要?#21387;?#23450;的文件头写进一个 .kml 的文本文件,然后根据 GPS 实时返回的经纬?#32676;?#39640;度信息,不断地在文件后追加当前的位置信息,一直写入直到你不想记录的时候,再?#21387;?#23450;的文件尾追加到文件?#23567;?#20445;存,搞定!
不?#24403;?#30340;,先看一个典型的(花俏的) kml 文件。大家可以将以下保存到一个 .kml 文件里,拖到 google earth 里面看看效果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
<name>Paths</name>
<description> DBP V0.4 KML LOG</description>
<Style id="yellowLineGreenPoly">
    <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
    </LineStyle>
    <PolyStyle>
        <color>5f00ff00</color>
    </PolyStyle>
</Style>
<Placemark>
    <name>Absolute Extruded</name>
    <description>Deep Blue Plane V0.4 Path</description>
    <styleUrl>#yellowLineGreenPoly</styleUrl>
    <LineString>
        <extrude>1</extrude>
        <tessellate>1</tessellate>
        <altitudeMode>absolute</altitudeMode>
            <coordinates>
                110.411100,25.319343,194.000000
                110.411200,25.319243,194.000000
                110.411092,25.319144,194.000000
            </coordinates>
     </LineString>
    </Placemark>
</Document>
</kml>



按到关键没? “110.411092,25.319343,174.000000”
具体是?#27169;?#33258;己?#34892;?#36259;可以去看看。
至于格式问题,经度?#27573;?#20174; -180 到 +180? 负数代表西经,正数代表东经。维度?#27573;?#20174; -90 到 +90, 负数代表南?#24120;?#27491;数代表北纬。单位全部?#23884;齲?#25152;以?#25442;?#26377;几分?#35813;?#30340;情况,一个实数就代表了一个点。高度为海拔高度,单位是米。
看到文件的中间部分,由  <coordinates> </coordinates> 包起来的部分,每一行表示一个点,每一个点坐标,一次由经度,纬?#32676;?#28023;拔高度组成,这三个信息都可以?#22870;?#22320;从任何“正常的” GPS 输出中找到。
这里例子的文件,由三个位置坐标点组成,?#23548;?#39134;控记录的时候,这一部分将不断增加,将是整个文件中占用行数最多的部分。
在看到文件前部分,
1
2
3
4
5
6
7
8
9
<Style id="yellowLineGreenPoly">
    <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
    </LineStyle>
    <PolyStyle>
        <color>5f00ff00</color>
    </PolyStyle>
</Style>



这部分描述?#22235;?#30340;路径画出来的风格,具体可以去看手册里面,或者直?#26377;?#25913;一些配色,反正我这是已经是最丑的风格了。。
于是上面的代码风格就是如此逗逼

三个顶点,即为坐标里面描述的三个点,高度为海拔 194米。
只要不断记录这些点,就能实现动画里面的飞行路径了。
那么,飞控里面咋生成 .kml 文件呢?
2. 那我们来看看代码与 .kml 文件生?#19978;?#20851;的代码在 飞控主板源码.rar 的以下目录
program v1.0\RT-Thread_1.2.0\bsp\stm32f40x\user\thread_log.c
什么你没有代码? 代码在这里下载:四轴毕业设计初说 - DBP飞控的开源与简介
这个文件,包含了一些独立的储存飞控运行信息,传感器信息,GPS 记录等等的线程。其中一个即为生成 .kml 文件的线程 void entry_thread_kml_log(void* parameter)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//记录kml文件
void entry_thread_kml_log(void* parameter)
{   
    int fd = -1;
    int    size;
    int gps_count_bef = 1;
    char buf[512];
    char dir[64];
    unsigned int buf_offset = 0;        //指示上一次写到哪里
     
    unsigned long long file_byte_seek = 0;            //指示文件长度
    unsigned int head_len = 0;                        //文件头尾的长度
    unsigned int tail_len = 0;
    const char file_name[] = "path.kml";
    const char head[] =
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
    "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n"
    "\t<Document>\n"
    "<name>Paths</name>\n"
    "<description> DBP V0.4 KML LOG</description>\n"
    "<Style id=\"yellowLineGreenPoly\">\n"   
    "    <LineStyle>\n"      
    "        <color>7f00ffff</color>\n"     
    "        <width>4</width>\n"   
    "    </LineStyle>\n"   
    "    <PolyStyle>\n"      
    "        <color>5f00ff00</color>\n"   
    "    </PolyStyle>\n"  
    "</Style>\n"
    "<Placemark>\n"
    "    <name>Absolute Extruded</name>\n"   
    "    <description>Deep Blue Plane V0.4 Path</description>\n"     
    "    <styleUrl>#yellowLineGreenPoly</styleUrl> \n"   
    "    <LineString>\n"     
    "        <extrude>1</extrude>\n"      
    "        <tessellate>1</tessellate>\n"       //这一句是有没有竖线
    "        <altitudeMode>absolute</altitudeMode>\n"      
    "            <coordinates>\n";
     
    const char tail[] =   
    "            </coordinates>\n "   
    "    </LineString>\n"
    "    </Placemark>\n"
    "</Document>\n"
    "</kml>\n";
     
    //预先记录文件头尾长度
    head_len = strlen(head);
    tail_len = strlen(tail);
     
    //复制工作区 目录
    strcpy(dir, log_dir);
    //打开记录文件
    strcat(dir, file_name);
     
    //try to open the working file
    while(fd < 0)
    {
        int count = 0;        
        fd = open(dir, O_WRONLY | O_CREAT, 0);
        rt_thread_delay(RT_TICK_PER_SECOND);
         
        if ((count ++ )> 60) //60 seconds
        {
            rt_kprintf("kml: open file for write failed\n");
            return;
        }
    }

    rt_kprintf("google earth file'path.kml' has been created.\n");
    //写入文件头
    write(fd, head, head_len);
    file_byte_seek += head_len;
     
    //主循环
    while(1)
    {
        while(gps_count_bef >= gps.count)
        {
            rt_thread_delay(5);
        }
        gps_count_bef = gps.count;       //mark for 1 second a cycle
         
        //等待直到数据?#34892;?br />         if(gps.flag == 0)
            continue;
                 
        sprintf(buf,"\t\t\t\t%f,%f,%f\n",
                                        gps.lon,
                                        gps.lat,
                                        gps.altitude);   
         
        //将缓存区写入文件
        size = write(fd, buf, strlen(buf));
        file_byte_seek += size;                //记录写入长度   
         
        if(size>0)
        {
        //rt_kprintf(buf);
        }
        else
        {
            rt_kprintf("kml log: Write to file wrong!\n");
            while(1)
                rt_thread_delay(1000);  //相当于停止这个线程
        }
         
         
        //写入文件尾
        write(fd, tail, tail_len);
        close(fd);
        fd = open(dir, O_WRONLY | O_CREAT | O_APPEND, 0);//末尾重新打开        

        //覆盖 从文件头开始计算写入了多少?#34892;?#25968;据,覆盖文件尾
        lseek(fd, file_byte_seek, DFS_SEEK_SET);
    }
}



注释很清楚啦,我就不多说啦。
RT-Thread 支持 POSIX 标准文件系统接口,所以我的飞控可以直接使用 open() write() close() 之类的POSIX 文件接口操作文件。 如果你跑在自己的飞控,自己的 MCU,或者直接裸?#36857;?#37027;文件接口需要改成你的文件?#20302;程?#20379;的接口。
3. 经纬度,高度数据怎么取?这里就要说到如何 GPS 数据啦,这部分本不是这篇的内容,这里大概提一下。
一般 GPS 输出,至少都有标准的 NMEA-0183协议输出,可以参考这个文件 NMEA-0183 定义。 官方文档似乎?#20999;?#35201;购买的。
GPS 会通过串口输出一大堆包含导航信息的语句,一般在10Hz(每秒 10 条)以下。大部分 GPS 模块?#37096;?#20197;选择性输出部分语句,屏蔽部分语句。(因为很多语句信息是重复的,?#28909;?GGA 语句和 RMC 语句都包同样的含经纬度信息)[2]
如果不想看文档,那就直接看下面的例子
这是最常用的 GPS 返回的 NMEA-0183 语句之一 GGA 语句:
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GGA          Global Positioning System Fix Data
123519       Fix taken at 12:35:19 UTC
4807.038,N   Latitude 48 deg 07.038' N
01131.000,E  Longitude 11 deg 31.000' E
1            Fix quality: 0 = invalid
                          1 = GPS fix (SPS)
                          2 = DGPS fix
                          3 = PPS fix
                          4 = Real Time Kinematic
                          5 = Float RTK
                          6 = estimated (dead reckoning) (2.3 feature)
                          7 = Manual input mode
                          8 = Simulation mode
08           Number of satellites being tracked
0.9          Horizontal dilution of position
545.4,M      Altitude, Meters, above mean sea level
46.9,M       Height of geoid (mean sea level) above WGS84
                 ellipsoid
(empty field) time in seconds since last DGPS update
(empty field) DGPS station ID number
*47          the checksum data, always begins with *



以上说明应该比较清晰啦,其他语句也是一样的,请参考这里
这里面,有我?#20999;?#35201;的经纬度信息和海拔高度,4807.038,N  01131.000,E  545.4,M  只是,这表示方法是不是跟我们上面不同? 小伙们,自己想办法转换吧~ 如果需要查看C语言版本的,在program v1.0\RT-Thread_1.2.0\bsp\stm32f40x\user\thread_gps.c 里面找到 GPS 其中几个常用语句的解码函数。
4. 其他说其实这?#22336;?#24335;并不好,原因是我的飞控没有掉电保存能力,经常记录到一半,没写文件尾就掉电了,导致得自己手动编辑文件,加入文件尾。
另一?#22336;?#27861;,是在飞控中直接记录所有 GPS 输出的 NMEA-0183 语句,等回到电脑上,再用脚本语言工具,例如 python 来转换成 .kml 文件。 只是,占用空间会比 .kml 本身大很多,并?#20197;?#21152;了一个转换的步骤,?#26376;?#28902;。
再另一种,我记得 google earth 有直接导入 NMEA-0183 的能力,具体如?#38382;?#29616;,各位自行脑补。
.kml 文件是很神奇的,除了记录路径,还能做很多很多的事情。具体请参考文章刚开始提供的 .kml 开发指南。英文在这中文在这

与飞控无关 - 记刚开始弄飞控那会儿(上)
记录的是我的飞行器学习的黑历史,主角是一台类似 阿凡达里面的双桨 VTOL (Vertical Take-Off and Landing)飞行器的详细制作过程。错?#33267;?#31687;,虽然烂尾,没有但是..
版权所有,转载请看


先放张图吓吓人,以下原文

项目名称:AUTO FLY SYSTEM
项目编号: FL project 005
目的:制作一个能自动导航并自动进行姿态调节的无人机控制系统
要求:
1.使用惯性导航和GPS进行导航
2.能自动进行姿态调节
3.能手动/自动飞行随意切换
4.有实时远距离状态/控制数据传输能力
5.实现自动航线飞行/航点实时切换
6.实现定点自动起飞/着陆
7.地面控制站支持
8.功能模块挂载
整体思路:
通过惯性导航和GPS等实现飞行器自动控制和导航,并进行实时修正姿态,接受地面控?#39057;?br /> 预计用时:6个月
开始时间:2011年1月20日
结束时间:
硬件清单:
预算:2000RMB
逻辑图解:   
首先,这是个大项目,其次,我?#34892;?#24515;完成它
涉及的新知识有:
新的单片机C8051F
稳定的电源
AD转换
IIC接口
SPI接口
UART接口
上位机串口编程
上位机Labview编程
模拟输出传感器
IIC数字传感器
PI算法
导航算法
空气动力学
材料科学
无线RF模块
GPS数据格式
在初期,我打算用洞洞板先把硬件组装出来,然后写软件一个个调试。画板?#19968;共换幔?#39034;利的话等到下学期应该定型可以做板了。
个人精力有限,对于这个AFS(Auto Fly System),作为一个C语言只写了1000行的初级入门半爱好者来说,姿态算法才是最有挑战的东西。所以寒假着重在算法上面花心思。其次,我是个电?#29992;ぃ?#22312;一个唯一不学电子技能基础的专业的大学新生),所?#28304;?#24863;器,能买到模块的就买模块的。买不到就尽量买数字的了,比起模拟的数字的外设少很多。

Auto Balance Module
MCU:C8051F410
使用内部晶振,工作在49MHZ
传感器:
1三轴模拟输出陀螺仪
2三轴模拟输出加速度传感器
  以上采样率500HZ
3数字三轴电子罗盘 IIC接口 采样率50HZ
工作周期
500Hz
2HZ
PWM信号输出周期50HZ
输出接口
八通?#20048;?#26399;50HZ的PWM信号
C8051F410的高速SMBus(IIC)
工作周期概述
并行周期1:500HZ
1转换三轴陀螺仪数据,取三轴加速度数据做融?#24076;?#35745;算出短期的调整量。
2等待定时器中断
并行周期2:50HZ
1将30次短期调整量移动加权平均为 输出量,乘上速度系数,设定好PWM?#38382;?br /> 2根据上次传回的PWM数据,设置好定时器,输出信号
3 取电子罗盘数据50次平均后,校准陀螺仪中立点。
4根据电子罗盘计算四轴姿态并保存。
5向AFN传输数据(航向,姿态…)
6接收AFN数据 设置飞行数据(速度?#38382;?br /> 并行周期3:2HZ
1在0.5秒内对50HZ平均输出量进行计算平均,得出长期调整量,然后积分加入到输出量积分处
2等待定时器中断

Auto Fly Navigator Module
MCU:C8051F410
使用内部晶振,工作在49MHZ
使用外部晶振作串口基准 11.0592MHZ
外部模块:
1 PPM解码模块接收机(真讨厌!)
2 气压传感器
3 GPS模块 接口UART 38.4Kbps 取样4HZ
4 Auto Balance Module 接口SMBus
5 RF905 2W模块 SPI接口
工作顺序概述
1.接到ABM输出数据
航向,俯仰角,倾斜角…
2.回传ABM上一次的数据和指令
飞行模式(起飞,着陆,左转,右转,爬升,降落),PPM信号,其他需要PWM?#38382;?br /> 3.开始转换PPM数据
根据ABM传回的数据,结合GPS坐标,航标和气压计,计算下一个航标的相?#36234;嵌群?#39640;度,或者根据PPM信号进行调整。形成新的ABM回传数据。
4.写入SD卡,并通过Zigbee传输回数据地面(后来决定用RF905 433mhz)
5.等待下次ABM的数据
2011/2/12好吧,这么多天,我一直没写这个,其实…真不是我?#36947;痢?#20174;1月29号到现在,我已经买了陀螺仪(LY530,LPR530),加速度计(ADXL335),磁阻传感器(HMC5883L),GPS模块(LEA-5Q),C8051F单片机下载器(EC6)…看上去差不多了?#21069;桑看恚?#26368;最最关键的单片机(C8051F410)没买到!淘宝商家个个都回家过年去了!我哭…不过这么多天来,我一遍又一遍地看了各个传感器的datasheet(都是英文的,想哭TAT),查了很多各方面的资料,泡飞行器的论坛,看各?#25351;?#26679;的算法。(但是感觉什么都没学)
好吧,没事,只能先YY载体(飞机)了。

今天之前的文字是最初步想法,大概就是做一个惯性导航和GPS,磁阻传感器等配合而成的一个包括姿态控制和飞行导航的?#20302;常?#24182;在载体上?#23548;?br /> 最初打算用固定翼模型飞机作为载体。选固定翼的原因很简单,我?#26377;?#23601;接触固定翼的模型飞机,从绕橡筋,到后来的电动,从买来的商品机,到后来完全自己做的飞机。我虽然很久不玩模型飞机了,但是就制作能力来说,?#19968;?#26159;很有自信的。给我两个小时,我就可以完成一台基于KT板的载体飞机。除了制作,我对固定翼飞机的飞行特点和控制方式都有很详细的了解。这些都是我一开?#21363;?#31639;?#21387;?#23450;翼飞机作为载体的原因。
但是,我必须得放弃固定翼了。第一,我忽略了实验场地问题,固定翼飞机飞行需要太大的场地,只少是一个足球场的空地,即使能在学校的足球场飞起来,也因为离自己太远不好观察和调整?#38382;?#31532;二,GPS不能提供足够的精度供固定翼使用,几十米的动态误差足够飞机撞体育场主席台了。即使飞起来了,想让它找准位置降落是很困难的。除非我能使用到DGPS技术,我现在还不太了解,理论上是可行的,我买的GPS模块也支持DGPS,等我有时间看过以后再说吧。
除去固定翼,我第一个想到的是四轴飞行器。我有做这个AFS(Auto Fly System)的想法也是因为看了其他人做的四轴飞行器例子。四轴飞行器,资料多,姿态算法都有现成的,而且控制原理最简单,?#36136;嵌?#31216;的飞行器,没有复杂的控制算法。但是说真的,我?#28304;?#31532;一眼看见四轴飞行器,就不?#19981;端?#30340;样子,有点丑,有点?#22238;!?#25105;不是很愿意做这个。

上图是国内玩家自己DIY的四轴飞行器
另一个想法,是《AVATAR》里的直升飞机,样子很酷很酷,在哈利路亚这?#20540;?#37325;力的星球上,它的两个涵道风扇显得并不是那么不?#31995;览懟?#20043;前几天我一直在思考,那么另类的飞行器,姿态检测和控制算法会?#25442;?#27604;较复杂?我结合四轴飞行器和AVATAR的直升机,经过分析,得出一些结论:这两者之间,姿态检测是完全一样的,机体的倾?#20445;?#21152;速度的检测都差不多,控制算法上,AVATAR直升机和四轴飞行器在横滚控制上是相同的,但在前后倾斜控制上不同,但也不是很复?#21360;?#20854;次,AVATAR直升机相对于四轴有一个优点,重心比较?#20572;?#36825;样,调试会变得简单许多。我看过许多四轴飞行器的视频,不少在飞行时会发生振荡,选择适合的?#38382;?#26174;得比较困难。
结合这几天的分析,我决定选择AVATAR直升机作为实验载体。同于四轴的姿态检测,资料多,做起来会比较容易,相似又有不同的控制算法,对于我来说也是一种新的挑战。

AVATAR直升机
主体结构,有两个方向,玻璃钢和桐?#23613;?#26704;木是模型飞机里经常用到的,主要特点是轻,比轻木稍重,但强度大于轻木,小于松木,而松木最重强度最大,一般用于支撑结构上,?#28909;?#32764;梁。淘宝上有提供激光切割非金属材料的服务,我计算了一下,切1平方米3mm厚的桐木板大概需要100元,还可以接受吧。玻璃钢的话,又有两个方向,自己做(环氧树脂+稀?#22270;?玻璃纤维?#36857;?#25110;者送去PCB打样,至少1平方米(这个价格估计比较杯具)。自己做呢,初中的时候我收集过许多资料,环氧树脂也买了,但是当时不知道怎么买玻璃纤维?#36857;?#19968;直没动手做过玻璃钢,比较悬。固化剂那个浓烈的氨气味,不是一般?#22235;?#25215;受的,不可能在宿舍做了,比?#19979;?#28902;。但如果能用玻璃钢做,效果当然是最好的,我继续纠结ing。
另外,碳纤维不用考虑,完全不用考虑,我考虑不起,不解释。(好吧,刚刚我淘宝了一下,看来碳纤维也不是什么难事,有碳纤维布卖,如果做法跟玻璃刚差不多的话,?#22270;?#21333;了。看?#27425;?#30340;思想一?#24065;?#26469;被碳纤维这个词吓得不轻。但是价格还是稍微悲剧,是玻璃纤维布的15倍)
好吧,再更新一下,刚刚又淘宝一下,发现有成品的玻璃钢板卖,价格还行 1mm厚的,50x50cm 20元。材料决定用玻璃钢了。
我查了很多资料,在动力选择上,最?#31449;?#23450;用两个KV980 A2212的电机,配上1047的正、反螺旋桨(这些数字代表啥自己百度一下,我要是全部解释完,我都可以出书了),左右?#22870;?#21508;一个。电子调速器,选用两个I2C总线控制的25A四轴用无感电子调速器。电池我选择 11.1V 2200mAh~4000mAh 10C以上的聚合物锂离子电池。旋翼伺服舵机使用两个扭力1KG/cm以上的50Hz PWM信号控制的金属齿轮舵机(刚刚看到这几年数字舵机已经?#21344;?#20102;,但是我查不到数字舵机的通信协议,如果普通PWM舵机速度跟不上,也许会自己做舵机的驱动板,改装普通舵机,用自己协议,I2C总线控制)。
好吧,刚刚又查了很多资料,稍微有点失望了,数字舵机看来也不是那么数字的,只?#21069;?#26222;通模拟舵机的50Hz PWM 信号速度加快了而已,250Hz以上。不管了,至少不用?#28079;?#20040;多心思再去研究一个新的协议了。但是如果速度精度跟不上,不排除自己改装成I2C总线控制的舵机的可能。
根据电机的测试(希望这个数据是真实的),这个动力系统悬停效?#39318;?#39640;的输出为两个电机各输出 480g 的推力(此时输入功率为54瓦,力效率为8.77g/W),两个电机加起来一共960g推力。整机质量最好能在1000g以下。悬停时间(2200mAh的电?#20800;?#21487;?#28304;?#21040;12分?#21360;?br /> ?#33268;?#35745;算一下:
电机+电调+桨 = 80x2=160g
电?#20800;?200mAh)= 190g
伺服舵机 = 17x2 = 34g
机体结构(玻璃钢)= 250g
AFS主控电路 = 100g
连接线 = 50g
总计784g
这个估算~嘻嘻,很乐观嘛…
这套动力系统满功率300w时推力可以有1600g以上。看来有得玩了…希望不是我少算了什么~哈哈,要不然就?#30475;?#20102;,推重比达到2以上,可以挂上跟自己本身一样重的挂载(外挂800g以上的负载)。不过此时,只有 4分钟的悬停时间,少得可怜。
哈哈,以上纯属无聊了YY…能不能做好姿态检测还是个未知数,我的能力就那么一点点。
好久不说话了,今天废话多了点
2011/3/5距离上次更新已经差不多一个月过去了。现在是开学的第二周的周末。说一下,我第一周主要还是买东西,买了很多电子元件,还买了一个最便?#35828;?#28938;台(60多RMB吧,发顺丰发了30RMB..其他快递就不敢用了)
其实,当我发现,我想要什么,?#31373;?#30005;子元件里就有什么的时候,也就不在乎300RMB买来一堆零零散散的垃圾样的东西了~
我想,今天可以发布这篇文章了,虽然都还只是在硬件上?#36127;感?#29255;,软件上写写串口驱动,但是我想,这个星期我学到的已经很多很多了,绕了不少弯路,有必要记录一下。当然,并不是说这个项目到此为止,更新会持续下去。
首先说说,这是我接触的新的单片机。我现在大一下学期,接触过的单片机只有STC 的1T系列的。说是接触,也只是接触一下而已,没用它做过什么像样的东西。大?#25442;?#27809;开单片机课,估计要学也是学最标准的8051、8052而?#36873;?#34429;然没“接触”过,我想应该差不多吧。这回是C8051F410 这片是我在新华龙的C8051F选型表上经过很多对比选出来的。
LQPF 32的封装
50MIPS的速度
5V的IO口
200kbps N通道 12Bit的AD   
各种串行接口都挺全的(UART I2C SPI)
很合适我的项目。
要说这是51单片机,我就郁闷了,根本不止51那么简单,说完全兼容标准51是不对的,至少兼容没有STC做得那么好。还有一些很不可思议的地方,?#28909;?#40664;认开启看门狗!我在这里郁闷了2天的时间,才?#39029;?#21407;因。当然,他这么做是 有?#35272;?#30340;,我?#25442;?#29992;罢了
另一个问题是,焊接的单片机,芯片的时候,坚决不要用普通的非恒温的电烙铁了,我为此?#31995;?#20102;一片C8051F410 14RMB就这么飞走了,还有我两个小时的青春…
不知道为什么,芯片在下载程序的时候只要接上外部晶振,就会出错。根本识别不了单片机,这点我也郁闷了4天,直到我的焊台到了,用飞线焊好第二片单片机的时候,没来得及焊上外部晶振,才偶然间连上下载器了。
外部晶振是11.0596MHz的,打算做标准UART波特率发生器。现在的结论是不需要了,内部晶振的精度勾了 0.15%的波特率误差,传送少量字节的时候完全?#25442;?#20986;错(我现在一次传送6个字节 (5位数字ASCII+1?#25442;?#34892;))。
再说说软件,软件也有一些奇奇?#27490;?#30340;东西,?#28909;?#24320;了UART0中断后,TIMER2的中断就?#31995;?#20102;。我了个嚓!
现在已经写了300多行,实现了?#20302;持?#26399;计时,9通道AD转换,UART0发送16位的变量,16位变量转ASCII码…
好像现在能做的也只有这些了。
另外,大赞一个,C8051F的Config2真是太好用了,各种初始化函数,“一键”写完,Just copy and paste.计算波特率,通信速率的,很直白明了,各个设置之间关联也很紧密,不需要考虑太多。波特率在Datasheet上有,注意一下如果用了时钟乘法器的话,乘一下就好。

一堆堆的电子元件,花了我300RMB

这个星期奋战的环?#22330;?#27604;较简陋。等到下学期我们学?#33322;?#25955;了,我们进山里的新校区后,环境会好很多。

新买的焊台,什?#30913;?#23376;不记得了,挺便宜的。60多RMB ,来源淘宝
这好像是那?#25351;?#39057;的电烙铁,通电10秒钟就可以焊接了,电源在柜子里,桌面上实在是没位置了。

这?#38382;?#38388;,我一共飞了2片,可见我的焊工有多么烂,每只管脚我都测试过没短路短路后我才敢上电的。飞一片要1个多小时,我了个嚓!

左边的是UART2USB,右边的是433的UART?#22797;?#27169;块。(这东西是高一的时候买的圆梦小车上的,那车在我手里从未自?#21495;?#36807;,焊H桥出了问题。我就是在这里接触STC的单片机的,是我第一次认识单片机)。

这东西320RMB 不多说…没能力焊接只好添钱,卖家说他自己焊坏了很多个了,这价格是加上焊坏的一起的。
三轴加速度计 ADXL335
三轴陀螺仪   LPR530 + LY530
成本最多120RMB

XP虚拟机上的结果,很不错~

现在的成果,为了今后焊接更简单,我昨天花了1个小时用NOKIA n81的烂屏幕DIY了一个USB?#25300;?#24433;灯?#34180;?br /> 具体看FL project 006 usb light

补光效果相当好的。昨天晚上的照片
(照片丢失)
今天早上的照片
(照片丢失)
我很满意~除了多占用了一个USB口。接下来?#34892;?#24773;的时候再改装吧~酷酷的补光灯
今天就先到这里吧~
下一步就是提取传感器信息,然后开始写姿态代码了,给自己加油~哈~
2011/3/7这?#25945;?#20027;要是软件上面做,尝试了一下编写上位机,Labview卡在下不到VISA上,(刚刚才下载到,还没安装)试了一下VC编串口的上位机,用的是C语言,但是还是有很多看不懂的。大葱说VC6要在XP的虚拟机上开,有点纠结。VC还是很有难度的(当然对于我这种懒人来说)。按着ourdev上的《从零开始学VC系列?#22363;?一.信息显示实验》,做了一个串口接收程序,但还是不太明白,代码都是别人写的,自己看得也不太懂。
还在纠结VC还是Labview的选择。
至少还不?#20445;?#20063;许不急吧。
现在分析数据可以用串口助手接收数据,然后matlab和Excel做表似乎?#24049;芊奖恪?#23601;先不纠结上位机用什么编了。
程序已经写了500多行,最大的进步就?#21069;?#20018;口收发和ADC转换做成了中断的方式,这样就可以留更多的时间放在姿态算法的计算上了。
串口中断收发程序是在网上找的,修改了很多,精简了一点,缓冲换成32字节(兼容以后无线数传,每帧字节也是32个)就放到我的代码里,代替了原来的串口收发函数,用起来很好~只是要做成指针的?#38382;劍?#25351;向一个数组,还要知道长度,在中断里循环发送。不是很直观,但也很好理解。
于是我也模仿这?#22336;?#24335;,在GetSensorData()函数里,只写了一个语句,ADC0BUSY = 0;用来调用ADC的interrupt函数。中断函数第一次只选择一个通道,然后开始转换。第二次就设置下一次的通道,把上一次转换的值付给所需的变量。一共转换9次,调用interrupt 10次。
期间调试了很多,还遇到输出都是00000的情况,原因是在一个八位变量里左移了8位(相当于乘以256)。后面换成这样的语句后就解决了
1
2
AccAdX = ADC0H;
AccAdX = (AccAdX<<8) + ADCHL;



要注意的是,上面的小括号一定要加,不?#25442;?0000.巨囧。
这样以来,UART0 和 ADC 都换成中断的?#38382;?#20102;,这就留给姿态算法更多的时间了,至少这500多行里只有一个 while(TF2H != 1){;}  用来判断是不是达到?#20302;持?#26399;定时4MS了。没有把时间浪费在不该浪费的地方,我很欣慰。
昨天做好UART 中?#24076;?#20170;天做好ADC 中断。绕了很多弯子,不过总算现在都工作得很正常了~很HAPPY

自己写的(其实是抄的)代码,用我的单片机发送的AD转换结果,好像很正常.也许吧..呵呵。至少收到数据了。有点点曙光~
总结到这吧~
希望姿态算法能写得很顺利~
2011/3/26额…很久又没更新了,怎么说,不是我懒(其实也懒),是?#34892;?#38382;题实在太纠结了。直接说正题好了。
尝试写了一些姿态算法,写出来,思想并不难,但是必须先做好底层的东西,?#28909;?#36890;信。于是姿态算法就先不做了。
最近一直都在忙一个东西,一个小小的外设,可能在晶圆上面它占用的面积也就跟一粒?#39029;?#24046;不多,但是实在是让我觉得纠结。不过到今天总算差不多弄清楚了。这个东西就是 C8051F410 的硬件SMBus总线。
这个SMBus不是真正的SMBus,我觉得叫做加强版I2C比较合?#30465;?#31532;一是没有速度的限制,速度可?#28304;?#21040;系统时钟的1/10,如果是100MIPS的C8051F,就是10MHz了很夸张的…他有I2C没有的功能,低电平超时检测等?#21462;?#21151;能多了,带来的问题就是配置麻烦。
我是第一次接触这类串行总线,着实让我郁闷了好久(一个星期)。一开始我去看I2C的总线规范,并不是很难,用到的就只是最简单的几种时序。模式很简单,就是4种(主机发?#20572;?#20027;机接收,从机发?#20572;?#20174;机接收),思路很清晰。英文文档里,主机叫 Master,从机叫Slave…字面上解释,比中文的主、从要深刻得多,主人和奴隶…
要做这个,我第一?#20174;?#26159;上网找现成的程序,边看边改。很快我找到了一个,在一个网易空间里的(做技术的用网易空间的人好多哦)。马上复制?#31243;?#32534;译了一下,发现不行,有一个寄存器中的值名字叫 “AA” 我找了C8051F410.H ,根本没有这个值,我开始觉得?#34892;?#19981;对经了,然后我又找了其他的地方,发现配置寄存器410中是SMB0CN,而程序里是SMB0STA…越来越蹊跷了,后来看了看文章发表的时间,我才?#20174;?#36807;来,原?#27425;?#33853;后了。文章是09年写的,好像是针对 C8051F9XX 写的,因为9xx 的 datasheet 里才有那个寄存器,我在书里看见过。而 9xx 的 SMBus 跟 410 的不同,9xx 的是简化过的,而且又增加了一些功能,?#28909;?#22320;址自动检测?#21462;?br /> 于是,我只能自己看文档自己写程序了,看了很久,但是不懂,又是后来,才?#20174;?#36807;来,去找 C8051F 的example 程序,在里面找到了 SMBus,纯英文的注释,不过好过没有…注释写得很简单很清楚很明了…于是连我这?#38047;?#25991;垃圾都能看的懂。花了好几天的时间去研究他的例程,得到的结论依旧悲剧。SMBus 文件夹中一共有6个文件…
翻译过来分别是:
单主机,单字节传送
单主机,多字节传送
多主机,单字节传送
多主机,多字节传送
从机,单字节传送
从机,多字节传送
我不明白的是,为什么偏偏。。偏偏要把功能都分开呢!
我要的是一个能传送多个字节,又做主机,又能做从机的程序…
最后我选择在多主机单字节上面改。
于是?#21482;?#20102;好几天,到现在的样子。(省略过程几万字的感慨)
结构已经基本明了,函数写完了,编译出来没有错误,只差上机实验了。今晚有点累了,明天是周末,明天再弄吧。
其次。。我找到了合适的机架~?#25954;?#32822;
机架一直是我一个比较郁闷的问题。怎么?#30340;兀?#22312;我自己做的话,不是不可能,我有这个能力,之前的打算就是买玻璃纤维板,然后锯成条,再用环氧树脂胶把条?#31243;?#25104;立体结构的机架,原理可行,有点麻?#24120;?#25105;不是很愿意做。
今天上英语课的时候,我突然想到,?#28909;?#25105;做的也挺想直升机的,为什么不能直接利用直升机的机架?改一下就可以啦,电池位置?#37096;?#20197;很?#22870;?#22320;调整,重量?#37096;?#20197;得到控制,最主要的还是,我不用动太多手~
于是上网查了一下,这个才148元,还是碳纤维的,决定要这个了。(还挺帅哈~)

其次,上位机的问题继续纠结住。
又经不住拉框框的诱惑,打算去买本VB的旧书学习学习。
今天就到这里吧,好累。
2011/3/27知难而退的好孩子~VC6我搞不定,换个最简单的 Basic 语言弄弄。反正“黑猫白猫,能抓到老鼠就是好猫”搞定一件事,用最简单的方法不更好么?
花了?#25945;?#30340;时间,把 Visual basic 学了个大概,去旧书店买了一本书(好像昨天是什么地球日来着,提倡7点半开始逛灯一个小时?很?#38382;劍?#21040;处发传单。我觉得,提倡买旧书更能保护环?#22330;?#20070;是基于,VB6.0 的,这里我纠结了很久。之前我用 VC6,在 64 位 WIN7 里面编译不了,只能开虚拟机弄。现在心想着,也许用 BASIC 语言,就可以用 VS 2008 了,那就意味着更智能的编译环?#24120;?#21644;更加?#22870;?#30340;编译条件…
但是一切都想得太完美了,导致我又绕弯弯了,关键就在于书是 VB6 的,我的是 VS2008,这里面的 Basic 语法有一点区别的。具体有多少区别我不懂,我才接触BASIC ?#25945;?#32780;?#36873;?#20294;是至少我用“组合框”的时候,根本赋值不了。有必要的话,我再去买一本 VS2008 或者VS2010 的书吧~
后?#27425;一?#26159;?#27809;?#21040; XP 虚拟机里面…还好我寒假果?#32454;?#30005;脑换了 7200 转的硬盘和 4G 的内存,不然估?#39057;?#21345;德悲剧。
Basic 跟 C 其实差不多…但是也差很多。其实在我眼里,他们的区别感觉就是,C 更底层,Basic 更应用,C 区分大小写,要注意内存,Basic 不区分大小写,内存可以不管。我对 basic 还不了解…别拍我..
Basic 里弄串口还是很简单的,MScomm 控件就可以,挺?#22870;?#30340;。今天的成果,已经可以实现接收串口数据了,接收到的是加速度传感器的值,已经在单片机内转成 ASCII 了。发送没测试,应该不成问题。
下面那一大块空?#36164;?#30041;作曲线绘制的时候用的,不知道有什么好的图形控件,实时观察传感器和?#38382;?#30340;曲线。

比起前?#38382;?#38388;用VC来说,VB感觉起来是自己写的,上次的VC更像是抄的…也许以后都用VB开发上位机了,功能够就行,?#22870;?#26356;好…
VB很?#22870;?#21834;
2011/3/31待会就是愚人节了
AFN上位机第一版终于做出来了,现在实现的功能是实?#27605;?#31034;6轴姿态传感器的数据,并画成实时曲线图。
看图吧,累死了。从五天前,从刚刚接触 VB6和Basic 语言,到现在做出第一版简单的数据分析,绕了好大的弯弯,不过到现在总是是有了点点希望。宿舍快断网了...先传照片吧。

2011/4/1愚人节~
今天是母校南宁二中的校庆。。
听到何伟萍校长病逝的消息..心情有点?#26519;亍?#25105;?#36816;?#30340;了解不多,她是我们高三的时候才上任的。百度一下,才知道她生前的获的很多荣誉,是个值得敬佩的人..
昨天写上位机写得太匆忙,现在做一下补充说明
整个上位机是基于VB6写出来的,Basic 语言入门真的很快很好很简单。也许对于我这?#38047;?#25042;又没人教又不努力的人来说,是最好的选择了。
之前尝试过了LabView,VC6。labview 是我在 ourdev 上的上位机板块找到的,然后百度一下,做工控软件似乎很是简单。用的是G语言,图形化的语言,怎么说,我?#30475;?#30475;到都会小小地纠结一下。不习惯,看不懂,然后去尝试看labview?#22363;?#35270;频。越看越反?#26657;?#35273;得框框还不如代码清晰(这个仅是个人意见...别敲我,特别是我这种?#20498;希?#19981;值得你敲~)。labview 之后,大葱推荐我去看 ourdev上的一个帖子,讲的是VC上位机编程的(上文提过),我按照帖子做,是做出了一点成果,不过当时我不是很有耐心去看,也不知道是怎么办到的。其次我不?#19981;禫C6的代码编辑界面,至少得多点“色?#30465;?#21543;?(单片机里我一直用 keil4 自己分配关键字的颜色,代码会清楚很多)。还有就是,VC 生成的是 C++ 语言的.....
图表控件是 teechart 4 pro 破解版的....
Text框显示的是接收到的传感器的值,空格做分隔符。
下面的浅蓝色条条是实时的三轴加速度(Acc),三轴陀螺仪(Gyro)的实?#27605;?#31034;,用进度条来作指示,值得?#27573;?#26159;4095~0,加速度计输出电压是0~3.3V,我的AD是0~2.5V,所以整体高了一点。图表是自动往?#31227;?#31227;的,网上找不到方法,只好自己摸索。方法是这样,把横轴的最大值设置为自动,然后把 最大?#23548;?#21435;一个定值,赋值给最小值 就可以了。触发用的?#23884;?#26102;器,触发间隔是20ms 刷新率50HZ,我在虚拟机里开,CPU占用有点高了,达到35%这样...
有了图表观察起来就?#22870;?#22810;了,自动更新数据,用起来很不错~~
软件还有点问题,右边的图例错了,应该是
AccX 红
AccY 绿
AccZ 蓝

这是一个问题,Gyro的三条线从刚上电开始,是一?#27605;?#38477;,大概持续10秒后才能稳定在2048左右,很蹊跷。

从这里可以看到很清楚的 陀螺仪?#22270;?#36895;度计之间存在联动,有了这点设计上就会很?#22870;?#20102;。

2011/4/22好久好久没更新?#22235;?..
因为最近走了很多很多路,换句话说是很多很多弯路
姿态积分已经开始写了,飞机硬件已经开始做了
反复看了 ourdev 和 5imx 上面的帖子,我忽然意识到一个问题:他?#23884;?#26159;老手,他?#23884;?#26159;高手,步骤一般都是先做好硬件,然后画好电路板,然后送去打样,然后,然后的然后!才开始写程序,写代码。
只有我这?#22235;?#21457;癫发癫的先写软件,写得差不多了,不管怎样陀螺仪就是有点点漂移,加速度怎么样都是那么?#36857;?#23039;态积分怎么调都不能再 0 附近...
看了多少姿态算法,看了多少帖子,试了多少自己的方法。才意识到原来是没有硬件调试,调试个P啊...你把一块电路板传感器放那,他能按你的程序作出?#20174;?#21673;?我发现我就是傻X。
在 C8051F410 的 SMBus 上,徘徊了6天,最终发现是飞线有管脚虚焊,这坚定了我下一步一定要学protel 画板去打样的信念。(省略1000?#25351;?#35328;)
今天早上上完课后,就回到宿舍开始锯玻璃钢。我有3种厚度的玻璃钢,2mm 1mm 0.5mm
2mm太厚,1mm太薄...唉!
我放弃了电磨的方式,电磨太重口味,弄得宿舍一?#19978;?#27602;水的味道,试过在水里切割玻璃钢,但?#20174;?#22810;了四溅的水
于是手工+锉刀,慢慢磨,慢慢磨....于是成这样了。。。

锯子

单条的重量,一共需要4条,作用以后解释
(皂片丢失了。。)
机架的重量,最终应该在200上下
这重量相当于除了电池外的所有东西了...很乐观

当然上位机也改了,传输改成变量直接传,加了加法效验,不需要转换成ASCII了
加了CPU 占用率,实现的方法就是在等待定时器达到?#20302;持?#26399;之前,累加 SystemIdle 这个32位无符号变量的值。最大值是不通信,不做运算的时候记录下来的,然后用又计算又通信的值除以他,得到一个相对的空闲量,再变换一下就成了占用率了。虽然是相对的,但也很够用很直观了
看?#27425;业?#20272;了这颗 C8051F410 了, 现在计算的东西已经有最终的大约 1/2 了,然而才占用了8%。49Mhz 50MIPS,真的不是盖的。
以后可?#22253;?#31995;统时钟提高到500HZ哈哈

2011/4/24今天把机架装起来了,用的是504胶水,看上去很不错哦,挺坚固的,等明天完全凝固了,就开始钻电机空了,之后就可以上电机啦~~
全部是手工做的,用锉刀等工具,扩孔,从2mm大的空扩到13mm,锉刀一点一点锉出来的。弄得我手上面都是伤。以后打算用protel画PCB然后送去加工好了,像他们做四轴一样,多?#22870;?#21834;。300块我都愿意了…自己磨太?#32431;?#20102;。
今天主要放图片哈~
正在?#22266;?#38451;…等胶水干的日子,也有点点无?#27169;?#19979;面那两个支架,上面还用纤维胶带绑着…定?#20572;?#19981;然就?#36861;?#20102;
(皂片迷失了。。)
机架部分特写..

轴承直接用钳子?#38468;?#21435;,然后串上铝棒,定好位,马上上?#28023;?#22823;概2个小时后就固定好了

支架的重量,有点重了…如果能用PCB做好,就好了,可以在上面打洞,而且也不需要那么厚的。这个2mm有点夸张了(因此我的手…),其实1.6mm这样应该刚好合适了。
(照片丢了。。)
加上6mm * 250mm的铝棒后的质量

组装上去啦,好帅呀~哈哈 208g 是已经加了两个舵机在上面的重量了,还是很令人满意的~

转轴特写~很流畅,每一边2个大轴?#26657;?#27809;?#34892;?#20301;,胶水很给力,缺点是比较重,玻璃钢难加工!





与飞控无关 - 记刚开始弄飞控那会儿(下)
记录的是我的飞行器学习的黑历史,主角是一台类似 阿凡达里面的双桨 VTOL (Vertical Take-Off and Landing)飞行器的详细制作过程。错?#33267;?#31687;,虽然烂尾,没有但是..
版权所有,转载请看

如果没看过上半部: 与飞控无关 - 记刚开始弄飞控那会儿(上)
2011/5/8又是很久很久没更新了,觉得有点对比起谁…最近做的事不算多,调好了单片机之间的 SMBus 通信,又做好了硬件的控制系统。
照片没拍什么,所以今天更新就只是文字的啦~尽管看我废话在这里。
SMBus 的调试花了很长时间。我本来打算每一帧发送32字节的数据,后来发现不是很够,虽然有很多数据是不必须发送的,但是如果不发的话,就利于调试。我主要是通过串口发回的数据进行调试的,这样就纠结了。如果只发送必须的数据,32字节除去帧头2字节,效验2字节,还有28字节可用,压缩一下,完全够了。
后来为了?#22870;?#35843;试,还是决定在原来的基础上多发一帧的数据,于是每个周期50Hz?#25442;?#30340;?#34892;?#25968;据就有56字节,够了…可?#22253;?#23436;整的传感器,CPU占用等数据完全传输回去了。可以做到实时不丢帧。
但是,就在这里出了问题,我查了很久,后面才查出来,原来是上一个数据还没发送完,缓冲区(32字节)不够大,后来解决了,等发送完了再存进缓冲区就好了。
硬件上不知道怎么固定舵机…继续纠结,没有螺丝钉。谁告诉我最近哪里?#34892;?#26379;友玩的四驱车专卖店…
暂时用回形针的固定了一下…不是很好捏
刚刚写了PPM信号的解码函数,用定时器3来测时间,直接读取定时器的寄存器,这样做行不行,我是一点都不懂,哎哎。先设置成高电平触发,PPM信号直接接到外部中断1,在中断里取定时器3的值。然后切换到低电平触发。如此反复,就可以实?#25351;?#20302;电平都产生中?#24076;?#36890;过判断时间的长短,还可以分辨出引导段。通过测量不同的高电平宽度,就可以计算出每一个通道的PPM值。
接下来还要写 50HZ 的 PWM 信号,用来驱动舵机的,应该可以驱动6个通道的舵机,我先做4个通道的 PWM 吧,其实AFN模块还有蛮多的管教可以用的。
PWM 还需要一个定时器…现在似乎不够用了,还有一个超声波测距模块需要定时器。
AFN:
Timer0 空闲
Timer1 UART波特率
Timer2 SMBus波特率
Timer3 PPM解码
ABM:
Timer0 提供整个系统的时钟,ABM 250Hz AFN 50Hz
Timer1 UART 波特率
Timer2 SMBus 波特率
Timer3 空闲
现在整个?#20302;常?#36824;有2个空闲的定时器,还有超声波和PWM需要定时器,这样的?#26696;?#22909;够用…如果UART和SMBus用同一个定时器的话,整个系统还可以多出2个定时器。不过这样SMBus速度就太慢了,只有76k,好像也还好…实在不行的时候还可以这样做。
Timer3实在不是那么好用,因为不能位寻址,有点郁闷。
2011/5/14今天是周六,最忙的一周终于过去了。上一周,我们一共只有3节大课不用上…累死了。周四晚上进?#33050;?#33310;?#20184;硬?#25490;,周五晚上进山去看舞?#20184;?#34920;演…不过还好~女孩?#29992;?#24456;给力,得了个二等奖!
周四下午我的“新的”二手?#20302;分?#20110;到了,?#20302;?#26159;DT16-105。好难找啊…卖家恋恋不舍地帮我包好,寄过来…?#21069;?#35013;实在是..一句话:从3楼砸下去里面的鸡蛋都?#25442;?#30772;…拿到?#20302;分?#25509;得跟舞?#20184;?#36827;山彩排了,第一次拍舞台,感觉好爽~新的?#20302;?#23481;易引人注目,总会有人问我价格,当然,不同的人我只能说不同的价格,大概几百块到二手价,我都说了。
话题岔开太多了…?#39304;?br /> 回归正题,要说什么呢,虽然课余时间少得很,但是这一周还是做了很多东西。八路舵机驱动器,一次做成功,完美不抖舵,八位分辨率。PPM 信号解析还没搭硬件,苦于没有示波器,还有就是发射机的八颗电池我实在懒得去买。但是这个周末肯定要搞定 PPM 信号。还有就?#21069;?#30005;调焊好了,但是还没敢接上电。焊接功率器件真是费焊锡,还好我5节回家又掰了一大卷过来…并且,找到充电器用的12V电源了,电源来自我高二在“恩山论坛”买的一个路由器(刷了WRT-DD?#20302;常?br /> 有一个比较无语的地方是,如果要 UART 和 SMBus 公用定时器,SMBus 就会慢得出奇。UART 要工作在 9600或者 38400 下的,因为 LEA-5Q 这个 GPS 模块只支持这两个波特率。GPS 有 SPI 接口,只是因为相位这种我根本就很反感的东西,所以不打算用 SPI 接口。即使是 38400bps,算下来 SMBus 的波特率才2 5600bps,传完 64Byte 的数据需要 20ms,我 AFN 的工作周期都有20ms 了。9600bps 更不用考虑了。所以?#19968;?#26159;打算让 UART 和 SMBus 分开各自用一个定时器产生波特率。
如果把无线通信放在ABM里,无线模块如果能做到11520bps,SMBus 的 ABM->AFN 方向传输速度也有差不多 70kbps,这样的速度还是可以接受的。
这样一来,如果把舵机驱动放在ABM上面就会好一些,因为还有一个超声波测距,而定时器里面唯一能48分频的定时器是Timer0。
现在定时器资源利用改成如下:
AFN:
Timer0 :
Timer1 :UART波特率
Timer2 :SMBus波特率
Timer3 :PPM解码
ABM:
Timer0 :八路50HZ PWM信号输出
Timer1 :UART波特率
Timer2 :SMBus波特率
Timer3 :提供整个系统的时钟,ABM 250Hz AFN 50Hz
以后需要改的时候再改。
我觉得无线通信如果能放在AFN会更好,只是现在还找不到更好的解决方法,不行的话就只能放在ABM了。这样一来,模块之间的分工好像就?#34892;?#19981;符合原先的意愿了。
有一个小问题,就是ABM的引脚似乎不是很够用了,如果放八路舵机控制器,管脚就全圆满了,AFN还剩一?#36873;?#29616;在刚好够用,就这样了。先做6路舵机控制器,剩余两个,一个做工作指示,另一个留来增强ABM/AFN之间的SMBus通信可靠性,主要是怕总线死机,而且现在应用层的通信,虽然有做效验,但是没做效验不通后的回复,相当于UART的单向传输而已,没有应答标志的。不过即使这样,还经常能把我的虚拟机刷数据刷到死机的,很长时间的通信,甚至一个位都没错。赞~
另外,焊接好后我就称量了一下,所有的重量,到现在为止,工作大概已经完成了50%了吧,离飞起来的日子不远了。
看图:

重量,678g,主控电路单独称就有100多g了,如果画板打样回来的话,重量还会少几十克。电池也放上去了,还有脚架什么的也放上去了。我能想到的东西都放上去了。
如果能如此下去,总重量在700g之内是可?#22253;?#21040;的,就算加了螺旋桨保护圈,也?#25442;?#36229;过750g;再加上尾杆和尾翼,还有控制舵机的话,?#37096;?#20197;控制在800g之内。.
这个如果能做到800g以下的重量,就可以很轻松地在上面加上云台,放上摄像机进行航拍。
无线摄像机(用来做第一人称操控) 50g以下,3轴或2轴云台,50g以下,摄像机100多g(用来航拍录像或拍照)。
总重在1100g这样,一块电池飞行时间我估计可以到8~10分?#21360;?br /> 或者在上面挂载一些几百克的“西红柿炸弹”之类的东西~用一个舵机就可以控制两个投弹~多好玩~哈哈
今天YY就到这里~哈~
2011/5/15昨天刚刚更新…?#27425;?#36825;懒人的习惯,起码要几个星期后才会更新的…但是,今天真的有必要记录一下!
其实也不是什么大事…也就是,成功地直接从接收机里直接提取PPM信号了,然后又直接从ABM模块输出6路PWM信号驱动舵机了,还有一点点小小的有周期性的抖舵,大概周期有3秒这样,不知道怎么解决,或者是设备的问题?
?#19968;?#20102; 50RMB 买的 PWM转PPM 板(高手做的,点击可以看他的帖子)没用了,直接接接收机效果更好一些,经过那块板之后反倒没那么好。
现在还要解决的问题一个?#23884;?#26426;行程问题,这个在AFN里再写几十行代码就行了。另一个问题是如果只接上接收机,没打开遥控器之前PPM信号会全乱套,然后舵机乱跳,现在的解决方法只能在打开ABM电源之前先打开遥控器,这样舵机就?#25442;?#20081;串了。
比?#32454;?#24936;的是这次做PPM解码没用多少调试时间,虽然第一次上电必出问题,是程序员最熟悉最习惯的方式…
我的PPM信号提取…本来先做一个简易的,低频率的,玩具级别的逻辑分析仪&示波器。后来一直没?#31449;?#25302;到现在了。是我一直没发表的 FL project 010,以后有时间做出来再发表吧~现在的情况是没有示波器。还好我想到,我的万用表是有测频率的功能(高一的时候花了200多RMB买的一个钳形表,能测400A的“直流电”的)。于是我上网又看了一遍PPM信号的图。我的接收机是6通道的,然后分析PPM信号,信号如图(这个图是别人的经过整形的图,大概可以表达意思,借用一下)。万用表,就是我唯一的工具,我来讲一下,我是如何用万用表找到PPM信号并分析的。

我仔细分析过上面的那个图,PPM信号是通过高电平的宽度来表示各个通道的值的。于是我就可以通过测量高电平的宽?#28909;?#21462;值。我又注意到,6个通道,每一帧数据,一?#19981;?#26377;7次电平的涨落,我大概计算了一下,50HZ的PPM信号周期,每个周期有7个涨幅,所以万用表测出来的频?#35270;?#35813;在 50 x 7 = 350HZ 这样。然后我就找到了接收机里离PWM输出最靠近的那个芯片,上网百度一下,找到芯片的资料,希望直接找到芯片的输入脚。百度之后发现那是一片单片机…囧。然后我就给接收机上电,打开遥控器,把万用表调整到频率档,一个一个管脚地去测,发现有一个管脚 349.XHZ 的频率!乐死我了!终于给我找到了..因为有的PPM信号在输入其他芯片的时候,可能是反相的,于是我又打到电压档,去测那个引脚。结果为1.几V的电压,结合上面的图,说明这个“西安孵化6通道接收机” PPM 信号在经过最后的单片机之前是反相的。OK,马上修改AFN的程序。
关于外部中?#24076;?#22909;像只有固定的高电平,低电?#25509;行А?#25105;之前在这卡了一下,还打算把外部中断0和外部中断1连接在一起,一个设置高电?#25509;行В?#19968;个设置低电?#25509;行В?#36825;样设置来解决问题。后来发?#25351;?#26412;不用,只需要在电?#25509;行?#30340;时候,设置另一个电?#25509;行В?#36825;样就可以在每个电?#22870;?#21270;的时候(不管是高->?#20572;?#36824;是低->高)都产生中断了,只需要在中断里再判断一下管脚是高电平还是低电平就可以了。
PPM解码用的是AFN模块C8051F410的外部中断1,说实话,这是我第一次用“外部中断?#20445;?#20197;前从未用过这个…不过还好啦,编程很顺利,今天直接接上AFN,改了一下相位,就OK了。现在PPM解码有一百多行C代码,功能也算完善了,接收机可以热插拔,?#25442;?#24433;响系统。如果要加功能的话,也就?#21069;?#19978;面的问题2解决了,在遥控器打开之前,让接收机不乱跳。解决这个问题在以后是必要的,要实现自主航线,可能会超过PPM信号的距离,到时候得由AFN模块接手了。所以我打算有关于PPM的各个通道解码,行程,微调全部放在AFN里,而ABM则负责利用AFN传来的PPM信号,结?#29486;?#36523;计算出来的飞行器姿态进行混空,然后直接进行输出。
今天确实是个里程碑,实现了遥控->飞控的能力,虽然只是一小步,但是标志着飞控有了硬件的调?#38405;?#21147;。
准备就能听到螺旋桨切空气的声音了~~
接下来看图说话:

上位机也新改写过了,加了PPM信号的显示,但是不知道为什么第六通道就是显示不出来,而ABM上面第六通道我一直用来当供电用,所以也没测试到。应该是单片机上的问题,以后找到原因再解决好了。

左边第一块板..供电模块,可以接5~18V的电源,用了两块L7805CV,有3A的供电能力,在电源是锂电池的时候,提供舵机和其他5V器件供电用。调试的时候直接接miniUSB口。
左边第二块板..AFN模块
右边第一块板..ABM模块
AFN和ABM上面的两个黑色的,分别是接收机和舵机。
各?#33268;以?#31967;线…

天地飞FT06C,功能偏向CCPM直升机的控,对于固定翼只提供简单的模式。我用的是固定翼模式,够用了。

各?#33268;搖?#39134;机装上螺旋桨的样子,酷哦~正在调试飞机上的舵机。飞机上的两个舵机是数字舵机,PWM 频率可以超过 250HZ。不过我为了兼容性,还?#21069;?PWM 频率锁定在 50HZ,桌面上还放着两个非数字舵机,50HZ 下?#37096;?#20197;完美驱动。这四个舵机都是金属齿轮的,不怕摔了~

主角..西安孵化的接收机。找到PPM信号之后,就在里面引出了线,懒得钻孔,就直接在这里引出来了,效果还不错。没浪费我太多时间去调试。
今天就到这里吧~ 还有三个星期就高考了,想起去年我高考的时候,和同学们一起奋斗,那感觉真好…
2011/5/17好吧…这几天真是起劲了,连续更新~
昨天弄 IIC 电调,电调是 MK 四轴的,我用来驱动?#35270;?#30340;无刷电机。一直没成功,时转时不转的,断断续续。好像通信并不成功,地址什么的都正确,却只有在上电的瞬间电机会启动。我?#21069;?#22320;址+八位变量输出的,就是不正确,看了 MK 的源码电机驱动部分,也是这样驱动的。有?#22797;蜶P转了起来,但是也不顺畅,这个电调和?#35270;?#30340;无刷有兼容性问题?我不想再折腾了,马上决定换掉这两个电调。
于是马上上淘宝买了2个“好盈程序的新西达30A电调?#20445;?#20215;格 37RMB/个。怎么说,好几年前,大概初中的时候,我第一次接触无刷电调,那时候 20A 的需要 200RMB/个,?#39029;?#38065;买了一个,然后就没钱买无刷电机了。再后来就买磁钢,买废旧光驱 10RMB/个,拆光驱,用光驱电机来 DIY 功率大一点的无刷电机,线圈自己绕,磁钢摆好位置就用 502 贴好。后来还用镍氢电池和这个 DIY 的无刷电机,5030 的桨,把我自己做的飞翼飞起来了。再后来,铃铛外转子无刷电机以他的价格优势,?#21344;?#20102;。我就买了一个,但?#20999;?#37324;还是觉得那不算数,我心目中的无刷电机是内转子无刷。再后来,?#19968;?#27809;有机会拥有内转子无刷,外转子无刷就遍地都是了,好在他们外形都“专业”了好多~我心里才踏实…
?#23545;?#20102;…这个 xxd 无刷电调是 pwm 控制的,在启动的时候是有一些需要注意的地方,我之后会写好程序。下午拿到快递(顺丰飞了不到24个小时)就赶回宿舍开工了,到现在还没吃饭(现在是晚上10点)…据说这个电调可以开 250HZ 以上的 PWM 频率,控制跟舵机一样,就省的我去弄其他的协议了,由于不是用 IIC 总线的,减少了总线的大小,也避免了几乎会使整个系统完蛋的总线死机的概率。
插上标准的接收机,马上启动遥控器,哇..那声音,真是太爽了!很流畅,两个电调和电机都工作得很好。换上EPP1045 的桨,那拉力不是一般的大,飞起来是必须的!实验了几分钟,电调不热,电池常温,看来即使是夏天,也不需要什么特殊的散热措施了。
现在的动力系统配置:
电机?#35946;视?212 KV980 X2
电调:新西达 30A     X2
电?#20800;号?#23376;不记得了,11.1V 2200mAh
现在全重有750g这样,包括所有的东西了,主要是控?#39057;?#36335;2块板,电源板1块,无线模块1块…如果打样的话,应该可以减轻100g。总重650g是非常理想的!
推重比可?#28304;?#21040;3…好夸张!
下面看看今天装好的图~

我把几块板都连在一起了,这样?#22870;?#25105;收?#30333;?#38754;,体积好大啊!如果要直接放在飞机上,比较难哦…
上层是ABM模块,蓝色板是串口?#22797;?#21478;一边的绿色板是电源模块。

AFS上层板,无线?#22797;珹BM模块,电源模块

下层…孤零零的AFN模块…

在“机翼”上的两个黄色的,就是今天刚到的无刷电调,都能很好的工作~

嗯…各?#33268;以?#31967;的线,还有?#20197;?#31967;的飞行器,那块红色的是电池 11.1V 2200mAh
右边那一团…电源线啊,IIC总线啊,串口线啊,电源线啊…
桌子角落上是接收机…
今天就到这里吧~哈哈~
开始写混空功能咯~2个舵机和2个电调要混空的。
2011/5/23又是很久没更新了…
从现在开始2个星期内,我可能得停止硬件调试了,原因其一因为要考试,其二…最悲剧的是我在 XP 虚拟机里用VB6 写的上位机程序,死掉了,死得噼里啪啦的…源代码全部乱码!起因是因为一次长时间的 USB 口短路,引起电脑蓝屏,虚拟机非法关机…最终结果就是源代码变成乱码了。
代码备份是有的,?#19978;?#26368;近一?#38382;?月21日的了…通讯的协议我几乎每天都在?#27169;?#25152;以早就不是那个样子了,成?#36820;够?#22909;好的,但是也是因为改了协议,部分功能已经显示不出来了。后来打算重新写一个,只做了界面…就听到日姐姐学习C#,看了 VS2010 的界面,很美哇!受不住诱惑,就去查了其他能编上位机的语言。
期间又尝试在win7安装了USB转串口的驱动,没想到居然就安装成功了。之前为什么开虚拟机,其中一个原因就是win7装不上那个驱动。
我早就受不了 VB6 那个98年产的,到现在也没更新过的,界面很丑的编译器了…现在倒?#21442;?#20102;,驱动装上了,没得选择了,果断换掉VB。于是又开始纠结用什?#20174;?#35328;,java 和 C#?C++ 就算了,我在高中的时候已经死过一次了。学Java到时候可以编 android,可以做网站前台后台都可以,而 C# 可以也比较靠近 ASP.NET,?#37096;?#20197;做网站后台,相对于java比较简单。考虑到C#据?#24403;萰ava简单一点,我现在需要的是快速开发一个上位机代替 VB 那个烂东西,就决定学C#了…
在编第二个上位机的时候,遇到了瓶?#20445;?#20027;要是串口通信的时候有数据延迟的问题。之前的解决方法是?#30475;?#20174;缓冲区里取100字节的数据,然后从里面?#39029;?#23436;整的一帧32字节来,可以做到实?#27605;?#31034;不延迟,后果是有很多数据会?#27426;?#25481;。但是这样毕竟不好,之后的调试不允许这样了,或者说,需要做到不丢帧。延迟这个问题很严重,在VB里面有,我就怀疑是我的虚拟机速度根本不够解析每一个字节,后来换成帧数据解析,情况好了一点,但是还是有很严重的延迟。
单片机发回来的数据一次有3帧,每一帧包括帧头和效验一共32字节(两个数据帧,一个命令帧)。三帧就是96字节了。我发送的频率是AFN的?#20302;持?#26399;,50HZ,串口速度是 115200bps。这样一来,每秒钟大概传输5800Byte…这样电脑就?#21363;?#29702;不过来了..我了个纠结!即使是现在用VS2010写出来,延迟还是很严重,大概?#35813;?#38047;的延迟!用的是 serialports 类来接受,跟以前在VB里用 MSCOMM 空间接收一样的后果。
解决方法我想到了,比帧解析和字节解析处理量都小的方法,但是会丢掉最前面1~2帧的数据,应该不是很重要,大不了开机的时候多发一次第一帧。
我就把这个方法叫做:帧同步接收法
原理大概是这样:
1.一开始先设置接收一个字节就触发?#24405;?br /> 2.判断达到帧头2个字节后,设置成接收30个字节触发?#24405;?#36825;一帧?#32676;?#30053;掉吧,接收?#37096;?#20197;)
3.达到30字节后,设置接收32字节(一个帧的长度)触发?#24405;?br /> 4.?#27492;?#24207;存入3个不同的byte[30]数组(不需要同步,这里只?#20999;矗?#21478;一个地方只?#23884;粒?br /> 5.分析其中一帧的关键数据就好了(命令帧)。
然后用定时器定时更新界面的数据,更新图表就行了

第二次在虚拟机里开发的上位机,只用了?#25945;?#30340;时间,界面做好了,通信做好了,其他的还没做。没有做后台的分析和计算。

这是用C#做的上位机,左下角的命令栏是通过互相传送的命令帧进行调试的,右边的空的一大块是做3D姿态显示和?#25165;?#19968;些固定的操控?#30913;ィ?#36215;飞,回家,下一个航点…,当然?#37096;?#20197;用命令行发送命令)。?#38382;?#35774;置用的,地图是指Google Earth API, 正在学习,结合飞行器传回来的GPS数据,写好kml文件后,就可以实?#27605;?#31034;飞行器的位置了!哇哈哈!
2011/5/25刚刚看了看word的左下角 “页面 55页?#34180;?#23383;数 16,759?#34180;??#20102;?#20102;3分钟,终于得出结论,我的废话太多了…不管了,就这样费下去吧。等做完之后,?#19968;?#20877;写一篇只有20页左右的总结性的PDF,多写技术资料,多写经验,少废话!希望各?#25442;?#26377;耐心等下去…我相信我?#25442;?#35753;你等到沧海桑田的~ 哈哈~
刚刚做好了混空,电机的混空还没测试,舵机的混控已经很完美了,前后摆动的幅度一致,即使推杆拉杆达到极限后,操作方向依然有动作。这样就安全些了,还把动作的幅度降低了一些,避免扭?#20282;?#24471;太厉害导致超过舵机连杆的控制?#27573;А?#21478;外,把方向操作衰减了4倍的后才加入舵机混控,我可不想方向操作太过灵敏了。
做这些主要费时间费在调整合适的行程和衰减系数。整整调了我好长一?#38382;?#38388;,记录一下,左舵机 230 50 右舵机 255 80 。
舵机的方向和俯仰都还没有和姿态积分一起做PI运算,明天或者周末加上,其实做完这个,就可以飞了。电机的PI控制已经做好了,就等上机测试了。
另外,上位机继续完善,可以说功能越来?#35282;看?#20102;,自己都佩服死(自恋ing)。还没做上位机回传到下位机的数据,所以右边的?#38382;?#35843;整面板暂时不可用(要不是这样刚?#25214;?#19981;需要花那么多时间去调行程了),C#下操作数据和字节的转换有点麻?#24120;?#31561;有时间再做。
还有就是上位机的图表控件换成我最熟悉的 teechart 2010 推荐使用这个哦~CSDN有破解版下载。期间试过NTGraph MSChart…等?#21462;?br />
看图就好啦~ 命令栏暂时用作串口数据监控,等我做?#27809;?#20256;程序后,命令调试栏和?#38382;?#35774;置就真正有用了。
3D显示?#19968;?#27809;找到方法,NI的labview 有控件,不知道怎么提取,也许只能,用D3D了…
2011/6/16
至于上次更新是什么时候,我也懒得去看了…有一件事差不多可以确定了,首飞会在家里而不是在学校,因为还有3个星期就放假咯,现在考?#26434;?#22810;,不是很有时间做这个。
之前一直在纠结软件的问题,不管怎么说,还是作出了挺多的成果的。比?#29486;院?#30340;是我发明的那个“帧同步接收法?#20445;?#25105;打算在飞行器上面也用这个方法接收电脑或者手机传上来的数据,这个方法耗CPU实在是够少的,对系统影响小到不能再小了。还没优化过就有不错的效果,对于单片机这种速度更低的器件,帧同步接收法应该是在CPU占用和数据完整性上的最优解了。接收数据时只处理几个关键字节,然后验证,就没事了,不需要分析完每一个字节。剩下的字节等CPU空闲了或者需要使用的时候再去处理。
思路已经完整了,等有时间了就写单片机上的代码。
其实这?#38382;?#38388;也一直在做东西,我?#20498;?#25105;不想让洞洞板飞起来,于是我学了PCB做板,视?#21040;坛?#30475;了几个小时,就开始画了。遇到了很多问题,有的是通过ourdev.cn解决的,有的是自己憋?#27809;?#24971;出来的。
肚子饿死了,外卖还没来!
看看成果吧,我第一次画板。排元件排了一个下午,然后自动布线的,电源线还没改粗。只?#21069;?#20803;件摆得眼花。在5CM*5CM的电路板上塞下两片单片机,几个传感器,N片电源芯片,近十个接口,电阻电容几十个…只希望你看到图片不要吐出来。
对外接口有:
12V DC
PPM 信号输入
ABM/AFN调试接口
PWM 舵机驱动  (6通道,包括电源也做在板上了,独立2A电流的7805供电)
GPS 接口      (其实就是UART,独立3.3V AS1117供电)
气压传感器接口(5V供电,ADC转换)
超声波测距接口(5V供电,接中?#24076;?br /> I2C总线接口  (5V对外供电)
Nokia 5110 液晶屏接口
原理图就先不放出来了,因为太大了,放出来也看不清楚。

电源线还没改呢,线都是10mil宽的,改完电源线就差不多了。有一个不懂的地方,就是怎么在四个角打上螺丝钉能扭住的地方呢?郁闷。

Altium designer 6.9 大葱推荐的…
有预览功能,还是3D的,个人比较偏向蓝色或者红色的板,比较好看呐,虽然贵了50RMB…纠结!不过绿色就免了,我不想第一块板看起来就那么丑。
丝印层还要调整一下,其他的差不多了。没有大面积地线的余量,话说第一次做板就做这种那么复杂的,要是没有自动布线我不知道怎么办了…眼都花。接口太多,差不多要成筛子了…这是正面,放传感器单片机用的,背面放电源模块和电阻电容一?#36873;?br /> 2011/6/20正在打样…很无语,我最不?#19981;?#30340;就是等待…但是一般东西?#35745;?#20840;了,我又懒得动手做了。刚刚查了工程图学的成绩,还好没挂,79分,不算很高,拉学分是大三才该考虑的事…大一的我就别慌张先了。
淘宝了 L3G4200D ADXL345,还在?#39134;希?#31532;一次遇到顺丰发了三天的情况。这三个传感器我一?#19981;?#20102;138RMB,其实可以花得少一点的,只是曾经在一个卖家那里买过模拟的传感器和陀螺仪(就是上文我用的那块红色的板子)还有磁阻传感器,和卖家聊得来,也不用担心买到假货(这东西有假的不?)。
PCB已经重新修改过了,自己布线花了一个中午和一个下午的时间,第一次布线实在是比较纠结,什么都不懂,线也不听话。不过最终算是做完啦~
板子已经送到嘉立创打样了,过?#25945;?#23601;到。相对于上面的,还调整了一点位置,用两片C8051F410,还能装逼一下“双核的哦”
看看板子吧~
阻焊用的是红色,比较显眼一点~?#30475;?#20026;了摆炫…也是为了试飞的时候,周围的同学能一眼看出这上面还多了“电路板”而不是一个普通的模型…

反面,当然要?#34892;?#19979; ourdev.cn
(图丢失)

现在应该纠结的问题是怎么焊接那两片传感器,只靠电烙铁我觉得有点悬,打算做一?#33258;?#28909;的装置。用最简单的东西。
用易拉罐做一个小?#20449;蹋?#28982;后去外面搞点细沙回来,没有细沙就买一包盐,然后把?#20301;?#32773;细?#31216;?#22312;?#20449;?#19978;,最后放上电路板。
然后给那两个传感器的管脚和电路板上的?#27010;?#19978;一层锡,然后用蜡烛在?#20449;滔录?#28909;,这样做可能达不到焊锡的熔点,但是也能使焊锡更容易融化一些,然后再用电烙铁对着?#27010;?#28938;接,再加一点锡,或者不?#21360;?#19981;打算做温度控制。PCB有十块,烧坏一块还有9块…不怕不怕。
一切都得实验后才知道可行性...不过感觉这样做应该?#34892;?#26524;的
2011/6/21今天已经查到我的PCB已经发过来了,晕死,因为是深圳发过来的,我今早刚被快递吵起?#29627;?#20174;深圳发到桂林,顺丰不超过18个小?#26412;?#21040;了。明早?#19968;?#26377;?#25991;兀?#35201;是他发过?#27425;?#23601;死定了。
今天呢,继续无?#27169;?#20110;是给飞机做了尾翼。
说真的,尾翼在这个无人机上可有可无的,它本身的控制能力已经可以进行全方位的控制了,尾翼在这飞机上唯一的作用就是在飞航线的时候使飞机平稳一些。这个尾翼只有升降舵,没有方向舵,尾翼的形状大概是120度的三片玻璃钢板。尾翼和尾架都是0.5mm的玻璃钢板做的,尾架上有四根牙签做加固。胶水依旧是504。
虽然用处不是很大。不过装了尾翼之后看起来更帅了~~
尾翼+尾舵机重量估计在50克整,不是很影响。只是重心要重新调了。刚刚又拆掉机架上固定尾管的部分,11g的重量。觉得好开心啊。现在除掉主控电路,?#20063;?#35013;桨保护器的情况下,重量只有627g。这代表着什么~哈哈。
在室外,重量不到700g,室内(加将保护器)750g以内。对电?#20800;?#23545;电调,?#26376;?#36798;都显得毫无压力,悬停时小消耗的电流估计在10安以内,2200mah的电池可以飞12分钟,3000mah的电池可以飞18分?#21360;?br /> 今天拍了好多图片~看图吧~

尾部的支架,牙签作为支架,现在完全干固后会用钳子减掉多余的部分用螺丝钉与机架固定在一起。

剪刀靠在那里,做些修正,因为粘的时候发?#38047;行?#20542;斜了。

这是尾翼..不多说了,一样用牙签做固定,相当的坚固

整机咯~在宿舍的走廊上完成今天的工作。

换一个?#23884;齲?#23614;翼和支架?#21069;臚该?#30340;,有点软,不过强度完全足够了。尾翼可以做升降舵运动,是整个尾翼一起动的,类似金鱼的尾巴

可以清晰地看到牙签的固定,当然里面除了牙签,里面平行于牙签的还有玻璃钢板。

有人好奇旋翼的结构,我就拍两张清晰的图给大家看看

另一边,看上去是不是一样的?那你就错了,我安装的方式?#23884;?#31216;的,看不懂?自己好好想想

称称~哈,重量嘛~看下一张图片

638g,后来又减掉11g,就是627g。除了主控电路,其他的都在上面了哦
主控电路?#25442;?#36229;过50g~

桨保护器一起,670多g,还少了一些支架。

这个最终成品应该在60g以下,现在还少了一些支架。这方面设计我遇到点麻?#24120;?#19981;知道怎么固定地好。有几?#22336;桨浮?br />
  • 完全刚性的,继续用0.5mm的玻璃钢板,6条或者8条支架..(懒得做)
  • 类似自行车条幅一样,用鱼线制作(很难做)
而且固定还郁闷…
算了,以后再做这个保护架。明天PCB就要到了,答应要送一片给Linda美女的,希望她能收藏?#38376;秪
然后实验一下盐浴加热法
今天到此为止咯~明天还要交一篇论?#27169;?#37057;闷
2011/6/22今天板子到了…
焊接LGA封装实在是一种挑战,不过就像焊接LQFP一样,一开始很?#32431;啵?#21518;来焊着焊着,觉得越焊越爽。
费了一个中午,小心翼翼终于把两个传感器焊接好了。没有用盐浴法…天气太热了!

焊接好两个传感器之后事情就变得简单了,LQFP用托焊的方法,其他的…随便了。
只是四个接口的插口,做得不是很好,打得过孔太小了!插进去费了好大的力气。下次记得改过来。


待会改程序,然后准备下载到这板子上来了。
希望一次成功不要出错,至少电路不要出错了!
2011/9/23很久没更新了,之前的电路板子设计有问题。
我把两片C8051F410之间的通讯,ADXL345 L3G4200D 的通?#24230;?#37096;丢到IIC总线上了,又因为我的系统工作速度是250HZ。
?#23548;首?#32447;速度最快只有160kbps 导致的结果是系统整个被?#19979;?#20102;。
没办法,现在全?#30475;有?#35774;计
最终?#26728;?#22914;下
控制器 STM32F103RE   
三轴陀螺仪 L3G4200D
三轴加速度计 ADXL345
三轴磁阻传感器 HMC5883L
气压传感器 MPX4115A
铁电储存器 FM25CL64
GPS LEA-5Q
超声波传感器
九轴传感器全部采用数字传感器
陀螺仪?#22270;?#36895;度计接入STM32的SPI1接口,HMC5883L接入STM32的I2C1接口
MPX4115A接入STM32的ADC
GPS 接入 STM32的USART3。LEA 5Q 拥有38400bps的UART速度,和4HZ 的高速更新率。
FM25CL64 铁电储存器接入SPI2 将用来保存配置?#38382;?#33322;点信息
超声波传感器接入中?#24076;?#29992;于贴地飞行,自主降落?#26412;?#30830;定高
另外STM32负责解码PPM接收机,混合控制信息后,通过PWM输出。
PWM设计为6通道(因为管脚冲突,没能设计成八个通道真是遗憾)
前四通?#21862;?#29992;250HZ高速输出。高电平为0.5~1.5ms,主要用于姿态控制的两个数字舵机和电调,使飞机具有高速?#20174;?#33021;力。
后二通道为标准50HZ PWM输出,兼容普通舵机
I2C接口将用来拓展其他模块,例如航行LED灯控制,例如三轴云台控制模块等等
唯一的遗憾是没有加入SD卡的驱动。这个将在V0.3之后的飞控版本上加入!

新的PCB将采用蓝色的阻焊油。我一直讨厌绿色,宁可多花50RMB!

另外一个更重要的更新是 RT-Thread 将被移植到这块V0.2的控制板上。
经过前一块板子的失败,我深刻了解到,当任务很多时,顺序结构将很难胜任。这次我决定在飞行器上移植国产RTOS RT-Thread,以应对多任务的复杂度。
移植版本先暂定0.3.2 之后再考虑0.4 。0.3.2资料相对多一些,我也是第一次接触RTOS。这几天查找了很多资料,看了一整本书之后,感觉移植?#25442;?#26377;很大的困难,接下来要做的就是要?#35270;?#22312;操作系统上编程了。
STM32F103RE 512kB rom 和  64kB ram 足够?#19968;?#38669;啦~ 要是能找到合适的TF卡座封装就好了,直接加TF卡,再移植FAT文件?#20302;常?#35760;录更完整的飞行数据是非常有意义的事情。
新的飞控板将实现自主航行飞行功能。
当然一切都是设想。。。
后天顺丰就把新的传感器和芯片,PCB送到我手上了~~~

就是那么突然,这篇?#21344;?#24335;的制作?#22987;?#23601;这么烂尾了
原文将近 70 张图,2万多字,可能是因为前面废话太多了导致写不下去了吧。。
在这之后,这个双轴飞行器,曾经尝试去飞了一次,并不成功,没有离地就翻了。飞机没有摔坏。当然,烂尾的只是这个最初的双轴飞行器,当我最后决定把飞控跑在STM32 + RT-Thread 上之后。更多地精彩和玩法一直在继续,直到最后成为了毕设。一个从大一开始做的毕设



评分

参与人数 1黑币 +5 收起 理由
B!ueice + 5 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 转播转播 分享分享 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
LINPEI 发表于 2016-11-14 23:47 | 只看该作者
厉害厉害厉害 真的超厉害 受益匪浅 学习到很多
回复

使用道具 举报

板凳
yjs 发表于 2016-11-24 09:15 来自手机 | 只看该作者
bhghdjfgfg
回复

使用道具 举报

地板
Dameinwdm 发表于 2017-2-11 07:58 来自手机 | 只看该作者
支持你。我的哥
回复

使用道具 举报

5#
rjheng 发表于 2017-4-6 15:59 | 只看该作者
谢谢楼主分享,正需要
回复

使用道具 举报

6#
nnq 发表于 2017-4-14 16:40 | 只看该作者
很下功夫的,学到机械电子软件硬件一大?#36873;!!!?/td>
回复

使用道具 举报

7#
cjxu 发表于 2018-2-4 00:14 | 只看该作者
很厉害 不错不错
回复

使用道具 举报

8#
wushiye54 发表于 2018-7-17 10:59 | 只看该作者
?#32454;縭嵌?#38498;的吧?膜拜优秀校友
回复

使用道具 举报

9#
FENGJLONG 发表于 2019-3-26 02:47 | 只看该作者
学习了!!谢谢分享!!!
回复

使用道具 举报

10#
qinyuning 发表于 2019-4-5 02:03 | 只看该作者
地面站软件是自己写的吗?
回复

使用道具 举报

11#
roachwz 发表于 2019-4-9 14:01 | 只看该作者
牛逼哄哄啊可以
回复

使用道具 举报

12#
1984528951 发表于 2019-5-15 20:42 | 只看该作者
厉害了楼主啊!
回复

使用道具 举报

13#
zqbx123 发表于 2019-5-16 14:22 | 只看该作者
?#34892;?#20998;享
回复

使用道具 举报

14#
hljtlwx 发表于 2019-10-14 12:55 | 只看该作者
很厉害。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机?#22363;?#32593;

快速回复 返回顶部 返回列表
北京快3玩法窍门
魅惑魔女出装 今日快3开奖号碼(河北) 福彩3d稳赚不赔的打法 推杰克高手赢钱技巧 安卓软件培训 黑龙江11选五任选走势 五分彩怎么知道开什么 牛牛群 最新准的三肖六码网站 七星彩8元小复式怎么买