基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车

这篇具有很好参考价值的文章主要介绍了基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        闲来无事整个小车玩玩,设想的小车可以有蓝牙模块来控制模式切换,通过发送指令来更改相对应的功能,当避障的时候可以自动规避障碍物,当处于红外循迹时,可以跟随规划的轨迹前线,当手动遥控时可以控制前进后退左右转向停止等功能。

        先介绍一下使用的红外模块,其上有四个管脚,vcc接电源,gnd接地,D0传输红外线是否被吸收,A0传输模拟信号主要是不同距离输出不同的电压,但是此脚一般可以不接.

        然后思路就是通过判断D0传过来的电平信号来判断小车有没有接触到黑线,当红外线被吸收,也就是触碰到黑线,D0会持续输出高电平,直到它检测到红外线返回才会回归低电平,基于对管脚传回的电平检测,可以判断是否接触到黑线。

fpga智能小车,fpga开发

这部分代码很好写,可以参考如下代码:

`timescale 1ns / 1ps


module red_line(
input sysclk         ,///系统时钟
input rst_n          ,///复位
input [1:0] D0       ,///红外探测模块的电平输入
output  reg [3:0] car//输出轮子控制
    );
always @(posedge sysclk)
   if(!rst_n)
      car<=4'b1001;
   else if( D0[0]==1 && D0[1]==1 )
      car<=4'b0000;     
   else if(D0[0]==1)   //左边的红外探测模块
      car<=4'b0101;
   else if(D0[1]==1)  //右边的红外探测模块
      car<=4'b1010;
   else
      car<=4'b1001;    //保持状态
endmodule

输入系统时钟,复位,红外探测模块的电平输入,然后输出小车轮子一个怎么走,就只有一个简单的判断语句。

然后是超声波模块,超声波模块的应用,之前写过了,这里就不再赘述。

超声波模块的距离还要输入到一个避障模块中,这个模块只负责成立输入的距离信息,判断是否达到阈值。

`timescale 1ns / 1ps


module car_c(
input sysclk,
input rst_n,
input [13:0] distance,
output  reg [3:0] car
    );
 always @(posedge sysclk)
    if(!rst_n)
        car<=4'b1001;
    else if(distance>=15)
        car<=4'b1001;
    else if(distance<15)
        car<=4'b1010 ; 
    else
        car<=car;
 //assign car=4'b1001;   //1010 左转  0101 右转  1001 前进 0110 后退
                    
 
endmodule

然后是蓝牙模块,蓝牙模块包括两部分,接收的rx,这里是基于蓝牙模块来说的,对蓝牙模块的接收和发送,我们需要通过蓝牙模块来进行指令控制,输入特定的十六进制代码输出特定的控制信息:

这里我们定义了开发板的振动频率也就是一秒震动多少次,然后是波特率,这里没有涉及到其他的模块,如果是不同的蓝牙模块之间通信,波特率要设置的一样。

//串口读取,可调整波特率,运行频率,本次设计不可以修改数据传输的长度//
`timescale 1ns / 1ps
module uart_RX_car
#(
    parameter SYSCLK = 50_000_000   ,//系统时钟
    parameter Baud   = 9600     //波特率
)
(
    input              sysclk           ,
    input              rst_n            ,
    input              RX               ,
    output reg         vaild            ,//数据有效
    output reg   [7:0] Data
    );
localparam CLK_DELAY = SYSCLK/Baud;
localparam CLK_MID     = CLK_DELAY/2;
localparam IDLE=2'd0;//空闲状态,等待RX信号被拉低
localparam START=2'd1;//起始状态
localparam DATA=2'd2;//数据接收
localparam STOP=2'd3;//停止状态
reg [1:0] cur_state;
reg [1:0] next_state;
reg [1:0] rx_flag = 2'b11;
reg [4:0] cnt_bit;//传输数据个数
reg [31:0] cnt;//记录波特率,即记录何时让cnt_bit加1
******开始信号寄存*****
always@(posedge sysclk)
    if(!rst_n)
        rx_flag<=2'b11;
    else
        rx_flag<={rx_flag[0],RX};
    
******state1*****
always@(posedge sysclk)
    if(!rst_n)
        cur_state<=IDLE;
    else
        cur_state<=next_state;
******state2*****
always@(*) begin
    next_state = IDLE;
    case(cur_state)
        IDLE:begin
            if(rx_flag==2'b10)
                next_state = START;
            else
                next_state = IDLE;    
        end
        START:begin
            if(cnt_bit==5'd1)
                next_state = DATA;
            else
                next_state = START;
        end
        DATA:begin
            if(cnt_bit==5'd9)
                next_state = STOP;
            else
                next_state = DATA;
        end
        STOP:begin
            if(cnt_bit==5'd9 && rx_flag == 2'b11)
                next_state = IDLE;
            else
                next_state = STOP;    
        end
        default:begin
            next_state = IDLE;
        end
    endcase
end
******state3*****
always@(posedge sysclk)
    if(!rst_n) begin
        cnt_bit <= 5'd0;
        cnt     <= 32'd0;  
        Data    <= 8'd0;
        vaild   <= 32'd0;
    end
    else
        case(next_state)
            IDLE:begin
                cnt_bit <= 5'd0;
                cnt     <= 32'd0;  
                vaild    <= 32'd0;
                Data   <= Data;//可以为0,也可以保持上一次的数据    
            end
            START:begin
                if(cnt >= CLK_DELAY-1)begin
                    cnt <= 32'd0;
                    cnt_bit <= cnt_bit + 32'd1;
                end
                else begin
                    cnt_bit <= cnt_bit;
                    cnt <= cnt + 32'd1;
                end
                    Data <= Data;
                    vaild <= 0;
            end
            DATA:begin
                if(cnt >= CLK_DELAY-1)begin
                    cnt <= 32'd0;
                    cnt_bit <= cnt_bit + 32'd1;
                end
                else begin
                    cnt_bit <= cnt_bit;
                    cnt <= cnt + 32'd1;
                end
                if(cnt == CLK_MID-1) //中点的时候进行数据的采集,这样能保证数据采集比较稳定//
                    Data <= {RX,Data[7:1]};
                else
                    Data <= Data;
                vaild <= 0;
            end
            STOP:begin
                if(cnt >= CLK_DELAY-1)begin
                    cnt <= 32'd0;
                    cnt_bit <= cnt_bit + 32'd1;
                end
                else begin
                    cnt_bit <= cnt_bit;
                    cnt <= cnt + 32'd1;
                end 
                Data <= Data;
                if(cnt == CLK_MID-1)
                    vaild <= 1;
                else
                    vaild <= 0;
            end
            default:begin
                cnt_bit <= 5'd0;
                cnt     <= 32'd0;  
                Data    <= 8'd0;
                vaild   <= 32'd0;
            end
        endcase
endmodule

然后是接收控制信息的模块,rx传出来的Data会输入到这个模块里面,根据输入的控制信息输出

对应的小车控制信息。

module rx_ctrl(
    input                       sysclk       ,
    input                       rst_n       ,  
    input        [7:0]       Data            ,  
    output   reg  [3:0]      car_ctrl_2            
    );
    
always@(posedge sysclk)
    if(!rst_n)
      car_ctrl_2 <= 4'b0000;
    else
    case(Data) 
    8'h47 : car_ctrl_2 <= 4'b1001;//前进
    8'h4b : car_ctrl_2 <= 4'b0110;//后退
    8'h4a : car_ctrl_2 <= 4'b1010;//右转
    8'h48 : car_ctrl_2 <= 4'b0101;//左转
    8'h49 : car_ctrl_2 <= 4'b0000;//停止
    default :car_ctrl_2 <= 4'b0000;
    endcase     
endmodule

然后是TOP模块,我们需要将所有的模块都都连接起来。这里顶层加了一个led的输出,这样方便我们观察我们当前处于什么状态,也可以方便我们切换状态,通过判断led处于什么状态,将小车的控制输出交给相对应的控制输出模块。在这个里面,数码管和led都可以不用加,这里加入了只是因为可以更好的帮助我们观察小车的状态。文章来源地址https://www.toymoban.com/news/detail-724131.html

`timescale 1ns / 1ps


module TOP8(
input             sysclk,
input             rst_n,
input             echo,//输出的超声波
input       [1:0] D0,
input             RX,
output            trig ,//产生高电平
output  reg [3:0] led  , 
output      [7:0] seg  ,
output      [3:0] dig  ,
output reg  [3:0] car
    );

//assign car=4'b1010;
wire [13:0] distance;
wire [7:0] Data;

wire [3:0] car_ctrl0;//避障
wire [3:0] car_ctrl1;//循迹
wire [3:0] car_ctrl2;//蓝牙
always @(posedge sysclk)
    if(!rst_n)
        led<=4'b0000;
    else
        case(Data)
            8'h41:led<=4'b0001;//避障
            8'h42:led<=4'b0010;//循迹
            //8'h43:led=4'b0100;//蓝牙
            default :led<=4'b0100;
        endcase 
 always @(posedge sysclk)
    if(!rst_n)
        car<=4'b0000;
    else
        case(led)
            4'b0001:car<=car_ctrl0;//避障
            4'b0010:car<=car_ctrl1;//循迹
            4'b0100:car<=car_ctrl2;//蓝牙
            default :car<=4'b0000;
        endcase        
csb csb1(
.sysclk  (sysclk  ),
.rst_n   (rst_n   ),
.trig    (trig    ),//产生高电平
.echo    (echo    ),//输出的超声波
.distance(distance)
    );
seg seg1(
    . sysclk       (sysclk)    ,
    . rst_n        (rst_n )    ,
    . num          (distance   )    ,  //数码管上显示的数字0-9999
    . seg          (seg   )    ,//段选8个灯
    . dig          (dig   )    //位选4个数码管
    );  
car_c car1(
.  sysclk    (sysclk)    ,
.  rst_n     (rst_n )    ,
.  distance  (distance)  ,
.  car       (car_ctrl0  )
    );    
red_line red1(
.sysclk (sysclk),
.rst_n  (rst_n ),
.D0     (D0    ),
.car    (car_ctrl1   )
    );      
uart_RX_car 
#(
    . SYSCLK(50_000_000 )  ,//系统时钟
    . Baud  (9600       ) //波特率
)
uart1(
 . sysclk       ( sysclk )    ,
 . rst_n        ( rst_n  )    ,
 . RX           ( RX     )    ,
 . vaild        ( vaild  )    ,//数据有效
 . Data         ( Data   )
    ); 
 rx_ctrl rx1(
  .   sysclk    (   sysclk   )   ,
  .   rst_n     (   rst_n    )  ,  
  . Data        ( Data       )    ,  
  .car_ctrl_2   (car_ctrl2  )         
    );
 
 
    
         
endmodule

到了这里,关于基于FPGA的蓝牙遥控,超声波避障,红外循迹的智能小车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的超声波测距

    distance超声波测距模块负责数据的采集,vga、uart、beep、数码管根据采集到的数据分别进行vga的屏幕打点、串口输出到上位机、蜂鸣器根据数据大小进行鸣叫以及数码管显示采集到的数据。 RTL视图 代码 串口控制模块把接受到的24位BCD码转换成ASSIC码,并且清除高位零位和添加

    2024年02月07日
    浏览(47)
  • 基于FPGA的超声波测距(verilog)

    目录 一、超声波测距模块(HC-SR04) 1、产品特色 2、产品实物 二、超声波测距原理 三、模块代码 1、产品特色 1、典型工作用电压:5V 2、超小静态工作电流:小于 5mA 3、感应角度(R3 电阻越大,增益越高,探测角度越大): R3 电阻为 392,不大于 15 度 R3 电阻为 472, 不大于 30 度 4、探

    2024年02月03日
    浏览(118)
  • 基于FPGA的超声波测距——UART串口输出

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE10F17C8 4、超声波模块:HC_SR04 要求: 使用 EP4CE10F17C8开发板驱动 超声波检测模块(HC_SR04 ),并将所测得数据显示到串口助手上。 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发

    2024年02月14日
    浏览(45)
  • 基于FPGA的超声波测距——数码管显示

    环境: 1、Quartus18.1 2、vscode 3、板子型号:EP4CE6F17C8N 4、超声波模块:HC_SR04 要求: 使用 EP4CE6F17C8开发板驱动 超声波检测模块(HC_SR04 ),并将所测得数据显示到开发板上的数码管上 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超

    2024年02月06日
    浏览(40)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(68)
  • STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2024年02月05日
    浏览(77)
  • 基于MAX-10 FPGA 超声波测距模块HC_SR04

    HC-SR04是一种基于超声波的测距模块。该模块向前15度内发送超声波并接收回响,通过发出超声波到收到回响的这个时间间隔计算前方的障碍物距离,可以用来给智能小车做障碍物监测。可提供2cm- 400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接

    2024年02月07日
    浏览(49)
  • 51智能小车(舵机、超声波、蓝牙)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本项目实现超声波舵机自动避障,手机连接蓝牙控制小车运动、调速两个功能并实现两个功能的切换。 整体思路: 1.T1作为串口的波特率发生器,串口连接HC06蓝牙模块(从机)与手机连接,手机发送数

    2024年02月03日
    浏览(49)
  • 【嵌入式系统应用开发】FPGA——基于HC-SR04超声波测距

    硬件 DE2-115 HC-SR04超声波传感器 软件 Quartus 18.1 使用DE2-115开发板驱动HC-SR04模块,并将所测得数据显示到开发板上的数码管。 HC-SR04 超声波测距模块可提供 2cm-400cm的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。图1为 HC-SR04 外观,

    2024年02月08日
    浏览(62)
  • Arduino开发实例-DIY超声波传感器避障机器人

    在本应用中,我们将使用一个超声波传感器与两个直流电机和一个伺服电机相结合,Arduino作为主控板创建一个简单的避障机器人。 超声波传感器发送和接收信号以确定物体的距离。 如果距离小于 15 厘米有物体,机器人将停止。 然后它环顾四周,转向一个它什么都感觉不到

    2023年04月08日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包