五路灰度传感器学习HJ-XJ5

目录

一、注释: 

二、接线

三、代码

灰度传感器bsp_GraySensor.c

 灰度传感器部bsp_GraySensor.h

主函数main.h

主函数mian.c


 

一、注释: 

参数:pwm:最大速度值,P:比例系数

根据位置式离散PID公式 
pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
e(k)代表本次偏差 
e(k-1)代表上一次的偏差  
∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2···k;

pid巡线函数:track_PID

float   Proportion;             // 比例常数 Proportional Const
        float   Integral;          // 积分常数 Integral Const
        float   Derivative;      // 微分常数 Derivative Const
        int      Error1;            // Error[n-1]
        int      Error2;            // Error[n-2]
        int      iError;             // Error[n]

PID position         位置式

PID int MatOut    设定输出最大值

int Setpoint          PID控制器设定值

position.iError=Setpoint-CurrentPoint;    // 计算当前误差
position.Error_sum+=position.iError;
iIncpid=position.Proportion * position.iError                  // P
          +position.Integral * position.Error_sum               // I
          +position.Derivative * (position.iError-position.Error1); // D
position.Error1=position.iError;          // 存储误差,用于下次计算  
sensor  传感器

analog  模拟值

左偏设置值为正,右偏设置值为负

二、接线

五路灰度传感器----stm32
DND--------------GND
VCC--------------5V
L2---------------C13
L1---------------C4
M----------------E6
R1---------------E5
R2---------------A4

(可自行更改)

通讯协议

要想得到偏移量就必须使用串口传输的形式 

在这里插入图片描述

三、代码

灰度传感器bsp_GraySensor.c


#include "bsp_GraySensor.h"
#include "main.h"
#include "adc.h"
#include "control.h"

//ÓÃÀ´Ñ²ÏßµÄ '»Ò¶È´«¸ÐÆ÷' ºÍ ÓÃÀ´¼ì²âÊÇ·ñ·ÅÉÏÒ©Æ·µÄ 'ºìÍâ´«¸ÐÆ÷' µÄ´úÂ붼·ÅÔÚÕâ¸ö.cÎļþÀïÁË

u8 L2_Val, L1_Val, M_Val, R1_Val, R2_Val;
int Line_Num;


u16 ADC_Value;
float ADC_Volt;
u8 Load_flag =0;  // 0±íʾ»¹Ã»×ªÔØÒ©Æ·£¬±íʾתÔØÍê±Ï£¬-1±íʾҩƷËÍ

u8 LoadCount,NotLoadCount;

/*******************»Ò¶È´«¸ÐÆ÷ѲÏß*************/
//Ö»Òª°ÑËٶȻ·¿ØÖƺ㬲¹³¥Öµ¼´¿ÉÈ·¶¨¡£  ²»Í¬ËÙ¶ÈÖµÐèÒª²»Í¬µÄ²¹³¥Öµ¡£  ²âÊÔºÃÒ»¸ö×îºÃµÄ¡£  ²»Í¬µÄתËÙÒª¶ÔÓ¦²»Í¬µÄ²¹³¥ÏµÊý»òÊýÖµ
void Light_GoStraight_control(void)   //»Ò¶ÈѲÏßÖ±ÐÐ, ÐèÒªÓиöÅжÏÐèÒªÖ±Ðж೤¾àÀëµÄº¯Êý    //²¹³¥Òªµ½ÖмäµÄ´«¸ÐÆ÷²âµ½»Øµ½ÏßÉÏΪֹ
{
	  Get_Light_TTL();  
	
	//Èç¹ûÒª¸ü¼Ó¾«×¼µÄ¿ØÖÆ£¬Ö»ÒªÓÐÁËѲÏß»·£¬¶¼ÐèÒª¶ÔλÖýøÐв¹³¥¡£  ¿É·ñÖ±½Ó½« g_lMotorPulseSigma  ºÍg_lMotor2PulseSigma ½øÐÐÊýÖµ¼Ó¼õ£¿£¿
  
	//Èç¹ûÑ°Ö±ÏßÓõĴ«¸ÐÆ÷¿ÉÒÔ¶ÁÈ¡Ä£ÄâÁ¿µÄ»°£¬Èý¸ö´«¸ÐÆ÷¶¼¿ÉÒÔѲֱÏßѰͦÎȵÄ


		if(L1_Val == 0 &&  M_Val == 1 && R1_Val == 0 )  Line_Num =  0;
	  if(L1_Val == 0 &&  M_Val == 1 && R1_Val == 1) Line_Num =  400;
	  if(L1_Val == 0 &&  M_Val == 0 && R1_Val == 1 )  Line_Num =  500;
	  if(L1_Val == 1 &&  M_Val == 0 && R1_Val == 0) Line_Num = -500;   
    if(L1_Val == 1 &&  M_Val == 1 && R1_Val == 0) Line_Num = -400;	
	
//	 if(LineNumToggleFlag == 1)
//	 {
//		 Line_Num = - Line_Num;
//	 }
	
}


//°Ñ»Ò¶È´«¸ÐÆ÷µ±×÷Ö»Êä³ö¸ßµÍµçƽ¡£ ¸ßµçƽÊÇʶ±ðµ½ºìÏßÁË¡£
void Get_Light_TTL(void)  
{
	if(HAL_GPIO_ReadPin(L2_GPIO_Port, L2_Pin) == GPIO_PIN_SET){L2_Val = 1;} else {L2_Val = 0;}
	if(HAL_GPIO_ReadPin(L1_GPIO_Port, L1_Pin) == GPIO_PIN_SET){L1_Val = 1;} else {L1_Val = 0;}
	if(HAL_GPIO_ReadPin(M_GPIO_Port, M_Pin) == GPIO_PIN_SET)  {M_Val = 1;} else {M_Val = 0;}
	if(HAL_GPIO_ReadPin(R1_GPIO_Port, R1_Pin) == GPIO_PIN_SET){R1_Val = 1;} else {R1_Val = 0;}
	if(HAL_GPIO_ReadPin(R2_GPIO_Port, R2_Pin) == GPIO_PIN_SET){R2_Val = 1;} else {R2_Val = 0;}
}



/********¼ì²âÊÇ·ñתÔØÒ©Æ·*************/
void LoadOrNot()
{
			HAL_ADC_Start(&hadc1);      
			if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
			{
				ADC_Value = HAL_ADC_GetValue(&hadc1);
				ADC_Volt =  (float)ADC_Value*3.3/4096.0;
			}
			
			if(ADC_Volt <= 1.6)
			{
				NotLoadCount = 0;
				
				LoadCount++;
				if(LoadCount > 3) //3´Î³ÌÐòÖ´Ðе½ÕâÖ®ºóÔÙ´ÎÅжÏ
				{
					Load_flag = 1;
				}
			}
			else if(ADC_Volt >  1.6)
			{
				LoadCount = 0;
				
				if(Load_flag == 1)    //±ØÐëÏÈ×°ÔعýÒ©Æ·µÄÇé¿öϲÅÄÜÅжÏÊÇ·ñÄÃ×ßÒ©Æ·
				{
					NotLoadCount++;
					if(NotLoadCount > 3 )  //3´Î³ÌÐòÖ´Ðе½ÕâÖ®ºóÔÙ´ÎÅжÏ
					{
						Load_flag = 2;
					}
			  }
			}
}

 灰度传感器部bsp_GraySensor.h

#ifndef __GRAYSENSOR_H
#define __GRAYSENSOR_H
#include "bsp_sys.h"

extern u8 L2_Val, L1_Val, M_Val, R1_Val, R2_Val;

extern u16 ADC_Value;
extern float ADC_Volt;
extern u8  Load_flag;


extern int Line_Num;


void LoadOrNot(void);

void Get_Light_TTL(void);
void Light_GoStraight_control(void);


#endif

主函数main.h

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define L2_Pin GPIO_PIN_13
#define L2_GPIO_Port GPIOC
#define LOAD_Pin GPIO_PIN_1
#define LOAD_GPIO_Port GPIOA
#define L1_Pin GPIO_PIN_4
#define L1_GPIO_Port GPIOC
#define M_Pin GPIO_PIN_6
#define M_GPIO_Port GPIOE
#define BIN1_Pin GPIO_PIN_10
#define BIN1_GPIO_Port GPIOB
#define BIN2_Pin GPIO_PIN_11
#define BIN2_GPIO_Port GPIOB
#define red_sig_Pin GPIO_PIN_15
#define red_sig_GPIO_Port GPIOB
#define R1_Pin GPIO_PIN_5
#define R1_GPIO_Port GPIOE
#define R2_Pin GPIO_PIN_4
#define R2_GPIO_Port GPIOA
#define blue_sig_Pin GPIO_PIN_11
#define blue_sig_GPIO_Port GPIOA
#define yellow_sig_Pin GPIO_PIN_12
#define yellow_sig_GPIO_Port GPIOA
#define AIN1_Pin GPIO_PIN_8
#define AIN1_GPIO_Port GPIOB
#define AIN2_Pin GPIO_PIN_9
#define AIN2_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

主函数mian.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "bsp_key.h"
#include "bsp_sys.h"
#include "bsp_delay.h"
#include "control.h"
#include "bsp_led.h"
#include "menu.h"
#include "Fire_protocol.h"

#include "bsp_pid.h"
#include "openmv.h"
#include "bsp_GraySensor.h"

#include "bsp_BlueTooth.h"



/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

u8 Do_count = 0, Do2_count = 0;

u16 showOLEDTime = 0;
u16 SendTime = 0;

extern unsigned char BMP3[];
extern unsigned char BMP4[];

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	/*ÊÓƵ½Ì³ÌÁ´½Ó https://www.bilibili.com/video/BV1UL411V7XK?p=2&share_source=copy_web   êdzƣºº£Î¹Î¹Î¹*/
	
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
	LED_Init();
	KEY_GPIO_Init();

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
	delay_init(72);

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_TIM6_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_TIM7_Init();
  MX_TIM8_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
	
	
	HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);   //¿ªÆôTIM3µÄ±àÂëÆ÷½Ó¿Úģʽ
  HAL_TIM_Encoder_Start(&htim8, TIM_CHANNEL_ALL);   //¿ªÆôTIM8µÄ±àÂëÆ÷½Ó¿Úģʽ


	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);       //Motor 2  
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
	
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);     //Motor1
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);   
	
	
	delay_ms(100);    //ÑÓʱһÏ£¬ÈÃOLEDÕý³£Êä³ö
	OLED_Init();
	delay_ms(100);    //ÑÓʱһÏ£¬ÈÃOLEDÕý³£Êä³ö
	
  OLED_Clear(); //ÒòΪÊÇÖ±½Ó½øÀ´µÄ£¬ËùÒÔÇå³ýһϱȽϺÃ
	
	PID_param_init();  

  set_motor2_enable();    //ÉÏλ»úµ÷ÊÔpidʱ²ÅÐèÒªÊÖ¶¯Ê¹Äܵç»úµÄPWMÊä³ö
	set_motor_enable();  
	
	 HAL_TIM_Base_Start_IT(&htim7);
	 HAL_TIM_Base_Start_IT(&htim6);
	 
	 
	 HAL_UART_Receive_IT(&huart3,&uart3_rxbuff,1);  //openmvͨÐÅ´®¿Ú
	 
	 HAL_UART_Receive_IT(&huart2,&uart2_rxbuff,1);  //À¶ÑÀͨÐÅ´®¿Ú
	
	 __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);    //´®¿Ú1½ÓÊÕÖжϣ¬Ö»¿ªÆô½ÓÊÕÖжϣ¬ÓëÉÏλ»úͨÐÅ
	
	
		protocol_init();       //Õâ¸ö³õʼ»¯Á˲ÅÄÜͨ¹ýÉÏλ»ú¿ØÖÆѽ, ÔÙ¿´Õâ¸ö×¢ÒâÊÂÏî
		
	 __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
	 
	

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		receiving_process();   //½âÎöÒ°»ðÉÏλ»úͨÐÅЭÒé,µ÷ÊÔµç»úλÖÃËٶȴ®¼¶PIDʱÓÃ
		
		
		if(SendTime >= 21)
		{
			SendTime = 0;
			
			SendDataToOpenmv();   //²»ÄÜÌ«¿ì£¬·ñÔò»á³¬¹ýopenmvµÄ½ÓÊÕÊý¾Ý»º³åÇø
			
		}
		
		if(showOLEDTime >= 200)
		{
			showOLEDTime = 0;
			OLED_Display(Menu_Item);
			
//			if(OneLoadFlag == 1)
//			{
//				BlueSignal_Toggle;
//			}
			//printf("123");
		  
			/****ÅжÏÊÇ·ñÓзÅÒ©Æ·******/  
			LoadOrNot();
		}
		
	 
		
	  /**************µÈ´ýʶ±ð²¡·¿ºÅ**************/   
		if(TASK == 1)   
		{
			SetTargetRoom();
			
		}
		
		
		else if(TASK == 2)    
	  {
			 //¼ÓÉÏ·¢Ë͸øopenmv µÄÊý¾Ý
				if(Load_flag == 1)    //ÔËËÍÒ©Îï
				{
						//½ü¶Ë²¡·¿£¬¿¿openmv¹æ»®	£¬ ÓÃÀ´²âÊÔ¶þ³µÐÔÄÜ
						if(TargetRoom == 'A')   
						{
							switch(Do_count)
							{
								case 0:
									 Do_count++;								 
									 Car_go(60-5+15+HeadToWheelCM);   //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
								
								break;
						 
								case 1:
									 if(Stop_Flag ==1)          //Ö±ÐС¢×ªÍ亯Êý½»ÌæʹÓÃʱ£¬¿ÉÒÔ²»ÊÖ¶¯½«±ê־λÇåÁã
									 {
										 Do_count++;
										 spin_Turn(left_90);   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
									 }
								break;
								 
								case 2:
									 if(Spin_succeed_flag == 1)
									 {
										 Do_count++;
										 Car_go(40-5+15-HeadToWheelCM +3);      //Stop_FlagÔÙ´ÎÖÃ1   +3ÊÇΪÁ˽øÍ£³µÇø  
									 }
								break;
									 
								case	3:
									if(Stop_Flag ==1)
									{
										RedSignal_on;
										
											//µãÁÁºìɫָʾµÆ
										
									}
								break;
							}			 
						}
						
						
						else if(TargetRoom == 'B')
						{
							switch(Do_count)
							{
								case 0:
									 Do_count++;								 
																									
										Car_go(60-5+15+HeadToWheelCM);  //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ

								break;
						 
								case 1:
									 if(Stop_Flag ==1)
									 {
										 Do_count++;
										 spin_Turn(right_90);   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
									 }
								break;
								 
								case 2:
									 if(Spin_succeed_flag == 1)
									 {
										 Do_count++;
										 Car_go(40-5+15-HeadToWheelCM +3);        //Stop_FlagÔÙ´ÎÖÃ1   +3ÊÇΪÁ˽øÍ£³µÇø  
									 }
								break;
									 
								case	3:
									if(Stop_Flag ==1)
									{
										
										RedSignal_on;
											//µãÁÁºìɫָʾµÆ
										
									}
								break;
							}			 
						}
						
						if(OneLoadFlag == 1)
						{
								//È¥ÖжËËÍÒ©£¬¿¿Ò»³µµÈ´ýÄ¿±ê·¿ºÅÀ´È·¶¨£¬²»Ó÷µ»Ø
							if(OneTargetRoom == 'C')
							{
								 switch(Do_count)
								 {
										case 0:
											 Do_count++;								 
											 Car_go(160+HeadToWheelCM);    //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
											 
										break;

										case 1:
											 if(Stop_Flag ==1)      
											 {
												 Do_count++;
												 spin_Turn(right_90 );   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
												
											 }
										break;
										 
										case 2:
											 if(Spin_succeed_flag == 1)   //ÕâÀï¶ãÈëÁíÍâÒ»¸öÖж˲¡·¿Í¨µÀ£¬  ²âÊÔһϣ¬¿´µôͷЧ¹ûºÃ»¹ÊÇÖ±½ÓºóÍËЧ¹ûºÃ
											 {
												 Do_count++;   
												 Car_go(HideCM);        //Stop_FlagÔÙ´ÎÖÃ1    //Èç¹ûºóÍ˵Ļ°£¬Ñ²Ïß²¹³¥µÄÖµÐèÒªÏà·´  
												
											 }
										break;
											 
										case 3:
											if(Stop_Flag ==1)        
											{
												
												YellowSignal_on; //µÈÒ»³µÈ¡Ò©
												
											}
										break;
											 
								 }
							}
									
								
							else if(OneTargetRoom == 'D' )
							{
								 switch(Do_count)
								 {
										case 0:
											 Do_count++;								 
											 Car_go(150-5+15+HeadToWheelCM);    //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
											 
										break;

										case 1:
											 if(Stop_Flag ==1)         
											 {
												 Do_count++;
												 spin_Turn(left_90);   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
												
											 }
										break;
										 
										case 2:
											 if(Spin_succeed_flag == 1)   //ÕâÀï¶ãÈëÁíÍâÒ»¸öÖж˲¡·¿Í¨µÀ£¬  ²âÊÔһϣ¬¿´µôͷЧ¹ûºÃ»¹ÊÇÖ±½ÓºóÍËЧ¹ûºÃ
											 {
												 Do_count++;  
												 Car_go(HideCM);        //Stop_FlagÔÙ´ÎÖÃ1   //Èç¹ûºóÍ˵Ļ°£¬Ñ²Ïß²¹³¥µÄÖµÐèÒªÏà·´  
												
											 }
										break;
											 
										case 3:
											if(Stop_Flag ==1)          
											{
												
												YellowSignal_on;  //µÈÒ»³µÈ¡Ò©
												
											}
										break;
											 
										
								 }
							}
						}
				}
			
				else if(Load_flag == 2)       // Ö»ÔÚ½ü¶Ë²Å·µ»Ø,ÓÃÀ´²âÊÔ¶þ³µ¿ØÖÆЧ¹û  
				{
						if(TargetRoom == 'A')
						{
							switch(Do2_count)
							{
								case 0:
									Do2_count++;
									 
									spin_Turn(back_180 );
									RedSignal_off; //¹Ø±ÕºìɫָʾµÆ
									
								break;
							
								
								case 1:
									if(Spin_succeed_flag == 1)
									{
										Do2_count++;
									
										
										Car_go(40-5+15-HeadToWheelCM+3);   //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
									}
								break;
						 
								case 2:
									 if(Stop_Flag ==1)
									 {
										 Do2_count++;
										 spin_Turn(right_90 );   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
									 }
								break;
								 
								case 3:
									 if(Spin_succeed_flag == 1)
									 {
										 
										 
										 Do2_count++;
										 Car_go(60-5+15-HeadToWheelCM +3 );   //Stop_FlagÔÙ´ÎÖÃ1
									
									 }
								break;
									 
								case	4:
									if(Stop_Flag ==1)
									{
									
										GreenSignal_on; //µãÁÁÂÌɫָʾµÆ
										
									}
								break;
							}	               

						}
						
						else if(TargetRoom == 'B')
						{
							switch(Do2_count)
							{
								case 0:
									Do2_count++;
									 
									spin_Turn(back_180 );
									RedSignal_off; //¹Ø±ÕºìɫָʾµÆ
									
								break;
							
								
								case 1:
									if(Spin_succeed_flag == 1)
									{
										Do2_count++;
									
										
										Car_go(40-5+15-HeadToWheelCM+3);     //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
									}
								break;
						 
								case 2:
									 if(Stop_Flag ==1)
									 {
										 Do2_count++;
										 spin_Turn(left_90 );   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
									 }
								break;
								 
								case 3:
									 if(Spin_succeed_flag == 1)
									 {
										 
										 
										 Do2_count++;
										 Car_go(60-5+15-HeadToWheelCM +3);    //Stop_FlagÔÙ´ÎÖÃ1
										
									 }
								break;
									 
								case	4:
									if(Stop_Flag ==1)
									{
									
										GreenSignal_on; //µãÁÁÂÌɫָʾµÆ
										
									}
								break;
							}
						}
				}
			
			
			if(OneLoadFlag == 2)
			{

        if(OneTargetRoom == 'C' || OneTargetRoom == 'D')
				{
					switch(Do_count)
					{
						
						case 3:
							//À´¸öÑÓʱµÄ±ê־λ
							 WaitFlag = 1;
						   YellowSignal_off;	 
						
							 if(WaitTimeCount >=  6000)  //ÑÓʱ6s
							 {
								 Do_count++;
								 
								 WaitFlag = 0;
								 WaitTimeCount = 0;
								 
								 spin_Turn(back_180);
							 
						   }
					  break;
							 
						case	4:
							if(Spin_succeed_flag ==  1)
							{
								 Do_count++;
								
								 Car_go(HideCM + 40-5+15-HeadToWheelCM +3);
							}
						break;
							
					  case 5:
							if(Stop_Flag == 1)
							{
								Do_count++;
								
								RedSignal_on;
							}
						
						break; 
					}
				}  				
			
				//È¥Ô¶¶ËÈ¡Ò©£¬²»ÓùÜÊÇ·ñ×°ÔØÒ©Æ·£¬ÏÈÔÚÖж˵ÈÒ»³µ¹ýÁËÔÙÈ¥Ô¶¶Ë¡£ 
			  if(OneTargetRoom == 'E' || OneTargetRoom == 'F'  ||  OneTargetRoom == 'G' ||OneTargetRoom == 'H' )   // ÓÉÒ»³µ·¢Ë͵ıê־λ¿ØÖƶþ³µÆô¶¯
				{
					switch(Do_count)
					{
						 case 0:
							 Do_count++;								 
							 Car_go(150-5+15+HeadToWheelCM-2);    //´Ëʱ Stop_Flag ==0  Íê³Éºó×Ô¶¯ÖÃ1        //½ü¶Ë²¡·¿²»Ô¤Áôopenmvʶ±ðµÄλÖÃ
							 
						 break;

						 case 1:
							 if(Stop_Flag ==1)         
							 {
								 if(OneTargetRoom == 'E' || OneTargetRoom == 'F')
								 {
									 Do_count++;
									 spin_Turn(right_90);   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
								 }
								 
								 else if(OneTargetRoom == 'G' ||OneTargetRoom == 'H')
								 {
									 Do_count++;
									 spin_Turn(left_90);   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
								 }
								
							 }
						 break;
							 
						 case 2:					 
							 if(Spin_succeed_flag == 1)
							 {
									Do_count++;
									Car_go(HideCM);
							 }
						 break;
							 
						 case 3:
							 if(Stop_Flag == 1)
							 {
									WaitFlag = 1;
								  Do_count++;
							 }
						 break;
							 
						 case 4:
							 if(WaitTimeCount >= 3000 )  //µÈ´ý3s
							{
								Do_count++;
								WaitTimeCount = 0;
								WaitFlag = 0;
								
								spin_Turn(back_180);
							}
             break;						 
							 
							 
						 case 5:
							 if(Spin_succeed_flag == 1)
							 {
								 Do_count++;
							   Car_go(HideCM );
							 }
						 break;
							
						 case	6:
							 if(Stop_Flag ==1)         
							 {
								 if(OneTargetRoom == 'E' || OneTargetRoom == 'F')
								 {
									 Do_count++;
									 spin_Turn(right_90 );   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
								 }
								 
								 else if(OneTargetRoom == 'G' ||OneTargetRoom == 'H')
								 {
									 Do_count++;
									 spin_Turn(left_90 );   //´ËʱSpin_succeed_flag== 0 ,Íê³Éºó×Ô¶¯ÖÃ1
								 }
								
							 }
						 break;

						 case	7:
							 if(Spin_succeed_flag == 1)
							 {
									Do_count++;
									Car_go(90- (LookCM + HeadToWheelCM) );
							 }
						 break;

						 case	8:
							 if(Stop_Flag == 1 )
							 {
									FindStartFlag = 1;
											
									if(FindTimeCount < 500)    //Ò»¶¨Ê±¼äÄÚʶ±ðµ½RoomNum, ÇÒÆäλÖÃÆ«×ó     Èý¸öÌõ¼þ¶¼ÒªÂú×㣺ʱ¼ä¡¢Ê¶±ð³É¹¦±ê־λ¡¢Î»ÖÃ
									{
										if(RoomNum == TargetNum && LoR == 1) 
										{
											 Do_count++; 
											 TargetRoom = 'E';      //Ïȼٶ¨ÊÇE
											 Car_go(LookCM+HeadToWheelCM);      //²¹»Ø¸øopenmvʶ±ðÔ¤ÁôµÄλÖã¬Í¬Ê±ÈóµÂÖѹÏߣ¬ÒÔ±ãºóÐøתÍä
											
											//Í£Ö¹¼Æʱ,²¢ÇåÁã
											 FindTimeCount = 0;
											 FindStartFlag = 0;
										}
										else if(RoomNum == TargetNum && LoR == 2 )  	//ʶ±ðµ½Ä¿±êÊý×Ö, ÇÒÆäλÖÃÆ«ÓÒ
										{
											 Do_count++; 
											 TargetRoom = 'G';    //Ïȼٶ¨ÊÇG
											 Car_go(LookCM + HeadToWheelCM);      //²¹»Ø¸øopenmvʶ±ðÔ¤ÁôµÄλÖã¬Í¬Ê±ÈóµÂÖѹÏߣ¬ÒÔ±ãºóÐøתÍä
											
											//Í£Ö¹¼Æʱ,²¢ÇåÁã
												 FindTimeCount = 0;
												 FindStartFlag = 0;
										}										
										
									}										 

									else if(FindTimeCount >= 500)   //ÈÔÈ»³¬Ê±²¢Î´Ê¶±ðµ½£¬Ôò±£Áô³õʼ»¯ÊǸ³ÓèµÄ'E'
									{
										 Do_count++; 
										 Car_go(LookCM + HeadToWheelCM);      //²¹»Ø¸øopenmvʶ±ðÔ¤ÁôµÄλÖã¬Í¬Ê±ÈóµÂÖѹÏߣ¬ÒÔ±ãºóÐøתÍä
											
											//Í£Ö¹¼Æʱ,²¢ÇåÁã
										 FindTimeCount = 0;
										 FindStartFlag = 0;
									}
										
								}
						 break;
						 
						 case	9:
								if(Stop_Flag == 1)
								{
									Do_count++;
									if(TargetRoom == 'E')
									{
										spin_Turn(left_90);
									}
									else if(TargetRoom == 'G')
									{
										spin_Turn(right_90);
									}
								}
						 break;
								
						 case 10:
								if(Spin_succeed_flag == 1)
								{
									Do_count++;
									Car_go(90 -HeadToWheelCM -LookCM);
								}
						 break;
						 
						 case 11:
								if(Stop_Flag == 1)
								{
									FindStartFlag = 1;
									if(FindTimeCount < 500)
									{
										if(TargetRoom == 'E')
										{
												if(RoomNum == TargetNum && LoR == 1)    //ʶ±ðµ½RoomNum, ÇÒÆäλÖÃÆ«×ó    
											 {
												 Do_count ++;  
												 TargetRoom = 'E';
												 Car_go(LookCM+HeadToWheelCM);      //²¹»Ø¸øopenmvʶ±ðÔ¤ÁôµÄλÖã¬Í¬Ê±ÈóµÂÖѹÏߣ¬ÒÔ±ãºóÐøתÍä
												 
												 FindStartFlag = 0;
												 FindTimeCount =0;
											 }										 
											 
											 else if(RoomNum == TargetNum && LoR == 2)   //Ò»¶¨Ê±¼äÄÚʶ±ðµ½RoomNum, ÇÒÆäλÖÃÆ«ÓÒ
											 {
												 Do_count++;  
												 TargetRoom = 'F';
												 Car_go(LookCM + HeadToWheelCM);
												 
												 FindStartFlag = 0;
												 FindTimeCount =0;
											 }
										}
										
										else if(TargetRoom == 'G')
										{
												if(RoomNum == TargetNum && LoR == 1)    //Ò»¶¨Ê±¼äÄÚʶ±ðµ½RoomNum, ÇÒÆäλÖÃÆ«×ó    
											 {
												 Do_count++; 
												 TargetRoom = 'G';
												 Car_go(LookCM+HeadToWheelCM);												 
												 
												 FindStartFlag = 0;
												 FindTimeCount =0;
											 }										 
											 
											 else if(RoomNum == TargetNum && LoR == 2)   //Ò»¶¨Ê±¼äÄÚʶ±ðµ½RoomNum, ÇÒÆäλÖÃÆ«ÓÒ
											 {
												 Do_count++;  
												 TargetRoom = 'H';
												 Car_go(LookCM + HeadToWheelCM);
												 
												 FindStartFlag = 0;
												 FindTimeCount =0;
											 }
										}		
									}
									
									else if(FindTimeCount >= 500)   
									{
										Do_count++;  
										Car_go(LookCM + HeadToWheelCM);
										
										
										FindStartFlag=0;
										FindTimeCount=0;
									}
										
								}
						 break;
						 
						 case 12:
								if(Stop_Flag == 1)
								{
									Do_count++;
									if( TargetRoom == 'E' || TargetRoom == 'G')
									{
										spin_Turn(left_90);
									}
									else if( TargetRoom == 'F' || TargetRoom == 'H')
									{
										spin_Turn(right_90);
									}
								}
						 break;
						 
						 case 13:
								if(Spin_succeed_flag == 1)
								{
									Do_count++;
									Car_go(40-5+15-HeadToWheelCM +3);
								}
						 break;					 
						
						 case 14:
								if(Stop_Flag == 1)
									{
										
										RedSignal_on;
										 //µãÁÁºìɫָʾµÆ
									}
						 break;					 
						
					}
				}
				
			}
		}
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据引用\[1\]中的内容,灰度传感器可以用于判断口的情况。在T形口的判断中,可以通过判断灰度传感器上的灯是否在黑线上来确定是否到达口。例如,当1、2、3、4四个灰度灯或者5、6、7、8四个灰度灯在黑线上时,可以认为到达了口。根据这个判断,可以编写程序来实现停止的命令。 至于不规则口的判断,引用\[2\]中提到了三种转弯形式:改变前轮的方向、原地旋转和万向轮。其中,改变前轮的方向可以通过舵机来实现,可以配合两个集成灰度传感器实现精确转向。原地旋转可以通过四轮驱动智能车来实现,可以配合两个集成灰度传感器实现精确转向。万向轮可以通过程序控制电机的运动方向来实现智能车的运动方向。 综上所述,灰度传感器可以用于巡线,通过判断灯是否在黑线上来确定口的情况,并根据不同的转弯形式来实现转向。至于PID巡线算法的具体实现,需要根据具体的硬件和软件平台来进行编写。 #### 引用[.reference_title] - *1* *2* [灰度巡线技巧](https://blog.csdn.net/qq_51963216/article/details/124548666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值