張雨辰,孫琛,林奎,秦生輝
(北方工業(yè)大學(xué),北京100000)
四旋翼機(jī)器人是一種靈巧的、電動(dòng)的、可以垂直起降的,能夠遙控或自主飛行并執(zhí)行任務(wù)的一種空中機(jī)器人。四旋翼機(jī)器人具有4個(gè)螺旋槳并呈十字形交叉結(jié)構(gòu),相隔的螺旋槳為一組,兩組的旋轉(zhuǎn)方向不同,相鄰兩個(gè)螺旋槳旋轉(zhuǎn)方向不同來抵消水平反扭力矩,保證自身不發(fā)生自旋。與其它空中機(jī)器人相比,其靈活性體現(xiàn)在只通過改變螺旋槳的速度就可以執(zhí)行飛行任務(wù)。
本課題采用msp430g2553作為主要控制系統(tǒng),通過使用C語(yǔ)言編寫程序,使用S-BUS協(xié)議實(shí)現(xiàn)對(duì)飛機(jī)的通信。選用msp430微控制器作為控制系統(tǒng)是因?yàn)樵撓盗锌刂破饕呀?jīng)廣泛用于家用電器和工業(yè)控制之中,而且價(jià)格便宜,易于購(gòu)買和自主設(shè)計(jì)。微控制器系統(tǒng)降低了外圍硬件設(shè)備的投資,省去了遙控器等設(shè)備的麻煩,無(wú)論是日常生活還是工業(yè)生產(chǎn)也都會(huì)隨之更加的方便。
Futaba S-BUS通信協(xié)議是一種用來控制舵機(jī)的串口通信協(xié)議。最多可以包含16個(gè)舵機(jī)的數(shù)據(jù),它是由經(jīng)典的RS232串口通信協(xié)議發(fā)展過來的,邏輯取反。它的長(zhǎng)度為25字節(jié),每字節(jié)包括1位起始位0,8位數(shù)據(jù)位,1位奇偶校驗(yàn)位(若8為數(shù)據(jù)位中有奇數(shù)個(gè)1,則奇偶校驗(yàn)位取1,若有偶數(shù)個(gè)1則奇偶校驗(yàn)位取0),2位結(jié)束位11。信號(hào)周期為14毫秒,其中前3毫秒是數(shù)據(jù),后11毫秒是延時(shí),置低電平。用來發(fā)送數(shù)據(jù)的3毫秒中,共發(fā)送25*(1+8+1+2)=300位數(shù)據(jù),也就是說,每位數(shù)據(jù)(高或低電平)持續(xù)10微秒的時(shí)間。
該協(xié)議有25個(gè)字節(jié)。其中第一個(gè)字節(jié)是起始字節(jié),然后是22個(gè)包含數(shù)據(jù)的字節(jié),最后是一個(gè)標(biāo)志字節(jié)和結(jié)束字節(jié)。起始字節(jié)中的8位數(shù)據(jù)位為11110000b,即完整起始字節(jié)為011110000011b。標(biāo)志字節(jié)可根據(jù)不同飛控自行設(shè)定,用于承載除了舵機(jī)數(shù)據(jù)以外的數(shù)據(jù)。結(jié)束字節(jié)中的數(shù)據(jù)位為00000000b。
協(xié)議中有22個(gè)包含數(shù)據(jù)的字節(jié),每個(gè)字節(jié)數(shù)據(jù)位為8位,22*8=16*11,也就是說每個(gè)舵機(jī)的數(shù)據(jù)長(zhǎng)度為11位。實(shí)際傳輸時(shí)需要把16個(gè)舵機(jī)數(shù)據(jù)填入22個(gè)包含數(shù)據(jù)的字節(jié)中,填入方式為第一個(gè)字節(jié)的8位和第二個(gè)字節(jié)的前3位為第一舵機(jī),其中第一字節(jié)8位中的最高位為舵機(jī)的最低位,第二字節(jié)的從最高位數(shù)第三位為舵機(jī)的最高位。第二個(gè)字節(jié)的后5位和第三個(gè)字節(jié)的前6位為第二舵機(jī),以此類推。
程序主要由發(fā)送數(shù)據(jù)和接受數(shù)據(jù)2個(gè)模塊組成。流程如下所示:
圖1 發(fā)送數(shù)據(jù)
圖2 接收數(shù)據(jù)
MSP430單片機(jī)不能對(duì)字節(jié)進(jìn)行操作,因此將待發(fā)送或接收數(shù)據(jù)的每一位依次和要使用的I/O口進(jìn)行與操作,從而實(shí)現(xiàn)信號(hào)的發(fā)送與接收。具體做法是根據(jù)配置的波特率,使用時(shí)鐘定時(shí)改變管腳電平的高低,達(dá)到發(fā)送二進(jìn)制數(shù)據(jù)的目的。因?yàn)镾-BUS的邏輯電平是反的,所以高電平為0,低電平為1。
發(fā)送數(shù)據(jù)時(shí),程序首先發(fā)送一個(gè)起始字節(jié)0xF0,然后按S-BUS的規(guī)則將每個(gè)通道拆分成各個(gè)數(shù)據(jù)字節(jié)(在本文使用的程序中通過改變IO口的電平模擬數(shù)據(jù)位的發(fā)送)。發(fā)送數(shù)據(jù)字節(jié)流程如下:
圖3 發(fā)送數(shù)據(jù)字節(jié)流程
程序首先發(fā)送一個(gè)起始位(高電平),然后將通道1的低8位放到第一個(gè)數(shù)據(jù)字節(jié),將通道1的高3位放到第二個(gè)數(shù)據(jù)字節(jié)的低3位,以此類推計(jì)算出每個(gè)數(shù)據(jù)字節(jié)并發(fā)送。當(dāng)每一個(gè)數(shù)據(jù)字節(jié)中的數(shù)據(jù)位發(fā)送完后,計(jì)算偶校驗(yàn)位并發(fā)送,最后發(fā)送停止位(低電平)。之后程序繼續(xù)發(fā)送下一個(gè)數(shù)據(jù)字節(jié),直到22個(gè)數(shù)據(jù)字節(jié)發(fā)送完成。
數(shù)據(jù)字節(jié)全部發(fā)送完成后,程序?qū)l(fā)送標(biāo)志字節(jié)flags,最后發(fā)送結(jié)束字節(jié)0x00。flags的內(nèi)容為:flags=bit7=ch17=digital channel(0x80)
接收數(shù)據(jù)時(shí),程序先收到一個(gè)起始字節(jié),據(jù)此判斷新的一幀開始。然后將收到的22個(gè)數(shù)據(jù)字節(jié)解析出來。一種方法是,根據(jù)發(fā)送時(shí)的計(jì)算方式,反過來將每個(gè)字節(jié)通過左移或右移運(yùn)算之后,相應(yīng)位上按位與1,達(dá)到解析的目的。由于通道數(shù)較少,故可以用這樣一種較為取巧的方式。如果偶校驗(yàn)位錯(cuò)誤,則請(qǐng)求重新發(fā)送這一字節(jié)。之后將解析出的16個(gè)通道的數(shù)據(jù)傳遞給飛控,查看標(biāo)志位的內(nèi)容,最后接收到結(jié)束字節(jié),一幀結(jié)束,等待接收下一幀。
以第一、第二個(gè)通道為例,當(dāng)接收到第一個(gè)和第二個(gè)數(shù)據(jù)字節(jié)時(shí),將第一個(gè)數(shù)據(jù)字節(jié)右移3位后,按位與00011111111,將結(jié)果存入buffer_1,第二個(gè)數(shù)據(jù)字節(jié)左移8位后,按位與11100000000,將結(jié)果存入buffer_2,再讓buffer_1按位與buffer_2即可得到第一個(gè)通道的數(shù)據(jù)。同理,將第二個(gè)數(shù)據(jù)字節(jié)右移6位后,按位與00000011111,將結(jié)果存入buffer_3,第三個(gè)數(shù)據(jù)字節(jié)左移2位后,按位與11111100000,將結(jié)果存入buffer_4,再讓buffer_3按位與buffer_4即可得到第二個(gè)通道的數(shù)據(jù)。
本文對(duì)S-BUS協(xié)議的環(huán)境設(shè)置以及具體的數(shù)據(jù)結(jié)構(gòu)進(jìn)行了說明,并給出了S-BUS在MSP430上的實(shí)現(xiàn)。本系統(tǒng)進(jìn)一步完善的話,可以將解析通道的部分用一個(gè)更好的算法替代本文的移位算法??梢钥吹絊-BUS是一種簡(jiǎn)單的四旋翼通信協(xié)議,同時(shí)16個(gè)通道也較好地滿足了四旋翼飛行器對(duì)信號(hào)傳輸?shù)男枨蟆?/p>