基于Arduino制作一款自动家庭清洁机器人

机器人

533人已加入

描述

自动地板清洁剂并不是什么新鲜事,但它们都有一个共同的问题。它们对于它们所做的事情来说都太昂贵了。今天,我们将制作一款自动家庭清洁机器人,其成本仅为市场上的一小部分。这个机器人可以检测它前面的障碍物和物体,并可以继续移动,避开障碍物,直到整个房间被清理干净。它附有一个小刷子来清洁地板。

所需组件:

Arduino UNO R3。

超声波传感器。

Arduino Motor Driver Shield。

轮驱动机器人底盘。

计算机对Arduino进行编程。

电机电池。

为Arduino供电的移动电源

鞋刷。

苏格兰布里特磨砂垫。

注意:除了使用电池,您还可以像我们一样使用长 4 股线。虽然这不是一个非常优雅或实用的解决方案,但如果您不打算每天在现实世界中使用它,则可以这样做。确保电缆的长度足够。

HC-SR04 超声波传感器:

超声波传感器用于以高精度和稳定的读数测量距离。它可以测量从 2 厘米到 400 厘米或从 1 英寸到 13 英尺的距离。它在空气中以40KHz的频率发射超声波,如果物体挡住了它的方式,那么它将反弹回传感器。通过使用撞击物体并返回所需的时间,您可以计算距离。

清洁机器人

超声波传感器使用一种称为“ECHO”的技术。“回声”只是一种反射的声波。当声音在到达死胡同后反射回来时,您将有一个回声。

当我们使“触发”引脚高约10us时,HCSR04模块在超声波范围内产生声音振动,这将以声速发送8个周期的声波突发,撞击物体后,它将被回波引脚接收。根据声音振动恢复所需的时间,它提供适当的脉冲输出。如果物体距离很远,则需要更多时间才能听到回波,并且输出脉冲宽度会很大。如果障碍物近在咫尺,那么回声将被更快地听到,输出脉冲宽度将更小。

我们可以根据超声波返回传感器所花费的时间计算物体的距离。由于声的时间和速度是已知的,我们可以通过以下公式计算距离。

Distance= (Time x Speed of Sound in Air (343 m/s))/2.

该值除以 2,因为波向前和向后传播覆盖相同的距离。因此,到达障碍物的时间仅为总时间的一半

所以以厘米为单位的距离 = 17150*T

地板清洁机器人组装:

将 Arduino 安装在机箱上。确保您的机箱由金属制成时不会短路任何东西。最好为Arduino和电机控制器扩展板买一个盒子。使用螺钉将电机与车轮和底盘固定。您的机箱应该可以从工厂开始选择执行此操作,但如果没有,您可以即兴制作不同的解决方案。环氧树脂不是一个坏主意。将鞋刷安装在机箱前面。为此,我们使用了M-Seal环氧树脂和钻孔螺钉的组合,尽管您可以使用任何其他对您来说可能更容易的解决方案。将苏格兰布里特磨砂垫安装在刷子后面。我们使用了穿过底盘的轴来支撑它,尽管这也是即兴的。弹簧加载轴可用于伴随它。安装电池(或机箱背面的电缆)。环氧树脂或电池座是做到这一点的好方法。热胶也不错。

清洁机器人

 

清洁机器人

清洁机器人

接线和连接:

这款自动家庭清洁机器人的电路非常简单。如下所述,将超声波传感器连接到Arduino,并像任何其他扩展板一样将电机驱动器屏蔽放在Arduino上。

清洁机器人

超声波的Trig引脚连接到Arduino上的第12个引脚,Echo引脚连接到第13个引脚,电压引脚连接到5V引脚,接地引脚连接到接地引脚。Echo引脚和Trig引脚允许Arduino与传感器通信。电源通过电压和接地引脚输送到传感器,三角和回波引脚允许它使用 Arduino 发送和接收数据。

电机屏蔽应至少有 2 个输出,并且它们应连接到 2 个电机。通常,这些输出标记为“M1”和“M2”或“电机1”和“电机2”。将电池和移动电源分别连接到电机护罩和 Arduino。不要交叉连接它们。电机屏蔽应具有输入通道。如果您使用的是电线,请将它们连接到交流适配器。

编程说明:

打开 Arduino IDE。将本教程末尾给出的完整 Arduino 代码粘贴到 IDE 中。将Arduino连接到计算机。在“工具/端口”中选择端口。单击上传按钮。

测试机器人。如果它变得太少或太多,请尝试延迟直到完美。

在进入代码之前,我们需要安装Adafruit 电机屏蔽库来驱动直流电机。由于我们使用的是 L293D 电机驱动器扩展板,因此我们需要从此处下载 AFmotor 库。然后将其添加到Arduino IDE库文件夹中。确保将其重命名为 AFMotor。了解有关安装此库的更多信息。

代码很简单,很容易理解,但在这里我们解释了它的几个部分:

下面的代码设置机器人。首先,我们包括了用于驱动带有电机驱动器盾牌的电机的 Adafruit 库。之后,我们定义了三角引脚和回声引脚。它还设置电机。它将三角引脚设置为输出,将回显引脚设置为输入。

#include
#define trigPin 12
#define echoPin 13
AF_DCMotor motor1(1,MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_8KHZ);

void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
下面的代码告诉Arduino循环以下命令。之后,它使用传感器发送和接收超声波。一旦超声波反弹回来,它就会计算它与物体的距离,在注意到物体在设定的距离内后,它会告诉 Arduino 相应地旋转电机。

void loop() {
long duration, distance;
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;

if (distance < 20) { 
motor1.setSpeed(255);
motor2.setSpeed(0);
motor1.run(BACKWARD);
motor2.run(BACKWARD);
delay(2000); //CHANGE THIS ACCORDING TO HOW THE ROBOT TURNS. 
这使得机器人通过旋转一个电机并保持另一个电机停滞来转动。

下面的代码使机器人向同一方向转动两个电机,以使其向前移动,直到它检测到上述边界中的物体。

else {
motor1.setSpeed(160); //CHANGE THIS ACCORDING TO HOW FAST YOUR ROBOT SHOULD GO.
motor2.setSpeed(160); //CHANGE THIS TO THE SAME VALUE AS YOU PUT IN ABOVE.
motor1.run(FORWARD);
motor2.run(FORWARD); 
}

#include

#define trigPin 12

#define echoPin 13

AF_DCMotor motor1(1,MOTOR12_64KHZ);

AF_DCMotor motor2(2, MOTOR12_8KHZ);



void setup() {

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

}



void loop() {



long duration, distance;

digitalWrite(trigPin, LOW); 

delayMicroseconds(2); 

digitalWrite(trigPin, HIGH);



delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

distance = (duration/2) / 29.1;



if (distance < 20) { 

motor1.setSpeed(255);

motor2.setSpeed(0);

motor1.run(BACKWARD);

motor2.run(BACKWARD);

delay(2000); //CHANGE THIS ACCORDING TO HOW THE ROBOT TURNS. 

}

else {

motor1.setSpeed(160); //CHANGE THIS ACCORDING TO HOW FAST YOUR ROBOT SHOULD GO.

motor2.setSpeed(160); //CHANGE THIS TO THE SAME VALUE AS YOU PUT IN ABOVE.

motor1.run(FORWARD);

motor2.run(FORWARD); 

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分