發(fā)板Arduino IDE環(huán)境搭建與燒錄指南)
1. 為什么NU40 DK值得你花20分鐘上手如果你最近在找一塊能跑藍(lán)牙低功耗、Thread、Zigbee還能兼容Arduino生態(tài)的開(kāi)發(fā)板NU40 DK大概率已經(jīng)出現(xiàn)在你的購(gòu)物車或者收藏夾里了。這塊基于nRF52840芯片的開(kāi)發(fā)板在創(chuàng)客圈和物聯(lián)網(wǎng)原型開(kāi)發(fā)中熱度一直不低但很多人拿到手之后卡在第一步——環(huán)境搭不起來(lái)板子插上電腦沒(méi)反應(yīng)Arduino IDE里找不到開(kāi)發(fā)板型號(hào)編譯報(bào)錯(cuò)一堆。我自己第一次接觸NU40 DK的時(shí)候光是在Arduino IDE里把開(kāi)發(fā)板支持包裝好就折騰了快一個(gè)小時(shí)走了不少?gòu)澛?。這篇文章的目標(biāo)很明確讓你在20分鐘內(nèi)從一塊全新的NU40 DK開(kāi)始到成功燒錄第一個(gè)程序并看到串口輸出。不需要你之前用過(guò)nRF52系列也不需要你懂藍(lán)牙協(xié)議棧只要你會(huì)裝軟件、會(huì)插USB線就行。我會(huì)把每一步的操作意圖、可能踩的坑、以及我實(shí)際測(cè)試下來(lái)最穩(wěn)的配置方案都講清楚。關(guān)鍵詞里提到的Arduino IDE、nRF52840、NUCODE這些我都會(huì)在對(duì)應(yīng)環(huán)節(jié)里展開(kāi)說(shuō)明尤其是Arduino IDE在Mac和Windows上的一些常見(jiàn)問(wèn)題比如啟動(dòng)時(shí)一直等待、離線包怎么處理這些我都會(huì)給到具體的解決思路。NU40 DK的核心是Nordic的nRF52840 SoC這顆芯片在低功耗藍(lán)牙領(lǐng)域算是明星產(chǎn)品了ARM Cortex-M4F內(nèi)核64MHz主頻1MB Flash256KB RAM支持藍(lán)牙5.0、Thread、Zigbee、ANT等多種協(xié)議。NU40 DK這塊板子是國(guó)內(nèi)廠商基于nRF52840做的開(kāi)發(fā)板板載了調(diào)試器引出了大部分GPIO還帶了RGB燈、按鍵、NFC天線接口等常用外設(shè)。相比原廠的nRF52840 DKNU40 DK在價(jià)格上更有優(yōu)勢(shì)對(duì)于個(gè)人開(kāi)發(fā)者和小團(tuán)隊(duì)來(lái)說(shuō)是個(gè)不錯(cuò)的選擇。適合讀這篇文章的人剛拿到NU40 DK的新手、想從ESP32轉(zhuǎn)到nRF52平臺(tái)的開(kāi)發(fā)者、需要快速驗(yàn)證低功耗藍(lán)牙方案的產(chǎn)品經(jīng)理、以及在學(xué)校里做物聯(lián)網(wǎng)課程設(shè)計(jì)的學(xué)生。不管你是哪種只要跟著下面的步驟走20分鐘內(nèi)讓板子跑起來(lái)是完全可行的。2. 環(huán)境搭建前的關(guān)鍵決策與工具選型2.1 Arduino IDE版本選擇為什么我推薦2.x而不是1.8.xArduino IDE目前有兩個(gè)大版本分支1.8.x系列和2.x系列。很多人習(xí)慣用1.8.x覺(jué)得穩(wěn)定、插件兼容性好但我在NU40 DK上實(shí)測(cè)下來(lái)2.x版本的整體體驗(yàn)更好。原因有幾個(gè)2.x版本內(nèi)置了調(diào)試器支持串口監(jiān)視器的響應(yīng)速度更快而且對(duì)新版開(kāi)發(fā)板支持包的兼容性更好。1.8.x在安裝nRF52支持包的時(shí)候偶爾會(huì)出現(xiàn)索引更新失敗的問(wèn)題尤其是在國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下。不過(guò)2.x也有它的問(wèn)題比如啟動(dòng)時(shí)一直等待、界面卡頓等。這個(gè)后面我會(huì)專門(mén)講怎么處理。如果你已經(jīng)在用1.8.x并且不想換那也行但需要確保版本在1.8.19以上否則某些依賴庫(kù)會(huì)編譯報(bào)錯(cuò)。注意不管你用哪個(gè)版本安裝路徑里千萬(wàn)不要有中文和空格。我見(jiàn)過(guò)太多人因?yàn)槁窂嚼镉兄形膶?dǎo)致編譯工具鏈找不到文件報(bào)錯(cuò)信息還特別隱晦排查起來(lái)很費(fèi)時(shí)間。2.2 開(kāi)發(fā)板支持包的選型NUCODE還是Adafruit這是很多人糾結(jié)的地方。NU40 DK基于nRF52840而Arduino IDE里支持nRF52840的開(kāi)發(fā)板包主要有幾個(gè)來(lái)源Adafruit的nRF52系列、Seeed的nRF52系列、以及NUCODE提供的支持包。我三個(gè)都試過(guò)最后穩(wěn)定在NUCODE的方案上。Adafruit的包優(yōu)點(diǎn)是文檔全、社區(qū)大但它默認(rèn)的板型定義和NU40 DK的引腳映射不完全一致比如RGB燈的引腳編號(hào)就不一樣直接用Adafruit的包編譯出來(lái)的程序燈可能不亮或者顏色不對(duì)。Seeed的包也是類似問(wèn)題。NUCODE的支持包是專門(mén)針對(duì)NU40 DK做的適配引腳定義、時(shí)鐘配置、USB描述符都是對(duì)的燒錄之后外設(shè)直接就能用。所以我的建議是如果你用的是NU40 DK優(yōu)先裝NUCODE的開(kāi)發(fā)板支持包。如果你用的是其他nRF52840板子那就按板子廠商的說(shuō)明來(lái)。2.3 驅(qū)動(dòng)安裝Windows和Mac的差異處理Windows上NU40 DK插上之后通常會(huì)被識(shí)別為一個(gè)USB串口設(shè)備和一個(gè)調(diào)試器設(shè)備。Win10和Win11一般能自動(dòng)識(shí)別但如果你看到設(shè)備管理器里有黃色感嘆號(hào)那就需要手動(dòng)裝驅(qū)動(dòng)。NUCODE的包里通常帶了驅(qū)動(dòng)或者你可以去Nordic官網(wǎng)下載nRF Connect的驅(qū)動(dòng)包。Mac上相對(duì)省心macOS自帶CDC驅(qū)動(dòng)插上就能用。但要注意一點(diǎn)如果你用的是M1/M2芯片的MacArduino IDE需要裝ARM64版本否則編譯工具鏈跑不起來(lái)。另外Mac上偶爾會(huì)出現(xiàn)串口設(shè)備不顯示的問(wèn)題這時(shí)候拔掉板子重新插一次或者在終端里跑一下ls /dev/tty.*看看設(shè)備有沒(méi)有出現(xiàn)。3. 20分鐘實(shí)操流程從零到點(diǎn)亮第一顆燈3.1 第一步安裝Arduino IDE并配置開(kāi)發(fā)板管理器先去Arduino官網(wǎng)下載IDE選2.x版本W(wǎng)indows選exe安裝包Mac選dmg。安裝過(guò)程沒(méi)什么好說(shuō)的一路下一步就行。裝完之后打開(kāi)IDE進(jìn)入“文件”-“首選項(xiàng)”在“附加開(kāi)發(fā)板管理器網(wǎng)址”里填入NUCODE提供的JSON地址。這個(gè)地址通常在你購(gòu)買NU40 DK時(shí)附帶的資料里或者去NUCODE的官方倉(cāng)庫(kù)找。填好之后打開(kāi)“工具”-“開(kāi)發(fā)板”-“開(kāi)發(fā)板管理器”在搜索框里輸入“nRF52”或者“NUCODE”。這時(shí)候可能會(huì)遇到一個(gè)問(wèn)題搜索轉(zhuǎn)圈很久沒(méi)結(jié)果。這是因?yàn)殚_(kāi)發(fā)板管理器的索引服務(wù)器在國(guó)外國(guó)內(nèi)訪問(wèn)不穩(wěn)定。解決辦法有兩個(gè)一是掛代理這里不展開(kāi)二是手動(dòng)下載離線包。離線包的處理方式去NUCODE的倉(cāng)庫(kù)下載最新的支持包壓縮文件然后在開(kāi)發(fā)板管理器里選擇“手動(dòng)安裝”指向你下載的壓縮包。這種方式繞過(guò)索引更新速度最快。關(guān)鍵詞里提到的“arduino ide esp32離線包”其實(shí)也是同樣的思路ESP32的離線包安裝方法和這個(gè)一模一樣只是包不同而已。3.2 第二步選擇正確的開(kāi)發(fā)板型號(hào)和端口裝好支持包之后在“工具”-“開(kāi)發(fā)板”里找到NUCODE的目錄選擇“NU40 DK”或者對(duì)應(yīng)的型號(hào)。然后插上板子在“工具”-“端口”里應(yīng)該能看到一個(gè)新增的串口設(shè)備。Windows上是COMxMac上是/dev/tty.usbmodemxxxx。如果端口列表里沒(méi)有出現(xiàn)新設(shè)備先檢查USB線是不是數(shù)據(jù)線有些線只能充電不能傳數(shù)據(jù)然后檢查板子上的電源燈有沒(méi)有亮。如果燈亮了但端口沒(méi)出現(xiàn)試試按一下板子上的復(fù)位鍵或者換一個(gè)USB口。提示NU40 DK有兩個(gè)USB口一個(gè)是調(diào)試器口一個(gè)是原生USB口。燒錄程序用調(diào)試器口就行原生USB口主要用于USB設(shè)備功能測(cè)試。第一次上手別插錯(cuò)了。3.3 第三步寫(xiě)一個(gè)最簡(jiǎn)單的Blink程序并燒錄打開(kāi)“文件”-“示例”-“01.Basics”-“Blink”把里面的LED_BUILTIN改成NU40 DK對(duì)應(yīng)的引腳號(hào)。NU40 DK的RGB燈通常接在三個(gè)獨(dú)立的GPIO上具體引腳號(hào)在NUCODE的文檔里有。如果你不想查文檔可以直接用板載的藍(lán)色LED引腳號(hào)一般是P0.13或者P0.14具體看版本。改好之后點(diǎn)上傳按鈕。第一次編譯會(huì)比較慢因?yàn)橐幾g整個(gè)核心庫(kù)大概需要1到2分鐘。編譯完成后會(huì)自動(dòng)燒錄燒錄成功后板子上的燈就會(huì)開(kāi)始閃爍。如果編譯報(bào)錯(cuò)最常見(jiàn)的原因是工具鏈沒(méi)裝全。Arduino IDE在第一次編譯nRF52項(xiàng)目時(shí)會(huì)自動(dòng)下載ARM GCC工具鏈和nRF5 SDK這個(gè)過(guò)程需要聯(lián)網(wǎng)。如果網(wǎng)絡(luò)不穩(wěn)定下載會(huì)中斷報(bào)錯(cuò)信息通常是“找不到arm-none-eabi-gcc”。解決辦法是手動(dòng)下載工具鏈包解壓到Arduino的packages目錄下。3.4 第四步打開(kāi)串口監(jiān)視器驗(yàn)證運(yùn)行狀態(tài)Blink程序跑起來(lái)之后我們可以進(jìn)一步驗(yàn)證串口通信。新建一個(gè)草圖在setup里初始化串口void setup() { Serial.begin(115200); while (!Serial) delay(10); Serial.println(NU40 DK is running!); } void loop() { Serial.println(Hello from nRF52840); delay(1000); }燒錄之后打開(kāi)串口監(jiān)視器波特率選115200你應(yīng)該能看到每秒打印一次“Hello from nRF52840”。如果看到亂碼檢查波特率是不是設(shè)對(duì)了。如果什么都沒(méi)看到檢查while (!Serial)這行——有些板子需要串口監(jiān)視器打開(kāi)之后才會(huì)繼續(xù)執(zhí)行如果你沒(méi)打開(kāi)監(jiān)視器程序會(huì)卡在那里。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 Arduino IDE啟動(dòng)時(shí)一直等待怎么辦這個(gè)問(wèn)題在Mac上特別常見(jiàn)Windows上偶爾也會(huì)遇到。表現(xiàn)是打開(kāi)IDE之后界面卡住轉(zhuǎn)圈很久才進(jìn)去或者一直顯示“正在初始化”。原因通常是IDE在后臺(tái)檢查更新或者加載開(kāi)發(fā)板索引網(wǎng)絡(luò)不通就會(huì)一直等。解決辦法斷開(kāi)網(wǎng)絡(luò)再打開(kāi)IDE或者在首選項(xiàng)里關(guān)掉“檢查更新”和“顯示開(kāi)發(fā)板更新通知”。如果已經(jīng)卡住了強(qiáng)制退出然后去用戶目錄下找到Arduino15文件夾把里面的package_index.json臨時(shí)改名再重新打開(kāi)IDE。這樣IDE就不會(huì)去拉取索引了啟動(dòng)速度會(huì)快很多。4.2 編譯時(shí)報(bào)錯(cuò)“region RAM overflowed”怎么處理nRF52840的RAM是256KB聽(tīng)起來(lái)不小但藍(lán)牙協(xié)議棧會(huì)占用很大一部分。如果你開(kāi)了藍(lán)牙功能又定義了大數(shù)組很容易爆RAM。報(bào)錯(cuò)信息通常是“region RAM overflowed by xxx bytes”。解決辦法先關(guān)掉不必要的功能比如把藍(lán)牙協(xié)議棧的緩沖區(qū)調(diào)小或者把大數(shù)組改成動(dòng)態(tài)分配。如果還是不夠考慮換用nRF52840的更大Flash版本或者優(yōu)化代碼邏輯減少全局變量的使用。4.3 燒錄成功但程序不運(yùn)行這種情況通常是復(fù)位電路或者時(shí)鐘配置的問(wèn)題。NU40 DK的復(fù)位引腳和原廠DK可能不一樣如果你用了原廠的板型定義復(fù)位邏輯會(huì)對(duì)不上。確保你選的是NUCODE的板型而不是Adafruit或者Generic nRF52。另外檢查一下板子上的撥碼開(kāi)關(guān)或者跳線帽有些版本的NU40 DK需要手動(dòng)切換調(diào)試器和目標(biāo)芯片的連接方式。具體看板子背面的絲印說(shuō)明。4.4 串口監(jiān)視器沒(méi)有輸出先確認(rèn)波特率對(duì)不對(duì)NU40 DK的默認(rèn)串口波特率是115200。然后確認(rèn)你打開(kāi)的是調(diào)試器口的串口而不是原生USB口的。如果還是沒(méi)輸出試試在setup里加一句Serial.println(boot)放在最前面看看有沒(méi)有反應(yīng)。如果連boot都沒(méi)有那可能是串口初始化失敗檢查引腳定義是否正確。4.5 Mac上串口設(shè)備不顯示Mac上偶爾會(huì)出現(xiàn)插了板子但/dev/tty.usbmodem不出現(xiàn)的情況。這時(shí)候先拔掉板子在終端里跑sudo killall -9 usbd然后重新插上。如果還不行重啟電腦。這個(gè)問(wèn)題在macOS Ventura和Sonoma上比較常見(jiàn)屬于系統(tǒng)USB驅(qū)動(dòng)的小毛病不是板子的問(wèn)題。5. 進(jìn)階方向與后續(xù)擴(kuò)展建議板子跑起來(lái)之后你可以開(kāi)始嘗試更多功能了。nRF52840支持藍(lán)牙5.0你可以用Arduino的BLE庫(kù)來(lái)做一個(gè)藍(lán)牙溫度計(jì)或者藍(lán)牙鍵盤(pán)。NUCODE的包里通常帶了BLE示例直接打開(kāi)就能用。如果想玩Thread或者Zigbee那就需要換用Nordic官方的nRF Connect SDK那個(gè)是基于Zephyr RTOS的學(xué)習(xí)曲線陡一些但功能更強(qiáng)大。另一個(gè)方向是低功耗優(yōu)化。nRF52840的賣點(diǎn)就是低功耗你可以通過(guò)配置睡眠模式、關(guān)閉不用的外設(shè)、調(diào)整廣播間隔來(lái)把功耗降到微安級(jí)別。我實(shí)測(cè)下來(lái)在保持藍(lán)牙連接的情況下平均電流可以做到幾十微安用一顆紐扣電池就能跑好幾個(gè)月。如果你之前玩過(guò)ESP32想對(duì)比一下兩者的差異我的感受是ESP32適合做WiFi相關(guān)的項(xiàng)目生態(tài)成熟、資料多nRF52840適合做低功耗藍(lán)牙和Mesh相關(guān)的項(xiàng)目功耗控制更精細(xì)但上手門(mén)檻稍高。兩者互補(bǔ)不沖突。最后分享一個(gè)小技巧NU40 DK的調(diào)試器固件可以升級(jí)升級(jí)之后燒錄速度會(huì)快不少。去NUCODE的倉(cāng)庫(kù)下載最新的調(diào)試器固件用nRF Util或者拖拽的方式刷進(jìn)去就行。升級(jí)過(guò)程大概兩分鐘但之后每次燒錄能省好幾秒長(zhǎng)期來(lái)看很劃算。