如何使用Arduino制作簡(jiǎn)單低成本的RC控制器
在這個(gè)中級(jí)電子和無(wú)線電通信教程中,我們將深入研究使用Arduino平臺(tái)和nRF24L01+無(wú)線模塊構(gòu)建功能齊全的8+通道RC(無(wú)線電控制)發(fā)射器和接收器。該項(xiàng)目結(jié)合了微控制器編程,傳感器集成和射頻通信的核心技能,非常適合希望擴(kuò)展DIY遠(yuǎn)程控制系統(tǒng)知識(shí)的愛(ài)好者。
應(yīng)用程序
本RC系統(tǒng)可用于:
?遙控飛機(jī)、船和汽車(chē)
?DIY無(wú)人機(jī)或四軸飛行器
?無(wú)線機(jī)器人控制
?多伺服控制系統(tǒng)
為什么是nrf24lo1?
2.4 GHz射頻通信:工作在2.4 GHz ISM頻段,可實(shí)現(xiàn)中短距離(使用外置天線時(shí)為1km ~ 5km)的無(wú)線數(shù)據(jù)傳輸。
?基于包的通信:數(shù)據(jù)以小數(shù)據(jù)包(最多32字節(jié))發(fā)送,內(nèi)置CRC檢查錯(cuò)誤和自動(dòng)確認(rèn)(ack)以提高可靠性。
?多數(shù)據(jù)管道:支持多達(dá)6個(gè)數(shù)據(jù)管道,允許一個(gè)接收器監(jiān)聽(tīng)多個(gè)發(fā)射機(jī)使用唯一的地址。
?低功耗:傳輸時(shí)僅消耗~ 12ma,可進(jìn)入超低功耗休眠模式,提高電池效率。
?SPI接口:使用SPI協(xié)議與微控制器通信,用于高速數(shù)據(jù)傳輸和配置。
?可調(diào)功率和數(shù)據(jù)速率:傳輸功率和數(shù)據(jù)速率(250kbps, 1mbps, 2mbps)可以根據(jù)距離和速度進(jìn)行調(diào)整。
注意:要為接收器供電,僅使用1 (ONE) ESC的BEC,因?yàn)槌^(guò)1個(gè)電源輸入可以擊穿nano的5v引腳。
無(wú)線電總結(jié)
發(fā)射機(jī)的一面:
?從電位器和開(kāi)關(guān)等輸入設(shè)備讀取模擬或數(shù)字值。
?將這些值打包到結(jié)構(gòu)化數(shù)據(jù)包中。
?通過(guò)nRF24L01+模塊按設(shè)定的頻率發(fā)送報(bào)文。
接收端:
?連續(xù)偵聽(tīng)傳入的數(shù)據(jù)包。
?解析接收到的數(shù)據(jù)并將其映射到伺服位置或電機(jī)速度。
?包括安全功能,如信號(hào)丟失超時(shí)檢測(cè)。
發(fā)射機(jī)的代碼
主要功能:
?創(chuàng)建一個(gè)無(wú)線RC發(fā)射機(jī)使用電位器(或操縱桿)和按鈕。
?通過(guò)nRF24L01+將控制數(shù)據(jù)發(fā)送到接收端進(jìn)行控制:
?4個(gè)模擬通道:副翼、升降舵、方向舵、油門(mén)
?2個(gè)數(shù)字通道:按鈕(如彈射或齒輪)
?將指數(shù)響應(yīng)曲線(expo)應(yīng)用于模擬控制,使接近中心的操縱桿控制更平滑。
庫(kù)和初始化
?這些庫(kù)允許Arduino使用SPI并與nRF24L01+無(wú)線電通信。
?設(shè)置無(wú)線電對(duì)象,CE在引腳7,CSN在引腳8。
?使用5個(gè)字符的管道地址與接收方通信。
數(shù)據(jù)結(jié)構(gòu)(包)
?這是一個(gè)緊湊的自定義協(xié)議,僅占用18字節(jié)。
?它在單個(gè)數(shù)據(jù)包中有效地傳輸4個(gè)模擬軸位置+ 2個(gè)按鈕狀態(tài)。
?創(chuàng)建一個(gè)名為data的全局實(shí)例。
注意:你可以添加更多的變量,但最多只能添加32個(gè)字節(jié)(int是4個(gè)字節(jié),char是1個(gè)字節(jié),等等)。
設(shè)置函數(shù)
?begin(9600):?jiǎn)⒂么姓{(diào)試。
?radio.begin():初始化nRF24L01+模塊。
?openWritingPipe():設(shè)置用于向接收者發(fā)送數(shù)據(jù)的地址。
?setPALevel():降低功率電平(使用RF24_PA_LOW或HIGH以獲得更大范圍)。
?setDataRate():采用慢速可靠的數(shù)據(jù)速率(250kbps)。
?stoppllistening():設(shè)置模塊為傳輸模式。
注意:使用完全相同的設(shè)置為接收器和發(fā)射器。
主循環(huán)
?從模擬引腳讀取操縱桿值。
?轉(zhuǎn)換模擬值(0-1023)到伺服角度(0-180)。
?使用applyExpo()函數(shù)將指數(shù)曲線應(yīng)用于副翼、升降舵和方向舵。
?讀取按鈕狀態(tài)(HIGH =未按下)。
?如果未按下則發(fā)送‘1’,如果按下則發(fā)送‘0’(如果需要,您可能需要翻轉(zhuǎn)此邏輯)。
?將整個(gè)數(shù)據(jù)包通過(guò)無(wú)線電發(fā)送給接收者。
applyExpo()函數(shù)
?該函數(shù)對(duì)輸入應(yīng)用指數(shù)響應(yīng)曲線:
?Expo = 0:全線性響應(yīng)(無(wú)曲線)。
?世博> 0:軟化中心附近的靈敏度。
?它將0-180范圍內(nèi)的輸入映射到90(中心)附近的規(guī)范化曲線。
注意:這給了你精確的控制靠近操縱桿的中心和完整的旅行在兩端。
接收方代碼
主要功能:
?使用nRF24L01+模塊從發(fā)射器無(wú)線接收控制信號(hào)。
?解析6個(gè)通道(可擴(kuò)展)的輸入:4模擬(x1, y1, x2, y2)和2數(shù)字(b1, b2)。
?驅(qū)動(dòng)5個(gè)伺服器,用于2個(gè)副翼,1個(gè)升降舵,1個(gè)方向舵和1個(gè)電機(jī)(ESC帶BEC)。
?應(yīng)用微調(diào),映射,世博(通過(guò)dualRate)和信號(hào)安全(例如,約束())。
nRF24L01設(shè)置
?使用地址為“77777”的管道0偵聽(tīng)傳入數(shù)據(jù)。
?設(shè)置為最小功率(考慮RF24_PA_LOW或RF24_PA_HIGH以獲得更好的范圍)。
?使用250kbps,在更長(zhǎng)的距離上獲得更好的可靠性。
?禁用自動(dòng)確認(rèn)最小延遲或ping。
注意:為了擴(kuò)大范圍,考慮制作nrf24lo1,地面范圍助推器(教程即將推出)。
伺服系統(tǒng)初始化
?定制PWM范圍(1000-2000μs),通過(guò)附加(引腳,min, max)節(jié)流-用于esc。
?其他伺服使用默認(rèn)的544-2400μs范圍。
控制邏輯
?油門(mén)開(kāi)始在90(0推力),因?yàn)樗遣倏v桿的中性或默認(rèn)位置。
?0.7用作限制器,這樣電機(jī)就不會(huì)太熱或燒壞。
?使用dualRate()根據(jù)費(fèi)率因子限制旅行(對(duì)于初學(xué)者)。
?對(duì)所有表面應(yīng)用修剪值。
?電梯映射是倒置的,這是典型的取決于操縱桿的方向。
雙速率函數(shù)
?限制移動(dòng)范圍。
?清潔和可重復(fù)使用的所有表面。
本文編譯自hackster.io