找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 19779|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

四軸設(shè)計(jì) -RT-Thread DBP飛控的開(kāi)源了

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本文出自:Air_Cheese再次向作者致敬
簡(jiǎn)單說(shuō),這是一個(gè)我自己寫(xiě)的開(kāi)源的小飛控。全部代碼開(kāi)源,全部代碼簡(jiǎn)單,注釋完整。飛控加上配套的四軸機(jī)體,就成了我的設(shè)計(jì),輕松幫我拿到學(xué)校的優(yōu)秀設(shè)計(jì)。

聲明: 這篇小文章曾經(jīng)在幾個(gè)論壇發(fā)過(guò),自己的博客搭起來(lái)后當(dāng)然也少不了自己 self-plagiarism 一下。不過(guò),如需轉(zhuǎn)載請(qǐng)謹(jǐn)慎,我會(huì)追到天涯海角。。
以上

雖然我的題目是:《四軸飛行器的控制》,但飛行器的算法都是用最基本的算法,更復(fù)雜的是如何協(xié)調(diào)好各個(gè)任務(wù)。
而讓我自己感到更加有價(jià)值的部分是如何在 RTT 上運(yùn)行一個(gè)飛控并較好的協(xié)調(diào)各個(gè)模塊的工。希望能給學(xué)習(xí) STM32 和 RT-Thread 的同學(xué)一個(gè)參考,也希望 RTT 能越做越好。
四軸斷斷續(xù)續(xù)做了5個(gè)月,因?yàn)檫@幾年都做類(lèi)似的東西,所以做起來(lái)難度不大,我的目標(biāo)是夠用就行。而對(duì)于飛控,是我一直從大一到大四的學(xué)習(xí)研究過(guò)程,持續(xù)做了四年。
主要參數(shù)如下:
[td]
參數(shù)
空機(jī)重量390g
起飛重量(11.1V 2200mAh)550g
續(xù)航時(shí)間20分鐘
載重能力200g
懸停力效率>10g/w
電機(jī)2206 kv1200
8043
單個(gè)電機(jī)最大推力290g
[td]
傳感器型號(hào)
陀螺儀MAX21000
加速度計(jì)ADXL362
磁阻HMC5983
氣壓計(jì)MS5611
傳感器全部使用 SPI 接口,軟件利用 RTT 的 SPI 驅(qū)動(dòng),所以 ODR (Output Data Rate) 非常高。
[td]
參數(shù)
陀螺儀ODR2kHz
姿態(tài)解算更新率1kHz
控制更新率1kHz
電調(diào)控制更新率1kHz
CPU 占用率50~70%*
*:取決于是否需要高速記錄 log 到 SD 卡。
全機(jī)一共9個(gè)微控制器,主控芯片為 1 個(gè) STM32F4,其他的為 STM32F1 (電調(diào),電源管理,傳感器終端,接收機(jī) PPM 解碼器等等),全部運(yùn)行RTT,全部使用CAN BUS 通信。
飛控本身集成度較高(集成 10軸傳感器,GPS,12路PWM輸出,1路 PPM 輸入,1路 UART,1路CANbus),在沒(méi)有其他模塊的情況下也可以單獨(dú)完成飛行任務(wù)。拓展模塊包括電源板,電調(diào)板,各個(gè)傳感器,PWM解碼模塊等,因?yàn)橛辛薈AN Bus,使用很方便,論文內(nèi)有詳細(xì)說(shuō)明。
電調(diào)為自制兼容 ESC32的 硬件(感謝開(kāi)源模型興趣組的群主提供了 ESC32 的原理圖)
軟件上在 ESC32 與硬件之間加入 RTT 層,劫持了PWM更新函數(shù),從而實(shí)現(xiàn)控制數(shù)據(jù)流使用雙向的
飛控 <-> CANBUS <-> RTT <-> ESC32
代替了傳統(tǒng)單向的
飛控 -> PWM -> ESC32
數(shù)據(jù)溝通速度大幅度提高,信號(hào)延遲降低非常多(50Hz 對(duì)比 1000Hz),提供了反饋的能力。
論文里面提到幾個(gè)新的思路,包括虛擬終端,大的PCB機(jī)架+電路,單總線在四軸上的應(yīng)用,都是我在以前的制作中,感覺(jué)非常不方便后,提出的解決方案,在實(shí)際中也幫我省了很多精力去調(diào)試。
之后的文章,將根據(jù)論文逐步分析一些代碼和思路。如果對(duì)你有幫助,請(qǐng)使用頁(yè)腳的RSS訂閱鏈接RSS訂閱鏈接訂閱我的博客,謝謝。
演示視頻鏈接

全部程序,原理圖:
游客,本帖隱藏的內(nèi)容需要積分高于 1 才可瀏覽,您當(dāng)前積分為 0


放兩張圖片感受下:

飛控系列文章:

在飛控中記錄路徑(KML)文件,并在谷歌地球上顯示飛行軌跡還記得這段動(dòng)畫(huà)么,從飛控的 microSD 中直接點(diǎn)擊一個(gè)路徑文件,即可打開(kāi)谷歌地圖并顯示出路徑。并且這個(gè)文件是由飛控在飛行過(guò)程中實(shí)時(shí)生成的,不需要額外的編輯,使用起來(lái)非常方便。

因?yàn)?typecho 的原因,沒(méi)辦法上傳大于 1M 的 GIF 動(dòng)畫(huà)。效果請(qǐng)看視頻:youtube youku 1:35 處開(kāi)始

想要在飛控中記錄這個(gè)谷歌地球的描述文件,是非常簡(jiǎn)單的。
1. 背景知識(shí)谷歌地球/地圖 (google earth / google map) 使用的描述文件為 .kml 文件。本質(zhì)上為 xml 文件。XML 大家應(yīng)該熟悉了
可擴(kuò)展標(biāo)記語(yǔ)言(英語(yǔ):eXtensible Markup Language,簡(jiǎn)稱: XML),是一種標(biāo)記語(yǔ)言。標(biāo)記指計(jì)算機(jī)所能理解的信息符號(hào),通過(guò)此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。如何定義這些標(biāo)記,既可以選擇國(guó)際通用的標(biāo)記語(yǔ)言,比如HTML,也可以使用像XML這樣由相關(guān)人士自由決定的標(biāo)記語(yǔ)言,這就是語(yǔ)言的可擴(kuò)展性。XML是從標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言(SGML)中簡(jiǎn)化修改出來(lái)的。它主要用到的有可擴(kuò)展標(biāo)記語(yǔ)言、可擴(kuò)展樣式語(yǔ)言(XSL)、XBRL和XPath等。[1]
上面說(shuō)了一堆,意思就是說(shuō),.kml 呢,實(shí)際上就是一個(gè)文本文件,里面用文本記錄各種描述,比如線,顏色圖形,位置等等。
Google earth/map 開(kāi)發(fā)手冊(cè)里面有詳細(xì)的 kml 文件的開(kāi)法指南。
英文在這, 中文在這
其實(shí),要做這個(gè)路徑記錄文件,并不需要去翻手冊(cè)。
2. 這樣是不是很簡(jiǎn)單竅門(mén)就在這: 在描述路徑的時(shí)候,.kml 文件的頭和尾都可以是固定不變的,唯一變化的是,路徑中各個(gè)點(diǎn)的經(jīng)緯度值。
這么說(shuō)就簡(jiǎn)單了吧?我們的飛控只需要把固定的文件頭寫(xiě)進(jìn)一個(gè) .kml 的文本文件,然后根據(jù) GPS 實(shí)時(shí)返回的經(jīng)緯度和高度信息,不斷地在文件后追加當(dāng)前的位置信息,一直寫(xiě)入直到你不想記錄的時(shí)候,再把固定的文件尾追加到文件中。保存,搞定!
不說(shuō)別的,先看一個(gè)典型的(花俏的) kml 文件。大家可以將以下保存到一個(gè) .kml 文件里,拖到  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="">
    <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>
........
            </coordinates>
     </LineString>
    </Placemark>
</Document>
</kml>


按到關(guān)鍵沒(méi)?
具體是哪,自己有興趣可以去看看。
至于格式問(wèn)題,經(jīng)度范圍從 -180 到 +180? 負(fù)數(shù)代表西經(jīng),正數(shù)代表東經(jīng)。維度范圍從 -90 到 +90, 負(fù)數(shù)代表南緯,正數(shù)代表北緯。單位全部是度,所以不會(huì)有幾分幾秒的情況,一個(gè)實(shí)數(shù)就代表了一個(gè)點(diǎn)。高度為海拔高度,單位是米。
看到文件的中間部分,由  <coordinates> </coordinates> 包起來(lái)的部分,每一行表示一個(gè)點(diǎn),每一個(gè)點(diǎn)坐標(biāo),一次由經(jīng)度,緯度和海拔高度組成,這三個(gè)信息都可以方便地從任何“正常的” GPS 輸出中找到。
這里例子的文件,由三個(gè)位置坐標(biāo)點(diǎn)組成,實(shí)際飛控記錄的時(shí)候,這一部分將不斷增加,將是整個(gè)文件中占用行數(shù)最多的部分。
在看到文件前部分,
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>



這部分描述了你的路徑畫(huà)出來(lái)的風(fēng)格,具體可以去看手冊(cè)里面,或者直接修改一些配色,反正我這是已經(jīng)是最丑的風(fēng)格了。。
于是上面的代碼風(fēng)格就是如此逗逼

三個(gè)頂點(diǎn),即為坐標(biāo)里面描述的三個(gè)點(diǎn),高度為海拔 194米。
只要不斷記錄這些點(diǎn),就能實(shí)現(xiàn)動(dòng)畫(huà)里面的飛行路徑了。
那么,飛控里面咋生成 .kml 文件呢?
2. 那我們來(lái)看看代碼與 .kml 文件生成相關(guān)的代碼在 飛控主板源碼.rar 的以下目錄
program v1.0\RT-Thread_1.2.0\bsp\stm32f40x\user\thread_log.c
什么你沒(méi)有代碼? 代碼在這里下載:四軸設(shè)計(jì)初說(shuō) - DBP飛控的開(kāi)源與簡(jiǎn)介
這個(gè)文件,包含了一些獨(dú)立的儲(chǔ)存飛控運(yùn)行信息,傳感器信息,GPS 記錄等等的線程。其中一個(gè)即為生成 .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;        //指示上一次寫(xiě)到哪里
     
    unsigned long long file_byte_seek = 0;            //指示文件長(zhǎng)度
    unsigned int head_len = 0;                        //文件頭尾的長(zhǎng)度
    unsigned int tail_len = 0;
    const char file_name[] = "path.kml";
    const char head[] =
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
    "<kml xmlns=\"\">\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"       //這一句是有沒(méi)有豎線
    "        <altitudeMode>absolute</altitudeMode>\n"      
    "            <coordinates>\n";
     
    const char tail[] =   
    "            </coordinates>\n "   
    "    </LineString>\n"
    "    </Placemark>\n"
    "</Document>\n"
    "</kml>\n";
     
    //預(yù)先記錄文件頭尾長(zhǎng)度
    head_len = strlen(head);
    tail_len = strlen(tail);
     
    //復(fù)制工作區(qū) 目錄
    strcpy(dir, log_dir);
    //打開(kāi)記錄文件
    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");
    //寫(xiě)入文件頭
    write(fd, head, head_len);
    file_byte_seek += head_len;
     
    //主循環(huán)
    while(1)
    {
        while(gps_count_bef >= gps.count)
        {
            rt_thread_delay(5);
        }
        gps_count_bef = gps.count;       //mark for 1 second a cycle
         
        //等待直到數(shù)據(jù)有效
        if(gps.flag == 0)
            continue;
                 
        sprintf(buf,"\t\t\t\t%f,%f,%f\n",
                                        gps.lon,
                                        gps.lat,
                                        gps.altitude);   
         
        //將緩存區(qū)寫(xiě)入文件
        size = write(fd, buf, strlen(buf));
        file_byte_seek += size;                //記錄寫(xiě)入長(zhǎng)度   
         
        if(size>0)
        {
        //rt_kprintf(buf);
        }
        else
        {
            rt_kprintf("kml log: Write to file wrong!\n");
            while(1)
                rt_thread_delay(1000);  //相當(dāng)于停止這個(gè)線程
        }
         
         
        //寫(xiě)入文件尾
        write(fd, tail, tail_len);
        close(fd);
        fd = open(dir, O_WRONLY | O_CREAT | O_APPEND, 0);//末尾重新打開(kāi)        

        //覆蓋 從文件頭開(kāi)始計(jì)算寫(xiě)入了多少有效數(shù)據(jù),覆蓋文件尾
        lseek(fd, file_byte_seek, DFS_SEEK_SET);
    }
}



注釋很清楚啦,我就不多說(shuō)啦。
RT-Thread 支持 POSIX 標(biāo)準(zhǔn)文件系統(tǒng)接口,所以我的飛控可以直接使用 open() write() close() 之類(lèi)的POSIX 文件接口操作文件。 如果你跑在自己的飛控,自己的 MCU,或者直接裸奔,那文件接口需要改成你的文件系統(tǒng)提供的接口。
3. 經(jīng)緯度,高度數(shù)據(jù)怎么。這里就要說(shuō)到如何 GPS 數(shù)據(jù)啦,這部分本不是這篇的內(nèi)容,這里大概提一下。
一般 GPS 輸出,至少都有標(biāo)準(zhǔn)的 NMEA-0183協(xié)議輸出,可以參考這個(gè)文件 NMEA-0183 定義。 官方文檔似乎是需要購(gòu)買(mǎi)的。
GPS 會(huì)通過(guò)串口輸出一大堆包含導(dǎo)航信息的語(yǔ)句,一般在10Hz(每秒 10 條)以下。大部分 GPS 模塊也可以選擇性輸出部分語(yǔ)句,屏蔽部分語(yǔ)句。(因?yàn)楹芏嗾Z(yǔ)句信息是重復(fù)的,比如 GGA 語(yǔ)句和 RMC 語(yǔ)句都包同樣的含經(jīng)緯度信息)[2]
如果不想看文檔,那就直接看下面的例子
這是最常用的 GPS 返回的 NMEA-0183 語(yǔ)句之一 GGA 語(yǔ)句:
$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 *



以上說(shuō)明應(yīng)該比較清晰啦,其他語(yǔ)句也是一樣的,請(qǐng)參考這里。
這里面,有我們需要的經(jīng)緯度信息和海拔高度,4807.038,N  01131.000,E  545.4,M  只是,這表示方法是不是跟我們上面不同? 小伙們,自己想辦法轉(zhuǎn)換吧~ 如果需要查看C語(yǔ)言版本的,在program v1.0\RT-Thread_1.2.0\bsp\stm32f40x\user\thread_gps.c 里面找到 GPS 其中幾個(gè)常用語(yǔ)句的解碼函數(shù)。
4. 其他說(shuō)其實(shí)這種方式并不好,原因是我的飛控沒(méi)有掉電保存能力,經(jīng)常記錄到一半,沒(méi)寫(xiě)文件尾就掉電了,導(dǎo)致得自己手動(dòng)編輯文件,加入文件尾。
另一種方法,是在飛控中直接記錄所有 GPS 輸出的 NMEA-0183 語(yǔ)句,等回到電腦上,再用腳本語(yǔ)言工具,例如 python 來(lái)轉(zhuǎn)換成 .kml 文件。 只是,占用空間會(huì)比 .kml 本身大很多,并且增加了一個(gè)轉(zhuǎn)換的步驟,略麻煩。
再另一種,我記得 google earth 有直接導(dǎo)入 NMEA-0183 的能力,具體如何實(shí)現(xiàn),各位自行腦補(bǔ)。
.kml 文件是很神奇的,除了記錄路徑,還能做很多很多的事情。具體請(qǐng)參考文章剛開(kāi)始提供的 .kml 開(kāi)發(fā)指南。英文在這, 中文在這

與飛控?zé)o關(guān) - 記剛開(kāi)始弄飛控那會(huì)兒(上)
記錄的是我的飛行器學(xué)習(xí)的黑歷史,主角是一臺(tái)類(lèi)似 阿凡達(dá)里面的雙槳 VTOL (Vertical Take-Off and Landing)飛行器的詳細(xì)制作過(guò)程。錯(cuò)字連篇,雖然爛尾,沒(méi)有但是..
版權(quán)所有,轉(zhuǎn)載請(qǐng)看


先放張圖嚇嚇人,以下原文

項(xiàng)目名稱:AUTO FLY SYSTEM
項(xiàng)目編號(hào): FL project 005
目的:制作一個(gè)能自動(dòng)導(dǎo)航并自動(dòng)進(jìn)行姿態(tài)調(diào)節(jié)的無(wú)人機(jī)控制系統(tǒng)
要求:
1.使用慣性導(dǎo)航和GPS進(jìn)行導(dǎo)航
2.能自動(dòng)進(jìn)行姿態(tài)調(diào)節(jié)
3.能手動(dòng)/自動(dòng)飛行隨意切換
4.有實(shí)時(shí)遠(yuǎn)距離狀態(tài)/控制數(shù)據(jù)傳輸能力
5.實(shí)現(xiàn)自動(dòng)航線飛行/航點(diǎn)實(shí)時(shí)切換
6.實(shí)現(xiàn)定點(diǎn)自動(dòng)起飛/著陸
7.地面控制站支持
8.功能模塊掛載
整體思路:
通過(guò)慣性導(dǎo)航和GPS等實(shí)現(xiàn)飛行器自動(dòng)控制和導(dǎo)航,并進(jìn)行實(shí)時(shí)修正姿態(tài),接受地面控制等
預(yù)計(jì)用時(shí):6個(gè)月
開(kāi)始時(shí)間:2011年1月20日
結(jié)束時(shí)間:
硬件清單:
預(yù)算:2000RMB
邏輯圖解:   
首先,這是個(gè)大項(xiàng)目,其次,我有信心完成它
涉及的新知識(shí)有:
新的單片機(jī)C8051F
穩(wěn)定的電源
AD轉(zhuǎn)換
IIC接口
SPI接口
UART接口
上位機(jī)串口編程
上位機(jī)Labview編程
模擬輸出傳感器
IIC數(shù)字傳感器
PI算法
導(dǎo)航算法
空氣動(dòng)力學(xué)
材料科學(xué)
無(wú)線RF模塊
GPS數(shù)據(jù)格式
在初期,我打算用洞洞板先把硬件組裝出來(lái),然后寫(xiě)軟件一個(gè)個(gè)調(diào)試。畫(huà)板我還不會(huì),順利的話等到下學(xué)期應(yīng)該定型可以做板了。
個(gè)人精力有限,對(duì)于這個(gè)AFS(Auto Fly System),作為一個(gè)C語(yǔ)言只寫(xiě)了1000行的初級(jí)入門(mén)半愛(ài)好者來(lái)說(shuō),姿態(tài)算法才是最有挑戰(zhàn)的東西。所以寒假著重在算法上面花心思。其次,我是個(gè)電子盲(在一個(gè)唯一不學(xué)電子技能基礎(chǔ)的專(zhuān)業(yè)的大學(xué)新生),所以傳感器,能買(mǎi)到模塊的就買(mǎi)模塊的。買(mǎi)不到就盡量買(mǎi)數(shù)字的了,比起模擬的數(shù)字的外設(shè)少很多。

Auto Balance Module
MCU:C8051F410
使用內(nèi)部晶振,工作在49MHZ
傳感器:
1三軸模擬輸出陀螺儀
2三軸模擬輸出加速度傳感器
  以上采樣率500HZ
3數(shù)字三軸電子羅盤(pán) IIC接口 采樣率50HZ
工作周期
500Hz
2HZ
PWM信號(hào)輸出周期50HZ
輸出接口
八通道周期50HZ的PWM信號(hào)
C8051F410的高速SMBus(IIC)
工作周期概述
并行周期1:500HZ
1轉(zhuǎn)換三軸陀螺儀數(shù)據(jù),取三軸加速度數(shù)據(jù)做融合,計(jì)算出短期的調(diào)整量。
2等待定時(shí)器中斷
并行周期2:50HZ
1將30次短期調(diào)整量移動(dòng)加權(quán)平均為 輸出量,乘上速度系數(shù),設(shè)定好PWM參數(shù)
2根據(jù)上次傳回的PWM數(shù)據(jù),設(shè)置好定時(shí)器,輸出信號(hào)
3 取電子羅盤(pán)數(shù)據(jù)50次平均后,校準(zhǔn)陀螺儀中立點(diǎn)。
4根據(jù)電子羅盤(pán)計(jì)算四軸姿態(tài)并保存。
5向AFN傳輸數(shù)據(jù)(航向,姿態(tài)…)
6接收AFN數(shù)據(jù) 設(shè)置飛行數(shù)據(jù)(速度參數(shù)…)
并行周期3:2HZ
1在0.5秒內(nèi)對(duì)50HZ平均輸出量進(jìn)行計(jì)算平均,得出長(zhǎng)期調(diào)整量,然后積分加入到輸出量積分處
2等待定時(shí)器中斷

Auto Fly Navigator Module
MCU:C8051F410
使用內(nèi)部晶振,工作在49MHZ
使用外部晶振作串口基準(zhǔn) 11.0592MHZ
外部模塊:
1 PPM解碼模塊接收機(jī)(真討厭。
2 氣壓傳感器
3 GPS模塊 接口UART 38.4Kbps 取樣4HZ
4 Auto Balance Module 接口SMBus
5 RF905 2W模塊 SPI接口
工作順序概述
1.接到ABM輸出數(shù)據(jù)
航向,俯仰角,傾斜角…
2.回傳ABM上一次的數(shù)據(jù)和指令
飛行模式(起飛,著陸,左轉(zhuǎn),右轉(zhuǎn),爬升,降落),PPM信號(hào),其他需要PWM參數(shù)
3.開(kāi)始轉(zhuǎn)換PPM數(shù)據(jù)
根據(jù)ABM傳回的數(shù)據(jù),結(jié)合GPS坐標(biāo),航標(biāo)和氣壓計(jì),計(jì)算下一個(gè)航標(biāo)的相對(duì)角度和高度,或者根據(jù)PPM信號(hào)進(jìn)行調(diào)整。形成新的ABM回傳數(shù)據(jù)。
4.寫(xiě)入SD卡,并通過(guò)Zigbee傳輸回?cái)?shù)據(jù)地面(后來(lái)決定用RF905 433mhz)
5.等待下次ABM的數(shù)據(jù)
2011/2/12好吧,這么多天,我一直沒(méi)寫(xiě)這個(gè),其實(shí)…真不是我偷懶。從1月29號(hào)到現(xiàn)在,我已經(jīng)買(mǎi)了陀螺儀(LY530,LPR530),加速度計(jì)(ADXL335),磁阻傳感器(HMC5883L),GPS模塊(LEA-5Q),C8051F單片機(jī)下載器(EC6)…看上去差不多了是吧?錯(cuò)!最最最關(guān)鍵的單片機(jī)(C8051F410)沒(méi)買(mǎi)到!淘寶商家個(gè)個(gè)都回家過(guò)年去了!我哭…不過(guò)這么多天來(lái),我一遍又一遍地看了各個(gè)傳感器的datasheet(都是英文的,想哭TAT),查了很多各方面的資料,泡飛行器的論壇,看各種各樣的算法。(但是感覺(jué)什么都沒(méi)學(xué))
好吧,沒(méi)事,只能先YY載體(飛機(jī))了。

今天之前的文字是最初步想法,大概就是做一個(gè)慣性導(dǎo)航和GPS,磁阻傳感器等配合而成的一個(gè)包括姿態(tài)控制和飛行導(dǎo)航的系統(tǒng),并在載體上實(shí)踐。
最初打算用固定翼模型飛機(jī)作為載體。選固定翼的原因很簡(jiǎn)單,我從小就接觸固定翼的模型飛機(jī),從繞橡筋,到后來(lái)的電動(dòng),從買(mǎi)來(lái)的商品機(jī),到后來(lái)完全自己做的飛機(jī)。我雖然很久不玩模型飛機(jī)了,但是就制作能力來(lái)說(shuō),我還是很有自信的。給我兩個(gè)小時(shí),我就可以完成一臺(tái)基于KT板的載體飛機(jī)。除了制作,我對(duì)固定翼飛機(jī)的飛行特點(diǎn)和控制方式都有很詳細(xì)的了解。這些都是我一開(kāi)始打算把固定翼飛機(jī)作為載體的原因。
但是,我必須得放棄固定翼了。第一,我忽略了實(shí)驗(yàn)場(chǎng)地問(wèn)題,固定翼飛機(jī)飛行需要太大的場(chǎng)地,只少是一個(gè)足球場(chǎng)的空地,即使能在學(xué)校的足球場(chǎng)飛起來(lái),也因?yàn)殡x自己太遠(yuǎn)不好觀察和調(diào)整參數(shù)。第二,GPS不能提供足夠的精度供固定翼使用,幾十米的動(dòng)態(tài)誤差足夠飛機(jī)撞體育場(chǎng)主席臺(tái)了。即使飛起來(lái)了,想讓它找準(zhǔn)位置降落是很困難的。除非我能使用到DGPS技術(shù),我現(xiàn)在還不太了解,理論上是可行的,我買(mǎi)的GPS模塊也支持DGPS,等我有時(shí)間看過(guò)以后再說(shuō)吧。
除去固定翼,我第一個(gè)想到的是四軸飛行器。我有做這個(gè)AFS(Auto Fly System)的想法也是因?yàn)榭戳似渌俗龅乃妮S飛行器例子。四軸飛行器,資料多,姿態(tài)算法都有現(xiàn)成的,而且控制原理最簡(jiǎn)單,又是對(duì)稱的飛行器,沒(méi)有復(fù)雜的控制算法。但是說(shuō)真的,我自從第一眼看見(jiàn)四軸飛行器,就不喜歡它的樣子,有點(diǎn)丑,有點(diǎn)突兀。我不是很愿意做這個(gè)。

上圖是國(guó)內(nèi)玩家自己DIY的四軸飛行器
另一個(gè)想法,是《AVATAR》里的直升飛機(jī),樣子很酷很酷,在哈利路亞這種低重力的星球上,它的兩個(gè)涵道風(fēng)扇顯得并不是那么不合道理。之前幾天我一直在思考,那么另類(lèi)的飛行器,姿態(tài)檢測(cè)和控制算法會(huì)不會(huì)比較復(fù)雜?我結(jié)合四軸飛行器和AVATAR的直升機(jī),經(jīng)過(guò)分析,得出一些結(jié)論:這兩者之間,姿態(tài)檢測(cè)是完全一樣的,機(jī)體的傾斜,加速度的檢測(cè)都差不多,控制算法上,AVATAR直升機(jī)和四軸飛行器在橫滾控制上是相同的,但在前后傾斜控制上不同,但也不是很復(fù)雜。其次,AVATAR直升機(jī)相對(duì)于四軸有一個(gè)優(yōu)點(diǎn),重心比較低,這樣,調(diào)試會(huì)變得簡(jiǎn)單許多。我看過(guò)許多四軸飛行器的視頻,不少在飛行時(shí)會(huì)發(fā)生振蕩,選擇適合的參數(shù)顯得比較困難。
結(jié)合這幾天的分析,我決定選擇AVATAR直升機(jī)作為實(shí)驗(yàn)載體。同于四軸的姿態(tài)檢測(cè),資料多,做起來(lái)會(huì)比較容易,相似又有不同的控制算法,對(duì)于我來(lái)說(shuō)也是一種新的挑戰(zhàn)。

AVATAR直升機(jī)
主體結(jié)構(gòu),有兩個(gè)方向,玻璃鋼和桐木。桐木是模型飛機(jī)里經(jīng)常用到的,主要特點(diǎn)是輕,比輕木稍重,但強(qiáng)度大于輕木,小于松木,而松木最重強(qiáng)度最大,一般用于支撐結(jié)構(gòu)上,比如翼梁。淘寶上有提供激光切割非金屬材料的服務(wù),我計(jì)算了一下,切1平方米3mm厚的桐木板大概需要100元,還可以接受吧。玻璃鋼的話,又有兩個(gè)方向,自己做(環(huán)氧樹(shù)脂+稀釋劑+玻璃纖維布),或者送去PCB打樣,至少1平方米(這個(gè)價(jià)格估計(jì)比較杯具)。自己做呢,初中的時(shí)候我收集過(guò)許多資料,環(huán)氧樹(shù)脂也買(mǎi)了,但是當(dāng)時(shí)不知道怎么買(mǎi)玻璃纖維布,一直沒(méi)動(dòng)手做過(guò)玻璃鋼,比較懸。固化劑那個(gè)濃烈的氨氣味,不是一般人能承受的,不可能在宿舍做了,比較麻煩。但如果能用玻璃鋼做,效果當(dāng)然是最好的,我繼續(xù)糾結(jié)ing。
另外,碳纖維不用考慮,完全不用考慮,我考慮不起,不解釋。(好吧,剛剛我淘寶了一下,看來(lái)碳纖維也不是什么難事,有碳纖維布賣(mài),如果做法跟玻璃剛差不多的話,就簡(jiǎn)單了?磥(lái)我的思想一直以來(lái)被碳纖維這個(gè)詞嚇得不輕。但是價(jià)格還是稍微悲劇,是玻璃纖維布的15倍)
好吧,再更新一下,剛剛又淘寶一下,發(fā)現(xiàn)有成品的玻璃鋼板賣(mài),價(jià)格還行 1mm厚的,50x50cm 20元。材料決定用玻璃鋼了。
我查了很多資料,在動(dòng)力選擇上,最終決定用兩個(gè)KV980 A2212的電機(jī),配上1047的正、反螺旋槳(這些數(shù)字代表啥自己百度一下,我要是全部解釋完,我都可以出書(shū)了),左右兩邊各一個(gè)。電子調(diào)速器,選用兩個(gè)I2C總線控制的25A四軸用無(wú)感電子調(diào)速器。電池我選擇 11.1V 2200mAh~4000mAh 10C以上的聚合物鋰離子電池。旋翼伺服舵機(jī)使用兩個(gè)扭力1KG/cm以上的50Hz PWM信號(hào)控制的金屬齒輪舵機(jī)(剛剛看到這幾年數(shù)字舵機(jī)已經(jīng)普及了,但是我查不到數(shù)字舵機(jī)的通信協(xié)議,如果普通PWM舵機(jī)速度跟不上,也許會(huì)自己做舵機(jī)的驅(qū)動(dòng)板,改裝普通舵機(jī),用自己協(xié)議,I2C總線控制)。
好吧,剛剛又查了很多資料,稍微有點(diǎn)失望了,數(shù)字舵機(jī)看來(lái)也不是那么數(shù)字的,只是把普通模擬舵機(jī)的50Hz PWM 信號(hào)速度加快了而已,250Hz以上。不管了,至少不用費(fèi)那么多心思再去研究一個(gè)新的協(xié)議了。但是如果速度精度跟不上,不排除自己改裝成I2C總線控制的舵機(jī)的可能。
根據(jù)電機(jī)的測(cè)試(希望這個(gè)數(shù)據(jù)是真實(shí)的),這個(gè)動(dòng)力系統(tǒng)懸停效率最高的輸出為兩個(gè)電機(jī)各輸出 480g 的推力(此時(shí)輸入功率為54瓦,力效率為8.77g/W),兩個(gè)電機(jī)加起來(lái)一共960g推力。整機(jī)質(zhì)量最好能在1000g以下。懸停時(shí)間(2200mAh的電池)可以達(dá)到12分鐘。
粗略計(jì)算一下:
電機(jī)+電調(diào)+槳 = 80x2=160g
電池(2200mAh)= 190g
伺服舵機(jī) = 17x2 = 34g
機(jī)體結(jié)構(gòu)(玻璃鋼)= 250g
AFS主控電路 = 100g
連接線 = 50g
總計(jì)784g
這個(gè)估算~嘻嘻,很樂(lè)觀嘛…
這套動(dòng)力系統(tǒng)滿功率300w時(shí)推力可以有1600g以上。看來(lái)有得玩了…希望不是我少算了什么~哈哈,要不然就強(qiáng)大了,推重比達(dá)到2以上,可以掛上跟自己本身一樣重的掛載(外掛800g以上的負(fù)載)。不過(guò)此時(shí),只有 4分鐘的懸停時(shí)間,少得可憐。
哈哈,以上純屬無(wú)聊了YY…能不能做好姿態(tài)檢測(cè)還是個(gè)未知數(shù),我的能力就那么一點(diǎn)點(diǎn)。
好久不說(shuō)話了,今天廢話多了點(diǎn)
2011/3/5距離上次更新已經(jīng)差不多一個(gè)月過(guò)去了。現(xiàn)在是開(kāi)學(xué)的第二周的周末。說(shuō)一下,我第一周主要還是買(mǎi)東西,買(mǎi)了很多電子元件,還買(mǎi)了一個(gè)最便宜得焊臺(tái)(60多RMB吧,發(fā)順豐發(fā)了30RMB..其他快遞就不敢用了)
其實(shí),當(dāng)我發(fā)現(xiàn),我想要什么,那箱電子元件里就有什么的時(shí)候,也就不在乎300RMB買(mǎi)來(lái)一堆零零散散的垃圾樣的東西了~
我想,今天可以發(fā)布這篇文章了,雖然都還只是在硬件上焊焊芯片,軟件上寫(xiě)寫(xiě)串口驅(qū)動(dòng),但是我想,這個(gè)星期我學(xué)到的已經(jīng)很多很多了,繞了不少?gòu)澛罚斜匾涗浺幌。?dāng)然,并不是說(shuō)這個(gè)項(xiàng)目到此為止,更新會(huì)持續(xù)下去。
首先說(shuō)說(shuō),這是我接觸的新的單片機(jī)。我現(xiàn)在大一下學(xué)期,接觸過(guò)的單片機(jī)只有STC 的1T系列的。說(shuō)是接觸,也只是接觸一下而已,沒(méi)用它做過(guò)什么像樣的東西。大一還沒(méi)開(kāi)單片機(jī)課,估計(jì)要學(xué)也是學(xué)最標(biāo)準(zhǔn)的8051、8052而已。雖然沒(méi)“接觸”過(guò),我想應(yīng)該差不多吧。這回是C8051F410 這片是我在新華龍的C8051F選型表上經(jīng)過(guò)很多對(duì)比選出來(lái)的。
LQPF 32的封裝
50MIPS的速度
5V的IO口
200kbps N通道 12Bit的AD   
各種串行接口都挺全的(UART I2C SPI)
很合適我的項(xiàng)目。
要說(shuō)這是51單片機(jī),我就郁悶了,根本不止51那么簡(jiǎn)單,說(shuō)完全兼容標(biāo)準(zhǔn)51是不對(duì)的,至少兼容沒(méi)有STC做得那么好。還有一些很不可思議的地方,比如默認(rèn)開(kāi)啟看門(mén)狗!我在這里郁悶了2天的時(shí)間,才找出原因。當(dāng)然,他這么做是 有道理的,我不會(huì)用罷了
另一個(gè)問(wèn)題是,焊接的單片機(jī),芯片的時(shí)候,堅(jiān)決不要用普通的非恒溫的電烙鐵了,我為此廢掉了一片C8051F410 14RMB就這么飛走了,還有我兩個(gè)小時(shí)的青春…
不知道為什么,芯片在下載程序的時(shí)候只要接上外部晶振,就會(huì)出錯(cuò)。根本識(shí)別不了單片機(jī),這點(diǎn)我也郁悶了4天,直到我的焊臺(tái)到了,用飛線焊好第二片單片機(jī)的時(shí)候,沒(méi)來(lái)得及焊上外部晶振,才偶然間連上下載器了。
外部晶振是11.0596MHz的,打算做標(biāo)準(zhǔn)UART波特率發(fā)生器,F(xiàn)在的結(jié)論是不需要了,內(nèi)部晶振的精度勾了 0.15%的波特率誤差,傳送少量字節(jié)的時(shí)候完全不會(huì)出錯(cuò)(我現(xiàn)在一次傳送6個(gè)字節(jié) (5位數(shù)字ASCII+1位換行))。
再說(shuō)說(shuō)軟件,軟件也有一些奇奇怪怪的東西,比如開(kāi)了UART0中斷后,TIMER2的中斷就廢掉了。我了個(gè)嚓!
現(xiàn)在已經(jīng)寫(xiě)了300多行,實(shí)現(xiàn)了系統(tǒng)周期計(jì)時(shí),9通道AD轉(zhuǎn)換,UART0發(fā)送16位的變量,16位變量轉(zhuǎn)ASCII碼…
好像現(xiàn)在能做的也只有這些了。
另外,大贊一個(gè),C8051F的Config2真是太好用了,各種初始化函數(shù),“一鍵”寫(xiě)完,Just copy and paste.計(jì)算波特率,通信速率的,很直白明了,各個(gè)設(shè)置之間關(guān)聯(lián)也很緊密,不需要考慮太多。波特率在Datasheet上有,注意一下如果用了時(shí)鐘乘法器的話,乘一下就好。

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

這個(gè)星期奮戰(zhàn)的環(huán)境…比較簡(jiǎn)陋。等到下學(xué)期我們學(xué)院解散了,我們進(jìn)山里的新校區(qū)后,環(huán)境會(huì)好很多。

新買(mǎi)的焊臺(tái),什么牌子不記得了,挺便宜的。60多RMB ,來(lái)源淘寶
這好像是那種高頻的電烙鐵,通電10秒鐘就可以焊接了,電源在柜子里,桌面上實(shí)在是沒(méi)位置了。

這段時(shí)間,我一共飛了2片,可見(jiàn)我的焊工有多么爛,每只管腳我都測(cè)試過(guò)沒(méi)短路短路后我才敢上電的。飛一片要1個(gè)多小時(shí),我了個(gè)嚓!

左邊的是UART2USB,右邊的是433的UART透?jìng)髂K。(這東西是高一的時(shí)候買(mǎi)的圓夢(mèng)小車(chē)上的,那車(chē)在我手里從未自己跑過(guò),焊H橋出了問(wèn)題。我就是在這里接觸STC的單片機(jī)的,是我第一次認(rèn)識(shí)單片機(jī))。

這東西320RMB 不多說(shuō)…沒(méi)能力焊接只好添錢(qián),賣(mài)家說(shuō)他自己焊壞了很多個(gè)了,這價(jià)格是加上焊壞的一起的。
三軸加速度計(jì) ADXL335
三軸陀螺儀   LPR530 + LY530
成本最多120RMB

XP虛擬機(jī)上的結(jié)果,很不錯(cuò)~

現(xiàn)在的成果,為了今后焊接更簡(jiǎn)單,我昨天花了1個(gè)小時(shí)用NOKIA n81的爛屏幕DIY了一個(gè)USB“無(wú)影燈”。
具體看FL project 006 usb light

補(bǔ)光效果相當(dāng)好的。昨天晚上的照片
(照片丟失)
今天早上的照片
(照片丟失)
我很滿意~除了多占用了一個(gè)USB口。接下來(lái)有心情的時(shí)候再改裝吧~酷酷的補(bǔ)光燈
今天就先到這里吧~
下一步就是提取傳感器信息,然后開(kāi)始寫(xiě)姿態(tài)代碼了,給自己加油~哈~
2011/3/7這兩天主要是軟件上面做,嘗試了一下編寫(xiě)上位機(jī),Labview卡在下不到VISA上,(剛剛才下載到,還沒(méi)安裝)試了一下VC編串口的上位機(jī),用的是C語(yǔ)言,但是還是有很多看不懂的。大蔥說(shuō)VC6要在XP的虛擬機(jī)上開(kāi),有點(diǎn)糾結(jié)。VC還是很有難度的(當(dāng)然對(duì)于我這種懶人來(lái)說(shuō))。按著上的《從零開(kāi)始學(xué)VC系列教程 一.信息顯示實(shí)驗(yàn)》,做了一個(gè)串口接收程序,但還是不太明白,代碼都是別人寫(xiě)的,自己看得也不太懂。
還在糾結(jié)VC還是Labview的選擇。
至少還不急,也許不急吧。
現(xiàn)在分析數(shù)據(jù)可以用串口助手接收數(shù)據(jù),然后matlab和Excel做表似乎都很方便。就先不糾結(jié)上位機(jī)用什么編了。
程序已經(jīng)寫(xiě)了500多行,最大的進(jìn)步就是把串口收發(fā)和ADC轉(zhuǎn)換做成了中斷的方式,這樣就可以留更多的時(shí)間放在姿態(tài)算法的計(jì)算上了。
串口中斷收發(fā)程序是在網(wǎng)上找的,修改了很多,精簡(jiǎn)了一點(diǎn),緩沖換成32字節(jié)(兼容以后無(wú)線數(shù)傳,每幀字節(jié)也是32個(gè))就放到我的代碼里,代替了原來(lái)的串口收發(fā)函數(shù),用起來(lái)很好~只是要做成指針的形式,指向一個(gè)數(shù)組,還要知道長(zhǎng)度,在中斷里循環(huán)發(fā)送。不是很直觀,但也很好理解。
于是我也模仿這種方式,在GetSensorData()函數(shù)里,只寫(xiě)了一個(gè)語(yǔ)句,ADC0BUSY = 0;用來(lái)調(diào)用ADC的interrupt函數(shù)。中斷函數(shù)第一次只選擇一個(gè)通道,然后開(kāi)始轉(zhuǎn)換。第二次就設(shè)置下一次的通道,把上一次轉(zhuǎn)換的值付給所需的變量。一共轉(zhuǎn)換9次,調(diào)用interrupt 10次。
期間調(diào)試了很多,還遇到輸出都是00000的情況,原因是在一個(gè)八位變量里左移了8位(相當(dāng)于乘以256)。后面換成這樣的語(yǔ)句后就解決了
1
2
AccAdX = ADC0H;
AccAdX = (AccAdX<<8) + ADCHL;



要注意的是,上面的小括號(hào)一定要加,不然還00000.巨囧。
這樣以來(lái),UART0 和 ADC 都換成中斷的形式了,這就留給姿態(tài)算法更多的時(shí)間了,至少這500多行里只有一個(gè) while(TF2H != 1){;}  用來(lái)判斷是不是達(dá)到系統(tǒng)周期定時(shí)4MS了。沒(méi)有把時(shí)間浪費(fèi)在不該浪費(fèi)的地方,我很欣慰。
昨天做好UART 中斷,今天做好ADC 中斷。繞了很多彎子,不過(guò)總算現(xiàn)在都工作得很正常了~很HAPPY

自己寫(xiě)的(其實(shí)是抄的)代碼,用我的單片機(jī)發(fā)送的AD轉(zhuǎn)換結(jié)果,好像很正常.也許吧..呵呵。至少收到數(shù)據(jù)了。有點(diǎn)點(diǎn)曙光~
總結(jié)到這吧~
希望姿態(tài)算法能寫(xiě)得很順利~
2011/3/26額…很久又沒(méi)更新了,怎么說(shuō),不是我懶(其實(shí)也懶),是有些問(wèn)題實(shí)在太糾結(jié)了。直接說(shuō)正題好了。
嘗試寫(xiě)了一些姿態(tài)算法,寫(xiě)出來(lái),思想并不難,但是必須先做好底層的東西,比如通信。于是姿態(tài)算法就先不做了。
最近一直都在忙一個(gè)東西,一個(gè)小小的外設(shè),可能在晶圓上面它占用的面積也就跟一;覊m差不多,但是實(shí)在是讓我覺(jué)得糾結(jié)。不過(guò)到今天總算差不多弄清楚了。這個(gè)東西就是 C8051F410 的硬件SMBus總線。
這個(gè)SMBus不是真正的SMBus,我覺(jué)得叫做加強(qiáng)版I2C比較合適。第一是沒(méi)有速度的限制,速度可以達(dá)到系統(tǒng)時(shí)鐘的1/10,如果是100MIPS的C8051F,就是10MHz了很夸張的…他有I2C沒(méi)有的功能,低電平超時(shí)檢測(cè)等等…功能多了,帶來(lái)的問(wèn)題就是配置麻煩。
我是第一次接觸這類(lèi)串行總線,著實(shí)讓我郁悶了好久(一個(gè)星期)。一開(kāi)始我去看I2C的總線規(guī)范,并不是很難,用到的就只是最簡(jiǎn)單的幾種時(shí)序。模式很簡(jiǎn)單,就是4種(主機(jī)發(fā)送,主機(jī)接收,從機(jī)發(fā)送,從機(jī)接收),思路很清晰。英文文檔里,主機(jī)叫 Master,從機(jī)叫Slave…字面上解釋?zhuān)戎形牡闹鳌囊羁痰枚,主人和奴隸…
要做這個(gè),我第一反應(yīng)是上網(wǎng)找現(xiàn)成的程序,邊看邊改。很快我找到了一個(gè),在一個(gè)網(wǎng)易空間里的(做技術(shù)的用網(wǎng)易空間的人好多哦)。馬上復(fù)制粘貼,編譯了一下,發(fā)現(xiàn)不行,有一個(gè)寄存器中的值名字叫 “AA” 我找了C8051F410.H ,根本沒(méi)有這個(gè)值,我開(kāi)始覺(jué)得有些不對(duì)經(jīng)了,然后我又找了其他的地方,發(fā)現(xiàn)配置寄存器410中是SMB0CN,而程序里是SMB0STA…越來(lái)越蹊蹺了,后來(lái)看了看文章發(fā)表的時(shí)間,我才反應(yīng)過(guò)來(lái),原來(lái)我落后了。文章是09年寫(xiě)的,好像是針對(duì) C8051F9XX 寫(xiě)的,因?yàn)?xx 的 datasheet 里才有那個(gè)寄存器,我在書(shū)里看見(jiàn)過(guò)。而 9xx 的 SMBus 跟 410 的不同,9xx 的是簡(jiǎn)化過(guò)的,而且又增加了一些功能,比如地址自動(dòng)檢測(cè)等。
于是,我只能自己看文檔自己寫(xiě)程序了,看了很久,但是不懂,又是后來(lái),才反應(yīng)過(guò)來(lái),去找 C8051F 的example 程序,在里面找到了 SMBus,純英文的注釋?zhuān)贿^(guò)好過(guò)沒(méi)有…注釋寫(xiě)得很簡(jiǎn)單很清楚很明了…于是連我這種英文垃圾都能看的懂;撕脦滋斓臅r(shí)間去研究他的例程,得到的結(jié)論依舊悲劇。SMBus 文件夾中一共有6個(gè)文件…
翻譯過(guò)來(lái)分別是:
單主機(jī),單字節(jié)傳送
單主機(jī),多字節(jié)傳送
多主機(jī),單字節(jié)傳送
多主機(jī),多字節(jié)傳送
從機(jī),單字節(jié)傳送
從機(jī),多字節(jié)傳送
我不明白的是,為什么偏偏。。偏偏要把功能都分開(kāi)呢!
我要的是一個(gè)能傳送多個(gè)字節(jié),又做主機(jī),又能做從機(jī)的程序…
最后我選擇在多主機(jī)單字節(jié)上面改。
于是又花了好幾天,到現(xiàn)在的樣子。(省略過(guò)程幾萬(wàn)字的感慨)
結(jié)構(gòu)已經(jīng)基本明了,函數(shù)寫(xiě)完了,編譯出來(lái)沒(méi)有錯(cuò)誤,只差上機(jī)實(shí)驗(yàn)了。今晚有點(diǎn)累了,明天是周末,明天再弄吧。
其次。。我找到了合適的機(jī)架~喔耶耶
機(jī)架一直是我一個(gè)比較郁悶的問(wèn)題。怎么說(shuō)呢,在我自己做的話,不是不可能,我有這個(gè)能力,之前的打算就是買(mǎi)玻璃纖維板,然后鋸成條,再用環(huán)氧樹(shù)脂膠把條粘貼成立體結(jié)構(gòu)的機(jī)架,原理可行,有點(diǎn)麻煩,我不是很愿意做。
今天上英語(yǔ)課的時(shí)候,我突然想到,既然我做的也挺想直升機(jī)的,為什么不能直接利用直升機(jī)的機(jī)架?改一下就可以啦,電池位置也可以很方便地調(diào)整,重量也可以得到控制,最主要的還是,我不用動(dòng)太多手~
于是上網(wǎng)查了一下,這個(gè)才148元,還是碳纖維的,決定要這個(gè)了。(還挺帥哈~)

其次,上位機(jī)的問(wèn)題繼續(xù)糾結(jié)住。
又經(jīng)不住拉框框的誘惑,打算去買(mǎi)本VB的舊書(shū)學(xué)習(xí)學(xué)習(xí)。
今天就到這里吧,好累。
2011/3/27知難而退的好孩子~VC6我搞不定,換個(gè)最簡(jiǎn)單的 Basic 語(yǔ)言弄弄。反正“黑貓白貓,能抓到老鼠就是好貓”搞定一件事,用最簡(jiǎn)單的方法不更好么?
花了兩天的時(shí)間,把 Visual basic 學(xué)了個(gè)大概,去舊書(shū)店買(mǎi)了一本書(shū)(好像昨天是什么地球日來(lái)著,提倡7點(diǎn)半開(kāi)始逛燈一個(gè)小時(shí)?很形式,到處發(fā)傳單。我覺(jué)得,提倡買(mǎi)舊書(shū)更能保護(hù)環(huán)境…)書(shū)是基于,VB6.0 的,這里我糾結(jié)了很久。之前我用 VC6,在 64 位 WIN7 里面編譯不了,只能開(kāi)虛擬機(jī)弄。現(xiàn)在心想著,也許用 BASIC 語(yǔ)言,就可以用 VS 2008 了,那就意味著更智能的編譯環(huán)境,和更加方便的編譯條件…
但是一切都想得太完美了,導(dǎo)致我又繞彎彎了,關(guān)鍵就在于書(shū)是 VB6 的,我的是 VS2008,這里面的 Basic 語(yǔ)法有一點(diǎn)區(qū)別的。具體有多少區(qū)別我不懂,我才接觸BASIC 兩天而已。但是至少我用“組合框”的時(shí)候,根本賦值不了。有必要的話,我再去買(mǎi)一本 VS2008 或者VS2010 的書(shū)吧~
后來(lái)我還是得回到 XP 虛擬機(jī)里面…還好我寒假果斷給電腦換了 7200 轉(zhuǎn)的硬盤(pán)和 4G 的內(nèi)存,不然估計(jì)得卡德悲劇。
Basic 跟 C 其實(shí)差不多…但是也差很多。其實(shí)在我眼里,他們的區(qū)別感覺(jué)就是,C 更底層,Basic 更應(yīng)用,C 區(qū)分大小寫(xiě),要注意內(nèi)存,Basic 不區(qū)分大小寫(xiě),內(nèi)存可以不管。我對(duì) basic 還不了解…別拍我..
Basic 里弄串口還是很簡(jiǎn)單的,MScomm 控件就可以,挺方便的。今天的成果,已經(jīng)可以實(shí)現(xiàn)接收串口數(shù)據(jù)了,接收到的是加速度傳感器的值,已經(jīng)在單片機(jī)內(nèi)轉(zhuǎn)成 ASCII 了。發(fā)送沒(méi)測(cè)試,應(yīng)該不成問(wèn)題。
下面那一大塊空白是留作曲線繪制的時(shí)候用的,不知道有什么好的圖形控件,實(shí)時(shí)觀察傳感器和參數(shù)的曲線。

比起前段時(shí)間用VC來(lái)說(shuō),VB感覺(jué)起來(lái)是自己寫(xiě)的,上次的VC更像是抄的…也許以后都用VB開(kāi)發(fā)上位機(jī)了,功能夠就行,方便更好…
VB很方便啊
2011/3/31待會(huì)就是愚人節(jié)了
AFN上位機(jī)第一版終于做出來(lái)了,現(xiàn)在實(shí)現(xiàn)的功能是實(shí)時(shí)顯示6軸姿態(tài)傳感器的數(shù)據(jù),并畫(huà)成實(shí)時(shí)曲線圖。
看圖吧,累死了。從五天前,從剛剛接觸 VB6和Basic 語(yǔ)言,到現(xiàn)在做出第一版簡(jiǎn)單的數(shù)據(jù)分析,繞了好大的彎彎,不過(guò)到現(xiàn)在總是是有了點(diǎn)點(diǎn)希望。宿舍快斷網(wǎng)了...先傳照片吧。

2011/4/1愚人節(jié)~
今天是母校南寧二中的校慶。。
聽(tīng)到何偉萍校長(zhǎng)病逝的消息..心情有點(diǎn)沉重。我對(duì)她的了解不多,她是我們高三的時(shí)候才上任的。百度一下,才知道她生前的獲的很多榮譽(yù),是個(gè)值得敬佩的人..
昨天寫(xiě)上位機(jī)寫(xiě)得太匆忙,現(xiàn)在做一下補(bǔ)充說(shuō)明
整個(gè)上位機(jī)是基于VB6寫(xiě)出來(lái)的,Basic 語(yǔ)言入門(mén)真的很快很好很簡(jiǎn)單。也許對(duì)于我這種又懶又沒(méi)人教又不努力的人來(lái)說(shuō),是最好的選擇了。
之前嘗試過(guò)了LabView,VC6。labview 是我在 論壇上的上位機(jī)板塊找到的,然后百度一下,做工控軟件似乎很是簡(jiǎn)單。用的是G語(yǔ)言,圖形化的語(yǔ)言,怎么說(shuō),我每次看到都會(huì)小小地糾結(jié)一下。不習(xí)慣,看不懂,然后去嘗試看labview教程視頻。越看越反感,覺(jué)得框框還不如代碼清晰(這個(gè)僅是個(gè)人意見(jiàn)...別敲我,特別是我這種傻瓜,不值得你敲~)。labview 之后,大蔥推薦我去看論壇上的一個(gè)帖子,講的是VC上位機(jī)編程的(上文提過(guò)),我按照帖子做,是做出了一點(diǎn)成果,不過(guò)當(dāng)時(shí)我不是很有耐心去看,也不知道是怎么辦到的。其次我不喜歡VC6的代碼編輯界面,至少得多點(diǎn)“色彩”吧?(單片機(jī)里我一直用 keil4 自己分配關(guān)鍵字的顏色,代碼會(huì)清楚很多)。還有就是,VC 生成的是 C++ 語(yǔ)言的.....
圖表控件是 teechart 4 pro 破解版的....
Text框顯示的是接收到的傳感器的值,空格做分隔符。
下面的淺藍(lán)色條條是實(shí)時(shí)的三軸加速度(Acc),三軸陀螺儀(Gyro)的實(shí)時(shí)顯示,用進(jìn)度條來(lái)作指示,值得范圍是4095~0,加速度計(jì)輸出電壓是0~3.3V,我的AD是0~2.5V,所以整體高了一點(diǎn)。圖表是自動(dòng)往右平移的,網(wǎng)上找不到方法,只好自己摸索。方法是這樣,把橫軸的最大值設(shè)置為自動(dòng),然后把 最大值減去一個(gè)定值,賦值給最小值 就可以了。觸發(fā)用的是定時(shí)器,觸發(fā)間隔是20ms 刷新率50HZ,我在虛擬機(jī)里開(kāi),CPU占用有點(diǎn)高了,達(dá)到35%這樣...
有了圖表觀察起來(lái)就方便多了,自動(dòng)更新數(shù)據(jù),用起來(lái)很不錯(cuò)~~
軟件還有點(diǎn)問(wèn)題,右邊的圖例錯(cuò)了,應(yīng)該是
AccX 紅
AccY 綠
AccZ 藍(lán)

這是一個(gè)問(wèn)題,Gyro的三條線從剛上電開(kāi)始,是一直下降,大概持續(xù)10秒后才能穩(wěn)定在2048左右,很蹊蹺。

從這里可以看到很清楚的 陀螺儀和加速度計(jì)之間存在聯(lián)動(dòng),有了這點(diǎn)設(shè)計(jì)上就會(huì)很方便了。

2011/4/22好久好久沒(méi)更新了捏...
因?yàn)樽罱吡撕芏嗪芏嗦罚瑩Q句話說(shuō)是很多很多彎路
姿態(tài)積分已經(jīng)開(kāi)始寫(xiě)了,飛機(jī)硬件已經(jīng)開(kāi)始做了
反復(fù)看了 論壇 上面的帖子,我忽然意識(shí)到一個(gè)問(wèn)題:他們都是老手,他們都是高手,步驟一般都是先做好硬件,然后畫(huà)好電路板,然后送去打樣,然后,然后的然后!才開(kāi)始寫(xiě)程序,寫(xiě)代碼。
只有我這菜鳥(niǎo)發(fā)癲發(fā)癲的先寫(xiě)軟件,寫(xiě)得差不多了,不管怎樣陀螺儀就是有點(diǎn)點(diǎn)漂移,加速度怎么樣都是那么準(zhǔn),姿態(tài)積分怎么調(diào)都不能再 0 附近...
看了多少姿態(tài)算法,看了多少帖子,試了多少自己的方法。才意識(shí)到原來(lái)是沒(méi)有硬件調(diào)試,調(diào)試個(gè)P啊...你把一塊電路板傳感器放那,他能按你的程序作出反應(yīng)咩?我發(fā)現(xiàn)我就是傻X。
在 C8051F410 的 SMBus 上,徘徊了6天,最終發(fā)現(xiàn)是飛線有管腳虛焊,這堅(jiān)定了我下一步一定要學(xué)protel 畫(huà)板去打樣的信念。(省略1000字感言)
今天早上上完課后,就回到宿舍開(kāi)始鋸玻璃鋼。我有3種厚度的玻璃鋼,2mm 1mm 0.5mm
2mm太厚,1mm太薄...唉!
我放棄了電磨的方式,電磨太重口味,弄得宿舍一股消毒水的味道,試過(guò)在水里切割玻璃鋼,但卻又多了四濺的水
于是手工+銼刀,慢慢磨,慢慢磨....于是成這樣了。。。

鋸子

單條的重量,一共需要4條,作用以后解釋
(皂片丟失了。。)
機(jī)架的重量,最終應(yīng)該在200上下
這重量相當(dāng)于除了電池外的所有東西了...很樂(lè)觀

當(dāng)然上位機(jī)也改了,傳輸改成變量直接傳,加了加法效驗(yàn),不需要轉(zhuǎn)換成ASCII了
加了CPU 占用率,實(shí)現(xiàn)的方法就是在等待定時(shí)器達(dá)到系統(tǒng)周期之前,累加 SystemIdle 這個(gè)32位無(wú)符號(hào)變量的值。最大值是不通信,不做運(yùn)算的時(shí)候記錄下來(lái)的,然后用又計(jì)算又通信的值除以他,得到一個(gè)相對(duì)的空閑量,再變換一下就成了占用率了。雖然是相對(duì)的,但也很夠用很直觀了
看來(lái)我低估了這顆 C8051F410 了, 現(xiàn)在計(jì)算的東西已經(jīng)有最終的大約 1/2 了,然而才占用了8%。49Mhz 50MIPS,真的不是蓋的。
以后可以把系統(tǒng)時(shí)鐘提高到500HZ哈哈

2011/4/24今天把機(jī)架裝起來(lái)了,用的是504膠水,看上去很不錯(cuò)哦,挺堅(jiān)固的,等明天完全凝固了,就開(kāi)始鉆電機(jī)空了,之后就可以上電機(jī)啦~~
全部是手工做的,用銼刀等工具,擴(kuò)孔,從2mm大的空擴(kuò)到13mm,銼刀一點(diǎn)一點(diǎn)銼出來(lái)的。弄得我手上面都是傷。以后打算用protel畫(huà)PCB然后送去加工好了,像他們做四軸一樣,多方便啊。300塊我都愿意了…自己磨太痛苦了。
今天主要放圖片哈~
正在曬太陽(yáng)…等膠水干的日子,也有點(diǎn)點(diǎn)無(wú)聊,下面那兩個(gè)支架,上面還用纖維膠帶綁著…定型,不然就白費(fèi)了
(皂片迷失了。。)
機(jī)架部分特寫(xiě)..

軸承直接用鉗子錘進(jìn)去,然后串上鋁棒,定好位,馬上上膠,大概2個(gè)小時(shí)后就固定好了

支架的重量,有點(diǎn)重了…如果能用PCB做好,就好了,可以在上面打洞,而且也不需要那么厚的。這個(gè)2mm有點(diǎn)夸張了(因此我的手…),其實(shí)1.6mm這樣應(yīng)該剛好合適了。
(照片丟了。。)
加上6mm * 250mm的鋁棒后的質(zhì)量

組裝上去啦,好帥呀~哈哈 208g 是已經(jīng)加了兩個(gè)舵機(jī)在上面的重量了,還是很令人滿意的~

轉(zhuǎn)軸特寫(xiě)~很流暢,每一邊2個(gè)大軸承,沒(méi)有虛位,膠水很給力,缺點(diǎn)是比較重,玻璃鋼難加工!





與飛控?zé)o關(guān) - 記剛開(kāi)始弄飛控那會(huì)兒(下)
記錄的是我的飛行器學(xué)習(xí)的黑歷史,主角是一臺(tái)類(lèi)似 阿凡達(dá)里面的雙槳 VTOL (Vertical Take-Off and Landing)飛行器的詳細(xì)制作過(guò)程。錯(cuò)字連篇,雖然爛尾,沒(méi)有但是..
版權(quán)所有,轉(zhuǎn)載請(qǐng)看

如果沒(méi)看過(guò)上半部: 與飛控?zé)o關(guān) - 記剛開(kāi)始弄飛控那會(huì)兒(上)
2011/5/8又是很久很久沒(méi)更新了,覺(jué)得有點(diǎn)對(duì)比起誰(shuí)…最近做的事不算多,調(diào)好了單片機(jī)之間的 SMBus 通信,又做好了硬件的控制系統(tǒng)。
照片沒(méi)拍什么,所以今天更新就只是文字的啦~盡管看我廢話在這里。
SMBus 的調(diào)試花了很長(zhǎng)時(shí)間。我本來(lái)打算每一幀發(fā)送32字節(jié)的數(shù)據(jù),后來(lái)發(fā)現(xiàn)不是很夠,雖然有很多數(shù)據(jù)是不必須發(fā)送的,但是如果不發(fā)的話,就利于調(diào)試。我主要是通過(guò)串口發(fā)回的數(shù)據(jù)進(jìn)行調(diào)試的,這樣就糾結(jié)了。如果只發(fā)送必須的數(shù)據(jù),32字節(jié)除去幀頭2字節(jié),效驗(yàn)2字節(jié),還有28字節(jié)可用,壓縮一下,完全夠了。
后來(lái)為了方便調(diào)試,還是決定在原來(lái)的基礎(chǔ)上多發(fā)一幀的數(shù)據(jù),于是每個(gè)周期50Hz交換的有效數(shù)據(jù)就有56字節(jié),夠了…可以把完整的傳感器,CPU占用等數(shù)據(jù)完全傳輸回去了?梢宰龅綄(shí)時(shí)不丟幀。
但是,就在這里出了問(wèn)題,我查了很久,后面才查出來(lái),原來(lái)是上一個(gè)數(shù)據(jù)還沒(méi)發(fā)送完,緩沖區(qū)(32字節(jié))不夠大,后來(lái)解決了,等發(fā)送完了再存進(jìn)緩沖區(qū)就好了。
硬件上不知道怎么固定舵機(jī)…繼續(xù)糾結(jié),沒(méi)有螺絲釘。誰(shuí)告訴我最近哪里有小朋友玩的四驅(qū)車(chē)專(zhuān)賣(mài)店…
暫時(shí)用回形針的固定了一下…不是很好捏
剛剛寫(xiě)了PPM信號(hào)的解碼函數(shù),用定時(shí)器3來(lái)測(cè)時(shí)間,直接讀取定時(shí)器的寄存器,這樣做行不行,我是一點(diǎn)都不懂,哎哎。先設(shè)置成高電平觸發(fā),PPM信號(hào)直接接到外部中斷1,在中斷里取定時(shí)器3的值。然后切換到低電平觸發(fā)。如此反復(fù),就可以實(shí)現(xiàn)高低電平都產(chǎn)生中斷,通過(guò)判斷時(shí)間的長(zhǎng)短,還可以分辨出引導(dǎo)段。通過(guò)測(cè)量不同的高電平寬度,就可以計(jì)算出每一個(gè)通道的PPM值。
接下來(lái)還要寫(xiě) 50HZ 的 PWM 信號(hào),用來(lái)驅(qū)動(dòng)舵機(jī)的,應(yīng)該可以驅(qū)動(dòng)6個(gè)通道的舵機(jī),我先做4個(gè)通道的 PWM 吧,其實(shí)AFN模塊還有蠻多的管教可以用的。
PWM 還需要一個(gè)定時(shí)器…現(xiàn)在似乎不夠用了,還有一個(gè)超聲波測(cè)距模塊需要定時(shí)器。
AFN:
Timer0 空閑
Timer1 UART波特率
Timer2 SMBus波特率
Timer3 PPM解碼
ABM:
Timer0 提供整個(gè)系統(tǒng)的時(shí)鐘,ABM 250Hz AFN 50Hz
Timer1 UART 波特率
Timer2 SMBus 波特率
Timer3 空閑
現(xiàn)在整個(gè)系統(tǒng),還有2個(gè)空閑的定時(shí)器,還有超聲波和PWM需要定時(shí)器,這樣的話剛好夠用…如果UART和SMBus用同一個(gè)定時(shí)器的話,整個(gè)系統(tǒng)還可以多出2個(gè)定時(shí)器。不過(guò)這樣SMBus速度就太慢了,只有76k,好像也還好…實(shí)在不行的時(shí)候還可以這樣做。
Timer3實(shí)在不是那么好用,因?yàn)椴荒芪粚ぶ,有點(diǎn)郁悶。
2011/5/14今天是周六,最忙的一周終于過(guò)去了。上一周,我們一共只有3節(jié)大課不用上…累死了。周四晚上進(jìn)山陪舞蹈隊(duì)彩排,周五晚上進(jìn)山去看舞蹈隊(duì)表演…不過(guò)還好~女孩子們很給力,得了個(gè)二等獎(jiǎng)!
周四下午我的“新的”二手鏡頭終于到了,鏡頭是DT16-105。好難找啊…賣(mài)家戀戀不舍地幫我包好,寄過(guò)來(lái)…那包裝實(shí)在是..一句話:從3樓砸下去里面的雞蛋都不會(huì)破…拿到鏡頭直接得跟舞蹈隊(duì)進(jìn)山彩排了,第一次拍舞臺(tái),感覺(jué)好爽~新的鏡頭容易引人注目,總會(huì)有人問(wèn)我價(jià)格,當(dāng)然,不同的人我只能說(shuō)不同的價(jià)格,大概幾百塊到二手價(jià),我都說(shuō)了。
話題岔開(kāi)太多了…呃…
回歸正題,要說(shuō)什么呢,雖然課余時(shí)間少得很,但是這一周還是做了很多東西。八路舵機(jī)驅(qū)動(dòng)器,一次做成功,完美不抖舵,八位分辨率。PPM 信號(hào)解析還沒(méi)搭硬件,苦于沒(méi)有示波器,還有就是發(fā)射機(jī)的八顆電池我實(shí)在懶得去買(mǎi)。但是這個(gè)周末肯定要搞定 PPM 信號(hào)。還有就是把電調(diào)焊好了,但是還沒(méi)敢接上電。焊接功率器件真是費(fèi)焊錫,還好我5節(jié)回家又掰了一大卷過(guò)來(lái)…并且,找到充電器用的12V電源了,電源來(lái)自我高二在“恩山論壇”買(mǎi)的一個(gè)路由器(刷了WRT-DD系統(tǒng))。
有一個(gè)比較無(wú)語(yǔ)的地方是,如果要 UART 和 SMBus 公用定時(shí)器,SMBus 就會(huì)慢得出奇。UART 要工作在 9600或者 38400 下的,因?yàn)?LEA-5Q 這個(gè) GPS 模塊只支持這兩個(gè)波特率。GPS 有 SPI 接口,只是因?yàn)橄辔贿@種我根本就很反感的東西,所以不打算用 SPI 接口。即使是 38400bps,算下來(lái) SMBus 的波特率才2 5600bps,傳完 64Byte 的數(shù)據(jù)需要 20ms,我 AFN 的工作周期都有20ms 了。9600bps 更不用考慮了。所以我還是打算讓 UART 和 SMBus 分開(kāi)各自用一個(gè)定時(shí)器產(chǎn)生波特率。
如果把無(wú)線通信放在ABM里,無(wú)線模塊如果能做到11520bps,SMBus 的 ABM->AFN 方向傳輸速度也有差不多 70kbps,這樣的速度還是可以接受的。
這樣一來(lái),如果把舵機(jī)驅(qū)動(dòng)放在ABM上面就會(huì)好一些,因?yàn)檫有一個(gè)超聲波測(cè)距,而定時(shí)器里面唯一能48分頻的定時(shí)器是Timer0。
現(xiàn)在定時(shí)器資源利用改成如下:
AFN:
Timer0 :
Timer1 :UART波特率
Timer2 :SMBus波特率
Timer3 :PPM解碼
ABM:
Timer0 :八路50HZ PWM信號(hào)輸出
Timer1 :UART波特率
Timer2 :SMBus波特率
Timer3 :提供整個(gè)系統(tǒng)的時(shí)鐘,ABM 250Hz AFN 50Hz
以后需要改的時(shí)候再改。
我覺(jué)得無(wú)線通信如果能放在AFN會(huì)更好,只是現(xiàn)在還找不到更好的解決方法,不行的話就只能放在ABM了。這樣一來(lái),模塊之間的分工好像就有些不符合原先的意愿了。
有一個(gè)小問(wèn)題,就是ABM的引腳似乎不是很夠用了,如果放八路舵機(jī)控制器,管腳就全圓滿了,AFN還剩一堆,F(xiàn)在剛好夠用,就這樣了。先做6路舵機(jī)控制器,剩余兩個(gè),一個(gè)做工作指示,另一個(gè)留來(lái)增強(qiáng)ABM/AFN之間的SMBus通信可靠性,主要是怕總線死機(jī),而且現(xiàn)在應(yīng)用層的通信,雖然有做效驗(yàn),但是沒(méi)做效驗(yàn)不通后的回復(fù),相當(dāng)于UART的單向傳輸而已,沒(méi)有應(yīng)答標(biāo)志的。不過(guò)即使這樣,還經(jīng)常能把我的虛擬機(jī)刷數(shù)據(jù)刷到死機(jī)的,很長(zhǎng)時(shí)間的通信,甚至一個(gè)位都沒(méi)錯(cuò)。贊~
另外,焊接好后我就稱量了一下,所有的重量,到現(xiàn)在為止,工作大概已經(jīng)完成了50%了吧,離飛起來(lái)的日子不遠(yuǎn)了。
看圖:

重量,678g,主控電路單獨(dú)稱就有100多g了,如果畫(huà)板打樣回來(lái)的話,重量還會(huì)少幾十克。電池也放上去了,還有腳架什么的也放上去了。我能想到的東西都放上去了。
如果能如此下去,總重量在700g之內(nèi)是可以辦到的,就算加了螺旋槳保護(hù)圈,也不會(huì)超過(guò)750g;再加上尾桿和尾翼,還有控制舵機(jī)的話,也可以控制在800g之內(nèi)。.
這個(gè)如果能做到800g以下的重量,就可以很輕松地在上面加上云臺(tái),放上攝像機(jī)進(jìn)行航拍。
無(wú)線攝像機(jī)(用來(lái)做第一人稱操控) 50g以下,3軸或2軸云臺(tái),50g以下,攝像機(jī)100多g(用來(lái)航拍錄像或拍照)。
總重在1100g這樣,一塊電池飛行時(shí)間我估計(jì)可以到8~10分鐘。
或者在上面掛載一些幾百克的“西紅柿炸彈”之類(lèi)的東西~用一個(gè)舵機(jī)就可以控制兩個(gè)投彈~多好玩~哈哈
今天YY就到這里~哈~
2011/5/15昨天剛剛更新…按我這懶人的習(xí)慣,起碼要幾個(gè)星期后才會(huì)更新的…但是,今天真的有必要記錄一下!
其實(shí)也不是什么大事…也就是,成功地直接從接收機(jī)里直接提取PPM信號(hào)了,然后又直接從ABM模塊輸出6路PWM信號(hào)驅(qū)動(dòng)舵機(jī)了,還有一點(diǎn)點(diǎn)小小的有周期性的抖舵,大概周期有3秒這樣,不知道怎么解決,或者是設(shè)備的問(wèn)題?
我花了 50RMB 買(mǎi)的 PWM轉(zhuǎn)PPM 板(高手做的,點(diǎn)擊可以看他的帖子)沒(méi)用了,直接接接收機(jī)效果更好一些,經(jīng)過(guò)那塊板之后反倒沒(méi)那么好。
現(xiàn)在還要解決的問(wèn)題一個(gè)是舵機(jī)行程問(wèn)題,這個(gè)在AFN里再寫(xiě)幾十行代碼就行了。另一個(gè)問(wèn)題是如果只接上接收機(jī),沒(méi)打開(kāi)遙控器之前PPM信號(hào)會(huì)全亂套,然后舵機(jī)亂跳,現(xiàn)在的解決方法只能在打開(kāi)ABM電源之前先打開(kāi)遙控器,這樣舵機(jī)就不會(huì)亂串了。
比較感慨的是這次做PPM解碼沒(méi)用多少調(diào)試時(shí)間,雖然第一次上電必出問(wèn)題,是程序員最熟悉最習(xí)慣的方式…
我的PPM信號(hào)提取…本來(lái)先做一個(gè)簡(jiǎn)易的,低頻率的,玩具級(jí)別的邏輯分析儀&示波器。后來(lái)一直沒(méi)空就拖到現(xiàn)在了。是我一直沒(méi)發(fā)表的 FL project 010,以后有時(shí)間做出來(lái)再發(fā)表吧~現(xiàn)在的情況是沒(méi)有示波器。還好我想到,我的萬(wàn)用表是有測(cè)頻率的功能(高一的時(shí)候花了200多RMB買(mǎi)的一個(gè)鉗形表,能測(cè)400A的“直流電”的)。于是我上網(wǎng)又看了一遍PPM信號(hào)的圖。我的接收機(jī)是6通道的,然后分析PPM信號(hào),信號(hào)如圖(這個(gè)圖是別人的經(jīng)過(guò)整形的圖,大概可以表達(dá)意思,借用一下)。萬(wàn)用表,就是我唯一的工具,我來(lái)講一下,我是如何用萬(wàn)用表找到PPM信號(hào)并分析的。

我仔細(xì)分析過(guò)上面的那個(gè)圖,PPM信號(hào)是通過(guò)高電平的寬度來(lái)表示各個(gè)通道的值的。于是我就可以通過(guò)測(cè)量高電平的寬度去取值。我又注意到,6個(gè)通道,每一幀數(shù)據(jù),一共會(huì)有7次電平的漲落,我大概計(jì)算了一下,50HZ的PPM信號(hào)周期,每個(gè)周期有7個(gè)漲幅,所以萬(wàn)用表測(cè)出來(lái)的頻率應(yīng)該在 50 x 7 = 350HZ 這樣。然后我就找到了接收機(jī)里離PWM輸出最靠近的那個(gè)芯片,上網(wǎng)百度一下,找到芯片的資料,希望直接找到芯片的輸入腳。百度之后發(fā)現(xiàn)那是一片單片機(jī)…囧。然后我就給接收機(jī)上電,打開(kāi)遙控器,把萬(wàn)用表調(diào)整到頻率檔,一個(gè)一個(gè)管腳地去測(cè),發(fā)現(xiàn)有一個(gè)管腳 349.XHZ 的頻率!樂(lè)死我了!終于給我找到了..因?yàn)橛械腜PM信號(hào)在輸入其他芯片的時(shí)候,可能是反相的,于是我又打到電壓檔,去測(cè)那個(gè)引腳。結(jié)果為1.幾V的電壓,結(jié)合上面的圖,說(shuō)明這個(gè)“西安孵化6通道接收機(jī)” PPM 信號(hào)在經(jīng)過(guò)最后的單片機(jī)之前是反相的。OK,馬上修改AFN的程序。
關(guān)于外部中斷,好像只有固定的高電平,低電平有效。我之前在這卡了一下,還打算把外部中斷0和外部中斷1連接在一起,一個(gè)設(shè)置高電平有效,一個(gè)設(shè)置低電平有效,這樣設(shè)置來(lái)解決問(wèn)題。后來(lái)發(fā)現(xiàn)根本不用,只需要在電平有效的時(shí)候,設(shè)置另一個(gè)電平有效,這樣就可以在每個(gè)電平變化的時(shí)候(不管是高->低,還是低->高)都產(chǎn)生中斷了,只需要在中斷里再判斷一下管腳是高電平還是低電平就可以了。
PPM解碼用的是AFN模塊C8051F410的外部中斷1,說(shuō)實(shí)話,這是我第一次用“外部中斷”,以前從未用過(guò)這個(gè)…不過(guò)還好啦,編程很順利,今天直接接上AFN,改了一下相位,就OK了,F(xiàn)在PPM解碼有一百多行C代碼,功能也算完善了,接收機(jī)可以熱插拔,不會(huì)影響系統(tǒng)。如果要加功能的話,也就是把上面的問(wèn)題2解決了,在遙控器打開(kāi)之前,讓接收機(jī)不亂跳。解決這個(gè)問(wèn)題在以后是必要的,要實(shí)現(xiàn)自主航線,可能會(huì)超過(guò)PPM信號(hào)的距離,到時(shí)候得由AFN模塊接手了。所以我打算有關(guān)于PPM的各個(gè)通道解碼,行程,微調(diào)全部放在AFN里,而ABM則負(fù)責(zé)利用AFN傳來(lái)的PPM信號(hào),結(jié)合自身計(jì)算出來(lái)的飛行器姿態(tài)進(jìn)行混空,然后直接進(jìn)行輸出。
今天確實(shí)是個(gè)里程碑,實(shí)現(xiàn)了遙控->飛控的能力,雖然只是一小步,但是標(biāo)志著飛控有了硬件的調(diào)試能力。
準(zhǔn)備就能聽(tīng)到螺旋槳切空氣的聲音了~~
接下來(lái)看圖說(shuō)話:

上位機(jī)也新改寫(xiě)過(guò)了,加了PPM信號(hào)的顯示,但是不知道為什么第六通道就是顯示不出來(lái),而ABM上面第六通道我一直用來(lái)當(dāng)供電用,所以也沒(méi)測(cè)試到。應(yīng)該是單片機(jī)上的問(wèn)題,以后找到原因再解決好了。

左邊第一塊板..供電模塊,可以接5~18V的電源,用了兩塊L7805CV,有3A的供電能力,在電源是鋰電池的時(shí)候,提供舵機(jī)和其他5V器件供電用。調(diào)試的時(shí)候直接接miniUSB口。
左邊第二塊板..AFN模塊
右邊第一塊板..ABM模塊
AFN和ABM上面的兩個(gè)黑色的,分別是接收機(jī)和舵機(jī)。
各種亂糟糟線…

天地飛FT06C,功能偏向CCPM直升機(jī)的控,對(duì)于固定翼只提供簡(jiǎn)單的模式。我用的是固定翼模式,夠用了。

各種亂…飛機(jī)裝上螺旋槳的樣子,酷哦~正在調(diào)試飛機(jī)上的舵機(jī)。飛機(jī)上的兩個(gè)舵機(jī)是數(shù)字舵機(jī),PWM 頻率可以超過(guò) 250HZ。不過(guò)我為了兼容性,還是把 PWM 頻率鎖定在 50HZ,桌面上還放著兩個(gè)非數(shù)字舵機(jī),50HZ 下也可以完美驅(qū)動(dòng)。這四個(gè)舵機(jī)都是金屬齒輪的,不怕摔了~

主角..西安孵化的接收機(jī)。找到PPM信號(hào)之后,就在里面引出了線,懶得鉆孔,就直接在這里引出來(lái)了,效果還不錯(cuò)。沒(méi)浪費(fèi)我太多時(shí)間去調(diào)試。
今天就到這里吧~ 還有三個(gè)星期就高考了,想起去年我高考的時(shí)候,和同學(xué)們一起奮斗,那感覺(jué)真好…
2011/5/17好吧…這幾天真是起勁了,連續(xù)更新~
昨天弄 IIC 電調(diào),電調(diào)是 MK 四軸的,我用來(lái)驅(qū)動(dòng)朗宇的無(wú)刷電機(jī)。一直沒(méi)成功,時(shí)轉(zhuǎn)時(shí)不轉(zhuǎn)的,斷斷續(xù)續(xù)。好像通信并不成功,地址什么的都正確,卻只有在上電的瞬間電機(jī)會(huì)啟動(dòng)。我是按地址+八位變量輸出的,就是不正確,看了 MK 的源碼電機(jī)驅(qū)動(dòng)部分,也是這樣驅(qū)動(dòng)的。有幾次RP轉(zhuǎn)了起來(lái),但是也不順暢,這個(gè)電調(diào)和朗宇的無(wú)刷有兼容性問(wèn)題?我不想再折騰了,馬上決定換掉這兩個(gè)電調(diào)。
于是馬上上淘寶買(mǎi)了2個(gè)“好盈程序的新西達(dá)30A電調(diào)”,價(jià)格 37RMB/個(gè)。怎么說(shuō),好幾年前,大概初中的時(shí)候,我第一次接觸無(wú)刷電調(diào),那時(shí)候 20A 的需要 200RMB/個(gè),我籌錢(qián)買(mǎi)了一個(gè),然后就沒(méi)錢(qián)買(mǎi)無(wú)刷電機(jī)了。再后來(lái)就買(mǎi)磁鋼,買(mǎi)廢舊光驅(qū) 10RMB/個(gè),拆光驅(qū),用光驅(qū)電機(jī)來(lái) DIY 功率大一點(diǎn)的無(wú)刷電機(jī),線圈自己繞,磁鋼擺好位置就用 502 貼好。后來(lái)還用鎳氫電池和這個(gè) DIY 的無(wú)刷電機(jī),5030 的槳,把我自己做的飛翼飛起來(lái)了。再后來(lái),鈴鐺外轉(zhuǎn)子無(wú)刷電機(jī)以他的價(jià)格優(yōu)勢(shì),普及了。我就買(mǎi)了一個(gè),但是心里還是覺(jué)得那不算數(shù),我心目中的無(wú)刷電機(jī)是內(nèi)轉(zhuǎn)子無(wú)刷。再后來(lái),我還沒(méi)有機(jī)會(huì)擁有內(nèi)轉(zhuǎn)子無(wú)刷,外轉(zhuǎn)子無(wú)刷就遍地都是了,好在他們外形都“專(zhuān)業(yè)”了好多~我心里才踏實(shí)…
扯遠(yuǎn)了…這個(gè) xxd 無(wú)刷電調(diào)是 pwm 控制的,在啟動(dòng)的時(shí)候是有一些需要注意的地方,我之后會(huì)寫(xiě)好程序。下午拿到快遞(順豐飛了不到24個(gè)小時(shí))就趕回宿舍開(kāi)工了,到現(xiàn)在還沒(méi)吃飯(現(xiàn)在是晚上10點(diǎn))…據(jù)說(shuō)這個(gè)電調(diào)可以開(kāi) 250HZ 以上的 PWM 頻率,控制跟舵機(jī)一樣,就省的我去弄其他的協(xié)議了,由于不是用 IIC 總線的,減少了總線的大小,也避免了幾乎會(huì)使整個(gè)系統(tǒng)完蛋的總線死機(jī)的概率。
插上標(biāo)準(zhǔn)的接收機(jī),馬上啟動(dòng)遙控器,哇..那聲音,真是太爽了!很流暢,兩個(gè)電調(diào)和電機(jī)都工作得很好。換上EPP1045 的槳,那拉力不是一般的大,飛起來(lái)是必須的!實(shí)驗(yàn)了幾分鐘,電調(diào)不熱,電池常溫,看來(lái)即使是夏天,也不需要什么特殊的散熱措施了。
現(xiàn)在的動(dòng)力系統(tǒng)配置:
電機(jī):朗宇2212 KV980 X2
電調(diào):新西達(dá) 30A     X2
電池:牌子不記得了,11.1V 2200mAh
現(xiàn)在全重有750g這樣,包括所有的東西了,主要是控制電路2塊板,電源板1塊,無(wú)線模塊1塊…如果打樣的話,應(yīng)該可以減輕100g?傊650g是非常理想的!
推重比可以達(dá)到3…好夸張!
下面看看今天裝好的圖~

我把幾塊板都連在一起了,這樣方便我收拾桌面,體積好大啊!如果要直接放在飛機(jī)上,比較難哦…
上層是ABM模塊,藍(lán)色板是串口透?jìng),另一邊的綠色板是電源模塊。

AFS上層板,無(wú)線透?jìng),ABM模塊,電源模塊

下層…孤零零的AFN模塊…

在“機(jī)翼”上的兩個(gè)黃色的,就是今天剛到的無(wú)刷電調(diào),都能很好的工作~

嗯…各種亂糟糟的線,還有亂糟糟的飛行器,那塊紅色的是電池 11.1V 2200mAh
右邊那一團(tuán)…電源線啊,IIC總線啊,串口線啊,電源線啊…
桌子角落上是接收機(jī)…
今天就到這里吧~哈哈~
開(kāi)始寫(xiě)混空功能咯~2個(gè)舵機(jī)和2個(gè)電調(diào)要混空的。
2011/5/23又是很久沒(méi)更新了…
從現(xiàn)在開(kāi)始2個(gè)星期內(nèi),我可能得停止硬件調(diào)試了,原因其一因?yàn)橐荚,其二…最悲劇的是我?XP 虛擬機(jī)里用VB6 寫(xiě)的上位機(jī)程序,死掉了,死得噼里啪啦的…源代碼全部亂碼!起因是因?yàn)橐淮伍L(zhǎng)時(shí)間的 USB 口短路,引起電腦藍(lán)屏,虛擬機(jī)非法關(guān)機(jī)…最終結(jié)果就是源代碼變成亂碼了。
代碼備份是有的,可惜最近一次是4月21日的了…通訊的協(xié)議我?guī)缀趺刻於荚诟模栽缇筒皇悄莻(gè)樣子了,成品倒還好好的,但是也是因?yàn)楦牧藚f(xié)議,部分功能已經(jīng)顯示不出來(lái)了。后來(lái)打算重新寫(xiě)一個(gè),只做了界面…就聽(tīng)到日姐姐學(xué)習(xí)C#,看了 VS2010 的界面,很美哇!受不住誘惑,就去查了其他能編上位機(jī)的語(yǔ)言。
期間又嘗試在win7安裝了USB轉(zhuǎn)串口的驅(qū)動(dòng),沒(méi)想到居然就安裝成功了。之前為什么開(kāi)虛擬機(jī),其中一個(gè)原因就是win7裝不上那個(gè)驅(qū)動(dòng)。
我早就受不了 VB6 那個(gè)98年產(chǎn)的,到現(xiàn)在也沒(méi)更新過(guò)的,界面很丑的編譯器了…現(xiàn)在倒安穩(wěn)了,驅(qū)動(dòng)裝上了,沒(méi)得選擇了,果斷換掉VB。于是又開(kāi)始糾結(jié)用什么語(yǔ)言,java 和 C#?C++ 就算了,我在高中的時(shí)候已經(jīng)死過(guò)一次了。學(xué)Java到時(shí)候可以編 android,可以做網(wǎng)站前臺(tái)后臺(tái)都可以,而 C# 可以也比較靠近 ASP.NET,也可以做網(wǎng)站后臺(tái),相對(duì)于java比較簡(jiǎn)單?紤]到C#據(jù)說(shuō)比java簡(jiǎn)單一點(diǎn),我現(xiàn)在需要的是快速開(kāi)發(fā)一個(gè)上位機(jī)代替 VB 那個(gè)爛東西,就決定學(xué)C#了…
在編第二個(gè)上位機(jī)的時(shí)候,遇到了瓶頸,主要是串口通信的時(shí)候有數(shù)據(jù)延遲的問(wèn)題。之前的解決方法是每次從緩沖區(qū)里取100字節(jié)的數(shù)據(jù),然后從里面找出完整的一幀32字節(jié)來(lái),可以做到實(shí)時(shí)顯示不延遲,后果是有很多數(shù)據(jù)會(huì)被丟掉。但是這樣畢竟不好,之后的調(diào)試不允許這樣了,或者說(shuō),需要做到不丟幀。延遲這個(gè)問(wèn)題很?chē)?yán)重,在VB里面有,我就懷疑是我的虛擬機(jī)速度根本不夠解析每一個(gè)字節(jié),后來(lái)?yè)Q成幀數(shù)據(jù)解析,情況好了一點(diǎn),但是還是有很?chē)?yán)重的延遲。
單片機(jī)發(fā)回來(lái)的數(shù)據(jù)一次有3幀,每一幀包括幀頭和效驗(yàn)一共32字節(jié)(兩個(gè)數(shù)據(jù)幀,一個(gè)命令幀)。三幀就是96字節(jié)了。我發(fā)送的頻率是AFN的系統(tǒng)周期,50HZ,串口速度是 115200bps。這樣一來(lái),每秒鐘大概傳輸5800Byte…這樣電腦就都處理不過(guò)來(lái)了..我了個(gè)糾結(jié)!即使是現(xiàn)在用VS2010寫(xiě)出來(lái),延遲還是很?chē)?yán)重,大概幾秒鐘的延遲!用的是 serialports 類(lèi)來(lái)接受,跟以前在VB里用 MSCOMM 空間接收一樣的后果。
解決方法我想到了,比幀解析和字節(jié)解析處理量都小的方法,但是會(huì)丟掉最前面1~2幀的數(shù)據(jù),應(yīng)該不是很重要,大不了開(kāi)機(jī)的時(shí)候多發(fā)一次第一幀。
我就把這個(gè)方法叫做:幀同步接收法
原理大概是這樣:
1.一開(kāi)始先設(shè)置接收一個(gè)字節(jié)就觸發(fā)事件
2.判斷達(dá)到幀頭2個(gè)字節(jié)后,設(shè)置成接收30個(gè)字節(jié)觸發(fā)事件(這一幀先忽略掉吧,接收也可以)
3.達(dá)到30字節(jié)后,設(shè)置接收32字節(jié)(一個(gè)幀的長(zhǎng)度)觸發(fā)事件
4.按順序存入3個(gè)不同的byte[30]數(shù)組(不需要同步,這里只是寫(xiě),另一個(gè)地方只是讀)
5.分析其中一幀的關(guān)鍵數(shù)據(jù)就好了(命令幀)。
然后用定時(shí)器定時(shí)更新界面的數(shù)據(jù),更新圖表就行了

第二次在虛擬機(jī)里開(kāi)發(fā)的上位機(jī),只用了兩天的時(shí)間,界面做好了,通信做好了,其他的還沒(méi)做。沒(méi)有做后臺(tái)的分析和計(jì)算。

這是用C#做的上位機(jī),左下角的命令欄是通過(guò)互相傳送的命令幀進(jìn)行調(diào)試的,右邊的空的一大塊是做3D姿態(tài)顯示和安排一些固定的操控按鈕(起飛,回家,下一個(gè)航點(diǎn)…,當(dāng)然也可以用命令行發(fā)送命令)。參數(shù)設(shè)置用的,地圖是指Google Earth API, 正在學(xué)習(xí),結(jié)合飛行器傳回來(lái)的GPS數(shù)據(jù),寫(xiě)好kml文件后,就可以實(shí)時(shí)顯示飛行器的位置了!哇哈哈!
2011/5/25剛剛看了看word的左下角 “頁(yè)面 55頁(yè)”“字?jǐn)?shù) 16,759”… 沉思了3分鐘,終于得出結(jié)論,我的廢話太多了…不管了,就這樣費(fèi)下去吧。等做完之后,我會(huì)再寫(xiě)一篇只有20頁(yè)左右的總結(jié)性的PDF,多寫(xiě)技術(shù)資料,多寫(xiě)經(jīng)驗(yàn),少?gòu)U話!希望各位還有耐心等下去…我相信我不會(huì)讓你等到滄海桑田的~ 哈哈~
剛剛做好了混空,電機(jī)的混空還沒(méi)測(cè)試,舵機(jī)的混控已經(jīng)很完美了,前后擺動(dòng)的幅度一致,即使推桿拉桿達(dá)到極限后,操作方向依然有動(dòng)作。這樣就安全些了,還把動(dòng)作的幅度降低了一些,避免扭桿扭得太厲害導(dǎo)致超過(guò)舵機(jī)連桿的控制范圍。另外,把方向操作衰減了4倍的后才加入舵機(jī)混控,我可不想方向操作太過(guò)靈敏了。
做這些主要費(fèi)時(shí)間費(fèi)在調(diào)整合適的行程和衰減系數(shù)。整整調(diào)了我好長(zhǎng)一段時(shí)間,記錄一下,左舵機(jī) 230 50 右舵機(jī) 255 80 。
舵機(jī)的方向和俯仰都還沒(méi)有和姿態(tài)積分一起做PI運(yùn)算,明天或者周末加上,其實(shí)做完這個(gè),就可以飛了。電機(jī)的PI控制已經(jīng)做好了,就等上機(jī)測(cè)試了。
另外,上位機(jī)繼續(xù)完善,可以說(shuō)功能越來(lái)越強(qiáng)大了,自己都佩服死(自戀ing)。還沒(méi)做上位機(jī)回傳到下位機(jī)的數(shù)據(jù),所以右邊的參數(shù)調(diào)整面板暫時(shí)不可用(要不是這樣剛剛也不需要花那么多時(shí)間去調(diào)行程了),C#下操作數(shù)據(jù)和字節(jié)的轉(zhuǎn)換有點(diǎn)麻煩,等有時(shí)間再做。
還有就是上位機(jī)的圖表控件換成我最熟悉的 teechart 2010 推薦使用這個(gè)哦~CSDN有破解版下載。期間試過(guò)NTGraph MSChart…等等…

看圖就好啦~ 命令欄暫時(shí)用作串口數(shù)據(jù)監(jiān)控,等我做好回傳程序后,命令調(diào)試欄和參數(shù)設(shè)置就真正有用了。
3D顯示我還沒(méi)找到方法,NI的labview 有控件,不知道怎么提取,也許只能,用D3D了…
2011/6/16
至于上次更新是什么時(shí)候,我也懶得去看了…有一件事差不多可以確定了,首飛會(huì)在家里而不是在學(xué)校,因?yàn)檫有3個(gè)星期就放假咯,現(xiàn)在考試又多,不是很有時(shí)間做這個(gè)。
之前一直在糾結(jié)軟件的問(wèn)題,不管怎么說(shuō),還是作出了挺多的成果的。比較自豪的是我發(fā)明的那個(gè)“幀同步接收法”,我打算在飛行器上面也用這個(gè)方法接收電腦或者手機(jī)傳上來(lái)的數(shù)據(jù),這個(gè)方法耗CPU實(shí)在是夠少的,對(duì)系統(tǒng)影響小到不能再小了。還沒(méi)優(yōu)化過(guò)就有不錯(cuò)的效果,對(duì)于單片機(jī)這種速度更低的器件,幀同步接收法應(yīng)該是在CPU占用和數(shù)據(jù)完整性上的最優(yōu)解了。接收數(shù)據(jù)時(shí)只處理幾個(gè)關(guān)鍵字節(jié),然后驗(yàn)證,就沒(méi)事了,不需要分析完每一個(gè)字節(jié)。剩下的字節(jié)等CPU空閑了或者需要使用的時(shí)候再去處理。
思路已經(jīng)完整了,等有時(shí)間了就寫(xiě)單片機(jī)上的代碼。
其實(shí)這段時(shí)間也一直在做東西,我說(shuō)過(guò)我不想讓洞洞板飛起來(lái),于是我學(xué)了PCB做板,視頻教程看了幾個(gè)小時(shí),就開(kāi)始畫(huà)了。遇到了很多問(wèn)題,有的是通過(guò)網(wǎng)上解決的,有的是自己憋得慌憋出來(lái)的。
肚子餓死了,外賣(mài)還沒(méi)來(lái)!
看看成果吧,我第一次畫(huà)板。排元件排了一個(gè)下午,然后自動(dòng)布線的,電源線還沒(méi)改粗。只是擺元件擺得眼花。在5CM*5CM的電路板上塞下兩片單片機(jī),幾個(gè)傳感器,N片電源芯片,近十個(gè)接口,電阻電容幾十個(gè)…只希望你看到圖片不要吐出來(lái)。
對(duì)外接口有:
12V DC
PPM 信號(hào)輸入
ABM/AFN調(diào)試接口
PWM 舵機(jī)驅(qū)動(dòng)  (6通道,包括電源也做在板上了,獨(dú)立2A電流的7805供電)
GPS 接口      (其實(shí)就是UART,獨(dú)立3.3V AS1117供電)
氣壓傳感器接口(5V供電,ADC轉(zhuǎn)換)
超聲波測(cè)距接口(5V供電,接中斷)
I2C總線接口  (5V對(duì)外供電)
Nokia 5110 液晶屏接口
原理圖就先不放出來(lái)了,因?yàn)樘罅耍懦鰜?lái)也看不清楚。

電源線還沒(méi)改呢,線都是10mil寬的,改完電源線就差不多了。有一個(gè)不懂的地方,就是怎么在四個(gè)角打上螺絲釘能扭住的地方呢?郁悶。

Altium designer 6.9 大蔥推薦的…
有預(yù)覽功能,還是3D的,個(gè)人比較偏向藍(lán)色或者紅色的板,比較好看吶,雖然貴了50RMB…糾結(jié)!不過(guò)綠色就免了,我不想第一塊板看起來(lái)就那么丑。
絲印層還要調(diào)整一下,其他的差不多了。沒(méi)有大面積地線的余量,話說(shuō)第一次做板就做這種那么復(fù)雜的,要是沒(méi)有自動(dòng)布線我不知道怎么辦了…眼都花。接口太多,差不多要成篩子了…這是正面,放傳感器單片機(jī)用的,背面放電源模塊和電阻電容一堆。
2011/6/20正在打樣…很無(wú)語(yǔ),我最不喜歡的就是等待…但是一般東西都齊全了,我又懶得動(dòng)手做了。剛剛查了工程圖學(xué)的成績(jī),還好沒(méi)掛,79分,不算很高,拉學(xué)分是大三才該考慮的事…大一的我就別慌張先了。
淘寶了 L3G4200D ADXL345,還在路上,第一次遇到順豐發(fā)了三天的情況。這三個(gè)傳感器我一共花了138RMB,其實(shí)可以花得少一點(diǎn)的,只是曾經(jīng)在一個(gè)賣(mài)家那里買(mǎi)過(guò)模擬的傳感器和陀螺儀(就是上文我用的那塊紅色的板子)還有磁阻傳感器,和賣(mài)家聊得來(lái),也不用擔(dān)心買(mǎi)到假貨(這東西有假的不?)。
PCB已經(jīng)重新修改過(guò)了,自己布線花了一個(gè)中午和一個(gè)下午的時(shí)間,第一次布線實(shí)在是比較糾結(jié),什么都不懂,線也不聽(tīng)話。不過(guò)最終算是做完啦~
板子已經(jīng)送到嘉立創(chuàng)打樣了,過(guò)兩天就到。相對(duì)于上面的,還調(diào)整了一點(diǎn)位置,用兩片C8051F410,還能裝逼一下“雙核的哦”
看看板子吧~
阻焊用的是紅色,比較顯眼一點(diǎn)~純粹為了擺炫…也是為了試飛的時(shí)候,周?chē)耐瑢W(xué)能一眼看出這上面還多了“電路板”而不是一個(gè)普通的模型…

反面,當(dāng)然要感謝下
(圖丟失)

現(xiàn)在應(yīng)該糾結(jié)的問(wèn)題是怎么焊接那兩片傳感器,只靠電烙鐵我覺(jué)得有點(diǎn)懸,打算做一套預(yù)熱的裝置。用最簡(jiǎn)單的東西。
用易拉罐做一個(gè)小托盤(pán),然后去外面搞點(diǎn)細(xì)沙回來(lái),沒(méi)有細(xì)沙就買(mǎi)一包鹽,然后把鹽或者細(xì)沙鋪在托盤(pán)上,最后放上電路板。
然后給那兩個(gè)傳感器的管腳和電路板上的焊盤(pán)上一層錫,然后用蠟燭在托盤(pán)下加熱,這樣做可能達(dá)不到焊錫的熔點(diǎn),但是也能使焊錫更容易融化一些,然后再用電烙鐵對(duì)著焊盤(pán)焊接,再加一點(diǎn)錫,或者不加。不打算做溫度控制。PCB有十塊,燒壞一塊還有9塊…不怕不怕。
一切都得實(shí)驗(yàn)后才知道可行性...不過(guò)感覺(jué)這樣做應(yīng)該有效果的
2011/6/21今天已經(jīng)查到我的PCB已經(jīng)發(fā)過(guò)來(lái)了,暈死,因?yàn)槭巧钲诎l(fā)過(guò)來(lái)的,我今早剛被快遞吵起床,從深圳發(fā)到桂林,順豐不超過(guò)18個(gè)小時(shí)就到了。明早我還有課呢,要是他發(fā)過(guò)來(lái)我就死定了。
今天呢,繼續(xù)無(wú)聊,于是給飛機(jī)做了尾翼。
說(shuō)真的,尾翼在這個(gè)無(wú)人機(jī)上可有可無(wú)的,它本身的控制能力已經(jīng)可以進(jìn)行全方位的控制了,尾翼在這飛機(jī)上唯一的作用就是在飛航線的時(shí)候使飛機(jī)平穩(wěn)一些。這個(gè)尾翼只有升降舵,沒(méi)有方向舵,尾翼的形狀大概是120度的三片玻璃鋼板。尾翼和尾架都是0.5mm的玻璃鋼板做的,尾架上有四根牙簽做加固。膠水依舊是504。
雖然用處不是很大。不過(guò)裝了尾翼之后看起來(lái)更帥了~~
尾翼+尾舵機(jī)重量估計(jì)在50克整,不是很影響。只是重心要重新調(diào)了。剛剛又拆掉機(jī)架上固定尾管的部分,11g的重量。覺(jué)得好開(kāi)心啊,F(xiàn)在除掉主控電路,且不裝槳保護(hù)器的情況下,重量只有627g。這代表著什么~哈哈。
在室外,重量不到700g,室內(nèi)(加將保護(hù)器)750g以內(nèi)。對(duì)電池,對(duì)電調(diào),對(duì)馬達(dá)都顯得毫無(wú)壓力,懸停時(shí)小消耗的電流估計(jì)在10安以內(nèi),2200mah的電池可以飛12分鐘,3000mah的電池可以飛18分鐘…
今天拍了好多圖片~看圖吧~

尾部的支架,牙簽作為支架,現(xiàn)在完全干固后會(huì)用鉗子減掉多余的部分用螺絲釘與機(jī)架固定在一起。

剪刀靠在那里,做些修正,因?yàn)檎车臅r(shí)候發(fā)現(xiàn)有些傾斜了。

這是尾翼..不多說(shuō)了,一樣用牙簽做固定,相當(dāng)?shù)膱?jiān)固

整機(jī)咯~在宿舍的走廊上完成今天的工作。

換一個(gè)角度,尾翼和支架是半透明的,有點(diǎn)軟,不過(guò)強(qiáng)度完全足夠了。尾翼可以做升降舵運(yùn)動(dòng),是整個(gè)尾翼一起動(dòng)的,類(lèi)似金魚(yú)的尾巴

可以清晰地看到牙簽的固定,當(dāng)然里面除了牙簽,里面平行于牙簽的還有玻璃鋼板。

有人好奇旋翼的結(jié)構(gòu),我就拍兩張清晰的圖給大家看看

另一邊,看上去是不是一樣的?那你就錯(cuò)了,我安裝的方式是對(duì)稱的,看不懂?自己好好想想

稱稱~哈,重量嘛~看下一張圖片

638g,后來(lái)又減掉11g,就是627g。除了主控電路,其他的都在上面了哦
主控電路不會(huì)超過(guò)50g~

槳保護(hù)器一起,670多g,還少了一些支架。

這個(gè)最終成品應(yīng)該在60g以下,現(xiàn)在還少了一些支架。這方面設(shè)計(jì)我遇到點(diǎn)麻煩,不知道怎么固定地好。有幾種方案。
  • 完全剛性的,繼續(xù)用0.5mm的玻璃鋼板,6條或者8條支架..(懶得做)
  • 類(lèi)似自行車(chē)條幅一樣,用魚(yú)線制作(很難做)
而且固定還郁悶…
算了,以后再做這個(gè)保護(hù)架。明天PCB就要到了,答應(yīng)要送一片給Linda美女的,希望她能收藏好哦~
然后實(shí)驗(yàn)一下鹽浴加熱法
今天到此為止咯~明天還要交一篇論文,郁悶
2011/6/22今天板子到了…
焊接LGA封裝實(shí)在是一種挑戰(zhàn),不過(guò)就像焊接LQFP一樣,一開(kāi)始很痛苦,后來(lái)焊著焊著,覺(jué)得越焊越爽。
費(fèi)了一個(gè)中午,小心翼翼終于把兩個(gè)傳感器焊接好了。沒(méi)有用鹽浴法…天氣太熱了!

焊接好兩個(gè)傳感器之后事情就變得簡(jiǎn)單了,LQFP用托焊的方法,其他的…隨便了。
只是四個(gè)接口的插口,做得不是很好,打得過(guò)孔太小了!插進(jìn)去費(fèi)了好大的力氣。下次記得改過(guò)來(lái)。


待會(huì)改程序,然后準(zhǔn)備下載到這板子上來(lái)了。
希望一次成功不要出錯(cuò),至少電路不要出錯(cuò)了!
2011/9/23很久沒(méi)更新了,之前的電路板子設(shè)計(jì)有問(wèn)題。
我把兩片C8051F410之間的通訊,ADXL345 L3G4200D 的通訊全部丟到IIC總線上了,又因?yàn)槲业南到y(tǒng)工作速度是250HZ。
實(shí)際總線速度最快只有160kbps 導(dǎo)致的結(jié)果是系統(tǒng)整個(gè)被拖慢了。
沒(méi)辦法,現(xiàn)在全部從新設(shè)計(jì)
最終方案如下
控制器 STM32F103RE   
三軸陀螺儀 L3G4200D
三軸加速度計(jì) ADXL345
三軸磁阻傳感器 HMC5883L
氣壓傳感器 MPX4115A
鐵電儲(chǔ)存器 FM25CL64
GPS LEA-5Q
超聲波傳感器
九軸傳感器全部采用數(shù)字傳感器
陀螺儀和加速度計(jì)接入STM32的SPI1接口,HMC5883L接入STM32的I2C1接口
MPX4115A接入STM32的ADC
GPS 接入 STM32的USART3。LEA 5Q 擁有38400bps的UART速度,和4HZ 的高速更新率。
FM25CL64 鐵電儲(chǔ)存器接入SPI2 將用來(lái)保存配置參數(shù),航點(diǎn)信息
超聲波傳感器接入中斷,用于貼地飛行,自主降落時(shí)精確定高
另外STM32負(fù)責(zé)解碼PPM接收機(jī),混合控制信息后,通過(guò)PWM輸出。
PWM設(shè)計(jì)為6通道(因?yàn)楣苣_沖突,沒(méi)能設(shè)計(jì)成八個(gè)通道真是遺憾)
前四通道采用250HZ高速輸出。高電平為0.5~1.5ms,主要用于姿態(tài)控制的兩個(gè)數(shù)字舵機(jī)和電調(diào),使飛機(jī)具有高速反應(yīng)能力。
后二通道為標(biāo)準(zhǔn)50HZ PWM輸出,兼容普通舵機(jī)
I2C接口將用來(lái)拓展其他模塊,例如航行LED燈控制,例如三軸云臺(tái)控制模塊等等
唯一的遺憾是沒(méi)有加入SD卡的驅(qū)動(dòng)。這個(gè)將在V0.3之后的飛控版本上加入!

新的PCB將采用藍(lán)色的阻焊油。我一直討厭綠色,寧可多花50RMB!

另外一個(gè)更重要的更新是 RT-Thread 將被移植到這塊V0.2的控制板上。
經(jīng)過(guò)前一塊板子的失敗,我深刻了解到,當(dāng)任務(wù)很多時(shí),順序結(jié)構(gòu)將很難勝任。這次我決定在飛行器上移植國(guó)產(chǎn)RTOS RT-Thread,以應(yīng)對(duì)多任務(wù)的復(fù)雜度。
移植版本先暫定0.3.2 之后再考慮0.4 。0.3.2資料相對(duì)多一些,我也是第一次接觸RTOS。這幾天查找了很多資料,看了一整本書(shū)之后,感覺(jué)移植不會(huì)有很大的困難,接下來(lái)要做的就是要適應(yīng)在操作系統(tǒng)上編程了。
STM32F103RE 512kB rom 和  64kB ram 足夠我揮霍啦~ 要是能找到合適的TF卡座封裝就好了,直接加TF卡,再移植FAT文件系統(tǒng),記錄更完整的飛行數(shù)據(jù)是非常有意義的事情。
新的飛控板將實(shí)現(xiàn)自主航行飛行功能。
當(dāng)然一切都是設(shè)想。。。
后天順豐就把新的傳感器和芯片,PCB送到我手上了~~~

就是那么突然,這篇日記式的制作筆記就這么爛尾了
原文將近 70 張圖,2萬(wàn)多字,可能是因?yàn)榍懊鎻U話太多了導(dǎo)致寫(xiě)不下去了吧。。
在這之后,這個(gè)雙軸飛行器,曾經(jīng)嘗試去飛了一次,并不成功,沒(méi)有離地就翻了。飛機(jī)沒(méi)有摔壞。當(dāng)然,爛尾的只是這個(gè)最初的雙軸飛行器,當(dāng)我最后決定把飛控跑在STM32 + RT-Thread 上之后。更多地精彩和玩法一直在繼續(xù),直到最后成為了。一個(gè)從大一開(kāi)始做的設(shè)計(jì)



評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
B!ueice + 5 絕世好帖!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:147926 發(fā)表于 2016-11-14 23:47 | 只看該作者
厲害厲害厲害 真的超厲害 受益匪淺 學(xué)習(xí)到很多
回復(fù)

使用道具 舉報(bào)

板凳
ID:140358 發(fā)表于 2016-11-24 09:15 來(lái)自手機(jī) | 只看該作者
bhghdjfgfg
回復(fù)

使用道具 舉報(bào)

地板
ID:138104 發(fā)表于 2017-2-11 07:58 來(lái)自手機(jī) | 只看該作者
支持你。我的哥
回復(fù)

使用道具 舉報(bào)

5#
ID:186732 發(fā)表于 2017-4-6 15:59 | 只看該作者
謝謝樓主分享,正需要
回復(fù)

使用道具 舉報(bào)

6#
ID:185829 發(fā)表于 2017-4-14 16:40 | 只看該作者
很下功夫的,學(xué)到機(jī)械電子軟件硬件一大堆。。。。
回復(fù)

使用道具 舉報(bào)

7#
ID:184816 發(fā)表于 2018-2-4 00:14 | 只看該作者
很厲害 不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

8#
ID:280876 發(fā)表于 2018-7-17 10:59 | 只看該作者
老哥是二院的吧?膜拜優(yōu)秀校友
回復(fù)

使用道具 舉報(bào)

9#
ID:498382 發(fā)表于 2019-3-26 02:47 | 只看該作者
學(xué)習(xí)了。≈x謝分享。!
回復(fù)

使用道具 舉報(bào)

10#
ID:505153 發(fā)表于 2019-4-5 02:03 | 只看該作者
地面站軟件是自己寫(xiě)的嗎?
回復(fù)

使用道具 舉報(bào)

11#
ID:250717 發(fā)表于 2019-4-9 14:01 | 只看該作者
牛逼哄哄啊可以
回復(fù)

使用道具 舉報(bào)

12#
ID:388013 發(fā)表于 2019-5-15 20:42 | 只看該作者
厲害了樓主啊!
回復(fù)

使用道具 舉報(bào)

13#
ID:244461 發(fā)表于 2019-10-14 12:55 | 只看該作者
很厲害。。。。。
回復(fù)

使用道具 舉報(bào)

14#
ID:155547 發(fā)表于 2020-1-29 21:12 | 只看該作者
RT-Thread操作系統(tǒng)的移植
回復(fù)

使用道具 舉報(bào)

15#
ID:186249 發(fā)表于 2020-5-13 22:00 | 只看該作者
好長(zhǎng)啊,寫(xiě)這么多
回復(fù)

使用道具 舉報(bào)

16#
ID:1101756 發(fā)表于 2023-12-6 10:38 | 只看該作者

厲害厲害厲害 真的超厲害 受益匪淺 學(xué)習(xí)到很多
回復(fù)

使用道具 舉報(bào)

17#
ID:993877 發(fā)表于 2024-3-1 14:37 | 只看該作者
很厲害 不錯(cuò)不錯(cuò),值得學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表