基于Arduino的智能真空吸尘器机器人代码说明 该Arduino代码类似于基于Arduino的超声波距离传感器代码,唯一的变化是多了地板检测。在以下代码中,我将解释代码的工作原理。本文中,我们没有使用任何额外的库。
首先,我们需要为连接到Arduino开发板的所有三个超声波传感器定义Trigger引脚和Echo引脚。在本文中,我们有三个Echo引脚和三个Trigger引脚。请注意,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;
- int irpin =2;
复制代码然后我们定义了变量表示测量距离,这些变量都是 (int) 类型的变量,而对于持续时间,我们选择使用 (long)。同样,这些变量都有三个。另外,我已经定义了一个整数来存储运动的状态。 - long duration1;
- long duration2;
- long duration3;
- int distanceleft;
- int distancefront;
- int distanceright;
- int a=0;
复制代码
接下来,在setup()函数中,我们需要使用 pinModes() 函数将所有相对应的引脚作为输入或输出。要从模块发送超声波,我们需要将Trigger引脚设为高电平,即所有触发引脚都应定义为 OUTPUT。为了接收回声,我们需要读取回声引脚的状态,因此所有Echo引脚都应定义为 INPUT。此外,我们启用串口监视器以进行故障排除。为了读取红外传感器模块的状态,将红外模块的引脚定义为输入。 - pinMode(trigPin1, OUTPUT);
- pinMode(trigPin2, OUTPUT);
- pinMode(trigPin3, OUTPUT);
- pinMode(echoPin1, INPUT);
- pinMode(echoPin2, INPUT);
- pinMode(echoPin3, INPUT);
- pinMode(irpin, INPUT);
复制代码以下数字引脚定义OUTPUT,连接到电机驱动器输入。 - pinMode(4, OUTPUT);
- pinMode(7, OUTPUT);
- pinMode(8, OUTPUT);
- pinMode(12, OUTPUT);
复制代码
在loop()函数中,我们为三个传感器分成了三个部分。所有部分的工作方式相同,但每个部分都适用于不同的传感器。在本部分中,我们从每个传感器读取障碍物距离并将其存储在每个定义的整数中。要读取距离,首先,我们必须准确触发引脚,为此,我们需要将Trigger引脚设置为低电平,并保持2µs。现在,为了产生超声波,我们需要将Trigger引脚转为高电平,并保持10 µs。这将发送超声波,使用在pulseIn()函数读取飞行时间,并将该值存储到变量duration中。这个函数有2个参数,第一个是echo引脚的名字,第二个,你可以写HIGH或LOW。 HIGH 表示pulseIn() 函数将等待由弹回声波引起的引脚变为高电平并开始计数,然后在声波结束时等待引脚变为低电平,这将停止计数。此函数以微秒为单位给出脉冲的长度。为了计算距离,我们将持续时间乘以 0.034(空气中的声速为 340m/s)并除以2。最后,我们将每个传感器的距离存储在相应的整数中。 - digitalWrite(trigPin1, LOW);
- delayMicroseconds(2);
- digitalWrite(trigPin1, HIGH);
- delayMicroseconds(10);
- digitalWrite(trigPin1, LOW);
- duration1 = pulseIn(echoPin1, HIGH);
- distanceleft = duration1 * 0.034 / 2;
复制代码
在获得与每个传感器的距离后,我们可以借助 if 语句控制电机,从而控制机器人的运动。这个很简单,首先,我们给出了一个障碍物距离值,在本例中,数值是15cm。然后我们根据那个值给出条件。例如,当左侧传感器前方有障碍物时(即左侧传感器的距离应小于或等于15厘米),而其他两个距离较高(即该传感器前方没有障碍物)时,然后借助数字写入函数,我们可以向右驱动电机。然后,检查红外传感器的状态。如果机器人在地板上,红外引脚的值将为LOW,否则,该值将为HIGH。然后我将该值存储在int s 变量中。我们要根据这个状态来控制机器人。
以下部分代码用于向前和向后移动机器人: - if(s==HIGH)
- {
- digitalWrite(4, LOW);
- digitalWrite(7, HIGH);
- digitalWrite(8, LOW);
- digitalWrite(12, HIGH);
- delay(1000);
- a=1;
- }
复制代码
但是这种方法有问题,当电机向后移动,遇到了楼梯,机器人向前移动时,它会重复使机器人卡住。为了克服这个问题,我们在楼梯不存在后将值 (1) 存储在 int 中。
检测到没有楼梯后,机器人不会向前移动。相反,它会向左移动,这样我们就可以避免这个问题。 - if ((a==0)&&(s==LOW)&&(distanceleft <= 15 && distancefront > 15 && distanceright <= 15) || (a==0)&&(s==LOW)&&(distanceleft > 15 && distancefront > 15 && distanceright > 15))
复制代码
在上述条件下。首先,机器人会检查楼梯状态和数值。只有满足所有条件,机器人才会前进。
现在,我们可以为电机驱动器编写命令。这将驱动右电机向后和左电机向前,从而使机器人向右转动。
以下代码用于将机器人向右移动: - digitalWrite(4, HIGH);
- digitalWrite(7, LOW);
- digitalWrite(8, HIGH);
- digitalWrite(12, LOW);
复制代码
如果机器人检测未遇到楼梯,则该值更改为 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;
- }
复制代码
以下代码用于向左移动机器人: - 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);
- }
复制代码
以上就是制作基于Arduino智能吸尘机器人的全部内容。如果您有任何问题,请随时在本帖下面回复。 |