【stm32简单外设篇】- 红外避障 / 红外循迹模块

一、适用场景

适用场景:移动机器人避障(左右转/刹停)、循迹小车(黑线/白线识别)、路径纠正(PID 控制输入)、自动导航原型、嵌入式传感器融合练习(多传感器融合与滤波)、课堂讲解数字/模拟传感器接入与标定。

二、器材清单

红外避障模块/红外循迹传感器模块×1

stm32f103(或其它 STM32)开发板 ×1

若干杜邦线、焊线、面包板 ×若干

稳定电源(3.3V/5V 按模块标注)×1

三、工作原理(要点)

避障模块

内部包含 IR 发射 LED + 接收器(光电二极管或光电三极管)以及比较器/放大电路。发射 IR,遇到近距离障碍物反射回接收器,电平变化由比较器输出数字信号(DO)。多数模块在板上集成了灵敏度电位器和指示 LED。

循迹模块

每一路包含 IR 发射 LED 与光电二极管/光电三极管,发射向地面红外并接收反射。白色(或亮色)反射强,黑色(或暗色)反射弱。模块常给出 AO(模拟强度)和数字 DO(经比较器阈值后的结果)两种输出。阵列(3/5/8)用于判断车辆在轨迹上的横向偏移。

四、接线示意

VCC → 5V

GND → GND

标准库

PC0 → DO

HAL库

PA0 → DO

五、示例代码

标准库

cpp 复制代码
#include "stm32f10x.h"
#include "forward_direction.h"

int main()
{
	em_init();
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0 && GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 0)
		{
			stop();
		}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0 && GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 1)
		{
			goright();
		}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 1 && GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 0)
		{
			goleft();	
		}else if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 1 && GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) == 1)
		{
			goforward();
		}
	}
//	return 0;
}

HAL库

cpp 复制代码
#include "main.h"

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

/* 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 ---------------------------------------------------------*/
UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(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 */

  /* USER CODE END 1 */

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

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

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

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

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1)
			HAL_UART_Transmit(&huart1,"有黑线或距离物体过远r\n", strlen("有黑线或距离物体过远\r\n"), HAL_MAX_DELAY);
		else
			HAL_UART_Transmit(&huart1,"无黑线或距离物体过近\r\n", strlen("无黑线或距离物体过近\r\n"), HAL_MAX_DELAY);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

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

六、讲解视频

https://www.bilibili.com/video/BV1j5mcBUEVr/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1a1mwBjERe/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1YCmwBmEeS/?spm_id_from=333.1387.upload.video_card.click\&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

相关推荐
喵了meme19 小时前
c语言经验分享
c语言·开发语言
安庆平.Я20 小时前
STM32——定时器:高级定时器
stm32·单片机·嵌入式硬件
项目題供诗20 小时前
51单片机入门(一)
单片机·嵌入式硬件·51单片机
Frank Castle21 小时前
【C语言】详解C语言字节打包:运算符优先级、按位或与字节序那些坑
c语言·开发语言
ltqshs21 小时前
vscode离线插件下载-vscode编译嵌入式C语言配置
c语言·ide·vscode
1621B驱动芯片原厂21 小时前
YL1621 芯片成功案例推荐
stm32·单片机·嵌入式硬件·mcu·51单片机
Hello_Embed1 天前
RS485 双串口通信 + LCD 实时显示(DMA+IDLE 空闲中断版)
笔记·单片机·学习·操作系统·嵌入式·freertos
小乔的编程内容分享站1 天前
C语言指针相关笔记
c语言·笔记
__万波__1 天前
STM32L475基于完全空白的项目,完成时钟树初始化配置并验证
单片机·嵌入式硬件
XINVRY-FPGA1 天前
XC7VX690T-2FFG1761I Xilinx AMD FPGA Virtex-7
arm开发·嵌入式硬件·fpga开发·硬件工程·fpga