動的microduck小車:硬件選型到避障實現(xiàn))
1. microduck 到底是什么項目全貌與設(shè)計思路最近兩周我一直在折騰 microduck 這個小車機器人項目從硬件選型到跑通第一行代碼前前后后花了兩個完整的周末。說實話這個 GitHub 上公開的開源項目名字挺討喜——microduck就是一只小鴨子造型的雙輪小車。它的核心玩法很樸素用一塊主控板控制兩個電機配上幾個傳感器讓它在桌面上自己避開障礙、沿著黑線跑特殊情況還能用手機藍牙遙控。聽起來不復(fù)雜但實際上手之后你會發(fā)現(xiàn)從芯片選型到電機死活不轉(zhuǎn)的排查每一步都藏著坑也每一步都有收獲。我本職是寫軟件的硬件這邊不算老手所以這篇文章里的路線圖可能特別適合兩類人一類是會寫代碼但沒怎么焊過板子的軟件工程師另一類是剛接觸嵌入式的學(xué)生朋友。如果你想找一個低成本、高信息密度的練手項目microduck 是一個非常好的起點。1.1 一句話講清 microduck 的定位microduck 本質(zhì)上是一個輕量級的雙輪差速機器人平臺。所謂輕量級指的是它對材料、工具、金錢的投入都壓到了極低主控板用 ESP32 系列開發(fā)板市價大概 30 到 50 塊錢電機是常見的 TT 減速電機或者 N20 微型減速電機一對一二十塊驅(qū)動芯片用 TB6612FNG 或 DRV8833幾塊到十幾塊傳感器按需購買尋跡、避障、測距每樣都是幾塊錢的模塊全部物料加起來不算工具、外殼和電池總成本能控制在 150 元以內(nèi)。這個成本比買成品套件還便宜——當(dāng)然重點是成品套件不會讓你理解每一個零件為什么存在。它解決的問題也很明確讓一個只寫過軟件的人用最短路徑把硬件選型—接線—燒錄—跑起來這一整條鏈路走通。它刻意保持簡單簡單到每個模塊都能看懂、能替換、能修。這種可修復(fù)性恰恰是商業(yè)成品給不了你的學(xué)習(xí)價值。1.2 從原理圖到成品整體系統(tǒng)怎么拆我一開始就給自己定了個原則不追求一步到位而是把整個系統(tǒng)拆成五個可以獨立驗證的模塊。供電模塊電池、電源開關(guān)、穩(wěn)壓電路負責(zé)給主控和電機分別供能控制模塊ESP32 主控負責(zé)讀傳感器、做決策、輸出 PWM 信號運動模塊電機驅(qū)動板加兩個減速電機加兩個輪子感知模塊ED330 紅外尋跡傳感器、HC-SR04 超聲波測距模塊交互模塊0.96 寸 OLED 顯示當(dāng)前狀態(tài)藍牙負責(zé)手機遙控拆完之后每個模塊都能單獨測試。比如先把電機驅(qū)動這塊焊好單獨寫一小段代碼讓電機轉(zhuǎn)起來再往下做別的。這個思路救了我很多次——如果一次性把所有東西接好再寫代碼任何一環(huán)出了問題你都不知道該從哪里查起。模塊化拆解不只是代碼架構(gòu)的概念硬件調(diào)試同樣適用。1.3 為什么選這條路方案對比與取舍做這種小車機器人市面上其實有幾條經(jīng)典路線。最省事的是直接買成品套件說明書一翻半個小時裝完。但那樣你學(xué)不到東西因為你沒有做過任何一個選型決策出了問題也只能問客服。第二條路是照著網(wǎng)上的 Arduino 入門教程用 UNO 板子加 L298N 驅(qū)動模塊。這個方案的資料堆積如山但有兩個硬傷一是 Arduino UNO 用的是 AVR 單片機性能太弱跑不了復(fù)雜邏輯以后想加攝像頭基本沒戲二是 L298N 模塊內(nèi)部是雙極型晶體管導(dǎo)通壓降能到 2V 以上電池電壓 6V 時真正到電機上的不到 4V續(xù)航和扭力都受影響。第三條路也就是 microduck 采用的路線ESP32 加 TB6612 驅(qū)動配合模塊化傳感器。ESP32 自帶 Wi-Fi 和藍牙性能最高能到 240MHz 雙核以后想加攝像頭做視覺、做聯(lián)網(wǎng)控制都留了余地。TB6612 是 MOS 管驅(qū)動壓降低、效率高兩路電機只需要一路 PWM 加一路方向信號接線也簡潔。這個方案在學(xué)習(xí)成本、性能、擴展空間三者之間是最平衡的。2. 硬件選型全解析從主控到每一個螺絲這一節(jié)詳細說說選型過程包括當(dāng)時為什么這么選、有什么替代方案以及我實際踩過的坑。硬件選型是這個項目里最容易讓人糾結(jié)的地方因為每個零件都有幾十種選擇但不代表你需要把所有選擇都搞明白才能下手。2.1 主控芯片ESP32 系列為什么是首選主控是整臺 microduck 的腦子。為什么不是 STM32因為 STM32 的開發(fā)門檻對新手極不友好光環(huán)境搭建和調(diào)試器配置就夠勸退一大批人。為什么不是樹莓派因為它太大、太貴、太耗電對一臺桌面小車來說屬于殺雞用牛刀。ESP32 則是折中得最好的選項性能足夠跑實時控制開發(fā)環(huán)境可以用 Arduino 框架快速上手后期想深入還能切換到 ESP-IDF。具體選哪一顆 ESP32我給三個參考建議ESP32-WROOM-32經(jīng)典款雙核 240MHz520KB RAM開發(fā)板價格 30 到 50 塊社區(qū)資料最全適合絕大多數(shù)人。ESP32-C3單核 RISC-V性能弱一些但價格能壓到十幾塊引腳也夠用適合低成本改裝。ESP32-S3性能和功能最強帶向量指令加速如果你已經(jīng)想好后續(xù)要接攝像頭做視覺識別直接上它。我自己用的是經(jīng)典款 ESP32 DevKitC原因很簡單microduck 倉庫里的示例代碼幾乎都按這塊板子的引腳布局來寫抄作業(yè)的時候不用自己改引腳映射能省下不少排查時間。2.2 電機與驅(qū)動TT 電機 TB6612 的經(jīng)典組合電機這塊microduck 默認配置是 TT 減速電機。網(wǎng)上搜TT 電機 3-6V 減速馬達能出來一大片通常配橡膠輪子一起賣。TT 電機的優(yōu)勢是便宜、結(jié)實扭矩對桌面小車來說綽綽有余缺點是轉(zhuǎn)速一致性一般同一批次的兩個電機實際轉(zhuǎn)速可能差 5% 到 10%這個問題后面我會講怎么在代碼里做軟件校準。驅(qū)動芯片我強烈建議用 TB6612FNG而不是新手教程里常見的 L298N。我把兩者的關(guān)鍵差異整理成一張表對比項TB6612FNGL298N輸出器件場效應(yīng)管MOSFET雙極型晶體管導(dǎo)通壓降約 0.5V2V 以上最大電流單路 1.2A單路 2A邏輯電壓2.7V-5.5V5V模塊體積很小很大帶散熱片價格十幾塊十幾塊壓降這個參數(shù)最要命。L298N 在 6V 供電下電機實際只能拿到不到 4V扭矩直接掉一截電池稍微沒電就趴窩。TB6612 的壓降幾乎可以忽略這也是 microduck 項目選擇它的核心原因。TB6612 的接線邏輯非常清晰每個電機需要三個信號一個 PWM 腳負責(zé)調(diào)速兩個方向腳決定正反轉(zhuǎn)。我把引腳定義留到第三節(jié)的表格里一起講避免重復(fù)。2.3 傳感器與顯示ED330 模塊和它的兄弟們microduck 的尋跡功能靠的是灰度傳感器。我在淘寶買的是很常見的 ED330 紅外尋跡模塊——就是板子上印著 ED330 字樣、中間一個紅外發(fā)射管加一個接收管的小板子。它的原理是反射式紅外探測紅外光打到地面后反射回來接收管根據(jù)反射光的強弱輸出不同的電平信號。黑色膠帶吸光反射弱白色桌面反射強模塊就能分辨當(dāng)前壓沒壓到線。ED330 模塊通常只有三根線VCC、GND、OUT其中 OUT 是數(shù)字輸出。板上有一個可調(diào)電位器用來設(shè)置觸發(fā)閾值。校準的時候有個小技巧把模塊放在白色桌面上看 OUT 輸出是什么電平再放到黑色膠帶上看輸出是否翻轉(zhuǎn)。電位器要調(diào)到黑白兩種狀態(tài)都能穩(wěn)定區(qū)分不能只調(diào)到一邊靈敏。如果你發(fā)現(xiàn)模塊在兩個場景下輸出始終不變先懷疑電位器沒調(diào)好再懷疑模塊壞了。除了 ED330我還加了兩個輔助模塊HC-SR04 超聲波測距模塊用來檢測前方障礙物0.96 寸 OLED 顯示屏用 I2C 接口接主控實時顯示當(dāng)前狀態(tài)和傳感器數(shù)值。OLED 表面看起來是裝飾品實際是調(diào)試利器——不接屏幕的話你只能靠串口打印而小車跑起來之后根本沒法連著電腦看串口屏幕能讓你直觀看到程序內(nèi)部的狀態(tài)。2.4 機械結(jié)構(gòu)與供電方案兩個最容易翻車的部分很多教程只講電路不講結(jié)構(gòu)但機械部分恰恰是讓 microduck 像一只鴨子的關(guān)鍵。車身我用的是一塊 3mm 亞克力板兩層結(jié)構(gòu)上層放 ESP32 和屏幕下層放電池盒和驅(qū)動板。如果你沒有切割條件直接用塑料盒、甚至硬紙板加扎帶也能湊合但要保證兩個電機軸平行否則小車會跑偏。供電是自制小車里翻車率最高的部分沒有之一。TT 電機瞬間啟動電流能到 1A 以上如果主控和電機共用一個電源電機一啟動電壓瞬間跌落ESP32 會直接掉電重啟。我前幾次調(diào)試反復(fù)遇到這個問題一度以為是代碼死循環(huán)。我的解決方案是兩節(jié) 18650 鋰電池串聯(lián)成 7.4V 給電機驅(qū)動板供電同時從電池端接一個 5V 降壓模塊我用的 MP1584輸出電流 1A 以上單獨給 ESP32 供電。這樣在物理上做到電機和主控電源分離電機的電流沖擊不會干擾主控。線材方面單獨提醒一句杜邦線便宜但接觸不可靠尤其是電機這種大電流線路。建議至少用 20AWG 的硅膠線直接焊接到驅(qū)動板焊盤上。我踩過的坑就是電機線用杜邦線插在驅(qū)動板上小車一跑就抖動斷電排查半天最后發(fā)現(xiàn)是杜邦線虛接。3. 開發(fā)環(huán)境與工程骨架從 GitHub 到第一行代碼硬件都齊了接下來就是很多人最頭疼的環(huán)境搭建環(huán)節(jié)。這一節(jié)把工具鏈安裝、引腳規(guī)劃和工程拉取的完整過程寫清楚照做就行。3.1 工具鏈安裝Arduino IDE 還是 ESP-IDFmicroduck 的示例代碼基于 Arduino 框架所以最省事的路徑就是用 Arduino IDE 開發(fā)。建議直接裝 2.x 版本界面比 1.x 舒服自帶串口監(jiān)視器增強還能自動補全。裝完 IDE 之后需要在文件 → 首選項 → 附加開發(fā)板管理器網(wǎng)址里填上 ESP32 官方的 JSON 地址然后在工具 → 開發(fā)板 → 開發(fā)板管理器里搜索 ESP32 并安裝支持包。這一步要下載幾十 MB 的數(shù)據(jù)國內(nèi)網(wǎng)絡(luò)偶爾會卡多試幾次就行或者手動下載安裝包解壓到 Arduino 的 hardware 目錄下。裝好支持包后在工具 → 開發(fā)板里選擇 ESP32 Dev Module 或?qū)?yīng)板型。還有一個很多人忽略的點串口驅(qū)動。經(jīng)典款 DevKitC 用的 USB 轉(zhuǎn)串口芯片是 CP2102Windows 系統(tǒng)第一次插入需要裝 CP210x 驅(qū)動否則電腦設(shè)備管理器里根本看不到串口。如果你買的板子是 CH340 芯片對應(yīng)驅(qū)動又不一樣買板子的時候最好問清楚。3.2 引腳分配表一次規(guī)劃省掉三次飛線接線之前強烈建議先把引腳分配畫成一張表。microduck 的參考接線可以這樣規(guī)劃我直接把有效的引腳分配表放出來功能模塊信號ESP32 引腳電機 A PWMPWMAGPIO 25電機 A 方向AIN1 / AIN2GPIO 26 / 27電機 B PWMPWMBGPIO 14電機 B 方向BIN1 / BIN2GPIO 12 / 13ED330 尋跡模塊OUTGPIO 34HC-SR04 超聲波Trig / EchoGPIO 5 / 18OLED 顯示屏SDA / SCLGPIO 21 / 22我特意避開了 GPIO 0、GPIO 2、GPIO 12、GPIO 15 這些有特殊功能的引腳。比如 GPIO 0 是 BOOT 引腳如果接了強下拉設(shè)備可能導(dǎo)致開發(fā)板無法進入下載模式GPIO 12 是 MTDI 引腳在某些板子上會影響啟動電壓。新手最容易犯的錯誤就是隨手選一個引腳結(jié)果燒錄之后板子沒法正常工作還不明所以。3.3 拉取工程模板與倉庫結(jié)構(gòu)GitHub 上搜 microduck 能找到官方倉庫通常會有 examples 目錄放著幾個不同難度層級的示例代碼。如果你從 GitHub 下載 ZIP 包比較慢可以去國內(nèi)的代碼托管平臺找找鏡像倉庫搜 microduck 一般能搜到別人同步過來的副本下載速度快不少。但我要給一個操作上的建議不要直接把倉庫里的代碼整個復(fù)制過來用而是建立一個自己的工程目錄。雖然 Arduino 的示例通常是一個.ino文件但當(dāng)代碼超過一百行之后我強烈建議按模塊拆文件。我的目錄結(jié)構(gòu)供參考microduck/ ├── src/ │ ├── main.cpp │ ├── motor.cpp │ ├── motor.h │ ├── sensor.cpp │ ├── sensor.h │ └── config.h ├── lib/ ├── docs/ └── README.md這樣做的核心價值在于后面每加一個功能就新建一個模塊文件出了問題定位收縮得極快。很多人一上來就在一個 main 文件里堆幾百行代碼出 bug 的時候頭都要大運行日志和功能邏輯攪在一起改一處崩三處。4. 核心代碼實現(xiàn)點燈、轉(zhuǎn)電機、站起來這一節(jié)是大家最關(guān)心的部分——怎么把硬件變成真正能動起來的 microduck。我從最基礎(chǔ)的第一行代碼講起再說電機控制、傳感器讀取最后給出一個完整的運動邏輯用例。4.1 第一行代碼前的燒錄測試很多人拿到板子第一件事就是寫業(yè)務(wù)代碼我的建議是先做一個最小驗證插上電腦打開 Arduino IDE先燒一個 Blink 例程。這個例程讓板載 LED 一閃一閃通過它你能確認三件事電腦能識別串口、IDE 的編譯鏈路正常、燒錄過程順暢。Blink 的代碼核心就三行pinMode(LED_BUILTIN, OUTPUT)設(shè)腳為輸出digitalWrite(LED_BUILTIN, HIGH)點亮digitalWrite(LED_BUILTIN, LOW)熄滅中間夾著delay(500)。這個例程如果跑通說明開發(fā)環(huán)境沒問題接下來寫任何代碼都有底。如果這個都跑不通不要急著往下走先檢查串口是不是選對了、驅(qū)動裝了沒有。4.2 電機控制PWM 是什么怎么調(diào)電機驅(qū)動最關(guān)鍵的概念是 PWM即脈沖寬度調(diào)制。說人話就是用高電平在一個固定周期內(nèi)占的比例也就是占空比來模擬不同的輸出電壓。占空比 100% 就是全速轉(zhuǎn)50% 就是半速0% 就是停。電機本質(zhì)上是慣性器件它在每個脈沖周期內(nèi)來不及反應(yīng)到完全停止所以平均電壓決定了它的平均轉(zhuǎn)速。Arduino 框架下有一個大坑ESP32 的 PWM 和 Arduino UNO 不一樣UNO 上的analogWrite()在 ESP32 上不可用。ESP32 必須用ledcSetup()和ledcAttachPin()來配置。下面是一個簡化版的電機控制代碼可以直接抄#define PWM_FREQ 1000 // 1kHz 頻率 #define PWM_RES 8 // 8 位分辨率占空比 0-255 void motorInit() { ledcSetup(0, PWM_FREQ, PWM_RES); // 配置通道 0 ledcAttachPin(25, 0); // GPIO25 綁定到通道 0 } void setMotorA(int speed) { // speed 范圍 -255~255 if (speed 0) { digitalWrite(26, HIGH); digitalWrite(27, LOW); ledcWrite(0, speed); } else { digitalWrite(26, LOW); digitalWrite(27, HIGH); ledcWrite(0, -speed); } }思路很簡單速度值的正負決定方向絕對值決定大小。正數(shù)讓 AIN1 高、AIN2 低電機正轉(zhuǎn)負數(shù)就反過來。這樣上層邏輯只需要傳一個帶符號的數(shù)不用操心方向引腳的狀態(tài)。關(guān)于 PWM 頻率的選擇有個知識點。頻率太低電機會發(fā)出明顯的高頻嗡嗡聲而且轉(zhuǎn)動不均勻頻率太高驅(qū)動芯片的開關(guān)損耗增大芯片發(fā)熱。對 TT 電機這種慣性較大的負載1kHz 到 10kHz 都能工作我最終選了 1kHz噪音和發(fā)熱平衡得好。如果你換用 N20 微型電機可以把頻率提到 20kHz 以上避開人耳敏感區(qū)——這也是為什么有些 N20 小車跑起來幾乎靜音。4.3 傳感器讀取讓 microduck 有知覺讀 ED330 尋跡模塊是數(shù)字 IO 的入門操作直接digitalRead()就能拿到結(jié)果。但實際用的時候要注意單次讀值偶爾會有抖動尤其是在黑白邊緣附近電平會在高低之間快速跳動。所以我在代碼里加了一個簡單的軟件濾波——連續(xù)讀三次取出現(xiàn)次數(shù)最多的值作為最終結(jié)果。這個三取二的算法雖然簡單但對付傳感器抖動非常有效。超聲波測距模塊 HC-SR04 稍微復(fù)雜一點它的工作流程是主控給 Trig 腳發(fā)送一個 10 微秒的高電平脈沖模塊內(nèi)部發(fā)出聲波然后 Echo 腳輸出一個高電平高電平持續(xù)的時間就是聲波往返的時間。換算公式如下float readDistance() { digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); long duration pulseIn(ECHO, HIGH); return duration * 0.034 / 2; // 聲速約 340m/s取一半是單程 }有人會問為什么除以 2——因為聲波發(fā)出去再從障礙物反射回來走的是兩倍距離所以要折半。返回值單位是厘米。這里有個使用限制HC-SR04 的最小測量距離約 2 厘米最大約 4 米對桌面小車來說綽綽有余。4.4 主邏輯一個簡單的運動狀態(tài)機各個模塊都測通之后終于可以寫主邏輯了。microduck 最簡單也最好玩的玩法是避障巡邏我給它的整體邏輯設(shè)計了一個三態(tài)狀態(tài)機前進、左轉(zhuǎn)、右轉(zhuǎn)。enum State { FORWARD, TURN_LEFT, TURN_RIGHT }; State state FORWARD; void loop() { float dist readDistance(); bool onLine digitalRead(ED330_PIN); switch (state) { case FORWARD: if (dist 15.0) { state TURN_RIGHT; // 前方有障礙向右轉(zhuǎn) } else if (onLine LOW) { state TURN_LEFT; // 壓到黑線向左躲 } break; case TURN_LEFT: setMotorA(-150); setMotorB(150); delay(200); // 原地左轉(zhuǎn) 200ms state FORWARD; break; case TURN_RIGHT: setMotorA(150); setMotorB(-150); delay(200); // 原地右轉(zhuǎn) 200ms state FORWARD; break; } if (state FORWARD) { setMotorA(180); setMotorB(180); } delay(20); }這個邏輯非常樸素但它是理解傳感器輸入 → 決策 → 執(zhí)行器輸出閉環(huán)的最小樣例。你可以看到整個程序就是在不斷重復(fù)讀數(shù)據(jù)、判斷狀態(tài)、控制電機。后面無論是換成 PID 直線校準、還是加上藍牙遙控指令解析核心框架都不會變。4.5 錦上添花OLED 狀態(tài)顯示與避障提示在調(diào)試過程中我發(fā)現(xiàn) OLED 屏幕還能幫助做可視化排錯。我寫了一個簡單的顯示函數(shù)把當(dāng)前狀態(tài)、前方距離、尋跡傳感器電平三個值循環(huán)刷新在屏幕上void updateDisplay(float dist, int sensorVal, int state) { display.clearDisplay(); display.setTextSize(1); display.setCursor(0, 0); display.println(MicroDuck v1.0); display.print(Dist: ); display.println(dist); display.print(Line: ); display.println(sensorVal); display.print(State: ); display.println(state); display.display(); }這段代碼有個實際價值小車在跑的時候你不需要連電腦串口只要低頭看屏幕就能知道它的內(nèi)心活動。比如電機不動屏幕顯示 State 一直在切換那問題多半在電機驅(qū)動如果屏幕顯示距離一直是 0那先查超聲波模塊的接線。用顯示模塊輔助定位問題效率翻倍。5. 常見問題與排查技巧實錄最后這部分我把做 microduck 過程中遇到的、以及星友群里其他朋友反饋過的高頻問題整理出來每個都附上排查思路和解決方案。這些內(nèi)容大多不會寫在官方 README 里屬于實戰(zhàn)經(jīng)驗。5.1 上電反復(fù)重啟的元兇供電不足現(xiàn)象插上電池之后ESP32 板載 LED 亮一下滅一下OLED 顯示一下又黑屏串口監(jiān)視器里反復(fù)輸出 Brownout detector was triggered。原因分析ESP32 內(nèi)部有一個欠壓檢測器當(dāng)供電電壓低于閾值通常是 3.0V 左右時它會強制系統(tǒng)復(fù)位防止程序在電壓不穩(wěn)的狀態(tài)下跑飛。這不是代碼 bug而是電源問題。解決辦法首先確認電池電壓兩節(jié) 18650 串聯(lián)是 7.4V經(jīng)降壓模塊到 5V 沒問題其次確認降壓模塊輸出電流能力ESP32 加 OLED 加傳感器峰值電流可能到 300mA建議降壓模塊至少支持 1A最后在 ESP32 的 5V 和 GND 之間并聯(lián)一個 470uF 電解電容濾掉電機啟動瞬間的電壓毛刺。這個電容幾乎成了我所有項目的標(biāo)配。5.2 電機不轉(zhuǎn)三種最常見的故障電機不轉(zhuǎn)是新手遇到概率最高的問題我總結(jié)下來基本逃不出三個原因。第一種驅(qū)動板電源接錯。TB6612 的 VM 和 VCC 是兩個不同的電源腳VM 接電池正極VCC 接主控的 3.3V 或 5V 邏輯電源。兩者接反或者漏接芯片都不會正常工作。注意 VM 和 VCC 千萬不能混在一起。第二種使能腳沒接。TB6612 上有一個 STBY 待機控制腳這個腳必須拉高驅(qū)動器才會實際輸出。很多接線圖為了簡化沒有畫出這個腳導(dǎo)致電機死活不動。處理方法是把 STBY 直接接到 3.3V 或者主控的一個 GPIO 并拉高。第三種PWM 通道沖突。ESP32 有多個獨立的 PWM 通道如果你在代碼里把兩個電機配置到同一個通道就會出現(xiàn)一個轉(zhuǎn)一個不轉(zhuǎn)或兩個一起轉(zhuǎn)但調(diào)速失效的怪現(xiàn)象。所以電機 A 用通道 0電機 B 一定要換一個通道編號。5.3 排查方法論從現(xiàn)象定位到根因我用了這么多年嵌入式項目總結(jié)出一個固定排查順序先看電源再看接線最后看代碼。這個順序不要亂。很多時候大家第一反應(yīng)就是代碼寫錯了查了半天最后發(fā)現(xiàn)是杜邦線松了——這種經(jīng)歷一次就夠了。我的排查動作拆開來講看電源用萬用表量各節(jié)點電壓VM 有沒有 7.4VVCC 有沒有 3.3V 或 5V共地點是否連通看接線對照引腳表逐根檢查特別是 GND 必須所有模塊共地看代碼用Serial.println()把傳感器原始值、狀態(tài)變量打印出來確認程序運行到了哪一步還有一個我反復(fù)強調(diào)的小技巧把每個部分拆開單獨測。電機不轉(zhuǎn)就先注釋掉傳感器邏輯只跑電機的代碼看電機本身有沒有問題傳感器讀不到數(shù)據(jù)就單獨打印傳感器值看有沒有跳動。能拆就拆拆到最后剩下的問題才是真正的問題。我自己用得最多的調(diào)試工具是兩樣串口打印和萬用表。這兩樣加起來能解決掉 90% 的問題。示波器當(dāng)然更好但新手沒必要一開始就投入那么多等真遇到難啃的定時問題再上儀器也不遲。做 microduck 這個項目給我最大的感受是它讓你親手把想法變成實物這個過程中學(xué)到的每一個小坑都是單純寫代碼永遠碰不到的。最后再分享一個實際建議——從開工第一天就用文檔記錄每個模塊的測試結(jié)果哪怕只是幾行字。等你做到第三版、第四版回頭看這些記錄它們會比任何教程都珍貴。