基于FPGA的智能小车设计(包含代码)/ 全栈FPGA智能小车:Verilog实现蓝牙/语音/多传感器融合的移动平台

首先先声明一下,本项目已经历多轮测试,可以放心根据我的设计进行二次开发和直接套用!!!

代码有详细的注释,方便同学进行学习!!

制作不易,记得三连哦,给我动力,持续更新!!!

完整工程文件下载:基于FPGA的智能小车完整工程下载 (点击蓝色字体获取)


引言

在智能硬件爆发的时代,基于MCU的智能小车方案已屡见不鲜,但FPGA在实时控制与并行处理上的潜力却鲜被挖掘。本文将揭秘一款全栈式FPGA智能小车 ------通过纯Verilog实现蓝牙遥控、语音指令识别、红外寻迹与超声波避障等多模态交互系统。

与传统方案相比,这款设计实现了三大突破:

  1. 硬件加速:利用FPGA的并行架构,超声波测距与电机PWM控制实现纳秒级响应

  2. 高度集成:单一芯片同时处理4路传感器数据流,资源利用率较STM32提升60%

  3. 可扩展性 :通过自定义IP核设计,可快速接入激光雷达、摄像头、云台等外设(本人接FPGA项目设计

  4. **稳定性:**全部设计由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桥电机驱动芯片,能够驱动两个直流电机或一个步进电机

模块引脚说明

一、电源部分

  1. 12V/VCC:电机驱动电压输入(5-35V)

  2. GND:电源地

  3. 5V:输出5V(当使能跳线帽连接时)或5V输入(当断开跳线帽时)

二、控制部分

  1. ENA/ENB:电机A/B使能端(PWM调速)

  2. IN1-IN4:电机控制输入端:

    • IN1/IN2控制电机A

    • IN3/IN4控制电机B

三、输出部分

  1. 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电脑进行通信,暂时不支持和苹果手机进行通信

蓝牙模块原理:

模块引脚说明

  1. VCC:3.3V电源输入(2.4-3.6V)

  2. GND:电源地

  3. TXD:模块串口发送端(接FPGA的RXD)

  4. RXD:模块串口接收端(接FPGA的TXD)

  5. STATE:连接状态指示(可选)

  6. EN:使能引脚(高电平工作,低电平进入AT模式)

工作原理图解

复制代码
 [MCU] --UART--> [JDY-31] --BLE无线--> [手机/主机设备]
 (TXD/RXD)        (蓝牙射频)

详细工作流程

  1. 初始化阶段

    • 上电后模块自动进入广播状态

    • 默认名称"JDY-31"可被蓝牙设备扫描到

  2. 配对连接

    • 手机/主机设备扫描并连接模块

    • 建立安全的GATT连接

    • 模块STATE引脚输出高电平(如果连接)

  3. 数据传输

    • MCU通过UART发送数据→模块通过BLE转发给主机

    • 主机发送数据→模块通过UART转发给FPGA

    • 全双工透明传输,波特率可配置

  4. 低功耗模式

    • 无连接时自动进入低功耗状态

    • 收到数据或主机连接请求时快速唤醒

通信协议

AT指令:

**查询版本指令:**AT+VERSION (可以通过这个指令查询串口连接是否正常,以及波特率是否正常)

**波特率设置指令:**AT+BAUD8,(4:9600, 8:115200)

**设置蓝牙昵称:**AT+NAMExiaoche,(设置蓝牙昵称为xioache)

5.3 语音模块

本设计采用的语音模块为:SU-03T系列芯片,喇叭采用的是内磁小喇叭扬声器8欧1瓦,拾音器采用的52DB电容式拾音器。

SU-03T是一款基于AI语音识别技术的低成本离线语音识别模块,广泛应用于智能家居、语音控制和物联网设备中,下面主要讲解他的原理和通信协议

语音模块原理:

模块引脚说明

  1. VCC:3.3V电源输入(3.3-5V)

  2. GND:电源地

  3. TXD:模块串口发送端(接FPGA的RXD)

  4. RXD:模块串口接收端(接FPGA的TXD)

  5. MIC+:外接拾音器正极

  6. MIC-:外接拾音器负极

  7. SPK+:外接扬声器正极

  8. SPK-:外接扬声器负极

工作流程详解

  1. 声波采集阶段

    • 通过驻极体麦克风将声波转换为电信号

    • 信号经过低噪声放大器(LNA)放大

    • 24-bit ADC进行模数转换(采样率16kHz)

  2. 语音预处理

    • 自适应降噪算法(ANS)消除环境噪声

    • 回声消除(AEC)处理

    • 语音活动检测(VAD)区分人声与环境音

  3. 特征提取

    • 梅尔频率倒谱系数(MFCC)分析

    • 动态时间规整(DTW)匹配

    • 本地神经网络模型处理(非云端)

  4. 指令匹配

    • 与预烧录的35条指令词进行比对

    • 采用动态时间规整算法提高识别率

  5. 输出控制

    • 通过UART发送识别结果(ASCII格式)

    • 或直接通过GPIO/PWM输出控制信号

5.4 超声波测距模块

本次设计的超声波测距模块采用的是HC-SR04,然后外接一个自己设计的超声波测距模块支架,放到第二层的前面,用胶枪固定即可。

同时我还自己设计了一个专门放超声波模块的支架,如下图所示,可以把超声波模块固定在小车底盘上

超声波模块工作原理:

模块引脚说明

  1. VCC:2.8-5.5V电源输入

  2. Trig:触发控制信号输入

  3. Echo:回响信号输出

  4. GND:地线

工作原理图解

复制代码
 [FPGA] --Trig脉冲--> [HC-SR04] --超声波发射--> 物体
                      ↑
 [FPGA] <--Echo脉冲-- [HC-SR04] <--超声波反射-- 物体

详细工作流程

  1. 触发阶段

    • 微控制器向Trig引脚发送至少10μs的高电平脉冲

    • 模块内部自动发出8个40kHz的超声波脉冲

  2. 发射阶段

    • 超声波换能器发射一束40kHz的声波

    • 声波在空气中传播(声速约343m/s,25℃时)

  3. 接收阶段

    • 如果前方有障碍物,声波会被反射

    • 模块接收器检测返回的声波

  4. 信号输出

    • 模块通过Echo引脚输出高电平

    • 高电平持续时间与距离成正比:距离 = (高电平时间 × 声速)/2

    • 如果没有检测到回波,Echo会在约38ms后返回低电平(表示超出量程)

时序图

5.5 红外寻迹模块

本次红外寻迹模块采用的是一个三路红外寻组,并没有单独的使用红外寻迹模块,这样节省了一些线的连接,使我们的设计看起来更加精简和美观。

也可以采用单独的红外模块,这个可以自行选择,我默认用的是单独的

红外寻迹原理:

一个典型的红外寻迹模块由以下几部分组成:

  1. 红外发射管(IR LED):发射红外光
  2. 红外接收管(光电晶体管或光电二极管):接收反射的红外光
  3. 比较器电路:将接收信号转换为数字信号
  4. 输出接口:将检测结果输出给控制器
  5. 通过多个传感器的输出组合可以判断轨迹线的位置和方向

工作原理示意图:

红外发射管\] → 发射红外光 → 地面反射 → \[红外接收管\] → 信号处理 → 数字输出 * 当反射光强(白色表面)→输出低电平(0) * 当反射光弱(黑色表面)→输出高电平(1) 总之一句话: **没反射------D0输出高电平------灭灯** **反射------D0输出低电平------点亮** ### 5.6 底盘设计 底盘是我自己设计的一个模型,然后通过3D打印机的出来的,因为市面上亚克力板的底盘价格真的太贵了,我就自己设计了一个,节约率成本,也实现了自主可控 ![](https://i-blog.csdnimg.cn/direct/e0da1d11c6474a77a84fe0e0dd14c426.png) 其中底盘的颜色也可以自行定制,这个需要的小伙伴可以找我来定制哦!! ## 六、代码实现 ### 6.1 顶层设计 顶层设计主要是例化项目中使用的各个模块,以及FPGA对外接口的定义 部分代码如下: ```cpp `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 电机控制模块 此模块是通过各自传感器模块发的数据,且通过他们的处理模块输出的数据,来对小车的电机进行控制,来实现各自功能,以及工作模式的选择。 ```cpp `timescale 1ns / 1ps module 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) begin if (!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显示模块即可 ```cpp 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) begin if(!rst_n) begin cnt <= 0; clk_1khz <= 0; end else if(cnt < t) begin cnt <= cnt + 1; clk_1khz <= clk_1khz; end else begin cnt <= 0; clk_1khz <= ~clk_1khz; end end //*****位选******// always @(posedge clk_1khz,negedge rst_n) begin if(!rst_n) begin sel <= 4'b0111; end else sel <= {sel[0],sel[3:1]}; ``` 别的模块就不多介绍了,想要了解的可以通过文章开头部分蓝色字体自行下载即可 ![](https://i-blog.csdnimg.cn/direct/574660ea69424dcfac0d96501b180157.png) ## 七、测试部分 将代码编译,然后生成sof文件,先通过JTAG进行下载测试,保证功能没问题之后,然后生成jjc文件,固化到FPGA开发板中。 我这边就直接给大家演示一段视频把,这样测试更加直观 基于FPGA的智能小车 **制作不易,记得三连哦,给我动力,持续更新!!!** **下期继续在这个小车基础上,添加功能!!**

相关推荐
书山有路勤为径~2 小时前
6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
智能家居
hahaha60164 小时前
ARINC818协议综述
网络·fpga开发
lo卖火柴的小熊猫9 小时前
FPGA(一)Quartus II 13.1及modelsim与modelsim-altera安装教程及可能遇到的相关问题
fpga开发
觅食小鱼10 小时前
智能家居技术简介
系统架构·智能家居
猎板PCB 邹亮1 天前
工业控制线路板是什么?工控PCB的核心原理和设计要点
fpga开发·pcb工艺
soulermax1 天前
数字ic后端设计从入门到精通11(含fusion compiler, tcl教学)全定制设计入门
嵌入式硬件·fpga开发·硬件架构
千宇宙航1 天前
闲庭信步使用图像验证平台加速FPGA的开发:第二十三课——图像直方图和灰度图像叠加的FPGA实现
fpga开发
Skylab11 天前
深入理解Zigbee:驱动智能家居与工业物联网的低功耗互联引擎
物联网·智能家居
fei_sun2 天前
【zynq7020】PS的“Hello World”
fpga开发