一板网电子技术论坛

风筝
发表于: 2021-7-30 16:07:12 | 显示全部楼层

现如今我们每个人都在忙于工作,以至于没有时间来打扫房间。解决这个问题的方法很简单,你只需要买一个家用吸尘机器人,比如irobot roomba,一键打扫你的房子。但是这样的商业产品有一个共同的问题,那就是价格太高。所以今天,在本篇文章中我们决定制作一个简单的地板清洁机器人,它不仅制作简单,而且与市场上的商业产品相比成本也低得多。经常阅读的读者可能还记得我们很久以前制作的Arduino吸尘机器人,但那个机器人非常笨重,需要一个大的铅酸电池才能移动。本文我们制作的新型Arduino真空吸尘器将更加紧凑和实用。最重要的是,该机器人将配备超声波传感器和红外接近传感器。超声波传感器使得机器人能够避开障碍物,以便它可以自由移动,而接近传感器将帮助它避免从楼梯上掉下来。所有这些功能听起来都很有趣,对吧?所以,让我们开始吧。


所需的材料

由于我们使用了非常通用的组件来制作真空吸尘器机器人的硬件部分,因此您应该能够很方便的找到所有这些组件。

Floor-Cleaning-Robot-Components.jpg


●    Arduino Pro Mini开发板

●    HC-SR04超声波模块

●    L293D电机驱动器

●    5伏N20 电机和安装支架

●    N20电机轮

●    开关

●    LM7805 稳压器

●    7.4V锂离子电池

●    红外传感器模块

●    万能板

●    通用便携式吸尘器


便携式吸尘器

在组件需求部分,我们谈到了便携式吸尘器,下图正好说明了这一点。这是一款来自亚马逊的便携式吸尘器。它的实现机制非常简单。底盘分为三部分,一个存放灰尘的小室,中间部分包括电机、风扇和顶部的电池插座。它包含一个直流电机和一个风扇。这个电机通过一个简单的开关直接连接到3V(2节AA 电池)。当我们用 7.4V 电池为我们的机器人供电时,将切断内部电池的连接并从5V给它供电电源。我们已经移除了所有不需要的部分,只需要带有两根线的电机。您可以在下图中看到。

Portable-Vacuum-Cleaner.jpg


HC-SR04超声波传感器模块

为了检测障碍物,我们使用了常见的HC-SR04超声波距离传感器,或者可以称之为避障传感器。工作原理非常简单,首先,发射器模块发送一个超声波,它在空气中传播,碰到障碍物,然后反弹回来,接收器接收该波。通过使用Arduino计算时间,我们可以确定距离。在之前关于基于Arduino的超声波距离传感器的文章中,我们非常深入地讨论了该传感器的工作原理。如果您想了解有关HC-SR04超声波距离传感器模块的更多信息,可以查看该帖子。

HC-SR04-Ultrasonic-Sensor-Module.jpg


用于楼梯检测的红外传感器

在前文中我们谈到了一个功能,机器人可以检测楼梯并防止自己坠落。为此,我们使用了红外传感器。我们将IR传感器连接到Arduino开发板。红外接近传感器的工作非常简单,它有一个红外LED和一个光电二极管,红外LED发出红外光,如果有障碍物出现在这个发射光的前面,它就会被反射,反射光会被光电二极管检测到。但是反射产生的电压会非常低。为了增加它,我们可以使用运算放大器比较器,我们可以放大并获得输出。 IR 模块具有三个引脚 - Vcc、接地和输出。通常,当传感器前面有障碍物时,输出会变低。所以,我们可以用它来检测地板。如果在某一瞬间,我们从传感器检测到高电平,我们可以停止机器人,将其转回来来防止它从楼梯上掉下来。

Floor-Sensor-for-Staircase-Detection.jpg

跳转到指定楼层
风筝
发表于: 2021-7-30 17:23:27 | 显示全部楼层

基于Arduino的吸尘器机器人电路图

Arduino-Based-Floor-Cleaner-Robot-Circuit-Diagram.png

我们使用三个超声波传感器来检测障碍物。因此,我们需要将超声波传感器的所有地连接起来,并将它们连接到公共地。此外,连接传感器的所有三个VCC并将其连接到公共VCC引脚。接下来,将Trig和Echo引脚连接到Arduino的PWM引脚。我们还将红外模块的VCC连接到5V,GND接到Arduino的接地引脚,红外传感器模块的输出引脚连接到Arduino的数字引脚 D2。对于电机驱动器,我们将两个使能引脚连接到5v,并将驱动器电压引脚连接到5V,因为我们使用的是5V电机。Arduino、超声波模块、电机驱动器和电机都工作在5V电压,更高的电压会损坏它,我们使用7.4伏电池,使用LM7805稳压器将其转换为5伏。


搭建吸尘器的电路

Floor-Cleaning-Robot-Circuit-Board.jpg


为了将每个组件焊接在一起,首先,使用了一块非常小的万能板,根据电路图放置每个组件,然后进行焊接。这部分非常简单。此外,我们使用了两个排母来放置Arduino pro mini开发板。完成万能板焊接后,我们将电线连接到超声波模块并将它们连接到相应的引脚,如图所示。


为Arduino吸尘器机器人制作一个外壳

为了将机器人打造的更有型,我在网上搜索了吸尘机器人,并得到了一些圆形机器人的图片。因此,我决定制作一个圆形机器人。为了制作机器人的外壳,可以使用多种材料,如泡沫板、中密度纤维板、纸板等。但我选择中密度纤维板MDF,因为它很硬,并且具有一定的防水性能。


在MDF纤维板中画了两个半径为8厘米的圆,在该圆内,我还画了另一个半径为4厘米的圆,用于安装吸尘器。然后我剪下圆圈。此外,我已经为车轮路径切割并移除了适当的部分。最后,为脚轮做了三个小孔。下一步是使用其支架将电机安装在底座上,同时放置脚轮并将其固定到其位置。之后,将超声波传感器放置在机器人的左侧、右侧和中间。此外,将红外模块连接到机器人的下侧,可以参考以下图片更加深刻理解。

Arduino-Based-Floor-Cleaning-Robot.jpg


在机器人的顶部,我还在泡沫板上切割了一个半径为11CM的圆。对于顶部和底部之间的间距,我使用了三个4厘米长的塑料管。之后,我将塑料垫片粘在底部,另一端粘在顶部。如果需要,您可以用塑料或类似材料覆盖机器人的侧面部分。

Floor-Cleaning-Robot-Assembly.jpg

回复

使用道具 举报

风筝
发表于: 2021-7-30 18:04:55 | 显示全部楼层

基于Arduino的智能真空吸尘器机器人代码说明

该Arduino代码类似于基于Arduino的超声波距离传感器代码,唯一的变化是多了地板检测。在以下代码中,我将解释代码的工作原理。本文中,我们没有使用任何额外的库。


首先,我们需要为连接到Arduino开发板的所有三个超声波传感器定义Trigger引脚和Echo引脚。在本文中,我们有三个Echo引脚和三个Trigger引脚。请注意,1 是左传感器,2 是前传感器,3 是右传感器。

  1. const int trigPin1 = 3;
  2. const int echoPin1 = 5;
  3. const int trigPin2 = 6;
  4. const int echoPin2 =9;
  5. const int trigPin3 = 10;
  6. const int echoPin3 = 11;
  7. int irpin =2;
复制代码

然后我们定义了变量表示测量距离,这些变量都是 (int) 类型的变量,而对于持续时间,我们选择使用 (long)。同样,这些变量都有三个。另外,我已经定义了一个整数来存储运动的状态。

  1. long duration1;
  2. long duration2;
  3. long duration3;
  4. int distanceleft;
  5. int distancefront;
  6. int distanceright;
  7. int a=0;
复制代码

接下来,在setup()函数中,我们需要使用 pinModes() 函数将所有相对应的引脚作为输入或输出。要从模块发送超声波,我们需要将Trigger引脚设为高电平,即所有触发引脚都应定义为 OUTPUT。为了接收回声,我们需要读取回声引脚的状态,因此所有Echo引脚都应定义为 INPUT。此外,我们启用串口监视器以进行故障排除。为了读取红外传感器模块的状态,将红外模块的引脚定义为输入。

  1. pinMode(trigPin1, OUTPUT);
  2. pinMode(trigPin2, OUTPUT);
  3. pinMode(trigPin3, OUTPUT);
  4. pinMode(echoPin1, INPUT);
  5. pinMode(echoPin2, INPUT);
  6. pinMode(echoPin3, INPUT);
  7. pinMode(irpin, INPUT);
复制代码

以下数字引脚定义OUTPUT,连接到电机驱动器输入。

  1. pinMode(4, OUTPUT);
  2. pinMode(7, OUTPUT);
  3. pinMode(8, OUTPUT);
  4. pinMode(12, OUTPUT);
复制代码

loop()函数中,我们为三个传感器分成了三个部分。所有部分的工作方式相同,但每个部分都适用于不同的传感器。在本部分中,我们从每个传感器读取障碍物距离并将其存储在每个定义的整数中。要读取距离,首先,我们必须准确触发引脚,为此,我们需要将Trigger引脚设置为低电平,并保持2µs。现在,为了产生超声波,我们需要将Trigger引脚转为高电平,并保持10 µs。这将发送超声波,使用在pulseIn()函数读取飞行时间,并将该值存储到变量duration中。这个函数有2个参数,第一个是echo引脚的名字,第二个,你可以写HIGH或LOW。 HIGH 表示pulseIn() 函数将等待由弹回声波引起的引脚变为高电平并开始计数,然后在声波结束时等待引脚变为低电平,这将停止计数。此函数以微秒为单位给出脉冲的长度。为了计算距离,我们将持续时间乘以 0.034(空气中的声速为 340m/s)并除以2。最后,我们将每个传感器的距离存储在相应的整数中。

  1. digitalWrite(trigPin1, LOW);
  2. delayMicroseconds(2);
  3. digitalWrite(trigPin1, HIGH);
  4. delayMicroseconds(10);
  5. digitalWrite(trigPin1, LOW);
  6. duration1 = pulseIn(echoPin1, HIGH);
  7. distanceleft = duration1 * 0.034 / 2;
复制代码

在获得与每个传感器的距离后,我们可以借助 if 语句控制电机,从而控制机器人的运动。这个很简单,首先,我们给出了一个障碍物距离值,在本例中,数值是15cm。然后我们根据那个值给出条件。例如,当左侧传感器前方有障碍物时(即左侧传感器的距离应小于或等于15厘米),而其他两个距离较高(即该传感器前方没有障碍物)时,然后借助数字写入函数,我们可以向右驱动电机。然后,检查红外传感器的状态。如果机器人在地板上,红外引脚的值将为LOW,否则,该值将为HIGH。然后我将该值存储在int s 变量中。我们要根据这个状态来控制机器人。


以下部分代码用于向前和向后移动机器人:

  1. if(s==HIGH)
  2.   {
  3.     digitalWrite(4, LOW);
  4.     digitalWrite(7, HIGH);
  5.     digitalWrite(8, LOW);
  6.     digitalWrite(12, HIGH);
  7.       delay(1000);
  8.     a=1;
  9.         }
复制代码

但是这种方法有问题,当电机向后移动,遇到了楼梯,机器人向前移动时,它会重复使机器人卡住。为了克服这个问题,我们在楼梯不存在后将值 (1) 存储在 int 中。


检测到没有楼梯后,机器人不会向前移动。相反,它会向左移动,这样我们就可以避免这个问题。

  1. if ((a==0)&&(s==LOW)&&(distanceleft <= 15 && distancefront > 15 && distanceright <= 15) || (a==0)&&(s==LOW)&&(distanceleft > 15 && distancefront > 15 && distanceright > 15))
复制代码

在上述条件下。首先,机器人会检查楼梯状态和数值。只有满足所有条件,机器人才会前进。


现在,我们可以为电机驱动器编写命令。这将驱动右电机向后和左电机向前,从而使机器人向右转动。


以下代码用于将机器人向右移动:

  1. digitalWrite(4, HIGH);
  2. digitalWrite(7, LOW);
  3. digitalWrite(8, HIGH);
  4. digitalWrite(12, LOW);
复制代码

如果机器人检测未遇到楼梯,则该值更改为 1,机器人将向左移动。左转后,'a' 的值从 1 变为 0。

  1. if ((a==1) &&(s==LOW) ||(s==LOW) && (distanceleft <= 15 && distancefront <= 15 && distanceright > 15) || (s== LOW) && (distanceleft <= 15 && distancefront <= 15 && distanceright > 15) || (s==LOW) && (distanceleft <= 15 && distancefront > 15 && distanceright > 15) || (distanceleft <= 15 && distancefront > 15 && distanceright > 15))
  2.   {
  3.     digitalWrite(4, HIGH);
  4.     digitalWrite(7, LOW);
  5.     digitalWrite(8, LOW);
  6.     digitalWrite(12, HIGH);
  7.     delay(100);
  8.     a=0;
  9.   }
复制代码

以下代码用于向左移动机器人:

  1. if ((s==LOW)&&(distanceleft > 15 && distancefront <= 15 && distanceright <= 15) ||(s==LOW)&& (distanceleft > 15 && distancefront > 15 && distanceright <= 15) ||(s==LOW)&& (distanceleft > 15 && distancefront <= 15 && distanceright > 15) )
  2.     {
  3.     digitalWrite(4, LOW);
  4.     digitalWrite(7, HIGH);
  5.     digitalWrite(8, HIGH);
  6.     digitalWrite(12, LOW);
  7.   }
复制代码

Floor-Cleaning-Robot.jpg


以上就是制作基于Arduino智能吸尘机器人的全部内容。如果您有任何问题,请随时在本帖下面回复。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 574 | 回复: 1152



手机版|

GMT+8, 2021-9-26 13:59 , Processed in 0.025570 second(s), 6 queries , MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2021 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表