RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【項目展示】基于CW32的遙控循跡小車

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2024-05-31 17:33 ? 次閱讀

CW32循跡小車.zip_免費高速下載|百度網(wǎng)盤-分享無限制

一、概述

CW32循跡、遙控小車具有循跡和遙控兩種功能,小車的硬件模塊由CW32F030C8T6小藍板、智能小車控制底板、BT04-E 藍牙模塊、OLED屏幕、TB6612和紅外循跡模塊組成,電源采用可充電鋰電池供電,建議不要使用 1.5V 干電池供電。

wKgZomZZmU-AaDmZAADtIBlrbLs17.webp

圖1 CW32小車

二、硬件部分

2.1主控板

小車主控板由小藍板和控制底板組成,小藍板通過排母與控制底板相連,控制底板上還預(yù)留了按鍵等功能。主控板的原理圖分別如下:

wKgaomZZmVCAVnMEAABmYAGmPN813.webp

圖2-1 小車控制底板原理圖1

wKgZomZZmVCAW_qmAABXbsaCt5A70.webp

圖2-2 小車控制底板原理圖2

2.2藍牙模塊

藍牙模塊采用 BT04-E 模塊,為單獨小板,通過排母插在小車主控板上:

wKgaomZZmVGAeM8sAAC6BtdbFH452.webp

圖2-3 BT04-E 模塊

通過模塊背面絲印可以確定與主控板的連接線序,主控板上為藍牙預(yù)留的位置如下:

wKgZomZZmVGAV077AAANpKqezVs89.webp

圖2-4 主控板藍牙位置

查找CW32F030的數(shù)據(jù)手冊可知 PA2 和 PA3 為其串口2,調(diào)用串口2對其發(fā)送信息即可通過串口藍牙助手接收對應(yīng)的消息。

2.3循跡模塊

循跡模塊通過排線與主控底板相連,參考原理圖里的紅外對管接口所對應(yīng)的引腳。

wKgaomZZmVKAGr1zAABeIjuYV-E87.webp

圖2-5 循跡模塊

循跡模塊的工作原理傳感器的紅外發(fā)射二極管不斷發(fā)射紅外線,當發(fā)射出的紅外線沒有被反射回來或被反射回來但強度不夠大時,紅外接收管一直處于關(guān)斷狀態(tài),此時模塊的 CH 端為高電平,通過比較器后輸出為低電平,指示 LED 被點亮; 當被檢測物體出現(xiàn)在檢測范圍內(nèi)時,紅外線被反射回來且強度足夠大,紅外接收管飽和,此時模塊的輸出端為低電平,經(jīng)過比較器后輸出為高電平,LED 燈熄滅。由于黑色會吸收紅外線,所以總結(jié)為:檢測到黑線--燈亮、輸出低電平;未檢測到黑線--燈滅、輸出高電平。

wKgaomZZmVKAGqM5AABOtKBR6_818.webp

圖2-6 循跡模塊原理圖

2.4TB6612芯片

TB6612是一款常用的雙路直流電機驅(qū)動器芯片,常用于控制小型電動機或機器人的運動。該芯片具有高效、可靠和靈活的特點,適用于各種電氣控制應(yīng)用。

wKgZomZZmVOAXfoYAACqoJkvKS488.webp

圖2-7 TB6612 和控制底板

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

雙路驅(qū)動:TB6612可以控制兩個直流電機的轉(zhuǎn)動,支持正轉(zhuǎn)、反轉(zhuǎn)和停止功能。因此,它可以同時控制兩個電機的運動,實現(xiàn)平穩(wěn)的雙輪驅(qū)動或其他雙電機配置。

電流輸出:該芯片能夠提供高達1.2A的持續(xù)輸出電流,并且具有1.5A的瞬時峰值電流能力。這使得TB6612在控制較大功率電機時表現(xiàn)出色,適用于一些對功率要求較高的應(yīng)用場景。

低功耗:TB6612在待機模式下的功耗非常低,可以有效延長電池壽命,適用于依賴電池供電的設(shè)備和機器人。

內(nèi)置保護功能:芯片內(nèi)部集成了過溫保護、過電流保護和欠壓鎖定等保護功能,可以保護電機和芯片本身免受損壞或過載的風險。

靈活的控制接口:TB6612支持多種控制接口,包括PWM控制、頻率鎖定和直接控制模式等,可以根據(jù)具體需求選擇合適的控制方式。

TB6612 可以控制兩路電機,分別由 AIN1、AIN2、PWMA、BIN1、BIN2、PWMB組成,下面是AIN和BIN不同輸入時控制電機的轉(zhuǎn)動方向真值表。PWMA 和 PWMB 輸入不同占空比的 PWM 波可以控制電機的轉(zhuǎn)速快慢。

IN1 IN2 電機狀態(tài)
0 0 制動
0 1 正轉(zhuǎn)
1 0 反轉(zhuǎn)
1 1 制動

三、軟件部分

3.1循跡模塊檢測判斷

循跡模塊檢測,根據(jù) 4 個燈的亮滅情況共有 16 種狀態(tài),每種狀態(tài)對應(yīng)小車在黑線上的一種情況,根據(jù)不同的情況有不同的控制策略。

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)      //略微偏離道路 偏左,需要右轉(zhuǎn)
  { Road_Error = 10; Flag_BaseSpeed = 10; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //略微偏離道路 偏右,需要左轉(zhuǎn)
  { Road_Error = -10; Flag_BaseSpeed = 10; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //較大偏離道路 偏左,需要右轉(zhuǎn)
  { Road_Error = 20; Flag_BaseSpeed = 20; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //較大偏離道路 偏右,需要左轉(zhuǎn)
  { Road_Error = -20; Flag_BaseSpeed =20; }
  /*********************************兩個燈亮****************************/
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 1) //需要左轉(zhuǎn)
  { 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) //需要右轉(zhuǎn)
  { 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) //需要左轉(zhuǎn)
  { Road_Error = -40; Flag_BaseSpeed = 100; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 0 && IR_Sensor[2] == 1 && IR_Sensor[3] == 0) //需要右轉(zhuǎn)
  { Road_Error = 20; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 0 && IR_Sensor[1] == 1 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //需要左轉(zhuǎn)
  { Road_Error = -20; Flag_BaseSpeed = 0; }
  else if(IR_Sensor[0] == 1 && IR_Sensor[1] == 0 && IR_Sensor[2] == 0 && IR_Sensor[3] == 0) //需要右轉(zhuǎn)
  { 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 計算控制根據(jù)紅外循跡模塊的亮滅情況,分別控制小車的基速和差速,從而控制小車運動的方向。

/**
 * @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遙控部分

遙控部分其實就是,通過串口藍牙接收信息并向?qū)?yīng)的方向運動,下面是藍牙串口的中斷服務(wù)程序:

// 串口2中斷處理函數(shù)
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);  // 將接收到的數(shù)據(jù)放入TxRxBuffer
    USART2_RX_BUF[rx2Index] = TxRxBuffer; // 將接收到的數(shù)據(jù)放入緩沖區(qū)
    if (rx2Index < USART2_REC_LEN - 1)    // 做數(shù)據(jù)長度的限制,留一個字節(jié)用于結(jié)束字符或者溢出檢測
    {
      // 接收到的字符包含 n 或者 r 結(jié)束接收
      if (USART2_RX_BUF[rx2Index - 1] == 'n' || USART2_RX_BUF[rx2Index - 1] == 'r')
      {
        USART2_RX_BUF[rx2Index] = ''; // 在最后一個字節(jié)加上空字符,表示字符串結(jié)束
      }
      else rx2Index++;
    }
                                
    if(USART2_RX_BUF[0] == 't')Flag_Mode = 1 - Flag_Mode;  //發(fā)送字符 ‘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; // 清除數(shù)據(jù)標志
  }
}

四、調(diào)試

4.1調(diào)試場地

調(diào)試場地對小車的要求包括直角、交叉點、彎道等,具體如下圖所示:

wKgaomZZmVOAJulvAAA8oFT0cLU07.webp

圖4-1 智能小車巡線賽道

4.2調(diào)試提示

小車運動主要由基速環(huán)和差速環(huán)的 PID 控制,可以先將差速環(huán)的 PID 參數(shù)整定下來,再調(diào)基速環(huán)的參數(shù)。

循跡模塊受到環(huán)境光的影響較大,最好在光線均勻和充足的環(huán)境下調(diào)試。

電池電壓同樣會影響循跡模塊的性能,建議不要使用 1.5V 干電池調(diào)試,而是使用鋰電池。在電池接近沒電時循跡模塊不能正常工作。

在彎道處如果小車不能及時轉(zhuǎn)向,可以適當降低速度和增大差速環(huán)的 Kp 值。

小車在交叉點處的循跡受到速度影響較大,較低的速度可能會使小車無法按照規(guī)定路線循跡,可以提高車速或者更換具有編碼器的電機做輪式里程計來對該點做預(yù)判。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 遙控小車

    關(guān)注

    2

    文章

    30

    瀏覽量

    18412
  • 藍牙模塊
    +關(guān)注

    關(guān)注

    30

    文章

    573

    瀏覽量

    55719
  • 循跡小車
    +關(guān)注

    關(guān)注

    42

    文章

    65

    瀏覽量

    68598
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    203

    瀏覽量

    613
收藏 人收藏

    評論

    相關(guān)推薦

    CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?6131次閱讀
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>開發(fā)者扶持計劃

    CW32快速開發(fā)入門

    CW32快速開發(fā)入門
    的頭像 發(fā)表于 04-24 18:56 ?1928次閱讀
    <b class='flag-5'>CW32</b>快速開發(fā)入門

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

    第13章-循跡功能 循跡小車講解 原理分析 STM32智能小車循跡教程 紅外對管使用 PID循跡
    的頭像 發(fā)表于 08-21 16:27 ?1303次閱讀
    第13章-<b class='flag-5'>循跡</b>功能 STM32智能<b class='flag-5'>小車</b><b class='flag-5'>循跡</b>教程 PID<b class='flag-5'>循跡</b>算法分析

    CW32開發(fā)者扶持計劃#CW32 #芯片

    CW32
    CW32生態(tài)社區(qū)
    發(fā)布于 :2023年05月24日 16:56:14

    基于武漢芯源半導(dǎo)體CW32的無刷電機訓(xùn)練營正式結(jié)營!

    :李洪林作品簡介:基于CW32的可實現(xiàn)手機控制前后左右以及切換循跡功能的小車,串口接收手機socket發(fā)送過來的數(shù)組,串口回傳控制電機PWM輸出控制小車速度和行走,
    發(fā)表于 06-21 15:04

    無線遙控小車

    無線遙控小車??梢约t外,無線,還可以循跡的智能小車。
    發(fā)表于 05-04 17:10 ?26次下載

    循跡、避障、紅外遙控的智能小車C語言代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是循跡、避障、紅外遙控的智能小車C語言代碼免費下載。
    發(fā)表于 04-03 17:21 ?92次下載
    <b class='flag-5'>循跡</b>、避障、紅外<b class='flag-5'>遙控</b>的智能<b class='flag-5'>小車</b>C語言代碼免費下載

    cw32和stm32的區(qū)別

    cw32和stm32的區(qū)別 CW32和STM32是兩種常見的單片機,被廣泛應(yīng)用于各種電子設(shè)備中。在本文中,我們將深入探討CW32和STM32之間的區(qū)別和優(yōu)劣勢。 1. 硬件性能 硬件性能是衡量單片機
    的頭像 發(fā)表于 08-16 11:15 ?4124次閱讀

    cw32和gd32的區(qū)別

    cw32和gd32的區(qū)別 CW32和GD32是兩種不同的芯片系列,分別由WCH和GigaDevice公司推出,兩者有很多不同之處,下面我們來詳細介紹。 首先從CW32系列開始,CW32
    的頭像 發(fā)表于 08-16 11:15 ?1942次閱讀

    基于CW32的無刷水泵方案

    基于CW32的無刷水泵方案
    的頭像 發(fā)表于 11-03 17:28 ?849次閱讀
    基于<b class='flag-5'>CW32</b>的無刷水泵方案

    基于CW32熱敏電阻采集溫度應(yīng)用

    基于CW32熱敏電阻采集溫度應(yīng)用
    的頭像 發(fā)表于 10-25 16:45 ?531次閱讀
    基于<b class='flag-5'>CW32</b>熱敏電阻采集溫度應(yīng)用

    CW32 PWM輸出功能介紹

    CW32 PWM輸出功能介紹
    的頭像 發(fā)表于 09-27 16:12 ?808次閱讀
    <b class='flag-5'>CW32</b> PWM輸出功能介紹

    CW32實時時鐘(RTC)介紹

    CW32實時時鐘(RTC)介紹
    的頭像 發(fā)表于 10-24 15:36 ?1126次閱讀
    <b class='flag-5'>CW32</b>實時時鐘(RTC)介紹

    基于CW32的物聯(lián)網(wǎng)應(yīng)用

    CW32】基于CW32的物聯(lián)網(wǎng)應(yīng)用
    的頭像 發(fā)表于 11-02 15:55 ?770次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應(yīng)用

    基于CW32遙控循跡小車

    本實驗是使用CW32單片機制作一個入門的遙控循跡小車遙控采用藍牙配合手機APP進行遙控
    的頭像 發(fā)表于 11-17 17:46 ?1009次閱讀
    基于<b class='flag-5'>CW32</b>的<b class='flag-5'>遙控</b><b class='flag-5'>循跡</b><b class='flag-5'>小車</b>
    RM新时代网站-首页