介绍
红外避障传感器模块,利用红外反射原理检测前方障碍物。检测距离2~30cm可调(电位器调节),数字开关量输出(遇障碍输出低电平),带电源和信号指示灯。工作电压3.3-5V,标准3线接口(VCC/GND/OUT),广泛用于机器人避障、生产线检测、黑白线循迹等。
红外避障传感器模块,利用红外反射原理检测前方障碍物。检测距离2~30cm可调(电位器调节),数字开关量输出(遇障碍输出低电平),带电源和信号指示灯。工作电压3.3-5V,标准3线接口(VCC/GND/OUT),广泛用于机器人避障、生产线检测、黑白线循迹等。
| 参数 | 值 |
|---|---|
| 接口 | 3线: VCC / GND / OUT |
| PCB尺寸 | 32mm x 14mm |
| 指示灯 | 电源(红) + 信号(绿,触发时亮) |
| 工作电压 | 3.3V-5V DC |
| 检测角度 | 35° |
| 检测距离 | 2cm ~ 30cm(可调) |
| 输出电流 | 最大15mA |
| 输出类型 | 数字开关量(NPN常开,遇障碍低电平) |
# 红外避障传感器模块代码例程
## 1. STM32 HAL 库驱动
```c
// ir_obstacle.h
#ifndef __IR_OBSTACLE_H
#define __IR_OBSTACLE_H
#include "main.h"
/* 按实际接线修改 GPIO */
#define IR_PORT GPIOB
#define IR_PIN GPIO_PIN_1
#define IR_CLK_EN() __HAL_RCC_GPIOB_CLK_ENABLE()
#define IR_READ() HAL_GPIO_ReadPin(IR_PORT, IR_PIN)
/* 返回值:0 = 无障碍,1 = 有障碍(低电平有效,取反后返回) */
uint8_t IR_IsObstacle(void);
void IR_Init(void);
#endif
```
```c
// ir_obstacle.c
#include "ir_obstacle.h"
void IR_Init(void) {
IR_CLK_EN();
GPIO_InitTypeDef gpio = {
.Pin = IR_PIN,
.Mode = GPIO_MODE_INPUT,
.Pull = GPIO_PULLUP, // 启用内部上拉
.Speed = GPIO_SPEED_FREQ_LOW
};
HAL_GPIO_Init(IR_PORT, &gpio);
}
/* 返回 1 = 检测到障碍物(OUT 低电平),0 = 无障碍 */
uint8_t IR_IsObstacle(void) {
return (IR_READ() == GPIO_PIN_RESET) ? 1 : 0;
}
```
## 2. STM32 完整示例 - 避障小车逻辑
```c
#include "ir_obstacle.h"
#include <stdio.h>
// 假设左/右/前三个红外模块
#define IR_LEFT_Init() /* ... */
#define IR_RIGHT_Init() /* ... */
#define IR_FRONT_Init() /* ... */
int main(void) {
HAL_Init();
SystemClock_Config();
IR_Init(); // 前方红外避障
// IR_LEFT_Init(); IR_RIGHT_Init(); // 可选左右
while (1) {
if (IR_IsObstacle()) {
// 检测到障碍物 → 停车、后退、转向
printf("Obstacle detected! Avoiding...\r\n");
// Motor_Stop();
// Motor_Backward();
HAL_Delay(500);
// Motor_TurnLeft();
HAL_Delay(300);
} else {
// 无障碍 → 前进
// Motor_Forward();
}
HAL_Delay(50); // 50ms 轮询
}
}
```
## 3. Arduino 例程
### 基础读取
```cpp
#define IR_PIN 3 // OUT 接 D3
void setup() {
Serial.begin(9600);
pinMode(IR_PIN, INPUT_PULLUP); // 启用内部上拉
}
void loop() {
int val = digitalRead(IR_PIN);
if (val == LOW) {
Serial.println("Obstacle detected!");
} else {
Serial.println("Clear.");
}
delay(100);
}
```
### 避障小车完整逻辑
```cpp
// 三个红外避障模块
#define IR_LEFT 2
#define IR_FRONT 3
#define IR_RIGHT 4
// 电机驱动引脚(示例 L298N)
#define ENA 5
#define IN1 6
#define IN2 7
#define IN3 8
#define IN4 9
#define ENB 10
void setup() {
for (int i = 2; i <= 4; i++) pinMode(i, INPUT_PULLUP);
for (int i = 5; i <= 10; i++) pinMode(i, OUTPUT);
}
void forward() { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); }
void backward() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); }
void turnLeft() { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); }
void turnRight(){ digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); }
void stop() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); }
void loop() {
bool L = (digitalRead(IR_LEFT) == LOW);
bool F = (digitalRead(IR_FRONT) == LOW);
bool R = (digitalRead(IR_RIGHT) == LOW);
if (F) {
// 前方有障碍
stop();
delay(200);
backward();
delay(400);
// 判断左右哪边空旷
if (!L) turnLeft();
else if (!R) turnRight();
else turnLeft(); // 都堵了随便转
delay(400);
} else if (L) {
turnRight(); // 左边有障碍,偏右
} else if (R) {
turnLeft(); // 右边有障碍,偏左
} else {
forward(); // 全部通畅
}
delay(30);
}
```
## 4. 关键说明
| 要点 | 说明 |
|------|------|
| **读取逻辑** | 有障碍=低电平(LOW),无障碍=高电平(HIGH),注意取反 |
| **上拉电阻** | 模块 OUT 为 NPN 开路输出,MCU 必须启用内部上拉或外接上拉 |
| **消抖** | 建议连续读取 2-3 次确认,避免毛刺误判 |
| **轮询频率** | 50-100ms 即可,太快无意义 |
| **多传感器** | 每个模块独立 GPIO,互不影响 |
暂无参考文献