一、适用场景
适用场景:移动机器人避障(左右转/刹停)、循迹小车(黑线/白线识别)、路径纠正(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 */
}
六、讲解视频