[课程与套件] 底盘控制 工程实践 底盘任务2

[复制链接]
版主掌心的温柔
2018-3-30 11:47:04 显示全部楼层

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 掌心的温柔 于 2018-3-30 12:25 编辑

工程实践——底盘任务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

[复制链接]
中士小花火
2018-12-22 22:02:24 来自手机 显示全部楼层
6666666666666

[课程与套件] 底盘控制 工程实践 底盘任务2

[复制链接]
上等兵thomashui
2018-12-25 11:51:57 显示全部楼层
加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

本版积分规则

触屏版 | 电脑版

Copyright © 2019 RoboMasters 版权所有

快速回复 返回顶部 返回列表