今天是实训的最后一天,我们在前两天基础实验的基础上将其扩展,做项目——智能小车的循迹避障
项目要求:
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 */
```