用Rd-03雷达做个报警器

[复制链接]
查看277 | 回复13 | 2024-7-31 23:58:10 | 显示全部楼层 |阅读模式
由于实在是太久没发帖子了,引起了园长的不满,再加上买了Rd-03雷达几个月了还没怎么玩过,所以今天水一帖交个作业

这次我用的是Rd-03雷达、LCD1602显示屏、和Intel Cyclone 10 10CL025YU256I7G芯片
做的所谓的报警器很简单:雷达检测到有人来,发送信号到主控,蜂鸣器响起,屏幕上显示'some body come in'、'Warning';没人的时候蜂鸣器不响,屏幕上显示'nobody come in'、'safe'
整体就是这个样子,LCD1602用个转接板接到开发板上,不用接杜邦线比较方便,还可以轻易调亮度和对比度

整体图

整体图


下面就是思路和程序了
Rd-03雷达检测到有人来会在OT2引脚输出一个高电平,没人的时候输出低电平,因此只需要检测高低电平就知道有没有人来了。
至于检测的距离设置我买的是测试板套装,可以在安信可配网助手里设置距离门(检测距离)
微信图片_20240731234329.png

之后是LCD1602的驱动程序
  1. module lcd(
  2. clk,
  3. rst,
  4. LCD_EN,
  5. RS,
  6. RW,
  7. DB8,
  8. trig //trigger
  9. //data_row1,
  10. //data_row2
  11. );
  12. //input         [127:0]data_row1,data_row2;//第一行和第二行输入数据
  13. input   clk;
  14. input   rst;        //rst为全局复位信号
  15. input   trig;
  16. output  LCD_EN;//LCD_EN为LCD模块的使能信号(下降沿触发)
  17. output  reg RS;//RS=0时为写指令;RS=1时为写数据
  18. output  RW;//RW=0时对LCD模块执行写操作;RW=1时对LCD模块执行读操作
  19. output  [7:0] DB8; //8位指令或数据总线

  20. reg     LCD_EN_Sel;
  21. reg     [7:0] DB8;
  22. reg [127:0]data_row1;
  23. reg [127:0]data_row2;

  24. //-------------------------------------//
  25. //输入时钟50MHz  输出周期2ms
  26. //division50MHz_2ms.v
  27. reg [15:0]count;
  28. reg clk_2ms;
  29. always @ (posedge clk)
  30. begin
  31.         if(count == 16'd50_000)
  32.         begin
  33.                 count <= 16'b1;
  34.                 clk_2ms <= ~clk_2ms;
  35.         end
  36.         else
  37.                 count <= count + 1'b1;
  38. end
  39. //---------------------------------------//

  40. reg     [127:0] Data_Buf;   //液晶显示的数据缓存
  41. reg     [4:0] disp_count;
  42. reg     [3:0] state;

  43. parameter   Clear_Lcd = 4'b0000,  //清屏并光标复位
  44.                       Set_Disp_Mode = 4'b0001, //设置显示模式:8位2行5x7点阵   
  45.                    Disp_On = 4'b0010,  //显示器开、光标不显示、光标不允许闪烁
  46.             Shift_Down = 4'b0011,  //文字不动,光标自动右移
  47.             Write_Addr = 4'b0100,   //写入显示起始地址
  48.             Write_Data_First = 4'b0101,  //写入第一行显示的数据
  49.             Write_Data_Second = 4'b0110; //写入第二行显示的数据                       
  50. assign  RW = 1'b0;  //RW=0时对LCD模块执行写操作(一直保持写状态)
  51. assign  LCD_EN = LCD_EN_Sel ? clk_2ms : 1'b0;//通过LCD_EN_Sel信号来控制LCD_EN的开启与关闭

  52. always @(*) begin
  53.         if(!rst) begin
  54.                 data_row1 <= "IT IS IN RESET  ";
  55.                 data_row2 <= "RELEASE THE KEY ";
  56.         end
  57.         else if(trig) begin
  58.                 data_row1 <= "somebody come in";
  59.                 data_row2 <= "    WARNING     ";
  60.         end
  61.         else begin
  62.                 data_row1 <= " nobody come in ";
  63.                 data_row2 <= "      SAFE      ";
  64.         end
  65. end

  66. always @(posedge clk_2ms or negedge rst)
  67. begin
  68.         if(!rst)
  69.         begin
  70.                 state <= Clear_Lcd;  //复位:清屏并光标复位   
  71.                 RS <= 1'b1;          //复位:RS=1时为读指令;                       
  72.                 DB8 <= 8'b0;         //复位:使DB8总线输出全0
  73.                 LCD_EN_Sel <= 1'b0;  //复位:关夜晶使能信号
  74.                 disp_count <= 5'b0;
  75.         end
  76.         else
  77.         begin
  78.                 case(state)         //初始化LCD模块
  79.                 Clear_Lcd:
  80.         begin
  81.                         LCD_EN_Sel <= 1'b1;//开使能
  82.                         RS <= 1'b0;//写指令
  83.             DB8 <= 8'b00000001;  //清屏并光标复位
  84.                         state <= Set_Disp_Mode;
  85.         end
  86.                 Set_Disp_Mode:
  87.                 begin
  88.                         DB8 <= 8'b00111000;   //设置显示模式:8位2行5x8点阵
  89.                         state <= Disp_On;
  90.                 end
  91.                 Disp_On:
  92.                 begin
  93.                         DB8 <= 8'b00001100;   //显示器开、光标不显示、光标不允许闪烁
  94.                         state <= Shift_Down;
  95.                 end
  96.                 Shift_Down:
  97.                 begin
  98.                         DB8 <= 8'b00000110;    //文字不动,光标自动右移   
  99.                         state <= Write_Addr;
  100.                 end
  101. //---------------------------------显示循环------------------------------------//               
  102.                 Write_Addr:
  103.                 begin
  104.                         RS <= 1'b0;//写指令
  105.                         DB8 <= 8'b10000000;      //写入第一行显示起始地址:第一行第1个位置   
  106.                         Data_Buf <= data_row1;     //将第一行显示的数据赋给Data_First_Buf
  107.                 //        DB8 <= Data_First_Buf[127:120];
  108.                         state <= Write_Data_First;
  109.                 end
  110.                 Write_Data_First:  //写第一行数据
  111.                 begin
  112.                         if(disp_count == 16)    //disp_count等于15时表示第一行数据已写完
  113.                         begin
  114.                                 RS <= 1'b0;//写指令
  115.                                 DB8 <= 8'b11000000;     //送入写第二行的指令,第2行第1个位置
  116.                                 disp_count <= 5'b0; //计数清0
  117.                                 Data_Buf <= data_row2;//将第2行显示的数据赋给Data_First_Buf
  118.                         //        DB8 <= Data_Second_Buf[127:120];
  119.                                 state <= Write_Data_Second;   //写完第一行进入写第二行状态
  120.                         end
  121.                         else//没写够16字节
  122.                         begin
  123.                                 RS <= 1'b1;    //RS=1表示写数据
  124.                                 DB8 <= Data_Buf[127:120];
  125.                                 Data_Buf <= (Data_Buf << 8);
  126.                                 disp_count <= disp_count + 1'b1;
  127.                                 state <= Write_Data_First;
  128.                         end
  129.                 end
  130.                 Write_Data_Second: //写第二行数据
  131.                 begin
  132.                         if(disp_count == 16)//数据写完了
  133.                         begin
  134.                                 RS <= 1'b0;//写指令
  135.                                 DB8 <= 8'b10000000;      //写入第一行显示起始地址:第一行第1个位置
  136.                                 disp_count <= 5'b0;
  137.                                 state <= Write_Addr;   //重新循环
  138.                         end
  139.                         else//
  140.                         begin
  141.                                 RS <= 1'b1;
  142.                                 DB8 <= Data_Buf[127:120];
  143.                                 Data_Buf <= (Data_Buf << 8);
  144.                                 disp_count <= disp_count + 1'b1;
  145.                                 state <= Write_Data_Second;
  146.                         end              
  147.                 end
  148. //--------------------------------------------------------------------------//               
  149.                 default:  state <= Clear_Lcd; //若state为其他值,则将state置为Clear_Lcd
  150.                 endcase
  151.         end
  152. end

  153. endmodule
复制代码
通过触发信号trig,即雷达OT2引脚的输出来确定检测范围内是否有人,从而确定屏幕上显示什么内容
没人来的时候
微信图片_20240731231908.jpg

有人来的时候
微信图片_20240731231900.jpg

之后是蜂鸣器,我开发板上的蜂鸣器是无源蜂鸣器,需要给一个大约500Hz~5KHz的PWM波才能驱动
微信图片_20240731234847.png

  1. module beep(
  2.     clk,         // 50 MHz clock input
  3.     rst,         // Reset input
  4.     trig,        // trig input to control PWM output
  5.     pwm_out      // PWM output
  6. );
  7.         input clk;
  8.         input rst;
  9.         input trig;
  10.         output reg pwm_out;

  11.     reg [17:0] count;       // Counter for generating PWM
  12.     localparam [17:0] count_period = 18'd60_000 - 1;  // 50M / 2000 = 25000

  13.     // PWM generation logic
  14.     always @(posedge clk or negedge rst) begin
  15.         if (!rst) begin
  16.             count <= 18'd0;
  17.             pwm_out <= 1'b0;
  18.         end else begin
  19.             if (trig) begin
  20.                 if (count >= count_period) begin
  21.                     count <= 18'd0;
  22.                     pwm_out <= ~pwm_out; // Toggle the PWM output
  23.                 end else begin
  24.                     count <= count + 1;
  25.                 end
  26.             end else begin
  27.                 count <= 18'd0; // Reset the counter when sw is 0
  28.                 pwm_out <= 1'b0; // Disable PWM output when sw is 0
  29.             end
  30.         end
  31.     end
  32. endmodule
复制代码
beep蜂鸣器同样由trig信号来控制是否响,有人来响,没人来不响。
写好了蜂鸣器和LCD1602模块之后,在顶层模块例化它们
  1. module radar(
  2.     clk,         // 50 MHz clock input
  3.     rst,         // Reset input
  4.     pwm_out,      // PWM output
  5.          LCD_EN,
  6.          RS,
  7.          RW,
  8.          DB8,
  9.          trig //trigger
  10. );
  11.         input clk;
  12.         input rst;
  13.         input trig;
  14.         output pwm_out;
  15.        
  16.         output  LCD_EN;//LCD_EN为LCD模块的使能信号(下降沿触发)
  17.         output  RS;//RS=0时为写指令;RS=1时为写数据
  18.         output  RW;//RW=0时对LCD模块执行写操作;RW=1时对LCD模块执行读操作
  19.         output  [7:0] DB8; //8位指令或数据总线
  20.        
  21.         lcd u_lcd(
  22.                 .clk(clk),
  23.                 .rst(rst),
  24.                 .LCD_EN(LCD_EN),
  25.                 .RS(RS),
  26.                 .RW(RW),
  27.                 .DB8(DB8),
  28.                 .trig(trig)
  29.         );
  30.        
  31.         beep u_beep(
  32.                 .clk(clk),      
  33.                 .rst(rst),      
  34.                 .trig(trig),        
  35.                 .pwm_out(pwm_out)
  36.         );
  37. endmodule
复制代码

综合、分配管脚,大功告成
论坛发不了视频,只能发个GIF了,没有蜂鸣器的声音
IMG_4657.gif

回复

使用道具 举报

爱笑 | 2024-8-1 08:31:21 | 显示全部楼层
哈哈哈并没有不满
用心做好保姆工作
回复 支持 反对

使用道具 举报

粉肠 | 2024-8-1 09:18:48 | 显示全部楼层
爱笑 发表于 2024-8-1 08:31
哈哈哈并没有不满

回复 支持 反对

使用道具 举报

WT_0213 | 2024-8-1 09:41:41 | 显示全部楼层
厉害
回复

使用道具 举报

bzhou830 | 2024-8-1 09:47:02 | 显示全部楼层
FPGA大佬,太厉害了
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

bzhou830 | 2024-8-1 09:48:14 | 显示全部楼层
爱笑 发表于 2024-8-1 08:31
哈哈哈并没有不满

没关系,你可以表示不满
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

妖猊 | 2024-8-1 10:20:36 | 显示全部楼层
粉肠大哥太棒了
回复 支持 反对

使用道具 举报

Francisliu | 2024-8-1 10:48:52 | 显示全部楼层
能不能在车上多装几个当报警的
回复 支持 反对

使用道具 举报

粉肠 | 2024-8-1 10:50:06 | 显示全部楼层
Francisliu 发表于 2024-8-1 10:48
能不能在车上多装几个当报警的

走近开车门的时候被报警了
回复 支持 反对

使用道具 举报

粉肠 | 2024-8-1 10:51:08 | 显示全部楼层
妖猊 发表于 2024-8-1 10:20
粉肠大哥太棒了

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则