基于nRF24L01+與Arduino的超聲波測距系統(tǒng)設(shè)計
距離是描述建筑物平面結(jié)構(gòu)的重要內(nèi)容,建筑物尺寸的傳統(tǒng)測量手段都需要人員借助工具現(xiàn)地進行,但面對比較危險的建筑物時,傳統(tǒng)的測量手段勢必增加人員的傷亡幾率。隨著科學技術(shù)的發(fā)展,測距技術(shù)和無線傳輸技術(shù)日趨成熟,無人距離測量在特殊領(lǐng)域中將得到廣泛應(yīng)用。利用超聲波測距成本低、精度高、速度快等技術(shù)特點,結(jié)合單片機、無線通信技術(shù)可對建筑物內(nèi)部平面尺寸進行測量,并將數(shù)據(jù)無線傳至終端設(shè)備實時顯示。
1 系統(tǒng)結(jié)構(gòu)
超聲波測距系統(tǒng)由發(fā)射端和接收端兩部分組成。發(fā)射端由Arduino開發(fā)板、無線射頻發(fā)射模塊、天線、超聲波模塊及電源模塊組成。接收端由Arduino開發(fā)板、無線射頻接收模塊、天線和終端設(shè)備等組成。
在系統(tǒng)發(fā)射端,超聲波模塊HC—SR04對距離信號進行實時采集,在Arduino的控制下通過無線射頻發(fā)射模塊將距離數(shù)字信號發(fā)送至接收端;在系統(tǒng)接收端,在Arduino開發(fā)板的作用下,通過無線射頻接收模塊接收發(fā)射端發(fā)送過來的距離數(shù)字信號,通過串口通信模塊與PC機進行通信,在PC機中利用軟件讀取數(shù)據(jù)并繪制曲線。
2 系統(tǒng)硬件電路設(shè)計
2.1 Arduino控制板
本系統(tǒng)中所采用的Arduino UNO是一塊采用USB接口的核心電路板,處理器核心是ATmega328,包括14個數(shù)字輸入輸出IO(其中6個可提供PWM輸出),6個模擬輸入IO,一個16 MHz晶體振蕩器,一個USB口(便于在線進行程序調(diào)試),一個電源插座和一個復(fù)位按鍵。
2.2 測距傳感器
HC—SR04超聲波測距模塊可提供2~400 cm的非接觸式距離感測功能,測距精度可達到3 mm,模塊包括超聲波發(fā)射器、接收器和控制電路。模塊采用IO口TRIG觸發(fā)測距,給至少10μs的高電平信號,之后模塊自動發(fā)送8個40 kHz的方波,自動檢測是否有信號返回,如有信號返回.通過IO口ECH0輸出一個高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。
2.3 nRF24L01+無線傳輸模塊
nRF24L01是一款新型單片射頻收發(fā)一體器件,工作于2.4~2.5 GHz ISM頻段。其內(nèi)置頻率合成器、功率放大器、晶體振蕩器、調(diào)制器、低噪聲放大器等功能模塊,并融合了增強型ShocKBurst技術(shù),其中輸出功率和通信頻道可通過程序進行配置。nRF24L01具有極低的電流消耗,當工作在發(fā)射模式下發(fā)射功率為0 dBm時電流消耗為11.3 mA,接收模式時為13.5 mA,掉電模式和待機模式下電流消耗更低。本文采用nRF24L01+模塊,在原模塊的基礎(chǔ)上增加了PA和LNA。在發(fā)射端通過PA電路將nRF24L01的輸出功率放大,同時在接收端通過LNA電路增加接收信號的強度。
2.4 SPI連接
Arduino與nRF24L01+無線收發(fā)模塊之間利用同步串口SPI進行通信。nRF24L01+的SPI總線有GND(接地)、VCC(1.9~3.6 V電源)、CE(使能發(fā)射或接收)、CSN(片選信號)、SCK(時鐘信號)、MOSI(數(shù)據(jù)輸入)、MISO(數(shù)據(jù)輸出)、IRQ(中斷標志位)。Arduino與nRF24L01+的連接圖如圖1所示。
2.5 實驗電路連接圖
發(fā)射端(HC—SR04、nRF24L01+和Arduino連接)和接收端(nRF24L01+和Arduino連接)實驗電路連接如圖2所示。
3 系統(tǒng)的軟件設(shè)計
3.1 無線發(fā)送模式流程
對nRF24L01+的相關(guān)寄存器進行配置,設(shè)置為增強型ShockBurstTM發(fā)送模式,通信速率為1 Mbit/s,晶振16 MHz,發(fā)射功率設(shè)置為0 dBm,MCU通過MOSI寫入數(shù)據(jù),通過MISO讀出數(shù)據(jù),設(shè)置通過nRF24L01+的數(shù)據(jù)輸入,保存到TX FIFO寄存器中,開始發(fā)送數(shù)據(jù)。在數(shù)據(jù)發(fā)送之后,讀取狀態(tài)寄存器的值并做出判斷,確定是否接收到應(yīng)答信號,判斷自動重發(fā)次數(shù)是否達到最大值(10次)。如果在設(shè)定的應(yīng)答時間內(nèi)接收到應(yīng)答信號,則認為數(shù)據(jù)成功發(fā)送到了接收端。如果在設(shè)定的時間范圍內(nèi)沒有接收到應(yīng)答信號,則重新發(fā)送數(shù)據(jù),并且自動重發(fā)計數(shù)器自動加1。若自動重發(fā)次數(shù)達到最大值,則表明數(shù)據(jù)沒有發(fā)送成功,需要清除MAX_RT位讓數(shù)據(jù)繼續(xù)重發(fā)。發(fā)送程序流程圖如3所示。
發(fā)射程序中的主要函數(shù)如下:
void TX_Mode (void) //初始化nRF24L01+設(shè)備進入發(fā)送模式
void Send_Data(int a) //發(fā)射數(shù)據(jù)“a”
unsigned char SPI_Read_Buf(unsigned char reg,unsigned
char*pBuf,unsigned char bytes) //從寄存器“reg”讀無符號字符型變量
3.2 無線接收模式流程
設(shè)置nRF24L01+為接收模式,與發(fā)射端相同的CRC配置、地址寬度、頻道和傳輸速率,拉高CE啟動接收,通過讀取狀態(tài)寄存器的值判斷是否有數(shù)據(jù)接收,若有數(shù)據(jù),接收端通過自身通道地址與接收到的數(shù)據(jù)包中的地址進行匹配,若相同就接收該數(shù)據(jù),若不同就放棄該數(shù)據(jù),繼續(xù)等待接收。接收程序流程圖如圖4所示。
接收程序中的主要函數(shù)如下:
void RX_Mode (void) //初始化nRF24L01+設(shè)備進入接收模式
void Recive Data() //接收數(shù)據(jù)
unsigned char SPI_Write_Buf(unsigned char reg,unsigned
char*pBuf,unsigned char bytes) //將nRF24L01+的內(nèi)容寫入緩沖區(qū)“*PBUF”
4 實驗結(jié)果
按照本方案設(shè)計的超聲波測距系統(tǒng)(實物如圖5所示)經(jīng)過建筑物現(xiàn)地測試,測量最大寬度8 m,最大高度4 m,超聲波模塊工作穩(wěn)定,無線傳輸模塊傳輸距離符合要求,完全可以達到實際應(yīng)用的目的。由于該系統(tǒng)目前還是初具功能的試驗品,測距平臺上功能模塊不夠豐富,應(yīng)搭配更多的傳感器模塊,提升系統(tǒng)功能。
5 結(jié)束語
本文著重介紹了基于nRF24L01+與Arduino的超聲波測距系統(tǒng)的設(shè)計,通過較低的成本實現(xiàn)了超聲波測距、數(shù)據(jù)無線傳輸、PC機實時接收顯示并繪制曲線等功能,可搭載不同的移動平臺,完成建筑物測距任務(wù),具有一定的實用價值。