利用多個nRF24L01+模塊組網通信的實現方式
這里討論的組網方式,不包含使用6個通道實現的多對1通信方式,因其只限於6個發送端,局限性很大,可以附加其他技術實現更好的組網,暫時這里不討論。這里分享的是所有nRF24L01+模塊都使用通道0,實現的數量遠超過6個的組網方式。
經過實戰總結,可以實用到落地項目的有輪詢方式、時分方式、自主避讓方式等幾種常用的組網方式,下面會逐一講解實現原理。
防撞(防沖突)機制的實現原理
其實無論使用那種方式,都會涉及到防止沖突,也就是防止該信道出現多個發射信號沖撞的現象,因為一旦發生,接收方很難接收成功。除了組網內的各模塊之間會發生這類現象,而且還要考慮工程密集安裝的時候,也會與鄰近其他組網的模塊出現沖撞,所以防撞機制是必要的。
行之有效的防撞方式,經過實戰檢驗,采用檢測信道占用+按編號延遲的方式,可以很好的躲避碰撞。首先通過我的博文“nRF24L01+如何檢測信道被占用-RSSI寄存器實戰分享”里講的,在發送之前先檢測信道情況。然后如果信道忙,則根據自身編號(每個從機都從1-255進行依次編號)乘以一個時間基數,比如1ms(根據單片機處理相關邏輯的速度可加長),這樣每個從機都會在檢測到信道忙的時候,延時不同的時間再次檢測和發送。如果同時遇到多個一起要發送,也會因為延時不同的原因,接下來就會錯開了。
還有一種情況,就是在檢測信道的時候是空閑的,但是在進入正式發送的時候,剛好有其他模塊發送了,這就真撞上了。但是因為有編號延時機制,那么當檢測到發送失敗后,各自錯開延時再次嘗試,也會最終躲避碰撞了。
輪詢方式一主多從
輪詢方式是最安全可靠的方式,是典型的一主多從的組網方式。所有從機都不會主動發送信息,平時一直處於接收狀態。只有主機發送給某個從機詢問指令的時候,該從機才會立刻回復一條信息后,立刻再置為接收狀態。這樣就避免的多個模塊隨意發產生的頻繁碰撞問題,使得每次通信都安全可靠。
但是這種方式是要規定一個輪詢的時間間隔,主機定期詢問一遍從機,這個時間間隔就影響了數據同步反應的速度。時間設置太短,模塊工作太頻繁。時間設置太長,從機的變化不能及時反應到主板。而且如果從機數量很多的話,每輪詢一輪下來的時間也不可忽視,所以不適用於對從機變化的同步要求高的應用場景。
時分方式一主多從或多主多從
時分方式,是將所有參與組網的模塊,按照編號順序依次分配一個時間段作為發送的時間窗口。只有到模塊自己的窗口期才可以發送,否則不能發送,平時都處在接收狀態。這種方式也很好的規避了碰撞問題,但是遇到發送失敗的話,就要等待下一個窗口期再嘗試,否則會影響其它模塊的發送。
這種方式就要求各個模塊可以發送的時間間隙被確定下來,而且必須有一個時間基准,所有模塊再同一個時間基准上開始計算自己的窗口期是哪里。時間基准的同步是這個方式的難點。實戰中這種方式需要做一個群發模式,先讓所有從機工作在同一個地址上,然后主機或臨時主機發送時間基准,所有從機同時接收(不能一個一個發送,因為會有時延)。然后從機再工作在各自的地址上接收。
由於每個模塊都分配了屬於自己的發送窗口期(窗口期要大於模塊發送一組32字節所需要的時間),所以這種方式既可以一主多從,也可以多主多從。但由於窗口期不能設置太短,對數量比較多的組網情況下,每個模塊的兩個窗口期的間隔可能會很長,所以組網數量不適合太多的應用場景。
自主避讓方式一主多從或多主多從
自主避讓方式,就是所有模塊的發送時間都是沒有限制的,有數據需要傳送的時候就發,不經過任何主機指揮協調,遇到發送失敗或信道占用,就延時躲避再次嘗試,直到發送成功。
這種方式即可以一主多從,也可以多主多從。因為誰都可以隨時發送,所以不需要主機協調,但是如果組網模塊數量比較多的時候,某次碰撞可能會需要延時較長才會錯開。因為有的可能接收到信息需要立刻回復,就有可能打亂延時錯開的時間順序造成二次碰撞,但終究是可以錯開的。但是這種的穩定性略差,模塊工作有時會一直等待,造成如果有需要給這個模塊發數據的時候,一直發不進來的情況,繼而造成更長時間的等待。
根據實際應用場景綜合運用
以上三種方式均通過實戰應用測試,在實際項目中,可以根據組網數量和對數據及時性和穩定性的要求,可以將這幾種方式組合應用起來,不同的指令和時域可以使用不同的方式,或同時使用兩種方式進行處理,會達到更好的效果。
這里只介紹了組網的方式原理,已經通過實戰確認的,具體實現代碼是需要一個完整的項目應用 場景來描述,這里就先不提供,后面陸續為大家分享更多的nRF24L01+實戰應用。