前言
本篇文章将带大家学习STM32智能小车的循迹功能。
一、红外循迹模块工作原理及接线图
红外循迹模块工作原理
电路工作描述
以其中一路为例
TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被接收到时,比较器LM3932脚的电压大于3脚的电压,输出OUT1为低电平,LED1为熄灭状态。简单的可以理解为遇到黑线灯亮,遇到白线灯灭。
红外循迹模块和STM32的接线图
此红外循迹模块使用到了4个IO口分别接到了STM32的PA4~PA7。
二、cubeMX配置
将红外循迹的4个IO口都设置为上拉输入模式即可。
三、代码解析
find.c
#include "find.h" #include "Moto.h" extern TIM_HandleTypeDef htim3; /* 函数功能:调节小车左右电机PWM Left:左电机PWM Right:右电机PWM */ void Moto_speed_set(int Left,int Right) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left); } /* 函数功能:循迹 */ void Find(void) { //全是白线前进 if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0)) { Moto_speed_set(800,800); car_move(0); } //右边有黑线小车向左即左轮加速右轮减速 else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0)) { Moto_speed_set(800,0); car_move(0); } //右边有黑线小车向左即左轮加速右轮减速 else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0)) { Moto_speed_set(800,0); car_move(0); } //右边有黑线小车向左即左轮加速右轮减速 else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0)) { Moto_speed_set(800,0); car_move(0); } //左边有黑线小车向右即右轮加速左轮减速 else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0)) { Moto_speed_set(0,800); car_move(0); } //左边有黑线小车向右即右轮加速左轮减速 else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1)) { Moto_speed_set(0,800); car_move(0); } //左边有黑线小车向右即右轮加速左轮减速 else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1)) { Moto_speed_set(0,800); car_move(0); } //全是黑线停车 if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1)) { Moto_speed_set(0,0); car_move(2); } }
find.h
#ifndef _FIND_H_ #define _FIND_H_ #include "main.h" #define u8 unsigned char #define u16 unsigned short #define u32 unsigned int //红外循迹IO口定义 //传感器从右到左 IO1 IO2 IO3 IO4 #define IO1_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4) #define IO2_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5) #define IO3_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) #define IO4_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7) void Find(void); void Moto_speed_set(int Left,int Right); #endif
总结
循迹代码已经贴出希望大家可以好好理解一下循迹算法的编写。