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

知识库
知识库文档
/firmware/传感器/红外避障模块/红外避障传感器模块代码例程.md

文档

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

1. STM32 HAL 库驱动

// 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
// 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 完整示例 - 避障小车逻辑

#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 例程

基础读取

#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);
}

避障小车完整逻辑

// 三个红外避障模块
#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,互不影响

信息

路径
/firmware/传感器/红外避障模块/红外避障传感器模块代码例程.md
更新时间
2026/5/26