實戰(zhàn))
1. 項目概述從零打造一臺面包板智能車剛接觸嵌入式開發(fā)的新手尤其是電子、自動化相關(guān)專業(yè)的學(xué)生常常會陷入一個困境學(xué)了一堆C語言、單片機原理但面對一個真實的項目時卻不知從何下手。理論知識和動手能力之間仿佛隔著一道鴻溝。這個“面包板智能車”項目就是為你量身打造的、跨越這道鴻溝的第一塊跳板。它不像那些直接購買集成底盤和驅(qū)動模塊的智能車套件而是回歸最原始的“面包板”搭建方式讓你親手將一個個獨立的元器件——單片機、電機驅(qū)動、傳感器、藍(lán)牙模塊——像搭積木一樣連接起來最終實現(xiàn)藍(lán)牙遙控、自動避障和循跡行駛。為什么選擇這種方式入門因為在這個過程中你收獲的遠(yuǎn)不止是一輛能跑的小車。你將直面最真實的硬件世界如何處理電機啟動時的電流沖擊如何消除超聲波傳感器回波的干擾如何讓紅外對管在復(fù)雜光線下穩(wěn)定工作這些在數(shù)據(jù)手冊和理論課上輕描淡寫的問題會在面包板的連線和調(diào)試中變得無比具體。而STM32作為當(dāng)前工業(yè)界和學(xué)術(shù)界主流的ARM Cortex-M內(nèi)核微控制器是你學(xué)習(xí)嵌入式裸機開發(fā)的最佳載體。通過這個項目你將系統(tǒng)地掌握GPIO、定時器、PWM、ADC、串口等核心外設(shè)的驅(qū)動理解中斷與輪詢的取舍并建立起從傳感器數(shù)據(jù)采集、到控制算法處理、再到執(zhí)行機構(gòu)驅(qū)動的完整閉環(huán)思維。這臺小車雖然結(jié)構(gòu)簡單但“麻雀雖小五臟俱全”。它涵蓋了智能移動平臺最基礎(chǔ)的三大功能遙控藍(lán)牙、感知超聲波、紅外、執(zhí)行直流電機。完成它你不僅獲得了一個有趣的玩具更重要的是構(gòu)建了一套可復(fù)用的嵌入式開發(fā)知識框架和調(diào)試方法論為后續(xù)學(xué)習(xí)更復(fù)雜的RTOS、物聯(lián)網(wǎng)、機器視覺等內(nèi)容打下堅實的硬件與編程基礎(chǔ)。2. 核心硬件選型與電路設(shè)計思路一輛智能車的骨架是它的硬件系統(tǒng)。在面包板上搭建意味著所有連接都暴露在外任何設(shè)計缺陷或連接錯誤都會直接導(dǎo)致故障。因此硬件選型與電路設(shè)計是項目成功的第一步其核心思路是在滿足功能的前提下力求簡潔、可靠、易于調(diào)試。2.1 主控芯片為什么是STM32F103C8T6在眾多STM32型號中F103C8T6也就是常說的“藍(lán)色藥丸”或“最小系統(tǒng)板”是入門級項目的絕對明星。選擇它主要基于以下幾點考量性能與資源平衡基于Cortex-M3內(nèi)核主頻72MHz擁有64KB Flash和20KB RAM。對于裸機程序來說資源綽綽有余。它提供了足夠多的GPIO、多個定時器用于產(chǎn)生PWM驅(qū)動電機、USART用于藍(lán)牙通信、ADC可用于電池電壓檢測等外設(shè)。極高的性價比與生態(tài)價格極其低廉配套的開發(fā)工具ST-Link下載器便宜易得。其生態(tài)極為成熟有標(biāo)準(zhǔn)外設(shè)庫StdPeriph_Lib和HAL庫等多種開發(fā)方式網(wǎng)上資料、開源項目浩如煙海遇到問題幾乎都能找到解決方案。封裝與可焊性LQFP48封裝引腳間距適中既可以直接焊接在轉(zhuǎn)接板上插到面包板使用也可以直接購買現(xiàn)成的最小系統(tǒng)板。后者大大降低了硬件入門門檻讓我們可以專注于軟件和系統(tǒng)邏輯。注意購買最小系統(tǒng)板時務(wù)必確認(rèn)其引出的引腳是否完整特別是用于電機PWM的定時器通道引腳如TIM1/2/3/4的CH1-CH4和用于超聲波模塊的GPIO避免買到引腳閹割版。2.2 感知層超聲波與紅外傳感器的原理與接入智能車的“眼睛”由超聲波模塊和紅外循跡模塊組成它們的工作原理和電路連接方式截然不同。HC-SR04超聲波模塊它通過發(fā)射40kHz的超聲波并接收回波利用聲波在空氣中的傳播速度來計算距離。模塊有四個引腳VCC、GND、Trig觸發(fā)和Echo回波。工作時主控需要向Trig引腳發(fā)送一個至少10us的高電平脈沖來觸發(fā)測距。隨后模塊會自動發(fā)射超聲波并在Echo引腳輸出一個高電平脈沖其寬度與測得的距離成正比每58us對應(yīng)1cm。因此我們需要用一個GPIO推挽輸出控制Trig并用一個GPIO浮空輸入捕獲Echo高電平的持續(xù)時間。這里的關(guān)鍵是定時器輸入捕獲功能的應(yīng)用。我們可以配置一個定時器在Echo上升沿開始計數(shù)下降沿停止計數(shù)從而精準(zhǔn)測量脈沖寬度避免軟件延時帶來的誤差。TCRT5000紅外循跡模塊這是一種反射式光電傳感器。其內(nèi)部紅外LED發(fā)射紅外光光敏三極管接收被地面反射回來的光。當(dāng)傳感器位于白色表面反射率高上方時接收到的光強光敏三極管導(dǎo)通輸出低電平位于黑色軌跡吸收率高上方時反射光弱輸出高電平。模塊通常輸出數(shù)字信號直接連接STM32的GPIO浮空輸入即可。為了適應(yīng)不同環(huán)境光模塊上有一個電位器可以調(diào)節(jié)靈敏度。在實際小車布局中我們通常會在車頭并排安裝3-5個這樣的模塊組成一個簡單的“線陣”通過判斷哪個或哪幾個傳感器輸出黑線信號高電平來決定小車的轉(zhuǎn)向。2.3 執(zhí)行層電機驅(qū)動與電源方案小車的“雙腿”是直流減速電機。STM32的GPIO引腳驅(qū)動能力非常弱通常只有幾十mA無法直接驅(qū)動電機啟動電流可達數(shù)百mA。因此必須使用電機驅(qū)動芯片。L298N或TB6612FNG是常見選擇。L298N是經(jīng)典的雙H橋驅(qū)動芯片驅(qū)動能力強但發(fā)熱較大需要散熱片。其邏輯簡單每個電機需要兩個GPIO控制轉(zhuǎn)向IN1, IN2一個PWM引腳控制速度ENA。TB6612FNG則是更現(xiàn)代的方案效率高、發(fā)熱小、外圍電路簡單。它同樣需要兩個GPIO控制方向AIN1/AIN2, BIN1/BIN2和兩個PWM引腳控制速度PWMA, PWMB。對于本項目TB6612FNG是更優(yōu)的選擇因為它更省電更適合電池供電的場景。電源是整個系統(tǒng)的基石。常見的方案是使用兩節(jié)18650鋰電池串聯(lián)約7.4V供電。這個電壓需要被分配到不同部分電機驅(qū)動部分直接接電池電壓VM引腳。STM32及傳感器部分需要穩(wěn)定的5V或3.3V。可以通過一個降壓模塊如LM2596將電池電壓降至5V供給超聲波、藍(lán)牙等模塊。STM32最小系統(tǒng)板通常自帶3.3V LDO因此將5V接入其VIN或5V引腳即可。關(guān)鍵設(shè)計務(wù)必在電機驅(qū)動芯片的電源輸入端VM和地GND之間并聯(lián)一個大容量如100uF的電解電容并在靠近芯片電源引腳處并聯(lián)一個1040.1uF的瓷片電容。前者用于緩沖電機啟停和換向時產(chǎn)生的巨大電流沖擊防止電源電壓被瞬間拉低導(dǎo)致單片機復(fù)位后者用于濾除高頻噪聲。這是很多新手容易忽略但會導(dǎo)致系統(tǒng)極不穩(wěn)定的關(guān)鍵點。2.4 通信層HC-05藍(lán)牙模塊的配置HC-05是經(jīng)典的藍(lán)牙2.0EDR模塊支持主從模式。我們將其配置為從機Slave等待手機等主機連接。模塊通過UART串口與STM32通信只需要連接四根線VCC(5V)、GND、TXD、RXD。需要注意的是STM32的TXD應(yīng)接模塊的RXDRXD接模塊的TXD。模塊的配置通常通過AT指令進行。在上電前按住模塊上的按鍵或使KEY引腳接高電平再上電模塊會進入AT指令模式此時指示燈慢閃。此時可以通過串口調(diào)試助手發(fā)送AT指令例如ATNAMEMySmartCar設(shè)置藍(lán)牙名。ATPSWD1234設(shè)置配對密碼。ATROLE0設(shè)置為從機模式。ATUART9600,0,0設(shè)置串口波特率通常9600或115200。配置完成后斷電重啟模塊進入自動連接模式指示燈快閃。此時用手機搜索并配對連接成功后指示燈轉(zhuǎn)為雙秒閃一次。之后手機發(fā)送的任何數(shù)據(jù)都會通過串口透傳給STM32STM32發(fā)送的數(shù)據(jù)也會透傳給手機。我們可以定義簡單的協(xié)議例如用字符F、B、L、R、S分別代表前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止。3. 嵌入式裸機程序架構(gòu)設(shè)計與實現(xiàn)在面包板上硬件飛線已經(jīng)夠混亂了如果軟件架構(gòu)也是一團亂麻那調(diào)試將是噩夢。一個清晰、模塊化的裸機程序架構(gòu)至關(guān)重要。我們的核心思想是面向?qū)ο笥媒Y(jié)構(gòu)體封裝的思想 時間片輪詢的調(diào)度框架。3.1 模塊化驅(qū)動層設(shè)計我們將每個硬件外設(shè)封裝成獨立的.c/.h文件對并為其定義一個結(jié)構(gòu)體包含該模塊的狀態(tài)、配置參數(shù)和操作函數(shù)指針或直接定義操作函數(shù)。例如對于電機驅(qū)動模塊// motor.h typedef struct { GPIO_TypeDef* IN1_Port; uint16_t IN1_Pin; GPIO_TypeDef* IN2_Port; uint16_t IN2_Pin; TIM_HandleTypeDef* pwm_tim; uint32_t pwm_channel; int16_t speed; // 當(dāng)前速度-100 ~ 100 } Motor_TypeDef; void Motor_Init(Motor_TypeDef* motor, ...); void Motor_SetSpeed(Motor_TypeDef* motor, int16_t speed);對于超聲波模塊我們封裝一個測量函數(shù)但其內(nèi)部會用到定時器輸入捕獲和可能的中斷。關(guān)鍵在于將硬件相關(guān)的底層操作如GPIO置位、定時器配置全部隱藏在驅(qū)動函數(shù)內(nèi)部上層應(yīng)用只需要調(diào)用Ultrasonic_GetDistance()這樣的接口。這樣如果更換了超聲波模塊型號只需修改底層驅(qū)動應(yīng)用層代碼幾乎不用動。3.2 時間片輪詢調(diào)度器裸機開發(fā)沒有操作系統(tǒng)調(diào)度我們需要自己管理多個任務(wù)的執(zhí)行。一個簡單有效的方法是時間片輪詢。我們利用STM32的SysTick定時器或一個基本定時器產(chǎn)生固定的時間中斷例如每1ms一次。在這個中斷服務(wù)函數(shù)中不對復(fù)雜任務(wù)進行處理只對一系列“軟件定時器”或任務(wù)標(biāo)志進行計數(shù)或置位。// 在SysTick中斷1ms一次中 void SysTick_Handler(void) { static uint16_t tick_1ms 0; tick_1ms; if(tick_1ms % 10 0) { // 每10ms task_10ms_flag 1; } if(tick_1ms % 50 0) { // 每50ms task_50ms_flag 1; } if(tick_1ms % 100 0) { // 每100ms task_100ms_flag 1; tick_1ms 0; // 復(fù)位防止溢出 } }在主函數(shù)的while(1)超級循環(huán)中我們不斷檢查這些任務(wù)標(biāo)志并執(zhí)行相應(yīng)的任務(wù)函數(shù)。這種方法的優(yōu)點是邏輯清晰能保證關(guān)鍵任務(wù)的周期性執(zhí)行并且避免了在中斷中處理復(fù)雜任務(wù)導(dǎo)致其他中斷被阻塞的風(fēng)險。while(1) { if(task_10ms_flag) { task_10ms_flag 0; Ultrasonic_Trigger(); // 觸發(fā)超聲波測距 // 注意這里只是觸發(fā)測量結(jié)果在中斷中處理 } if(task_50ms_flag) { task_50ms_flag 0; Bluetooth_Process(); // 處理藍(lán)牙數(shù)據(jù) Control_Algorithm(); // 執(zhí)行控制算法 } if(task_100ms_flag) { task_100ms_flag 0; Update_LED_Indicator(); // 更新狀態(tài)指示燈 } // 其他隨時可執(zhí)行的非緊急任務(wù) // ... }3.3 傳感器數(shù)據(jù)濾波與融合傳感器數(shù)據(jù)天生帶有噪聲。超聲波測距會受到聲波反射面角度、空氣擾動的影響紅外循跡會受到環(huán)境光、地面污漬的干擾。直接使用原始數(shù)據(jù)進行控制小車會表現(xiàn)得“神經(jīng)質(zhì)”。對于超聲波數(shù)據(jù)可以采用中值濾波或滑動平均濾波。例如連續(xù)采樣5次距離值去掉一個最大值和一個最小值對剩下的3個值取平均。這能有效剔除偶然的跳變異常值。更進階一點可以結(jié)合小車的運動速度做一個簡單的卡爾曼濾波或互補濾波預(yù)測下一時刻的位置并與測量值融合得到更平滑、滯后的距離估計。對于紅外循跡數(shù)據(jù)由于是開關(guān)量濾波更簡單。可以采用“多次采樣表決”法。例如每10ms讀取一次5路傳感器的值連續(xù)讀取5次即50ms窗口。只有當(dāng)某一路傳感器在5次采樣中有至少3次檢測到黑線才最終判定該路“看到”了黑線。這能有效避免因地面斑點或抖動造成的誤觸發(fā)。3.4 控制算法實現(xiàn)從遙控到自主控制算法的核心是根據(jù)輸入遙控指令或傳感器數(shù)據(jù)計算出電機的PWM占空比。藍(lán)牙遙控模式這是最簡單的開環(huán)控制。接收到F指令就讓左右電機都以一個固定速度正轉(zhuǎn)接收到L指令就讓左電機減速或反轉(zhuǎn)右電機加速或保持產(chǎn)生差速轉(zhuǎn)向。這里可以引入“指數(shù)曲線調(diào)速”來改善手感。不是讓速度從0突變到100而是讓目標(biāo)速度按指數(shù)曲線逼近設(shè)定值這樣遙控起來加速和減速會更平滑更像真車的油門和剎車。超聲波避障模式這是一個典型的閉環(huán)控制。我們設(shè)定一個安全距離如20cm。當(dāng)超聲波測量的前方距離大于安全距離時小車前進。當(dāng)距離小于安全距離時觸發(fā)避障動作。一個簡單的策略是立即停止然后讓小車原地旋轉(zhuǎn)一個隨機角度例如90度到270度之間再次測量前方距離如果安全則前進否則繼續(xù)旋轉(zhuǎn)。更智能的策略是讓小車在接近障礙物時就開始減速距離越近速度越慢同時配合紅外傳感器尋找沒有障礙物的方向進行轉(zhuǎn)向。紅外循跡模式這是本項目算法上的一個小亮點。我們以5路傳感器為例將其返回值組成一個5位的二進制數(shù)黑線為1白地為0。根據(jù)這個數(shù)值我們可以定義一個“位置偏差”。例如只有中間傳感器第3路檢測到黑線0b00100偏差為0小車直行。如果左邊第2路檢測到0b00010偏差為-1最左邊第1路檢測到0b00001偏差為-2。同理右邊第4路為1第5路為2。如果多路同時檢測到則取平均值或最外側(cè)值作為偏差。然后我們使用經(jīng)典的比例P控制左輪速度 基礎(chǔ)速度 偏差 * Kp右輪速度 基礎(chǔ)速度 - 偏差 * Kp。Kp是一個比例系數(shù)需要實際調(diào)試。偏差越大左右輪速度差就越大轉(zhuǎn)彎力度就越強從而將小車?yán)剀壽E中央。這就是一個最簡單的巡線PID控制器只用了P項。調(diào)試時Kp太小小車反應(yīng)慢容易沖出軌道Kp太大小車會在軌跡兩側(cè)劇烈振蕩。需要在實踐中找到一個平衡點。4. 系統(tǒng)集成、調(diào)試與性能優(yōu)化當(dāng)所有模塊的代碼都編寫完成后將它們集成到一個工程里并燒錄到STM32中這才是挑戰(zhàn)的真正開始。面包板上的系統(tǒng)極其脆弱一個接觸不良或一個軟件BUG都可能導(dǎo)致整個系統(tǒng)行為異常。4.1 分模塊集成與測試絕對不要一次性寫完所有代碼然后下載測試。必須采用“分步集成逐層測試”的策略。第一步核心板與基礎(chǔ)驅(qū)動。先測試LED閃爍、按鍵讀取確保最小系統(tǒng)、下載器和開發(fā)環(huán)境工作正常。第二步電機驅(qū)動。單獨寫一個測試程序讓兩個電機能按照指令正轉(zhuǎn)、反轉(zhuǎn)、調(diào)速。用示波器或萬用表測量PWM引腳輸出是否正常電機驅(qū)動芯片的輸出電壓是否正確。特別注意先將小車架起來讓輪子空轉(zhuǎn)測試避免一上電就“竄出去”。第三步藍(lán)牙模塊。連接藍(lán)牙模塊用串口調(diào)試助手打印信息確保能收到手機發(fā)來的數(shù)據(jù)并能解析出正確的控制指令。第四步超聲波模塊。在靜止?fàn)顟B(tài)下測試測距功能對著墻壁不同距離移動查看測距值是否準(zhǔn)確、穩(wěn)定。調(diào)試輸入捕獲的精度。第五步紅外模塊。將傳感器陣列放在白紙和黑膠帶上移動通過串口打印出5路傳感器的實時狀態(tài)確保每路都能正確區(qū)分黑白。第六步控制邏輯。最后才將傳感器數(shù)據(jù)與控制算法結(jié)合起來。可以先在遙控模式下用手機控制小車運動同時通過藍(lán)牙串口將超聲波和紅外數(shù)據(jù)實時發(fā)送到手機端顯示進行聯(lián)合調(diào)試。4.2 電源噪聲與電機干擾的排查這是面包板智能車最常見、也最令人頭疼的問題。癥狀包括程序無故復(fù)位、傳感器讀數(shù)亂跳、藍(lán)牙連接不穩(wěn)定。排查與解決步驟目視檢查首先確保所有電源線和地線連接牢固特別是電機驅(qū)動部分的大電流路徑最好使用較粗的杜邦線或直接焊接。電容是救星如前所述在電機驅(qū)動芯片的電源輸入端并上大電解電容100uF-470uF和小瓷片電容0.1uF。不僅要在驅(qū)動模塊上加最好在STM32最小系統(tǒng)板的電源入口處也并聯(lián)一個10uF電解電容和一個0.1uF瓷片電容。地線環(huán)路確保整個系統(tǒng)只有一個“星形”接地點。所有模塊的GND最終都應(yīng)匯集到電池的負(fù)極避免形成地線環(huán)路引入噪聲。物理隔離如果條件允許將電機驅(qū)動部分和單片機/傳感器部分在面包板上盡量分開布局中間留出一定空隙。或者使用兩塊面包板一塊專供大功率電機驅(qū)動另一塊供控制電路。軟件抗干擾在程序初始化時開啟STM32的獨立看門狗IWDG。如果程序因干擾跑飛看門狗會在設(shè)定時間內(nèi)復(fù)位單片機讓系統(tǒng)恢復(fù)。在讀取關(guān)鍵傳感器數(shù)據(jù)如紅外、超聲波Echo的GPIO代碼前后可以加入短暫的延時或多次讀取取平均值來抗抖動。4.3 動態(tài)性能調(diào)優(yōu)與參數(shù)整定當(dāng)小車能基本運行后就需要精細(xì)調(diào)優(yōu)讓它跑得更快、更穩(wěn)。循跡性能調(diào)優(yōu)調(diào)整紅外傳感器高度傳感器離地面太近容易檢測到地面紋理干擾太遠(yuǎn)檢測靈敏度下降。通常距離地面5-10mm為佳需要通過實驗確定。優(yōu)化PID參數(shù)如果只用P控制振蕩嚴(yán)重可以加入微分D控制來抑制振蕩。D項 Kd * (本次偏差 - 上次偏差)。D項能預(yù)測偏差的變化趨勢在偏差開始減小時提供反向力矩有效減少超調(diào)和振蕩。但D項對噪聲敏感需要先對偏差數(shù)據(jù)進行濾波。積分I項在本項目中一般不需要容易導(dǎo)致響應(yīng)遲鈍和飽和。速度與彎道適應(yīng)性直道時可以加快基礎(chǔ)速度進入彎道前通過偏差變化率判斷或進入彎道后可以動態(tài)降低基礎(chǔ)速度防止離心力過大沖出賽道。避障邏輯優(yōu)化 簡單的“停-轉(zhuǎn)-測”策略效率較低。可以改進為“邊轉(zhuǎn)邊測”當(dāng)檢測到障礙物時小車不是完全停止而是開始緩慢旋轉(zhuǎn)一個輪子正轉(zhuǎn)一個輪子反轉(zhuǎn)同時在旋轉(zhuǎn)過程中持續(xù)進行超聲波測距。一旦發(fā)現(xiàn)某個方向的距離大于安全距離就立即朝該方向前進。這樣避障動作更連貫耗時更短。一個重要的調(diào)試技巧利用藍(lán)牙進行無線調(diào)試。將小車內(nèi)部的傳感器數(shù)據(jù)、電機PWM值、控制狀態(tài)變量等通過藍(lán)牙串口實時發(fā)送到電腦或手機上的串口調(diào)試助手如Serial Bluetooth Terminal。這樣你就能在電腦上看到小車運行時的“內(nèi)心活動”對于分析問題、調(diào)整參數(shù)有巨大幫助。這相當(dāng)于給你的裸機系統(tǒng)增加了一個簡單的“日志系統(tǒng)”。5. 項目進階與擴展思路完成基礎(chǔ)功能后這個面包板智能車平臺仍有巨大的擴展?jié)摿梢宰鳛槟闵钊肭度胧绞澜绲木毷猪椖俊S布U展增加編碼器給電機加上光電或霍爾編碼器可以精確測量電機的實際轉(zhuǎn)速和行走距離實現(xiàn)更精準(zhǔn)的閉環(huán)速度控制和里程計定位。更換主控嘗試將STM32F103升級到性能更強的F4系列如F407或嘗試使用國產(chǎn)的GD32、APM32等兼容芯片體驗不同芯片的開發(fā)環(huán)境與性能差異。集成IMU加入MPU6050六軸陀螺儀加速度計模塊可以獲取小車的姿態(tài)角俯仰、橫滾、偏航實現(xiàn)更復(fù)雜的平衡車或姿態(tài)控制算法。升級感知系統(tǒng)嘗試使用TOF激光測距模塊如VL53L0X替代超聲波精度和響應(yīng)速度更高。或者添加一個灰度傳感器陣列實現(xiàn)更復(fù)雜的賽道元素識別。軟件架構(gòu)進階引入簡單RTOS當(dāng)功能越來越復(fù)雜時間片輪詢可能顯得力不從心。可以嘗試移植一個輕量級RTOS如FreeRTOS或RT-Thread Nano。將藍(lán)牙處理、傳感器采集、控制算法、電機驅(qū)動等任務(wù)分別放在不同的線程中由操作系統(tǒng)調(diào)度并利用信號量、消息隊列進行任務(wù)間通信使程序結(jié)構(gòu)更加清晰、健壯。實現(xiàn)上位機監(jiān)控用PythonPyQt或C#WinForm編寫一個簡單的上位機程序通過藍(lán)牙接收小車數(shù)據(jù)并實時繪制出傳感器數(shù)據(jù)曲線、小車運動軌跡等打造一個完整的調(diào)試與監(jiān)控系統(tǒng)。算法深化嘗試實現(xiàn)更先進的巡線算法如“預(yù)測控制”或使用“狀態(tài)機”來管理小車不同的運行模式遙控、循跡、避障、巡航之間的切換使小車行為更有邏輯性。這個項目最大的價值不在于最終做出來的小車能跑多快、多穩(wěn)而在于從元器件選型、電路連接、驅(qū)動編寫、算法實現(xiàn)到系統(tǒng)調(diào)試的完整過程中你所積累的每一個經(jīng)驗、踩過的每一個坑、解決的每一個問題。這些才是嵌入式工程師最寶貴的財富。當(dāng)你看著這輛由自己親手在面包板上搭建、用代碼一行行“賦予生命”的小車按照你的指令靈活運動時那種成就感是任何現(xiàn)成套件都無法給予的。它標(biāo)志著你已經(jīng)真正推開了嵌入式開發(fā)的大門具備了解決實際問題的初步能力。