红外避障传感器模块代码例程
1. STM32 HAL 库驱动
#ifndef __IR_OBSTACLE_H
#define __IR_OBSTACLE_H
#include "main.h"
#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)
uint8_t IR_IsObstacle(void);
void IR_Init(void);
#endif
#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);
}
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(); // 前方红外避障
while (1) {
if (IR_IsObstacle()) {
printf("Obstacle detected! Avoiding...\r\n");
HAL_Delay(500);
HAL_Delay(300);
} else {
}
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
#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,互不影响 |