3.红外对管模块

我们的思路是通过将红外对管装到小车的车头,红外朝地面,当红外扫描到底下有黑色的时候就进行转向

当4个红外对管都没发现底下有黑色线的时候,小车就一直往前走

当最左1和左2单个或者左1&左2都识别到的时候,小车就往左转

当最右1和右2单个或者右1&右2都识别到的时候,小车就往右转

我们也可把红外模块当做按键,当下面是黑色的时候就是高电平,不是黑色的时候就是低电平,所以这里需要用到中断

查看原理图

红外对管分别对应PB5,PB4,PB3,PA15

接下来我们看手册能知道PB5,PB4,PB3,PA15这几个脚都是特殊脚

所以我们需要JTAG-DP 启用SW-DP ,我们重映射配置应写为

cpp 复制代码
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

注意:不要关闭所有的烧录脚,不然会造成无法通过串口烧录等情况,只能通过usb口刷官方文件复位

我们可以使用GPIO_ReadInputDataBit这个函数来读取四个红外对管的电平状态,用作判断底下是否为黑线

相关宏定义

cpp 复制代码
#define HW_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//读取 PB5 
#define HW_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//读取 PB4
#define HW_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)//读取 PB3
#define HW_4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取 PA15

GPIO初始化

cpp 复制代码
void Infrared_GPIO_Init(void)
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA时钟
    
 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//需要关闭JTAG-DP 启用SW-DP才能使用3/4/5 IO口 
    
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

封装循迹函数

这里我们可以通过调节Delay时间来控制拐弯的力度,这个需要自己细心的慢慢调

cpp 复制代码
//通过调节Delay来控制拐弯的力度
void Infrared_Hw(void)
{

        //四个红外为低电平的时候向前走
        if(HW_1 ==0 && HW_2 ==0 && HW_3 ==0 && HW_4 ==0)
        {
            Forward();
            printf("1+2+3+4\n");
            OLED_ShowString(x,y,"Forward");
            Delay_ms(50);
        }
        //第二个红外为高电平的时候向右走
        if(HW_1 ==0 && HW_2 ==1 && HW_3 ==0 && HW_4 ==0)
        {
            Rightward();
            printf("2\n");
            OLED_ShowString(x,y,"Right2");
            Delay_ms(150);
        }
        //第一个红外为高电平的时候向右走
        if(HW_1 ==1 && HW_2 ==0 && HW_3 ==0 && HW_4 ==0)
        {
            Rightward();
            printf("1\n");
            Delay_ms(250);
        }
        
        //第一个红外和第二个红外同时为高电平的时候向右走
        if(HW_1 ==1 && HW_2 ==1 && HW_3 ==0 && HW_4 ==0)
        {
            Rightward();
            printf("1+2\n");
            Delay_ms(300);
        }
        //第三个红外为高电平的时候向左走  
        if(HW_1 ==0 && HW_2 ==0 && HW_3 ==1 && HW_4 ==0)
        {
            Leftward();
            printf("3\n");
            OLED_ShowString(x,y,"Left3");
            Delay_ms(150);
        }
        //第四个红外为高电平的时候向左走 
        if(HW_1 ==0 && HW_2 ==0 && HW_3 ==0 && HW_4 ==1)
        {
            Leftward();
            printf("4\n");
            OLED_ShowString(x,y,"Left4");
            Delay_ms(250);
        }
        //第三个红外和第四个红外同时为高电平的时候向左走 
        if(HW_1 ==0 && HW_2 ==0 && HW_3 ==1 && HW_4 ==1)
        {
            Leftward();
            printf("3+4\n");
            OLED_ShowString(x,y,"Left3+4");
            Delay_ms(300);
        }
    
}
相关推荐
周周记笔记21 分钟前
[元器件专题] RC充电电路(七)
嵌入式硬件·测试工具·硬件开发
ACP广源盛1392462567332 分钟前
GSV2712@ACP#2 进 1 出 HDMI 2.0/Type-C DisplayPort 1.4 混合切换器 + 嵌入式 MCU
单片机·嵌入式硬件·计算机外设·音视频
沉在嵌入式的鱼42 分钟前
STM32--GY906体温检测传感器
stm32·单片机·嵌入式硬件·gy906·体温检测
cooldream200942 分钟前
基于 RISC-V VisionFive 的桌面数字时钟项目实战
嵌入式硬件·risc-v·嵌入式开发
小李做物联网2 小时前
26.3基于stm32单片机毕业设计物联网软硬件智能遮阳棚设计
stm32·单片机·嵌入式硬件·物联网
D***y2012 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
易水寒陈2 小时前
使用1个定时器作为多个串口的超时计数器
stm32·单片机
三佛科技-187366133972 小时前
BP8501CH是什么芯片?BP8501CH(输出功率说明及典型电路图)
单片机·嵌入式硬件
Zeku2 小时前
20251125 - 韦东山Linux第三篇笔记【下】
linux·驱动开发·嵌入式硬件
芯联智造3 小时前
【stm32简单外设篇】- 水银开关
c语言·stm32·单片机·嵌入式硬件