0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【项目展示】基于CW32的遥控循迹小车

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2024-05-31 17:33 次阅读

CW32循迹小车.zip_免费高速下载|百度网盘-分享无限制

一、概述

CW32循迹、遥控小车具有循迹和遥控两种功能,小车的硬件模块由CW32F030C8T6小蓝板、智能小车控制底板、BT04-E 蓝牙模块、OLED屏幕、TB6612和红外循迹模块组成,电源采用可充电锂电池供电,建议不要使用 1.5V 干电池供电。

wKgZomZZmU-AaDmZAADtIBlrbLs17.webp

图1 CW32小车

二、硬件部分

2.1主控板

小车主控板由小蓝板和控制底板组成,小蓝板通过排母与控制底板相连,控制底板上还预留了按键等功能。主控板的原理图分别如下:

wKgaomZZmVCAVnMEAABmYAGmPN813.webp

图2-1 小车控制底板原理图1

wKgZomZZmVCAW_qmAABXbsaCt5A70.webp

图2-2 小车控制底板原理图2

2.2蓝牙模块

蓝牙模块采用 BT04-E 模块,为单独小板,通过排母插在小车主控板上:

wKgaomZZmVGAeM8sAAC6BtdbFH452.webp

图2-3 BT04-E 模块

通过模块背面丝印可以确定与主控板的连接线序,主控板上为蓝牙预留的位置如下:

wKgZomZZmVGAV077AAANpKqezVs89.webp

图2-4 主控板蓝牙位置

查找CW32F030的数据手册可知 PA2 和 PA3 为其串口2,调用串口2对其发送信息即可通过串口蓝牙助手接收对应的消息。

2.3循迹模块

循迹模块通过排线与主控底板相连,参考原理图里的红外对管接口所对应的引脚。

wKgaomZZmVKAGr1zAABeIjuYV-E87.webp

图2-5 循迹模块

循迹模块的工作原理传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的 CH 端为高电平,通过比较器后输出为低电平,指示 LED 被点亮; 当被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,经过比较器后输出为高电平,LED 灯熄灭。由于黑色会吸收红外线,所以总结为:检测到黑线--灯亮、输出低电平;未检测到黑线--灯灭、输出高电平。

wKgaomZZmVKAGqM5AABOtKBR6_818.webp

图2-6 循迹模块原理图

2.4TB6612芯片

TB6612是一款常用的双路直流电机驱动器芯片,常用于控制小型电动机或机器人的运动。该芯片具有高效、可靠和灵活的特点,适用于各种电气控制应用。

wKgZomZZmVOAXfoYAACqoJkvKS488.webp

图2-7 TB6612 和控制底板

TB6612芯片具有以下主要特性:

双路驱动:TB6612可以控制两个直流电机的转动,支持正转、反转和停止功能。因此,它可以同时控制两个电机的运动,实现平稳的双轮驱动或其他双电机配置。

电流输出:该芯片能够提供高达1.2A的持续输出电流,并且具有1.5A的瞬时峰值电流能力。这使得TB6612在控制较大功率电机时表现出色,适用于一些对功率要求较高的应用场景。

低功耗:TB6612在待机模式下的功耗非常低,可以有效延长电池寿命,适用于依赖电池供电的设备和机器人。

内置保护功能:芯片内部集成了过温保护、过电流保护和欠压锁定等保护功能,可以保护电机和芯片本身免受损坏或过载的风险。

灵活的控制接口:TB6612支持多种控制接口,包括PWM控制、频率锁定和直接控制模式等,可以根据具体需求选择合适的控制方式。

TB6612 可以控制两路电机,分别由 AIN1、AIN2、PWMA、BIN1、BIN2、PWMB组成,下面是AIN和BIN不同输入时控制电机的转动方向真值表。PWMA 和 PWMB 输入不同占空比的 PWM 波可以控制电机的转速快慢。

IN1 IN2 电机状态
0 0 制动
0 1 正转
1 0 反转
1 1 制动

三、软件部分

3.1循迹模块检测判断

循迹模块检测,根据 4 个灯的亮灭情况共有 16 种状态,每种状态对应小车在黑线上的一种情况,根据不同的情况有不同的控制策略。

void IR_Check(void)
{
  IR_Sensor[0] = GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12);  //存放循迹模块输入值
  IR_Sensor[1] = GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13);
  IR_Sensor[2] = GPIO_ReadPin(CW_GPIOB,GPIO_PIN_14);
  IR_Sensor[3] = GPIO_ReadPin(CW_GPIOB,GPIO_PIN_15);

  /*********************************只有一个灯亮****************************/
  if(IR_Sensor[0] == 1 && IR_Sensor[1] == 1 && IR_Sensor[2] == 0 && IR_Sensor[3] == 1)      //略微偏离道路 偏左,需要右转
  { Road_Error = 10; Flag_BaseSpeed = 10; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //略微偏离道路 偏右,需要左转
  { Road_Error = -10; Flag_BaseSpeed = 10; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //较大偏离道路 偏左,需要右转
  { Road_Error = 20; Flag_BaseSpeed = 20; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //较大偏离道路 偏右,需要左转
  { Road_Error = -20; Flag_BaseSpeed =20; }
  /*********************************两个灯亮****************************/
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //需要左转
  { Road_Error = -40; Flag_BaseSpeed = 100; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 0 && IR_Sensor[3] == 1) //直行
  { Road_Error = 0; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 1 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //需要右转
  { Road_Error = 40; Flag_BaseSpeed = 100; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //直行
  { Road_Error = 0; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 0 && IR_Sensor[3] == 1) //未偏离道路
  { Road_Error = 0; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //保持之前的操作
  { Road_Error = 0; Flag_BaseSpeed = 0; }
  /*********************************三个灯亮****************************/
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 0 && IR_Sensor[3] == 1) //需要左转
  { Road_Error = -40; Flag_BaseSpeed = 100; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //需要右转
  { Road_Error = 20; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //需要左转
  { Road_Error = -20; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //需要右转
  { Road_Error = 40; Flag_BaseSpeed = 100; }
  /*********************************零、四个灯亮****************************/
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //没有检测到线,保持之前的操作
  ;
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //全是线,说明在十字路口,保持之前的操作
  ;
}

3.2PID计算控制

PID 计算控制根据红外循迹模块的亮灭情况,分别控制小车的基速和差速,从而控制小车运动的方向。

/**
 * @brief       PID基速控制
 * @param       Encoder:Flag_BaseSpeed ,Target:0
 * @return      基速 PID 计算值
 */
int PID_BaseSpeed(int Encoder,int Target)
{
  float V_Base_Kp = 30,V_Base_Kd = 100; //Kp、Kd
  static float Bias,PID,Last_Bias;      //本次偏差、PID计算值、上次偏差
        
  Bias = Encoder - Target;              //计算本次偏差
  PID = MAXOUTPUT - V_Base_Kp * Bias + V_Base_Kd * (Bias - Last_Bias); //PID计算
  Last_Bias = Bias;                     //存储偏差
  return PID;
}
/**
 * @brief       PID差速控制
 * @param       Encoder:Road_Error ,Target:0
 * @return      差速 PID 计算值
 */
int PID_DiffSpeed(int Encoder,int Target)
{
  float V_Diff_Kp = 80,V_Diff_Ki = 0.08,V_Diff_Kd = 100;//Kp、Ki、Kd
  static float Bias_D,PID_D,Integral_Bias,Last_Bias_D;  //本次偏差、PID计算值、积分累计值、上次偏差
        
  Bias_D = Encoder - Target;  //计算本次偏差
  Integral_Bias += Bias_D;    //积累偏差
  PID_D = V_Diff_Kp * Bias_D + V_Diff_Ki * Integral_Bias + V_Diff_Kd * (Bias_D - Last_Bias_D);//PID计算
  Last_Bias_D = Bias_D;       //存储偏差
  return PID_D;
}
/**
 * @brief       小车控制
 * @param       无
 * @return      无
 */
void Car_Control(void)
{
  OUTPUT_Left = PID_BaseSpeed(Flag_BaseSpeed,0) + PID_DiffSpeed(Road_Error,0);    //左轮占空比计算
  OUTPUT_Right = PID_BaseSpeed(Flag_BaseSpeed,0) - PID_DiffSpeed(Road_Error,0);   //右轮占空比计算
        
  if(OUTPUT_Left > MAXOUTPUT)OUTPUT_Left = MAXOUTPUT;    //限制大小
  else if(OUTPUT_Left < 0)OUTPUT_Left = 0;
  if(OUTPUT_Right > MAXOUTPUT)OUTPUT_Right = MAXOUTPUT;
  else if(OUTPUT_Right < 0)OUTPUT_Right = 0;
        
  GTIM_SetCompare3(CW_GTIM1,OUTPUT_Left);                //左轮
  GTIM_SetCompare4(CW_GTIM1,OUTPUT_Right);               //右轮
}

3.3遥控部分

遥控部分其实就是,通过串口蓝牙接收信息并向对应的方向运动,下面是蓝牙串口的中断服务程序:

// 串口2中断处理函数
void UART2_IRQHandler(void)
{
  unsigned char TxRxBuffer;
  if (USART_GetITStatus(CW_UART2, USART_IT_RC) != RESET)
  {
    USART_ClearITPendingBit(CW_UART2, USART_IT_RC); // 清除中断标志位
    TxRxBuffer = USART_ReceiveData_8bit(CW_UART2);  // 将接收到的数据放入TxRxBuffer
    USART2_RX_BUF[rx2Index] = TxRxBuffer; // 将接收到的数据放入缓冲区
    if (rx2Index < USART2_REC_LEN - 1)    // 做数据长度的限制,留一个字节用于结束字符或者溢出检测
    {
      // 接收到的字符包含 n 或者 r 结束接收
      if (USART2_RX_BUF[rx2Index - 1] == 'n' || USART2_RX_BUF[rx2Index - 1] == 'r')
      {
        USART2_RX_BUF[rx2Index] = ''; // 在最后一个字节加上空字符,表示字符串结束
      }
      else rx2Index++;
    }
                                
    if(USART2_RX_BUF[0] == 't')Flag_Mode = 1 - Flag_Mode;  //发送字符 ‘t’来切换模式
                                
    if(Flag_Mode == 0)
    {
      if(USART2_RX_BUF[0] == '1')Flag_Start = 1;
      else Flag_Start = 0;
    }
                                
    else if(Flag_Mode == 1)
    {
      if(USART2_RX_BUF[0] == 'w')Flag_Direction = 1;
      else if(USART2_RX_BUF[0] == 's')Flag_Direction = 2;
      else if(USART2_RX_BUF[0] == 'a')Flag_Direction = 3;
      else if(USART2_RX_BUF[0] == 'd')Flag_Direction = 4;
      else Flag_Direction = 9;
    }
      rx2Index = 0; // 清除数据标志
  }
}

四、调试

4.1调试场地

调试场地对小车的要求包括直角、交叉点、弯道等,具体如下图所示:

wKgaomZZmVOAJulvAAA8oFT0cLU07.webp

图4-1 智能小车巡线赛道

4.2调试提示

小车运动主要由基速环和差速环的 PID 控制,可以先将差速环的 PID 参数整定下来,再调基速环的参数。

循迹模块受到环境光的影响较大,最好在光线均匀和充足的环境下调试。

电池电压同样会影响循迹模块的性能,建议不要使用 1.5V 干电池调试,而是使用锂电池。在电池接近没电时循迹模块不能正常工作。

在弯道处如果小车不能及时转向,可以适当降低速度和增大差速环的 Kp 值。

小车在交叉点处的循迹受到速度影响较大,较低的速度可能会使小车无法按照规定路线循迹,可以提高车速或者更换具有编码器的电机做轮式里程计来对该点做预判。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 遥控小车
    +关注

    关注

    2

    文章

    30

    浏览量

    18423
  • 蓝牙模块
    +关注

    关注

    30

    文章

    573

    浏览量

    55725
  • 循迹小车
    +关注

    关注

    42

    文章

    65

    浏览量

    68604
  • CW32
    +关注

    关注

    1

    文章

    203

    浏览量

    628
收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 6140次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32快速开发入门

    CW32快速开发入门
    的头像 发表于 04-24 18:56 1950次阅读
    <b class='flag-5'>CW32</b>快速开发入门

    第13章-循迹功能 STM32智能小车循迹教程 PID循迹算法分析

    第13章-循迹功能 循迹小车讲解 原理分析 STM32智能小车循迹教程 红外对管使用 PID循迹
    的头像 发表于 08-21 16:27 1417次阅读
    第13章-<b class='flag-5'>循迹</b>功能 STM32智能<b class='flag-5'>小车</b><b class='flag-5'>循迹</b>教程 PID<b class='flag-5'>循迹</b>算法分析

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    基于武汉芯源半导体CW32的无刷电机训练营正式结营!

    :李洪林作品简介:基于CW32的可实现手机控制前后左右以及切换循迹功能的小车,串口接收手机socket发送过来的数组,串口回传控制电机PWM输出控制小车速度和行走,
    发表于 06-21 15:04

    无线遥控小车

    无线遥控小车。可以红外,无线,还可以循迹的智能小车
    发表于 05-04 17:10 26次下载

    如何使用STM32来设计循迹避障遥控的多功能智能小车详细资料概述

    本文档介绍的主要内容是如何使用STM32来设计循迹避障遥控的多功能智能小车详细概述
    发表于 06-07 08:00 246次下载

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 4181次阅读

    cw32和gd32的区别

    cw32和gd32的区别 CW32和GD32是两种不同的芯片系列,分别由WCH和GigaDevice公司推出,两者有很多不同之处,下面我们来详细介绍。 首先从CW32系列开始,CW32
    的头像 发表于 08-16 11:15 1964次阅读

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 861次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    基于CW32热敏电阻采集温度应用

    基于CW32热敏电阻采集温度应用
    的头像 发表于 10-25 16:45 538次阅读
    基于<b class='flag-5'>CW32</b>热敏电阻采集温度应用

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 826次阅读
    <b class='flag-5'>CW32</b> PWM输出功能介绍

    CW32实时时钟(RTC)介绍

    CW32实时时钟(RTC)介绍
    的头像 发表于 10-24 15:36 1140次阅读
    <b class='flag-5'>CW32</b>实时时钟(RTC)介绍

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 787次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用

    基于CW32遥控循迹小车

    本实验是使用CW32单片机制作一个入门的遥控循迹小车遥控采用蓝牙配合手机APP进行遥控
    的头像 发表于 11-17 17:46 1020次阅读
    基于<b class='flag-5'>CW32</b>的<b class='flag-5'>遥控</b><b class='flag-5'>循迹</b><b class='flag-5'>小车</b>