嵌入式实训——day5(智能小车循迹避障)

今天是实训的最后一天,我们在前两天基础实验的基础上将其扩展,做项目——智能小车的循迹避障
项目要求:
1、小车开机后红灯闪烁三次,黄灯闪烁两次,然后亮绿灯,开始循迹行驶
2、小车行驶过程需根据轨道能平缓调整方向
3、小车行驶过程前面20cm范围内有障碍物,需能停止,并亮红灯;障碍物移开后,小车亮绿灯并继续前行
设计思想:模块化设计
(一)呼吸灯模块
呼吸灯模块使用红、绿、蓝三色灯,通过不同组合组成不同的颜色,初始默认三灯都是低电平,呈现白色,而其他两灯随机组合则会呈现不同颜色,如:红灯和绿灯同时亮蓝灯灭时呈现黄色;红和蓝组合呈现品红或紫色等。
(二)循迹模块
利用红外光电和电机驱动实现,通过对红外光电程序的输入,小车实现直行、左转和右转时亮不同的灯,通过改变PA2、PB9、PA1、PC9口上的高低电平变化控制小车前进方向,通过改变PA0、PA3口上的高低电平的占空比以控制电机的转速。
(三)避障模块
通过超声波模块实现避障,在一定的距离范围内,小车通过超声波接收范围内就离数据,来判断该范围内是否有障碍物,有障碍物时小车就停下,障碍物移开后,小车前行。

核心代码:(仅供参考)

/*USER CODE BEGIN Includes */
#define full_speed 200

#define null_speed 0

#define correct_speed 100 

#define MOTOR_A_CON1_GPIO GPIOA
#define MOTOR_A_CON1_PIN GPIO_PIN_2

#define MOTOR_A_CON2_GPIO GPIOB
#define MOTOR_A_CON2_PIN GPIO_PIN_9

#define MOTOR_A_EN_GPIO GPIOA
#define MOTOR_A_EN_PIN GPIO_PIN_0

#define MOTOR_B_CON1_GPIO GPIOA
#define MOTOR_B_CON1_PIN GPIO_PIN_1

#define MOTOR_B_CON2_GPIO GPIOC
#define MOTOR_B_CON2_PIN GPIO_PIN_9

#define MOTOR_B_EN_GPIO GPIOA
#define MOTOR_B_EN_PIN GPIO_PIN_3
#define _HAL_TIM_SET_COMPARE(_HANDLE_, _CHANNEL_,COMPARE_) \
(*(_I0 uint32_t *)(&((_HANDLE_)->Instance->CCRl) + ((_CHANNEL_) ? 2))=(_COMPARE_))

#define Left1_GPIO GPIOC  //左侧探头
#define Left1_PIN GPIO_PIN_7

#define Left2_GPIO GPIOC  //左侧探头
#define Left2_PIN GPIO_PIN_6 

#define Middle_GPIO  GPIOB  //距离检测
#define Middle_PIN  GPIO_PIN_12

#define Right1_GPIO GPIOB  //右侧探头
#define Right1_PIN GPIO_PIN_15

#define Right2_GPIO GPIOB   //右侧探头
#define Right2_PIN GPIO_PIN_14

#define Left1 HAL_GPIO_ReadPin(Left1_GPIO,Left1_PIN)
#define Left2 HAL_GPIO_ReadPin(Left2_GPIO,Left2_PIN)  
#define Middle HAL_GPIO_ReadPin(Middle_GPIO,Middle_PIN)
#define Right1 HAL_GPIO_ReadPin(Right1_GPIO,Right1_PIN)
#define Right2 HAL_GPIO_ReadPin(Right2_GPIO,Right2_PIN) 
/* USER CODE END Includes */


  
   /* USER CODE BEGIN 2 */
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);//小灯初始化
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
        
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);//打开PWM
      HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
  /* USER CODE END 2 */
    
 


  
/*USER CODE BEGIN WHILE */
 for(i=0;i<3;i++)
 {
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  HAL_Delay(1000);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
  HAL_Delay(1000);
 }
 for(i=0;i<2;i++)
 {
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
  HAL_Delay(1000);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
  HAL_Delay(1000);
 }
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
 
 HAL_TIM_Base_Start_IT(&htim2);
 while (1)
  {
  /* USER CODE END WHILE */
  
  

     /* USER CODE BEGIN 3 */
    if(distance>20){//判断没有障碍物
   if(Left1 == GPIO_PIN_SET)
   {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    Correct_Left();
   }
   else if(Left2 == GPIO_PIN_SET)
   {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
    litter_Left();
   }
   else if(Middle == GPIO_PIN_SET)
   {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    Straight();
   }
   else if(Right1 == GPIO_PIN_SET)
   {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
    Correct_Right();
   }
   else if(Right2 == GPIO_PIN_SET)
   {    
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    litter_Right();
   } 
   else{
    Straight();
   }
   }else{
  Stop();
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);//ºì
 }
/* USER CODE END 3 */



/* USER CODE BEGIN 4 */
    void Change_Pulse(u

int16_t left,uint16_t right) 
{
 __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, left);
  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_4, right);
}
void Correct_Left(void)
 {
 Change_Pulse(150,150);
  HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_SET);
 }
 void litter_Left(void)
 {
 Change_Pulse(0,150);
  HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_SET);
 }
//------------------------------------------------
 void Correct_Right(void)
 {
 Change_Pulse(150,150);
  HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_RESET);
 }
 void litter_Right(void)
 {
 Change_Pulse(150,0);
  HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_RESET);
 }
//-----------------------------------------------------
void Straight(void) 
{
 Change_Pulse(150,150);
 HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_SET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_SET); 
}
void Stop(void) 
{
 Change_Pulse(0,0);
 HAL_GPIO_WritePin(MOTOR_A_CON1_GPIO, MOTOR_A_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_A_CON2_GPIO, MOTOR_A_CON2_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON1_GPIO, MOTOR_B_CON1_PIN, GPIO_PIN_RESET);
 HAL_GPIO_WritePin(MOTOR_B_CON2_GPIO, MOTOR_B_CON2_PIN, GPIO_PIN_RESET);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim2)
    {
        HAL_TIM_Base_Stop_IT(&htim2);
        ultrasonic=0;  
        HAL_GPIO_WritePin(Trig_GPIO, Trig_PIN, GPIO_PIN_SET);
    HAL_TIM_Base_Start_IT(&htim3);
    }
    else if(htim==&htim3)
   {
        HAL_GPIO_WritePin(Trig_GPIO,Trig_PIN, GPIO_PIN_RESET);
        ultrasonic=1;
        HAL_TIM_Base_Stop_IT(&htim3);
        HAL_TIM_Base_Start_IT(&htim2);
      }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_2)
{
if(HAL_GPIO_ReadPin(Echo_GPIO, Echo_PIN))
        {
            ultrasonic_time=__HAL_TIM_GET_COUNTER(&htim2);
        }
        else if(ultrasonic==1)
        {
            ultrasonic=0;
            ultrasonic_time=__HAL_TIM_GET_COUNTER(&htim2)-ultrasonic_time;
            ultrasonic_time=ultrasonic_time*170/100;
            distance = ultrasonic_time;
            ultrasonic_time=ultrasonic_time%1000;
            b[0]=ultrasonic_time/100+'0';
            ultrasonic_time=ultrasonic_time%100;
            b[1]=ultrasonic_time/10+'0';
            b[2]=ultrasonic_time%10+'0';
            ultrasonic_time=0;
            HAL_GPIO_WritePin(Trig_GPIO,Trig_PIN, GPIO_PIN_RESET);
          }
       }
 }
 /* USER CODE END 4 */      



  
```
  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值