楊光 范志華 蘇成貴 鐘文才 許光明 李愛琴
(吉林省農業機械研究院,吉林 長春 130022)
目前市面上有已經有一些相關產品,但是采用的控制方式有以下弊端:有線信號傳輸,不方便連接和安裝;固定的液位傳感器由于裸露的部件容易被水中雜物纏繞包裹,影響液面位置的判定,導致誤判。項目組為了解決此問題,設計了一套無線便攜式浮漂排水控制器,該裝置具有以下優勢:采用無線模式進行信號傳輸,便于安裝,只需要放入水中即可,不需要連線;傳感器選用重力球機械感應原理,不受水質限制,經久耐用;可以替代人工監控儲水液面,在水位較低時停止排水,水位升高到一定程度時啟動排水,無需人員現場監控,通過設置可實現供水排水功能轉換。本項目利用NRF24L01模塊來實現各個部件的無線通訊,其工作頻段在2.4~2.5GHZ,該頻段是世界通用ISM頻段(不受管制的頻段),通信距離可達300m。
本方案是一套無線控制的浮球控制裝置系統,能夠代替人工對監控水面進行監管控制,按照人工設定功能及時進行相應,實現水泵及時排水給水功能[1],見圖1。

圖1 整體示意圖
1.1.1 排水工作狀態解析
浮球在漂浮時能夠在液面上保持豎立狀態,該狀態可以指導并控制排水泵開展排水工作。排空水池后,浮球在池底時保持橫臥狀態,并控制排水泵停機。
1.1.2 供水工作狀態解析
排空水池后,浮球在池底時保持橫臥狀態,并控制注水泵加水。水池加滿后,通過水位感應器控制注水泵停機。
1.1.3 無線裝置
本項目設計4種無線裝置:主機、供水泵及排水泵控制裝置、浮球液位控制器。主機控制器功能:供排水選擇、與其他3個裝置進行通訊、采集滿水信號。供水控制裝置功能:該裝置可以接收無線信號自帶小型可控制繼電器,可以輸出控制220V信號,以此來控制下一級的啟動水泵的繼電器,所以可以串聯接入原有的供水泵控制系統,對供水泵進行控制。排水控制裝置可以串聯接入排水泵原有的控制系統。浮球控制裝置功能:定時向主機控制器傳輸液位是否下降至底部信息,見圖2。

圖2 浮球裝置微動開關
本項目制作的共4個裝置,均采用單片機加NRF24L01模塊組合,采用嵌入式編程設計,見圖3。

圖3 無線模塊與單片機連接
本項目的工作原理是通過測量水池液位的滿和空2個狀態及主機設置的排水還是供水目的來實現供水和排水。本項目所研究系統共有4個部件組成,分別是主機控制器、排水泵控制器、供水泵控制器、浮球傳感器。主機的功能是接收水池邊的滿水信號和浮球的空水信號,再按照排水供水功能選項指揮排水裝置控制排水泵,或指揮供水裝置控制供水泵。供(排)水控制器的功能是接收主機的指令并通過供(排)水空開箱控制供(排)水泵工作。浮球傳感器的功能是測量到水池液面已經近似空水位狀態時發送空水位信號給主機控制器。
主機和3個從機對以上4個條件全部設置一致,如果是主機先發送數據,理論上3個從機都會收到數據,所以這樣做是不行的。1個無線節點對多個無線節點的通訊可以通過修改以下內容實現:頻道、地址、頻道和地址。如,從機1的頻道是10,從機2的頻道是30,從機3的頻道是50,從機4的頻道是70(頻道的值可以是0~125,共126個頻道)[2];頻道接近的話,有可能出問題,如,從機1的頻道是20,如果設置從機2的頻道是21的話,主機給從機1發送數據時,從機2也有可能收到數據。所以要向上面一樣,頻道距離拉開一些。從機的頻道定義好了,主機要和從機1通信,自身就把頻道改為從機1一樣的頻道10,就可以發送數據,此時,從機2~4由于頻道不同,是收不到數據的。同樣,主機要和從機2通信,就把自己的頻道改為和從機2一樣的頻道30,然后就可以發送數據。
以下程序是通過按鍵0和2來對從機1地址進行修改的程序:
if(KEY==0)//按下KEY1
{
NRF_CE=0;//拉低CE引腳
W_Reg(WRITE_REG+RF_CH,10);//修改為從機1的頻道
NRF_CE=1;//拉高CE引腳
TxPacket(rece_buf);//發送數據
}
else if(KEY2==0)//按下KEY2
{
NRF_CE=0;//拉低CE引腳
W_Reg(WRITE_REG+RF_CH,30);//修改為從機2的頻道
NRF_CE=1;//拉高CE引腳
TxPacket(rece_buf);//發送數據
}
本項目用單片機的P1.1~P1.7連接NFR24L01模塊。

圖4 單片機與NRF24L01的接口設置
本系統共涉及4個模塊的程序設計,主機的功能相當于指揮官,浮球是觀察兵,排水和供水裝置相當于陸戰隊員。所以要對4個模塊進行分別的程序編寫。下面以主機編寫為例進行介紹,其他程序編寫與之類似。
NRF24L01模塊與單片機可以有效連接,但是NRF24L01的內部寄存器比較多,設置起來比較復雜[3],具體設置程序可以按說明書的要求編寫。本項目采用C語言,通過uVision來實現。作為主機程序順序圖的編寫可見圖5。
NRF24L01有接收、發送、待機模式II、待機模式I、掉電模式,其工作模式由CE和寄存器內部PWR_UP位狀態、PRIM_RX位狀態共同控制,由CE引腳電平來控制[4]。
NRF24L01有寄存器25個,這些寄存器起到了狀態指示、地址寬度、讀寫配置、使能允許、射頻設置等。可以通過對寄存器的設置來實現相應的功能。配置寄存器讀寫程序一般都是按照時序圖完成,在這里不做贅述。
本項目中需要對單片機與nRF24L01的通訊進行測試,以便設備調試和維護,設置自測按鍵,在主程序中增加按鍵掃描程序,當掃描到自測開關被按下后,單片機向nRF24L01某個寄存器寫入一個數據,再把數據讀取出來比對,如果數據一致則證明通訊沒有問題,可以點亮通訊正常指示燈,如果數據不一致或沒有返回數據,則點亮通訊失敗指示燈。
自測程序:
void nrf_zc(void)
{
SPI_R_W_Reg(WRITE_REG | CONFIG,0x50);
if(SPI_Read(CONFIG)==0x50)
{
int i;
for(i= 0;i<3;i++)
{
LED4=0;
delay_ms(300);
LED4=1;
delay_ms(300);
}
}
else if (0x50 !=SPI_Read(CONFIG))
{
int i;
for(i=0;i<4;i++)
{
LED5=0;
delay_ms(300);
LED5=1;
delay_ms(300);
}
}
}
以上自測程序是單片機向寄存器CONFIG中寫入0x50數據,然后再讀取CONFIG中的數據并與0x50進行比較,如果相等則LED4燈閃爍3次,如果不相等,則LED5燈閃爍4次。
在NRF24L01點對點或點對多的無線通訊中,有些程序需要反復調試,調試過程如果遇到沒有正常反應的情況下是比較麻煩的,所以本項目購置了USB加NRF24L01模塊來作為中轉實現程序的調試,可以將接收信號傳入電腦,通過串口助手對數據進行顯示和分析。這樣比較直觀地看到接收的數據。一旦調試成功后再與另外的無線節點進行通訊,成功率就很高。
NRF24L01的功能解讀,該芯片的主要特點:2.4G全球開放工業、科學、醫療3個領域的頻段(ISM),免許可證使用;最高工作速率2Mbps,最低工作速率250Kbps;125個可選的頻道,滿足多點通信和調頻通信的需要,值得注意的是這是理論值,實際工作中應該保持頻道的間隔不要太近,以免造成信號干擾;內置CRC檢錯功能。NRF24L01采用SPI通訊協議,這個協議中在通訊命令發出后有接收反饋功能,如果接收不到反饋信號,則證明數據或命令沒有發送成功,所以通訊質量比較高;低工作電壓(1.9~3.6V)。如圖6所示。

圖6 NRF24L01 電路板
各管腳定義:1.GND;2.VCC;3.CE;4.CSN;5.SCK;6.MOSI;7.MISO;8.IRQ。具體說明:1.GND地線。本實驗功能簡介:在2塊51開發板上下載NRF24L01的主從程序后,在主機中進行排水和供水的選擇,實現系統排水或供水的功能。模塊接口與開發板對應的管腳原理圖,如圖7。

圖7 NRF24L01無線模塊和開發板的連接圖
本系統共有4張圖,其中供水泵無線控制器的電路原理圖如圖8。用單片機的P1.2~P1.7通過接口J44連接NRF24L01的MISO、IRQ、MOSI、CS、SCK、CE。P2.0作為電機驅動的輸出信號端口。用P0.0~0.3作為工作狀態指示燈的輸出控制端。其他3個板子的連接方式與之類似。
NRF24L01模塊具有一對多通訊功能,地址需要分配。4個節點都可以是接收模式,也可以是發送模式,彼此之間隨時可以通訊,為了彼此通訊順暢,多數時間都是接收模式,誰想發言誰變成發送模式,發完后馬上變身接收模式,這樣可以保證信號不打架,當然同時出現2個以上節點同時變身發射模式的概率非常低。只要節點X發送地址和節點XX的接收地址一樣,節點XX就會收到發送來的數據,接收數據完成后節點XX的IRQ就會有中斷產生。當RX_DR或TX_DS或MAX_RT為1時,nRF的硬件引腳IRQ自動產生中斷。該引腳復位需要通過CONFIG來進行設置。圖9是本項目中4個節點的收發模式的地址表。

圖8 控制排水泵電路圖

圖9 該系統4個節點地址分配圖
在對NRF24L01了解以后,首先編寫底層程序:底層程序是NRF24L01依據SPI開展工作的基本程序,其是依據工作時效完成并建立的,包括對字節、數據的讀和寫程序。NRF24L01采用SPI通信協議采用主從方式工作,全雙工,同步(需要時鐘線)通信總線,SCK信號線只由主設備控制,且數據為一位一位的進行傳送SPI的數據輸入和數據輸出線獨立。MOSI的意思就是說如果此芯片作為主機時,該引腳(MOSI引腳)就是輸出,如果此芯片作為從機時,該引腳(MOSI)引腳就是輸入。MISO與其道理類似。由于SPI采用2個移位寄存器來實現數據的交換,所以在8個時鐘過后,主機的數據會發送到從機中,同時,從機的數據也會發送到主機中。底層驅動時序:數據為先發高位,再發低位,在時鐘SCK的上升沿,數據發送出去。通信前需要先發送命令位,即S7~S0為status寄存器位,D7~D0為數據位。
NRF24L01的SPI同步讀寫時序程序:
uchar SPI_RW(uchar reg)//在發送一字節的同時,還會收到一字節的數據
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(reg & 0x80);
reg=(reg<<1);
SCK=1; //拉高SCK時鐘線
reg |=MISO;//獲取從機發給主機的一位數據,將其放到主機寄存器的最低位
SCK=0;//拉低SCK時鐘線
}
return(reg); //返回從機發給主機的數據
驅動層程序:驅動程序是依據底層程序編寫的對NRF24L01各種寄存器的配置與設置程序,包括了對所有寄存器的初始配置。
應用層程序:為保證項目功能實現而編寫的程序,包括水泵的啟停關系程序,鍵盤的掃描程序,主機對傳感器信號的采集程序等。下面是一段供排水命令程序:
voidSupply(void) //發送是否供水命令
{
Change_TX_RF_1(60);//調整頻段為供水頻段60,與供水泵通訊
if(KEY4==1) //空水標志指示空水,說明沒水了。需要注水,啟動注水泵
{
TX_BUF[0]=1; //數據1送到緩存,1代表應該注水,啟動注水泵
TX_Mode(TX_BUF); //把nRF24L01設置為發送模式并發送數據
Check_ACK(0); //等待發送完畢,清除TX FIFO
Supply_blink(5); //閃爍供水泵通訊燈。快閃爍5次
}
if(KEY3==1) //滿水標志指示水滿了,需要停止注水,停止注水泵
{
TX_BUF[0]=0;//數據0送到緩存,0代表不應該注水,停止注水泵
TX_Mode(TX_BUF);
Check_ACK(0);
Supply_blink(5); //閃爍供水泵通訊燈。快閃爍5次
}
Change_TX_RF_1(40); //重新調回頻段為主機頻段40
RX_Mode(); //轉化為接收模式
delay_ms(250);
finish_blink(3); //閃爍發送完成燈。慢閃爍3次
}
void Drainage(void) //發送是否排水命令
{
Change_TX_RF_1(50); //調整頻段為排水頻段50,與排水泵通訊
if(KEY3==0) //滿水標志指示水滿了,需要啟動排水,啟動排水泵
{
TX_BUF[0]=1; //數據1送到緩存,1代表應該排水,啟動排水泵
TX_Mode(TX_BUF);
Check_ACK(0);
Drainage_blink(5); //閃爍排水泵通訊燈。快閃爍5次
}
if(KEY4==0) //空水標志指示空水,KEY4等于1,說明水空。不需要排水,停止排水泵
{
TX_BUF[0]=0; //數據0送到緩存,0代表不應該排水,停止排水水泵
TX_Mode(TX_BUF);
Check_ACK(0);
Drainage_blink(5); //閃爍排水泵通訊燈。快閃爍5次
}
Change_TX_RF_1(40); //重新調回頻段為主機頻段40
RX_Mode(); //轉化為接收模式
delay_ms(250);
finish_blink(3); //閃爍發送完成燈。慢閃爍3次
}
無線浮球控制器是一個小型產品的變革式發展,由于對無線控制技術的引用,會提高浮球液位控制器的應用范圍,增加其適應性。該系統應用場景多,攜帶方便,安裝快捷,傳輸信號質量可靠,設定好初始狀態后無人值守,省時省力。同時對無線技術的應用可以推廣到其他自動測控領域。