闲来无事整个小车玩玩,设想的小车可以有蓝牙模块来控制模式切换,通过发送指令来更改相对应的功能,当避障的时候可以自动规避障碍物,当处于红外循迹时,可以跟随规划的轨迹前线,当手动遥控时可以控制前进后退左右转向停止等功能。
先介绍一下使用的红外模块,其上有四个管脚,vcc接电源,gnd接地,D0传输红外线是否被吸收,A0传输模拟信号主要是不同距离输出不同的电压,但是此脚一般可以不接.
然后思路就是通过判断D0传过来的电平信号来判断小车有没有接触到黑线,当红外线被吸收,也就是触碰到黑线,D0会持续输出高电平,直到它检测到红外线返回才会回归低电平,基于对管脚传回的电平检测,可以判断是否接触到黑线。
这部分代码很好写,可以参考如下代码:
`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;