• 【毕业设计】基于单片机的智能避障扫地机器人 -物联网 嵌入式



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于单片机的智能避障扫地机器人

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    本项目制作一个基于Arduino开发板的真空吸尘器、地板清洁机器人,它不仅制作简单,而且与市场上的商业产品相比成本也低得多。最重要的是,该机器人将配备超声波传感器和红外接近传感器。超声波传感器使得机器人能够避开障碍物,以便它可以自由移动,而接近传感器将帮助它避免从楼梯上掉下来。

    2 主要器件

    • Arduino Pro Mini开发板
    • HC-SR04超声波模块
    • L293D电机驱动器
    • 5伏N20 电机和安装支架
    • N20电机轮
    • 开关
    • LM7805 稳压器
    • 7.4V锂离子电池
    • 红外传感器模块
    • 万能板
    • 通用便携式吸尘器

    3 实现效果

    在这里插入图片描述

    4 硬件设计

    HC-SR04超声波传感器模块

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

    模块参数

    (1)模块主要电气参数

    • 使用电压:DC—5V
    • 静态电流:小于2mA
    • 电平输出:高5V
    • 电平输出:底0V
    • 感应角度:不大于15度
    • 探测距离:2cm-450cm
    • 高精度 可达0.2cm

    (2)模块引脚
    超声波模块有4个引脚,分别为Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V电源, Trig(控制端)控制发出的超声波信号,Echo(接收端)接收反射回来的超声波信号。模块如图
    在这里插入图片描述

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

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

    原理图

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

    5 软件说明

    该Arduino代码类似于基于Arduino的超声波距离传感器代码,唯一的变化是多了地板检测。
    定义连接到Arduino开发板的Trig引脚和Echo引脚。在本文中,我们有三个Trig引脚和三个Echo引脚。请注意,1表示左传感器,2表示前传感器,3表示右传感器。

    const  int trigPin1 = 3;
    const int echoPin1 = 5; 
    const int trigPin2 = 6;
    const int echoPin2 =9; 
    const int trigPin3 = 10;
    const int echoPin3 = 11;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    然后,我们定义了距离相关的所有变量,它们都是(int)类型变量,对于持续时间,我们选择使用(long)。同样,我们每个都有三个。

    long duration1;
     long duration2;
     long duration3;
    int distanceleft;
    int distancefront;
    int distanceright;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    pinMode(trigPin1, OUTPUT);
    pinMode(trigPin2, OUTPUT);
    pinMode(trigPin3, OUTPUT);
    pinMode(echoPin1, INPUT); 
    pinMode(echoPin2, INPUT);
    pinMode(echoPin3, INPUT);
    Serial.begin(9600);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    以下这些数字引脚被定义为电机驱动器的输出。

    pinMode(4, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(12, OUTPUT);
    
    • 1
    • 2
    • 3
    • 4

    与每个传感器保持距离后,我们可以借助if语句控制电机,从而控制机器人的运动。这非常简单,首先,我们给出的障碍物距离值为15厘米(根据需要更改此值)。然后我们根据该值给出条件。例如,当障碍物进入左传感器的前方(即左传感器的距离应小于或等于15 cm)并且其他两个距离都很高(这意味着该传感器的前方无障碍物)时,然后使用digital write函数,我们可以将电机向右驱动。

    if ((distanceleft <= 15 && distancefront <= 15 && distanceright > 15) || (distanceleft <= 15 && distancefront > 15 && distanceright > 15))
    
    
    • 1
    • 2

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

     digitalWrite(4, HIGH);
     digitalWrite(7, LOW);
     digitalWrite(8, HIGH);
     digitalWrite(12, LOW);
    
    • 1
    • 2
    • 3
    • 4

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

     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))
      {
        digitalWrite(4, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        digitalWrite(12, HIGH);
        delay(100);
        a=0;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

     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) )
        {
        digitalWrite(4, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(12, LOW);
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6 最后

  • 相关阅读:
    【网络】网络基础&&套接字编程详解
    京东销售码洋与广告投入及销量预测【数据集+完整代码】
    虚拟专用网络 之 VPN
    ELK安装、部署、调试 (八)logstash配置语法详解
    redis的java客户端之jedis
    基于SpringBoot的协同过滤算法商品推荐系统
    keil如何查看变量的实时值
    数据抓取可以应用到哪些行业
    从开发转测试:我从零开始,一干就是6年的自动化测试历程
    第五周算法题
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126846810