STM32蓝牙遥控循迹避障小车

一、功能介绍

        小车能够通过蓝牙来控制运行方向,同时它也能够循迹,循迹之后不用蓝牙控制就能够自己行走,当前方有障碍物时,它能够扭头,找到没有障碍物的方向然后再走。

二、硬件模块

1、stm32f103主控芯片

2、L298N驱动电机

        若要对直流电机进行 PWM 调速,需设置 IN1 和 IN2,确定电机的转动方向, 然后对使能端输出 PWM 脉冲,即可实现调速。注意当使能信号为 0 时,电机处于自由停止状态;当使能信号为 1,且 IN1 和 IN2 为 00 或 11 时,电机处于制动状 态,阻止电机转动。

       
 如果要控制小车的速度,则拔开L298N驱动电机的跳线帽,然后使能ENA和ENB引脚。

3、红外循迹模块

        TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

接口说明:

(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)

(2) GND 外接GND

(3) OUT 小板数字量输出接口(0和1)

4、蓝牙模块

5、小车

        

三、代码介绍

复用pin6和pin8来使能L298N电机驱动的ENA和ENB引脚来控制速度

pwm.c

void pwm()
{

    // 变量初始化

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8;      // 6和8引脚   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    // 50HZ 
    GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化接口

    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);      //使能定时器4时钟 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能GPIOB时钟
      

    
    TIM_TimeBaseStructure.TIM_Period =99;    //设置自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =71;     //设置预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式 
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);    
    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //脉冲宽度调制模式1
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //
  TIM_OCInitStructure.TIM_Pulse=0;
    
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  
    

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);   //使能TIM4在CCR1上的预装载寄存器
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);   //使能TIM4在CCR3上的预装载寄存器

    
    TIM_Cmd(TIM4, ENABLE);   //使能TIM4
}

// 前进
void front()
{

        TIM_SetCompare1(TIM4,66);  
        TIM_SetCompare3(TIM4,66);
        IN1 = 1;    
        IN2 = 0;
        
        IN3 = 1;
        IN4 = 0;
}

//后退
//IN1~IN4可根据L298N逻辑图来设置
void back()
{
        TIM_SetCompare1(TIM4,66);
        TIM_SetCompare3(TIM4,66);
    
        IN1 = 0;
        IN2 = 1;
        
 
        IN3 = 0;
        IN4 = 1;
}

//右转
void right()
{
        TIM_SetCompare1(TIM4,0);
        TIM_SetCompare3(TIM4,66);
    
        IN1 = 1;
        IN2 = 0;
      
        IN3 = 0;
        IN4 = 0;
}

//左转
void left()
{
        TIM_SetCompare1(TIM4,66);
        TIM_SetCompare3(TIM4,0);
        
        IN1 = 0;
        IN2 = 0;
        
        IN3 = 1;
        IN4 = 0;
}

//停下
void stop()
{

         IN1 = 0;
         IN2 = 0;
        
         IN3 = 0;
         IN4 = 0;
}

HC05.c

void USART1_IRQHandler(void)        //串口中断服务函数
{
    u8 Rec;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
        
        Rec = USART_ReceiveData(USART1);        //接收蓝牙传输过来的数据
        
            switch(Rec)
        {
            case '1':                                        //前进
                void front();    
            break;

            case '2':                                        //后退
                back();
            break;

            case '3':                                        //右转
                right();  
            break;

            case '4':                                        //左转
                left();
            break;

            case '5':                                        //停止
               shop();
            break;

            default:                                            //停止
                shop();
            break;
        }
    }
}
 

作者:阿留克斯

物联沃分享整理
物联沃-IOTWORD物联网 » STM32蓝牙遥控循迹避障小车

发表评论