1. 功能描述
扫地机器人是现代家庭清洁的得力助手,能够自主规划清扫路径,避开障碍物,有效覆盖整个清洁区域。扫地机器人的出现极大地减轻了家庭清洁的负担,节省了时间和精力,它可以定期清理地面,确保家居环境的整洁和卫生,让家里变得更加舒适、无尘和宜居。
本文示例将实现R058a样机扫地机器人在行进过程中避障并清扫垃圾的功能。
2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | Basra主控板(兼容Arduino Uno) |
扩展板 | Bigfish2.1扩展板 |
传感器 | 触须传感器 |
近红外传感器 | |
电池 | 7.4V锂电池 |
3. 功能实现
编程环境:Arduino 1.8.19
下面提供一个实现扫地机器人在行进过程中避障并清扫垃圾的参考程序(sketch_sep14a.ino):
/*------------------------------------------------------------------------------------
版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.
Distributed under MIT license.See file LICENSE for detail or copy at
https://opensource.org/licenses/MIT
by 机器谱 2023-09-14 https://www.robotway.com/
------------------------------*/
#include <Servo.h>
Servo left_wheel; // 左轮
Servo right_wheel; // 右轮
#define forward_speed_left 60 // 小车前进时,左轮速度
#define forward_speed_right 120 // 小车前进时,右轮速度
#define back_speed_left 120 // 小车后退时,左轮速度
#define back_speed_right 60 // 小车后退时,右轮速度
#define turnleft_speed_left 120 // 小车左转时,左轮速度
#define turnleft_speed_right 120 // 小车左传时,右轮速度
#define turnright_speed_left 60 // 小车右转时,左轮速度
#define turnright_speed_right 60 // 小车右转时,右轮速度
#define stop_left 90 // 小车停止时,左轮速度
#define stop_right 90 // 小车停止时,右轮速度
#define obstacle_threshold 500 // 触须传感器阈值
#define ir_threshold 800 // 近红外传感器阈值
int left_obstacle_sensor; // 左侧触须传感器
int right_obstacle_sensor; // 右侧触须传感器
int ir_sensor; // 近红外传感器
void setup() {
delay(50);
Serial.begin(9600);
left_wheel.attach(3); // 定义左右轮引脚
right_wheel.attach(4);
pinMode(A0, INPUT); // 左边触须传感器接口
pinMode(A2, INPUT); // 右边触须传感器接口
pinMode(A3, INPUT); // 前面近红外传感器接口
}
void loop() {
left_obstacle_sensor = analogRead(A0); // 读取左边触须传感器值
right_obstacle_sensor = analogRead(A2); // 读取右边触须传感器值
ir_sensor = analogRead(A3); // 读取近红外传感器值
// 如果左边传感器检测到障碍物,执行后退并向右转操作
if (left_obstacle_sensor > obstacle_threshold) {
backRight();
}
// 如果右边传感器检测到障碍物,执行后退并向左转操作
else if (right_obstacle_sensor > obstacle_threshold) {
backLeft();
}
// 如果前面近红外传感器检测到障碍物,执行后退操作
else if (ir_sensor > ir_threshold) {
back();
}
// 如果都没有检测到障碍物,执行前进操作
else {
forward();
}
}
// 小车前进
void forward() {
left_wheel.write(forward_speed_left);
right_wheel.write(forward_speed_right);
}
// 小车后退
void back() {
left_wheel.write(back_speed_left);
right_wheel.write(back_speed_right);
}
// 小车后退左转
void backLeft() {
left_wheel.write(back_speed_left);
right_wheel.write(turnleft_speed_right);
}
// 小车后退右转
void backRight() {
left_wheel.write(turnright_speed_left);
right_wheel.write(back_speed_right);
}
// 小车停止
void stop() {
left_wheel.write(stop_left); // 停止
right_wheel.write(stop_right); // 停止
}
4. 扩展样机
本样机有一些简单的扩展案例,如下图所示将舵机更换为直流电机:
程序源代码及样机3D文件等资料详见 扫地机器人