我的战队
【分享帖】底盘控制 工程实践 底盘任务2
工程实践——底盘任务2
工程实践任务2:实现超声波避障遇到障碍物紧急停止(期间会进行蜂鸣器报警),排除障碍物继续正常行驶。
下面是效果实现的GIF,可能需要等待一段时间才会显示。

任务2.gif


图1
一:使用串口通信进行超声波模块的操作。

捕获7.PNG


图2
超声波测距,使用超声波传感器的超声波发射探头产生超声波,超声波接触到障碍物时会产生反射,超声波接收探头会接收到声波信号,记录发送与接收的时间间隔,结合声波在空气中传播的速度,就可以计算出测量的距离。

捕获6.PNG

图3
RCWL-1603是一款3V-5.5V供电,2cm-500cm的超宽测量范围(测量较大的障碍物与平整墙面),UART,GPIO,PWMUART AUTO OUT多种工作模式选择,提供温度输出(仅串口模式),
可设置待机模式(仅UART模式),有温度补偿。我们使用串口通信的方式来获取距离值。

超声波传感器接线.jpg


图4
① 红色线接VCC,黄色线接RX,咖啡色线接TX,黑色线接GND。
② 超声波传感器的另一端接在串口4上。

捕获8.PNG


捕获9.PNG


图5
模式设置,我们除了使用RM精灵串口调试助手直接给超声波发送设置指令,为超声波模块尽行设置之外,还可以在程序中,进行设置。

//设置测距模块

if (dis_flag == 1)
{
uint8_t send_data = 1;
write_uart(USER_UART4, &send_data, 1);
dis_flag = 0;
}

if (dis_flag == 2)
{
uint8_t send_data = 2;
write_uart(USER_UART4, &send_data, 1);
dis_flag = 0;
}

if (dis_flag == 3)
{
uint8_t send_data = 3;
write_uart(USER_UART4, &send_data, 1);
dis_flag = 0;
}

if (dis_flag == 4)
{
uint8_t send_data = 4;
write_uart(USER_UART4, &send_data, 1);
dis_flag = 0;
}

这里我们选择自动串口输出模式

我们将超声波模块安装在整个底盘的前端,安装的时候一般不要太接近地面,因为超声波发出是以45°的锥形发出,太靠近地面会导致测量不精准。

超声波安装位置.jpg


图6
超声波传感器读取程序:
void dis_uart_callback(void)
{
uint8_t pos = 0;
distance = 0;

for(uint8_t i = 9; i > 1; i--)
{
if (dis_recv[i] == 0x0D && dis_recv[i-1] == 'm' && dis_recv[i-2] == 'm')//数据长度不确定,但我们通过最后三位是字符型的’m’,’m’,结束位为0xoD来判断一次测距数据。
{
pos = i-3;
break;
}
}

if (pos > 2)
{
for (uint8_t i = 2; i <= pos; i++)
{
distance = distance*10 + (dis_recv[i] - 48);//将数据的高位与低位处理后加到一起,获得距离数据
}
}
}



我们将超声波模块接到RM主控板的串口4,并且添加到我们的工程中。通过Debug模式查看是否获取了正确的距离值。如果distance距离值随底盘前面障碍物靠近时,值发生变化,使用卷尺测量,测量距离与实际距离吻合,则设置与连接成功。

捕获32.jpg


图7
我们在程序逻辑中加入,一个简单地判断。从而发现障碍与清除障碍。

if (distance<400)
{
start =2;//遭遇障碍,则底盘会停止
set_beep_param(BEEP1_IO, BEEP_FREQ, BEEP_ON);
osDelay(distance/2);
set_beep_param(BEEP1_IO, BEEP_FREQ, BEEP_OFF);
osDelay(distance/2);
if(distance>500)
{
start = 3;//故障清除,则底盘继续行驶
}
}






所有传感器连接图.jpg

请问这篇文章对你有用吗?
【分享帖】底盘控制 工程实践 底盘任务2
所有评论
暂无更多
关于作者
0 关注Ta
0 文章
0 经验值
0 获赞