红外避障模块

元器件
传感器
库存 1500

介绍

红外避障传感器模块,利用红外反射原理检测前方障碍物。检测距离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常开,遇障碍低电平)

代码例程

红外避障传感器模块代码例程.md

# 红外避障传感器模块代码例程

## 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,互不影响 |

参考资料

暂无参考文献