題:
使用nRF24L01 +的Arduino的OTA更新
Whiskeyjack
2015-05-10 18:31:43 UTC
view on stackexchange narkive permalink

是否可以通過nRF24L01 +模塊將OTA更新發送到Arduino?

這是我的發現:

這裡是對如何編程的指導Arduino是無線的,但這東西使用的是BT模塊,該模塊在PC上顯示為COM端口。

此處與Xbees類似。

但是,這些使用另一端連接到PC的arduino。就我而言,我計劃使用鉤接到另一個nRF24L01 +而不是PC的rPi。

這是Atmega芯片數據表的摘錄:

在ATmega88A / 88PA中/ 168A / 168PA / 328 / 328P,Boot LoaderSupport提供了真正的讀寫時自編程機制,供MCU自己下載和上傳程序代碼。該功能允許使用Flash駐留的Boot Loader程序由MCU控制靈活的應用程序軟件更新。 Boot Loader程序可以使用任何可用的數據接口和關聯的協議來讀取代碼並將該代碼寫入(編程)到閃存中,或從程序存儲器中讀取代碼。

我計劃作為一種策略。

主程序員= Raspberry Pi + nRF模塊。

從屬arduino = Arduino + nRF24L01 +外部EEPROM

一旦我必須上傳一個新代碼,我可以將編譯後的代碼傳輸到arduino(我可以這樣做,對嗎?),Arduino會暫時將其保存在外部EEPROM中。

傳輸完成後,我將發送信號,使arduino復位並將代碼從EEPROM複製到其閃存中。

我的問題:

該策略是否正確可行?

我應該如何實現呢?

歡迎您提出其他建議。

使用外部EEPROM將使您的自舉程序編寫起來更加簡單,並使事情變得更健壯。對我來說聽起來可行。
不確定在ESB上使用的協議是什麼,但是您應該意識到nRF24L01提供的16位CRC不足以保護固件上載。在接受新圖片之前,您的算法應進行更嚴格的測試(例如,整個FW上的CRC)。
@Ben-我對數據完整性表示懷疑。這就是為什麼我打算先進行驗證並將其首先存儲在外部EEPROM中的原因。一旦檢查了數據,則僅將存儲的代碼應用於微控制器。
也許http://forum.arduino.cc/index.php?topic=332191.0可能會導致示例如何從自己的草圖重新編程Flash ...
您可以調查MySensor的工作方式。我相當確定這會對您有所幫助。
五 答案:
Majenko
2015-05-10 18:35:09 UTC
view on stackexchange narkive permalink

您最好的策略是編寫自己的引導程序。

現有的引導程序通過串行端口接收數據,並將其一次一頁地寫入閃存。相反,您的自定義引導加載程序將通過nRF模塊接收數據,並將其一次寫入一頁Flash。

您可以將現有引導加載程序的源代碼(也許使用optiboot?)用作一個起點並刪除UART代碼,將其替換為nRF代碼。

當然,當您要對其進行編程時,您仍然需要一種進入Bootloader的方法-最簡單的方法是確保已添加到您上傳的任何草圖中,以便您可以向該草圖發送指令以進入引導程序。

您還需要在Pi上創建一個程序以進行空中編程-或修改現有的程序(如avrdude)。

從長遠來看,它可能是具有一對其他Arduino(可能有點小,例如基於ATTiny的板)來充當UART和nRF模塊之間的橋樑,使它們成為透明的無線串行鏈接更為簡單。

Kurt
2016-01-30 22:08:58 UTC
view on stackexchange narkive permalink

現在有一個 Arduino optiboot分支,它似乎可以處理您想要的東西。

您將使用PC,RPi或可以運行 avrdude 的任何東西將更新發送到充當更新服務器的Arduino,然後將代碼傳輸到客戶端。

p>

頁面上的說明似乎很全面。

感謝Kurt的回答。我會仔細看看的。希望對此進行修改後的版本可能對我將來的項目有所幫助。但是我現在跟隨nRF的可怕範圍移到esp8266。 Esp增加了預定義數據傳輸協議的優勢,並且ESP arduino庫中最近發布了ESP的OTA更新。與nRF相比,像esps似乎是更好的選擇,因為它具有良好的範圍和更好的數據傳輸可靠性。此外,對於簡單的工作,我什至不需要掛鉤到另一台arduino。
有人能做這項工作嗎?我已經使用https://github.com/nicolas-schurando/optiboot-nrf24l01-flasher和https://github.com/nicolas-schurando/optiboot-nrf24l01能夠刻錄引導加載程序和Flasher(遠程具有引導加載程序和本地有Flasher),但我不確定要使用哪個avrdude命令來刻錄遠程站-似乎總是覆蓋我的本地arduino並從中刪除Flasher草圖-而不是轉發它...
pdey
2015-11-07 12:36:30 UTC
view on stackexchange narkive permalink

如果您正在使用遠程傳感器節點,則可以考慮使用 MySensors庫。

它支持兩種傳遞OTA更新的方法-一種使用node.js。在rPi上運行的控制器;

否則,您可以從庫中藉用引導加載程序代碼,並根據自己的需要進行自定義。

rslite
2015-05-11 00:40:03 UTC
view on stackexchange narkive permalink

這絕對是可行的,並且已經完成了。請訪問 Low Power Labs網站,其中Felix做了同樣的事情,但是帶有RF69無線電和外部閃存芯片。您確實需要使用他修改過的自舉程序,該自舉程序將在外部閃存中檢測到新草圖,並在重置時將其上傳到Arduino。除了無線電差異,這應該可以很好地滿足您的目的。

鑑於無線電通信的脆弱性,我認為最好是單獨存儲程序,而不是創建一個高度修改的引導加載程序,該加載程序會讀取廣播流-可能是為了進行編程,您需要廣播無法始終提供的恆定字節流(儘管對此我不是100%肯定);另一個原因是您需要訪問無線電的額外代碼將使引導加載程序更大。

我對數據完整性表示懷疑。這就是為什麼我打算先進行驗證並將其首先存儲在外部EEPROM中的原因。一旦檢查了數據,則僅將存儲的代碼應用於微控制器。感謝您的文章。我將通過它。
user1748502
2018-01-07 05:14:36 UTC
view on stackexchange narkive permalink

根據@Majenko和@Kurt的建議:

請查看我的博客文章,它就是關於這一點!

https://www.2bitornot2bit。 com / blog / arduino-bootloader-with-ota-over-the-air-support-over-nrf24l01

我已經完成了有關此問題的完整教程,還修改了上面建議的代碼

基本思想是擁有一個本地工作站,該工作站將新草圖從計算機-> uart-> spi-> rf24 轉發到遠程Arduino。運行一個自定義引導程序,該引導程序偵聽 rf24-> spi 而不是UART。該引導加載程序照常執行所有操作(期望協議命令作為stk500協議的一部分,依此類推),但是,數據包不是通過UART而是通過SPI從RF24模塊到達。

在引導過程中,引導加載程序將必須初始化RF模塊寄存器,然後解析傳入的字節(如果有);超時後,它將退出並像往常一樣將當前的草圖放到那裡

我的博客中,您會看到一些有關本地工作站的硬件配置的註釋:在 RESET GND 引腳之間需要一個10uF的電容,以避免在嘗試刷新遠程站點時刷新本地站點。

該帖子還介紹了使用AVRdude刷新引導加載程序,然後通過運行“更新程序”草圖的本地站點(具有電容器的站點)刷新遠程站點(具有新的引導程序)所需的命令。 )。

基本命令是:

  avrdude -C“ C:\ Users \ Ben \ Downloads \ avrdude \ etc \ avrdude.conf” -b 19200 -c usbtiny -p m328p -v -e -U efuse:w:0xFD:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m -Favrdude -C“ C:\ Users \ Ben \ Downloads \ avrdude \ etc \ avrdude.conf” -b 19200 -c usbtiny -p m328p -v -e -U flash:w:optiboot_atmega328_new_bootlader.hex -U lock:w:0x0F:m  

您可以在我的博客上找到代碼,並鏈接到所需的其他資源和工具(例如AVR程序員)。

雖然此鏈接可以回答問題,但最好在此處包括答案的基本部分,並提供鏈接以供參考。如果鏈接頁面發生更改,僅鏈接的答案可能會無效。 -[評論](/ review / low-quality-posts / 31863)
@jfpoilpret添加了描述,感覺好像缺少了什麼?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...