使用Arduino Uno开发板制作一个简易循迹机器人
循迹机器人(Line Follower Robot,LFR)是一种比较简单的自主引导型机器人,它可以跟随地面上绘制的一条线,检测出白色表面上的黑线或黑色表面上的白线。循迹机器人是一个非常有趣的项目。在本篇文章中,我们将学习如何使用 Arduino Uno开发板和一些常见组件制作一个循迹机器人。听起来是不是很有趣?让我们开始吧。
循迹机器人的工作原理
如前所述,循迹机器人跟随一条线,为了跟随一条线,机器人必须先检测到这条线。现在的问题是如何在循迹机器人中实现线路感应机制。我们都知道,因为黑色表面吸收的光量最大,所以白色表面对光的反射最大,黑色表面反射最小。因此,我们将使用光的这种特性来检测线。要检测光亮度,可以使用光敏电阻LDR或红外IR传感器。在本文中,我们将使用IR传感器,因为它具有更高的精度。为了检测出走线,我们放置了两个红外传感器,其中一个在机器人左侧,另一个在机器人的右侧。然后我们将机器人放在线上,使线位于两个传感器的中间。
红外传感器由两个元件组成,发射器和接收器。发射器是一个红外LED,它产生信号,而红外接收器是一个光电二极管,它感应发射器产生的信号。红外传感器向物体发射红外光,遇到黑色部分的光被吸收,从而产生低输出,但遇到白色部分的光反射回发射器,然后被红外接收器检测到,从而提供模拟输出。使用上述原理,我们通过驱动连接到电机的轮子来控制机器人的运动,电机由微控制器控制。
循迹机器人如何导航?
一个典型的循迹机器人有两组电机,我们称它们为左电机和右电机。两个电机分别根据左右传感器接收到的信号进行旋转。机器人需要进行4组运动,包括前进、左转、右转和停止。下面分别对这些情况进行说明。
前进:
在这种情况下,当两个传感器都在白色表面上并且线在两个传感器之间时,机器人应该向前移动,即两个电机都应该旋转,使机器人向前移动。
左转:
在这种情况下,左侧传感器位于黑线上方,而右侧传感器位于白色部分,因此左侧传感器检测到黑线并向微控制器发出信号。由于信号来自左侧传感器,因此机器人应转向左侧方向。因此,左电机向后旋转,右电机正向旋转。因此,机器人转向左侧。
右转:
这种情况与左转情况类似,但在这种情况下,只有右传感器检测到线,这意味着机器人应该向正确的方向转动。为了使机器人向右转动,左电机向前旋转,右电机向后旋转,这样机器人向右转向。
停止:
在这种情况下,两个传感器都位于线的前方并且它们可以同时检测到黑线,微控制器被馈送以将这种情况视为停止过程。因此,两个电机都停止,这导致机器人停止移动。
所需的组件
● Arduino Uno开发板
● L293D电机驱动器
● 红外传感器模块
● 7.4或9V电池
● 电机
● 机器人底盘
● 电线
连接原理图
该电路主要由四部分组成:两个红外传感器、一个电机驱动器、两个电机、一个 Arduino、一个电池和几条连接线。传感器感应从表面反射的红外光,并将输出馈送到板载运算放大器比较器。当传感器位于白色背景上时,传感器发出的光被白色地面反射并被接收器接收。但是当传感器位于黑色背景上方时,来自光源的光不会反射到它上面。传感器感应反射光的强度以提供输出。传感器的输出被馈送到微控制器,微控制器向电机驱动器发出命令以相应地驱动电机。在本文中, Arduino Uno根据来自传感器的输入使机器人前进、右转或左转以及停止。 Arduino的输出连接到电机驱动器。
组装循迹机器人
在了解了所有组件的连接后,我们就可以开始组装循迹机器人了。要制作这个机器人,首先我们需要一个机器人底盘,本文我使用的是自制底盘。您可以使用现成的底盘,也可以自己组装。
现在,通过热熔胶将电机放置到底盘上,如下图所示。
下一步是将电机驱动器放在底盘上,并将电机线连接到电机驱动器的输出端。
接下来,如图所示焊接红外传感器。
然后将传感器放在机器人底部,根据轨道宽度和机器人宽度调整传感器。请记住,一个传感器用于左侧检测,另一个用于右侧检测。
现在使用胶水放置 Arduino Uno开发板,并将传感器输出引脚连接到 Arduino的数字引脚2和4。
将VCC引脚连接到 5V,将GND引脚连接到地。
现在,将电机驱动器的使能引脚连接到Arduino的引脚5和8,并将电机驱动器输入引脚分别连接到 Arduino的引脚6、7、9和10。
最后,将电池连接到电路并将电池放在底盘上。现在将底盘倒置,使用热熔胶安装脚轮,如下图所示。
最后一步,添加车轮。
Arduino循迹机器人的代码
循迹机器人的编程部分非常简单,我们只需要基础的 Arduino功能。程序说明如下。
首先定义我们使用的每个Arduino引脚号。从驱动驱动器的引脚和传感器引脚开始。在这里,我对每一行代码都做了注释,方便大家理解。
#define enA 5 //Enable1 L293 Pin enA
#define in1 6 //Motor1 L293 Pin in1
#define in2 7 //Motor1 L293 Pin in1
#define in3 9 //Motor2 L293Pin in1
#define in4 10 //Motor2 L293 Pin in1
#define enB 8 //Enable2 L298 Pin enB
#define R_S 4 // Right sensor
#define L_S 2 // Left sensor
在setup()函数中,声明每个引脚的引脚模式。我们需要读取红外传感器的输出,因此将这些引脚定义为输入。电机需要由 Arduino驱动,因此将电机驱动器引脚定义为输出。最后,将启用引脚拉高。
pinMode(R_S, INPUT);
pinMode(L_S, INPUT);
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enB, OUTPUT);
digitalWrite(enA, HIGH);
digitalWrite(enB, HIGH);
在loop()函数中,我们首先读取红外传感器的值,然后使用if条件控制电机的运动。下面解释四种运动条件。
向前进:
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();}
在这种情况下,如果右侧传感器和左侧传感器同时位于白线之上,则机器人应该向前移动,这时我们调用forward函数。(注意:这里0表示红外传感器输出高,因为传感器在白线上)
转向右侧:
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();}
如果右侧检测到黑线,而左侧传感器没有检测到任何黑线,则会调用turnRight函数向右转向。
转向左侧:
if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();}
如果右侧传感器在白线上并且左侧传感器检测到黑色,则它将调turnLeft函数向左转向。
停止:
if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();}
如果右侧传感器和左侧传感器位于黑线,则它将调用Stop函数。在这种情况下,机器人将完全停止。
我们定义了机器人工作的4个函数,分别Forward、turnLeft、turnRight和Stop。函数代码如下:
Forward函数:
void forward(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
我们将电机驱动器的输入1和4拉高,因此,两个电机都会向前移动。
以上就是代码部分。使用USB电缆将 Arduino与计算机连接,然后使用 Arduino IDE上传代码。
测试和校准
我们已经组装了机器人并上传了代码,现在是时候看看它的运行情况了,如果它无法跟随线路,那么我们需要校准机器人。首先将机器人放在黑色表面上(两个传感器都应该在黑色表面的顶部)然后调整红外模块的可变电阻,直到红外模块的输出LED熄灭。接下来,将机器人放在白色表面上并检查LED是否亮,如果不亮,则只需调整可变电阻即可。再次重复该过程,以确保输出 LED 按照要求运行。
现在,由于我们已经校准了机器人,需要做的就是将机器人放在黑线上并观察它的运行情况。