搜索代码

第25/31课:智能小车3使用红外传感器避障 | SunFounder Robojax

第25/31课:智能小车3使用红外传感器避障 | SunFounder Robojax

这个项目将您的 SunFounder 3合1 Arduino 智能车改造成一辆自主避障车辆。通过安装两个红外(IR)传感器——一个在左侧,一个在右侧——车辆可以检测其路径上的物体,并做出瞬间决策以绕过它们。这是机器人技术中的基础步骤,教您如何将传感器输入与电机控制逻辑相结合,打造一辆反应灵敏、自动驾驶的机器。您将在这里学到的原理适用于广泛的现实应用,包括:

  • 构建机器人吸尘器,可在房间内导航而不撞到家具。
  • 创建循线或迷宫求解机器人,用于竞赛或教育项目。
  • 开发自动化安全巡逻机器人,可绕周边巡逻并避开墙壁。
  • 设计智能玩具车,可独立玩耍而不会卡住。

本指南直接建立在之前课程的基础上,您已学会控制车辆电机并了解红外传感器的工作原理。在这里,我们将结合这些技能来实现一个简单而有效的避障算法。

避障逻辑的工作原理

核心思想很简单:车辆使用两个红外传感器检查其左右两侧的障碍物。每个传感器输出一个数字信号:当检测到其范围内(约20厘米)的物体时输出LOW(0),当路径畅通时输出HIGH(1)。然后,逻辑根据传感器状态决定车辆的动作(视频中02:35处):

  • 左侧有障碍物,右侧畅通:车辆向右转以避开它。
  • 右侧有障碍物,左侧畅通:车辆向左转。
  • 两侧都有障碍物:车辆向后移动以逃离可能的死胡同。
  • 无障碍物:车辆向前行驶。

这种反应式方法是有限状态机的经典示例,其中车辆的行为是对其当前传感器输入的直接响应。

Sunfounder-Smartcar-Obstacle-avoideance-1

硬件组件

要完成此项目,您需要以下组件,所有这些组件都包含在 SunFounder 3合1 Arduino 套件中:

  • 1x SunFounder 3合1 Arduino 智能车套件(或等效部件)
  • 2x 红外避障传感器
  • 1x Arduino Uno(或兼容板)
  • 1x 电机驱动扩展板/板
  • 跳线

接线指南

正确的传感器对齐对于此项目的成功至关重要。红外传感器必须朝前并略微向外对齐,因为它们将检测车辆侧面的障碍物(视频中02:07处)。以下接线图显示了如何将传感器连接到 Arduino。请注意,讲师使用了车辆面包板上的特定电源分配点,但连接到 Arduino 的线路才是关键。

Sunfounder-Smartcar-Obstacle-avoideance-wiring

接线连接如下(视频中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_1BA_1AB_1BB_1A)控制两个电机的速度和方向。rightIRleftIR 引脚是您连接传感器信号线的位置。如果您使用了不同的引脚,则需要在此处更改这些值。

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] 在地板上进行最终实际测试

图像

Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance wiring
Sunfounder smartcar obstacle avoidance wiring
894-Lesson 25: SunFounder's 3-in-1 Arduino kit Car-3 Smart Car Avoids Obstacle Using Infrared Sensors
语言: C++
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);
}

文件📁

Arduino 库(zip 格式)