红外传感器循迹过圆环

前言

很多人玩智能车第一步都是红外循迹,但是大多都没有去过圆环,下面过圆环思路,仅供参考.

一.红外循迹

一般循迹都是用两个红外传感器,当然多个更好,左右传感器控制两个轮子的差速来进行转向.

其实不过圆环一个传感器就足以循迹,只需要在没有检测到黑线时右转,检测到黑线时左转,两个轮子的速度差别太大(不然太摇摆),不过缺点是过不了圆环,一旦小车在线的右侧或者速度太快,车就会冲出赛道.

		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)==1)motor_run  (60,30);
		else motor_run  (45,60);

解决这个问题则需要加两个传感器,一个左侧一个右侧,一旦中间传感器越过黑线,被外侧传感器检测,逻辑就会反过来.

		if(loc==1)		//左传感器检测到黑
		{
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)==1)motor_run  (60,30);
		else motor_run  (45,60);
		}
		if(loc==2)		//右传感器检测到黑
		{
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)==1)motor_run  (30,60);
		else motor_run  (60,45);
		}

二.过圆环

外侧两个传感器会检测到圆环的线,根据上面的逻辑就会进出圆环,很丝滑

三.完整代码

代码很简单

main.c

#include "stm32f10x.h"               
#include "hongwai.h"
#include "motor.h"

int loc;

int main(void)
{
	
	hongwai_Init();
	PWM_Init();
	motor_init ();
	
	while(1)
	{
		hongwaijiyi ();
		if(loc==1)		//左传感器检测到黑
		{
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)==1)motor_run  (60,30);
		else motor_run  (45,60);
		}
		if(loc==2)		//右传感器检测到黑
		{
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)==1)motor_run  (30,60);
		else motor_run  (60,45);
		}
    }
}

hongwai.c

#include "stm32f10x.h"                 

extern int loc;

void hongwai_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9|GPIO_Pin_2 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);                  
	
}

void hongwaijiyi()
{
    if(GPIO_ReadInputDataBit(GPIOB ,GPIO_Pin_9 )==1)loc =1;
    else if(GPIO_ReadInputDataBit(GPIOB ,GPIO_Pin_7 )==1)loc =2;
    else loc=loc;
}

hongwai.h

#ifndef __hongwai_H
#define __hongwai_H

void hongwai_Init(void);
void hongwaijiyi();

#endif

motor.c

#include "stm32f10x.h"                 


void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);            //开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);                           //GPIO初始化
	
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;             //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;          //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;             //CCR
	
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	TIM_OC4Init(TIM2, &TIM_OCInitStructure);
		
	TIM_Cmd(TIM2, ENABLE);

}


void PWM_SetCompare3(uint16_t Compare3)
{
	TIM_SetCompare3(TIM2, Compare3);
}

void PWM_SetCompare4(uint16_t Compare4)
{
	TIM_SetCompare4(TIM2, Compare4);
}



void motor_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_12 | GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStructure);                       //GPIO初始化
	PWM_Init();
}



void motor_run(int L,int R)
{
	if(L>0)
	{	GPIO_ResetBits(GPIOB, GPIO_Pin_12);		
		PWM_SetCompare3(L);		
	if(L<0)
	{	GPIO_SetBits(GPIOB, GPIO_Pin_12);		
		PWM_SetCompare3(-L);		
	}
	if(R>0)
	{	GPIO_ResetBits(GPIOB, GPIO_Pin_14);	
		PWM_SetCompare4(R);	
	}
	if(R<0)
	{	GPIO_SetBits(GPIOB, GPIO_Pin_14);	
		PWM_SetCompare4(-R);	 
	}

}

motor.h

#ifndef __MOTOR_H
#define __MOTOR_H

void PWM_Init(void);
void PWM_SetCompare3(int  Compare3);
void PWM_SetCompare4(int Compare4);

void motor_init(void);
void motor_run(int L,int R);

#endif

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值