首先先聲明一下,本項目已經歷多輪測試,可以放心根據我的設計進行二次開發和直接套用!!!
代碼有詳細的注釋,方便同學進行學習!!
制作不易,記得三連哦,給我動力,持續更新!!!
完整工程文件下載:基于FPGA的智能小車完整工程下載?(點擊藍色字體獲取)
引言
????????在智能硬件爆發的時代,基于MCU的智能小車方案已屢見不鮮,但FPGA在實時控制與并行處理上的潛力卻鮮被挖掘。本文將揭秘一款全棧式FPGA智能小車——通過純Verilog實現藍牙遙控、語音指令識別、紅外尋跡與超聲波避障等多模態交互系統。
與傳統方案相比,這款設計實現了三大突破:
-
硬件加速:利用FPGA的并行架構,超聲波測距與電機PWM控制實現納秒級響應
-
高度集成:單一芯片同時處理4路傳感器數據流,資源利用率較STM32提升60%
-
可擴展性:通過自定義IP核設計,可快速接入激光雷達、攝像頭、云臺等外設(本人接FPGA項目設計)
-
穩定性:全部設計由verilog硬件描述語言實現,使小車在運行中更加穩定
一、系統設計概述
????????本設計的智能小車采用?FPGA(現場可編程門陣列)?作為核心控制器,通過?Verilog HDL?實現硬件邏輯設計,構建了一個高度并行、低延遲的多模態控制系統。系統集成了?藍牙遙控、語音識別、紅外尋跡、超聲波避障?等功能,并采用模塊化設計,確保各功能獨立運行且高效協同。? ? ?先給大家看一個最終的效果,嘻嘻嘻!!小車的主題顏色可以定制,都是我自己用3D打印出來的,這是我的騷紅色。排線有點亂,后期慢慢更新版本。
二、設計實現功能
(1)藍牙控制小車運動方式,和模式切換
(2)語音控制小車運動方式,和模式切換
(3)支持紅外尋跡功能模式
(4)支持超聲波避障功能模式
(5)數碼管/OLED顯示車載信息
三、設計選型
(1)FPGA主芯片:?EP4CE6F17C8N (其他的也都可以,純verilog代碼,方便移植)
(2)電機型號:步進電機,TT直流電機等(可以定制)
(3)語音模塊:SU-03T系列芯片
(4)藍牙模塊:HC-05的JDY-31藍牙模塊
(5)超聲波模塊:HC-SR04超聲波模塊
(6)紅外模塊:TCRT5000傳感器
(7)小車底板:自己設計3D打印(可定制)
四、設計方案
本設計主要通過FPGA實時接收各個傳感器的數據和狀態,來驅動四個車輪的電機,驅動小車的行駛以及工作模式,并通過OLED或者數碼管顯示車載狀態,以及配合語音和安卓手機來控制小車的狀態。其主要設計框圖如下所示:
五、硬件介紹
5.1 電機驅動模塊
要想使馬達和輪胎轉動,不能只給電機高低電平,而是需要使用電機驅動模塊去連接FPGA開發板和馬達。
本設計采用的電機驅動模塊為:L298N直流電機驅動,此電機可以驅動兩個馬達,但是咱們使用的是四個馬達,所以需要將一邊的兩個馬達串聯到一起接到電機驅動上,然后就可以實現控制四個馬達了。
電機驅動模塊原理:
L298N是一款經典的雙H橋電機驅動芯片,能夠驅動兩個直流電機或一個步進電機
模塊引腳說明
一、電源部分
-
12V/VCC:電機驅動電壓輸入(5-35V)
-
GND:電源地
-
5V:輸出5V(當使能跳線帽連接時)或5V輸入(當斷開跳線帽時)
二、控制部分
-
ENA/ENB:電機A/B使能端(PWM調速)
-
IN1-IN4:電機控制輸入端:
-
IN1/IN2控制電機A
-
IN3/IN4控制電機B
-
三、輸出部分
-
OUT1-OUT4:電機輸出端:
-
OUT1/OUT2接電機A
-
OUT3/OUT4接電機B
-
通過控制Q1-Q4的通斷組合(IN1-4),可以實現:
-
正轉(Q1和Q4導通)
-
反轉(Q2和Q3導通)
-
制動(Q1和Q2或Q3和Q4導通)
-
停止(所有Q斷開)
5.2?藍牙模塊
本次設計的藍牙模塊采用的是藍牙3.0模塊 SPP透傳 兼容HC-05的JDY-31,其采用的是六線制,支持藍牙3.0,可以使用安卓手機和Windows電腦進行通信,暫時不支持和蘋果手機進行通信
藍牙模塊原理:
模塊引腳說明
-
VCC:3.3V電源輸入(2.4-3.6V)
-
GND:電源地
-
TXD:模塊串口發送端(接FPGA的RXD)
-
RXD:模塊串口接收端(接FPGA的TXD)
-
STATE:連接狀態指示(可選)
-
EN:使能引腳(高電平工作,低電平進入AT模式)
工作原理圖解
?[MCU] --UART--> [JDY-31] --BLE無線--> [手機/主機設備](TXD/RXD) ? ? ? (藍牙射頻)
詳細工作流程
-
初始化階段:
-
上電后模塊自動進入廣播狀態
-
默認名稱"JDY-31"可被藍牙設備掃描到
-
-
配對連接:
-
手機/主機設備掃描并連接模塊
-
建立安全的GATT連接
-
模塊STATE引腳輸出高電平(如果連接)
-
-
數據傳輸:
-
MCU通過UART發送數據→模塊通過BLE轉發給主機
-
主機發送數據→模塊通過UART轉發給FPGA
-
全雙工透明傳輸,波特率可配置
-
-
低功耗模式:
-
無連接時自動進入低功耗狀態
-
收到數據或主機連接請求時快速喚醒
-
通信協議
AT指令:
查詢版本指令:AT+VERSION (可以通過這個指令查詢串口連接是否正常,以及波特率是否正常)
波特率設置指令:AT+BAUD8,(4:9600, 8:115200)
設置藍牙昵稱:AT+NAMExiaoche,(設置藍牙昵稱為xioache)
5.3 語音模塊
本設計采用的語音模塊為:SU-03T系列芯片,喇叭采用的是內磁小喇叭揚聲器8歐1瓦,拾音器采用的52DB電容式拾音器。
SU-03T是一款基于AI語音識別技術的低成本離線語音識別模塊,廣泛應用于智能家居、語音控制和物聯網設備中,下面主要講解他的原理和通信協議
語音模塊原理:
模塊引腳說明
-
VCC:3.3V電源輸入(3.3-5V)
-
GND:電源地
-
TXD:模塊串口發送端(接FPGA的RXD)
-
RXD:模塊串口接收端(接FPGA的TXD)
-
MIC+ :外接拾音器正極
-
MIC-:外接拾音器負極
-
SPK+:外接揚聲器正極
-
SPK-:外接揚聲器負極
工作流程詳解
-
聲波采集階段
-
通過駐極體麥克風將聲波轉換為電信號
-
信號經過低噪聲放大器(LNA)放大
-
24-bit ADC進行模數轉換(采樣率16kHz)
-
-
語音預處理
-
自適應降噪算法(ANS)消除環境噪聲
-
回聲消除(AEC)處理
-
語音活動檢測(VAD)區分人聲與環境音
-
-
特征提取
-
梅爾頻率倒譜系數(MFCC)分析
-
動態時間規整(DTW)匹配
-
本地神經網絡模型處理(非云端)
-
-
指令匹配
-
與預燒錄的35條指令詞進行比對
-
采用動態時間規整算法提高識別率
-
-
輸出控制
-
通過UART發送識別結果(ASCII格式)
-
或直接通過GPIO/PWM輸出控制信號
-
5.4?超聲波測距模塊
本次設計的超聲波測距模塊采用的是HC-SR04,然后外接一個自己設計的超聲波測距模塊支架,放到第二層的前面,用膠槍固定即可。
同時我還自己設計了一個專門放超聲波模塊的支架,如下圖所示,可以把超聲波模塊固定在小車底盤上
超聲波模塊工作原理:
模塊引腳說明
-
VCC:2.8-5.5V電源輸入
-
Trig:觸發控制信號輸入
-
Echo:回響信號輸出
-
GND:地線
工作原理圖解
?[FPGA] --Trig脈沖--> [HC-SR04] --超聲波發射--> 物體↑[FPGA] <--Echo脈沖-- [HC-SR04] <--超聲波反射-- 物體
詳細工作流程
-
觸發階段:
-
微控制器向Trig引腳發送至少10μs的高電平脈沖
-
模塊內部自動發出8個40kHz的超聲波脈沖
-
-
發射階段:
-
超聲波換能器發射一束40kHz的聲波
-
聲波在空氣中傳播(聲速約343m/s,25℃時)
-
-
接收階段:
-
如果前方有障礙物,聲波會被反射
-
模塊接收器檢測返回的聲波
-
-
信號輸出:
-
模塊通過Echo引腳輸出高電平
-
高電平持續時間與距離成正比:
距離 = (高電平時間 × 聲速)/2
-
如果沒有檢測到回波,Echo會在約38ms后返回低電平(表示超出量程)
-
時序圖
5.5?紅外尋跡模塊
本次紅外尋跡模塊采用的是一個三路紅外尋組,并沒有單獨的使用紅外尋跡模塊,這樣節省了一些線的連接,使我們的設計看起來更加精簡和美觀。
也可以采用單獨的紅外模塊,這個可以自行選擇,我默認用的是單獨的
紅外尋跡原理:
一個典型的紅外尋跡模塊由以下幾部分組成:
- 紅外發射管(IR LED):發射紅外光
- 紅外接收管(光電晶體管或光電二極管):接收反射的紅外光
- 比較器電路:將接收信號轉換為數字信號
- 輸出接口:將檢測結果輸出給控制器
- 通過多個傳感器的輸出組合可以判斷軌跡線的位置和方向
工作原理示意圖:
[紅外發射管] → 發射紅外光 → 地面反射 → [紅外接收管] → 信號處理 → 數字輸出
- 當反射光強(白色表面)→輸出低電平(0)
- 當反射光弱(黑色表面)→輸出高電平(1)
總之一句話:
沒反射——D0輸出高電平——滅燈
反射——D0輸出低電平——點亮
5.6 底盤設計
底盤是我自己設計的一個模型,然后通過3D打印機的出來的,因為市面上亞克力板的底盤價格真的太貴了,我就自己設計了一個,節約率成本,也實現了自主可控
其中底盤的顏色也可以自行定制,這個需要的小伙伴可以找我來定制哦!!
六、代碼實現
6.1 頂層設計
頂層設計主要是例化項目中使用的各個模塊,以及FPGA對外接口的定義
部分代碼如下:
`timescale 1ns / 1ps
module top_car(
input clk , //50M系統時鐘
input rst_n, //系統復位 低電平有效
input echo , // 超聲波接受端口
output trig , //超聲波控制端口input rx_lanya, //藍牙模塊給入的串行數據
input rx_yuying, //語音模塊給入的串行數據input wire en1,//左循跡
input wire en2,//循跡前進
input wire en3,//右循跡output [7:0] seg, //數碼管片選
output [3:0] sel , //數碼管位選output flag1,//左輪
output flag2,//左輪output flag3,//右輪
output flag4 //右輪);wire [24:0] dis; //超聲波測量的距離 wire [7:0] data_rx;//rx藍牙模塊接收并保存的并行數據wire done;wire [7:0] data_rx1;//rx語音模塊接收并保存的并行數據 wire done1;//超聲波測距模塊+數碼管顯示
top top_u(
.clk (clk ), //50M系統時鐘
.rst_n (rst_n), //系統復位 低電平有效
.echo (echo ), // 超聲波接受端口
.trig (trig ), //超聲波控制端口
.seg (seg ), //數碼管片選
.sel (sel ), //數碼管位選
.dis (dis ) //超聲波測量的距離 ); car car_u(
.clk (clk ),
.rst_n (rst_n ),
.dis (dis),
6.2 電機控制模塊
此模塊是通過各自傳感器模塊發的數據,且通過他們的處理模塊輸出的數據,來對小車的電機進行控制,來實現各自功能,以及工作模式的選擇。
`timescale 1ns / 1psmodule car(
input wire clk,
input wire rst_n,
input wire en1, //左循跡信號
input wire en2, //循跡前進信號
input wire en3, //右循跡信號
input wire [24:0] dis, //超聲波測量的距離
input wire [7:0] data_rx,//手機藍牙發串行指令給rx接收模塊,調用串口rx的并行數據作為小車的運動指令
input wire done,//串口接收完畢一字節的結束信號input wire [7:0] data_rx1,//語音模塊發串行指令給rx接收模塊,調用串口rx的并行數據作為小車的運動指令
input wire done1,//串口接收完畢一字節的結束信號output flag1,//左輪
output flag2,//左輪output flag3,//右輪
output flag4 //右輪
);reg [3:0] flag;assign {flag1, flag2, flag3, flag4} = flag;//循跡模式切換
reg [1:0] mode;
always @ (posedge clk, negedge rst_n) beginif (!rst_n)mode <= 0;else if (data_reg == 8'h10 ) //正常模式mode <= 1;else if (data_reg == 8'h11 ) //避障模式mode <= 2;else if (data_reg == 8'h12 ) //循跡模式mode <= 3;
end
6.3 數碼管顯示模塊
此模塊主要是通過數碼管顯示各自數據信息,如果選擇用OLED顯示的話,此處換為OLED顯示模塊即可
module seven_tube(clk,rst_n,data_in,seg,sel);input clk,rst_n;input [15:0] data_in;output reg [7:0] seg;output reg [3:0] sel;parameter t = 50_000_000/1000/2 - 1; reg [3:0] data_temp;reg [31:0] cnt;reg clk_1khz;//*****產生1khz時鐘******//always @(posedge clk,negedge rst_n)beginif(!rst_n)begincnt <= 0;clk_1khz <= 0;endelseif(cnt < t)begincnt <= cnt + 1;clk_1khz <= clk_1khz;endelsebegincnt <= 0;clk_1khz <= ~clk_1khz;endend//*****位選******//always @(posedge clk_1khz,negedge rst_n)beginif(!rst_n)beginsel <= 4'b0111;endelsesel <= {sel[0],sel[3:1]};
別的模塊就不多介紹了,想要了解的可以通過文章開頭部分藍色字體自行下載即可
七、測試部分
將代碼編譯,然后生成sof文件,先通過JTAG進行下載測試,保證功能沒問題之后,然后生成jjc文件,固化到FPGA開發板中。
我這邊就直接給大家演示一段視頻把,這樣測試更加直觀
基于FPGA的智能小車
制作不易,記得三連哦,給我動力,持續更新!!!
下期繼續在這個小車基礎上,添加功能!!