第25/31课:智能小车3使用红外传感器避障 | SunFounder Robojax
这个项目将您的 SunFounder 3合1 Arduino 智能车改造成一辆自主避障车辆。通过安装两个红外(IR)传感器——一个在左侧,一个在右侧——车辆可以检测其路径上的物体,并做出瞬间决策以绕过它们。这是机器人技术中的基础步骤,教您如何将传感器输入与电机控制逻辑相结合,打造一辆反应灵敏、自动驾驶的机器。您将在这里学到的原理适用于广泛的现实应用,包括:
- 构建机器人吸尘器,可在房间内导航而不撞到家具。
- 创建循线或迷宫求解机器人,用于竞赛或教育项目。
- 开发自动化安全巡逻机器人,可绕周边巡逻并避开墙壁。
- 设计智能玩具车,可独立玩耍而不会卡住。
本指南直接建立在之前课程的基础上,您已学会控制车辆电机并了解红外传感器的工作原理。在这里,我们将结合这些技能来实现一个简单而有效的避障算法。
避障逻辑的工作原理
核心思想很简单:车辆使用两个红外传感器检查其左右两侧的障碍物。每个传感器输出一个数字信号:当检测到其范围内(约20厘米)的物体时输出LOW(0),当路径畅通时输出HIGH(1)。然后,逻辑根据传感器状态决定车辆的动作(视频中02:35处):
- 左侧有障碍物,右侧畅通:车辆向右转以避开它。
- 右侧有障碍物,左侧畅通:车辆向左转。
- 两侧都有障碍物:车辆向后移动以逃离可能的死胡同。
- 无障碍物:车辆向前行驶。
这种反应式方法是有限状态机的经典示例,其中车辆的行为是对其当前传感器输入的直接响应。
硬件组件
要完成此项目,您需要以下组件,所有这些组件都包含在 SunFounder 3合1 Arduino 套件中:
- 1x SunFounder 3合1 Arduino 智能车套件(或等效部件)
- 2x 红外避障传感器
- 1x Arduino Uno(或兼容板)
- 1x 电机驱动扩展板/板
- 跳线
接线指南
正确的传感器对齐对于此项目的成功至关重要。红外传感器必须朝前并略微向外对齐,因为它们将检测车辆侧面的障碍物(视频中02:07处)。以下接线图显示了如何将传感器连接到 Arduino。请注意,讲师使用了车辆面包板上的特定电源分配点,但连接到 Arduino 的线路才是关键。
接线连接如下(视频中03:47处):
- 电源(VCC):将两个红外传感器的 VCC 引脚连接到 Arduino 上的 5V 输出或车辆的电源轨。
- 接地(GND):将两个红外传感器的 GND 引脚连接到 Arduino 上的公共接地或车辆的接地轨。
- 右侧传感器输出(OUT):将右侧红外传感器的数字输出引脚连接到 Arduino 上的数字引脚 7。
- 左侧传感器输出(OUT):将左侧红外传感器的数字输出引脚连接到 Arduino 上的数字引脚 8。
左右电机的电机驱动器连接与之前电机控制课程中建立的连接相同。
代码解释
此项目的代码很简单。主程序可在文章下方下载。在这里,我们将重点介绍您可以根据自己的车辆进行调整的用户可配置部分。
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int rightIR = 7;
const int leftIR = 8;
这些行定义了用于电机驱动器和红外传感器的引脚。电机引脚(A_1B、A_1A、B_1B、B_1A)控制两个电机的速度和方向。rightIR 和 leftIR 引脚是您连接传感器信号线的位置。如果您使用了不同的引脚,则需要在此处更改这些值。
int speed = 150;
此变量设置车辆的基础速度。该值范围从 0 到 255,其中 255 是最大速度。150 是学习时的一个良好起点,因为它足够快以保持趣味性,但又足够慢以留出反应时间(视频中07:10处)。您可以调整此值以使车辆更快或更慢。
代码的其余部分定义了loop()函数中的逻辑。它读取左侧和右侧传感器的状态,然后调用相应的移动函数(moveForward()、moveBackward()、backLeft()、backRight())。这些函数是预先定义好的,用于控制电机驱动器以实现所需的运动。讲师在后续修改中还添加了一个stop()函数,以便在避障操作后让小车短暂暂停,使其移动更加稳健(视频中10:29处)。
现场项目演示
在视频中,讲师首先使用串口监视器演示逻辑。将盒子靠近传感器,可以看到屏幕上出现相应的消息,如“向左转”、“向右转”或“向后转”,从而确认传感器读数和逻辑正确(视频中09:11处)。
验证逻辑后,讲师添加了一个关键增强功能:stop()函数。该函数在执行转弯或倒车后,使小车完全停止一段设定时间(例如1秒),防止动作生硬,并让小车重新评估周围环境(视频中10:29处)。
最后,小车在地板上进行了一系列障碍物测试。视频显示小车成功绕过盒子,根据需要左转、右转和倒车以找到畅通路径,展示了该避障算法在实际应用中的效果(视频中12:13处)。
章节
- [00:00] 使用红外传感器进行避障简介
- [01:24] 前提条件和项目概述
- [02:35] 避障逻辑的工作原理
- [03:47] 连接红外传感器和电机
- [05:40] 打开并解释代码
- [09:11] 使用串口监视器测试逻辑
- [10:29] 添加停止函数以实现更平滑的导航
- [11:42] 测试停止函数
- [12:13] 在地板上进行最终实际测试
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int rightIR = 7;
const int leftIR = 8;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//IR obstacle
pinMode(leftIR, INPUT);
pinMode(rightIR, INPUT);
}
void loop() {
int left = digitalRead(leftIR); // 0: Obstructed 1: Empty
int right = digitalRead(rightIR);
int speed = 150;
if (!left && right) {
backLeft(speed);
} else if (left && !right) {
backRight(speed);
} else if (!left && !right) {
moveBackward(speed);
} else {
moveForward(speed);
}
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void backLeft(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void backRight(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
Common Course Links
Common Course Files
资源与参考
-
文档SunFounder 3合1物联网/智能车/学习套件的文档docs.sunfounder.com
-
外部购买SunFounder的3合1智能汽车学习套件sunfounder.com
文件📁
Arduino 库(zip 格式)
-
SunFounder 的 3 合 1 智能汽车学习套件源代码
3in1-kit-main-v2.zip12.80 MB