风筝
发表于: 2021-9-14 09:20:52 | 显示全部楼层

循迹机器人(Line Follower Robot,LFR)是一种比较简单的自主引导型机器人,它可以跟随地面上绘制的一条线,检测出白色表面上的黑线或黑色表面上的白线。循迹机器人是一个非常有趣的项目。在本篇文章中,我们将学习如何使用Arduino Uno开发板和一些常见组件制作一个循迹机器人。听起来是不是很有趣?让我们开始吧。


循迹机器人的工作原理

如前所述,循迹机器人跟随一条线,为了跟随一条线,机器人必须先检测到这条线。现在的问题是如何在循迹机器人中实现线路感应机制。我们都知道,因为黑色表面吸收的光量最大,所以白色表面对光的反射最大,黑色表面反射最小。因此,我们将使用光的这种特性来检测线。要检测光亮度,可以使用光敏电阻LDR或红外IR传感器。在本文中,我们将使用IR传感器,因为它具有更高的精度。为了检测出走线,我们放置了两个红外传感器,其中一个在机器人左侧,另一个在机器人的右侧。然后我们将机器人放在线上,使线位于两个传感器的中间。


红外传感器由两个元件组成,发射器和接收器。发射器是一个红外LED,它产生信号,而红外接收器是一个光电二极管,它感应发射器产生的信号。红外传感器向物体发射红外光,遇到黑色部分的光被吸收,从而产生低输出,但遇到白色部分的光反射回发射器,然后被红外接收器检测到,从而提供模拟输出。使用上述原理,我们通过驱动连接到电机的轮子来控制机器人的运动,电机由微控制器控制。


循迹机器人如何导航?

一个典型的循迹机器人有两组电机,我们称它们为左电机和右电机。两个电机分别根据左右传感器接收到的信号进行旋转。机器人需要进行4组运动,包括前进、左转、右转和停止。下面分别对这些情况进行说明。


前进:

Line-Follower-Navigation.jpg

在这种情况下,当两个传感器都在白色表面上并且线在两个传感器之间时,机器人应该向前移动,即两个电机都应该旋转,使机器人向前移动。


左转:

Line-Follower-Left-Navigation.png

在这种情况下,左侧传感器位于黑线上方,而右侧传感器位于白色部分,因此左侧传感器检测到黑线并向微控制器发出信号。由于信号来自左侧传感器,因此机器人应转向左侧方向。因此,左电机向后旋转,右电机正向旋转。因此,机器人转向左侧。


右转:

Line-Follower-Right-Navigation.png

这种情况与左转情况类似,但在这种情况下,只有右传感器检测到线,这意味着机器人应该向正确的方向转动。为了使机器人向右转动,左电机向前旋转,右电机向后旋转,这样机器人向右转向。


停止:

Line-Follower-STOP-Navigation.png

在这种情况下,两个传感器都位于线的前方并且它们可以同时检测到黑线,微控制器被馈送以将这种情况视为停止过程。因此,两个电机都停止,这导致机器人停止移动。

跳转到指定楼层
风筝
发表于: 2021-9-14 09:38:37 | 显示全部楼层

所需的组件

●    Arduino Uno开发板

●    L293D电机驱动器

●    红外传感器模块

●    7.4或9V电池

●    电机

●    机器人底盘

●    电线

Line-Follower-Robot-Components.jpg


连接原理图

Line-Follower-Circuit-Diagram.png

该电路主要由四部分组成:两个红外传感器、一个电机驱动器、两个电机、一个Arduino、一个电池和几条连接线。传感器感应从表面反射的红外光,并将输出馈送到板载运算放大器比较器。当传感器位于白色背景上时,传感器发出的光被白色地面反射并被接收器接收。但是当传感器位于黑色背景上方时,来自光源的光不会反射到它上面。传感器感应反射光的强度以提供输出。传感器的输出被馈送到微控制器,微控制器向电机驱动器发出命令以相应地驱动电机。在本文中,Arduino Uno根据来自传感器的输入使机器人前进、右转或左转以及停止。 Arduino的输出连接到电机驱动器。


组装循迹机器人

在了解了所有组件的连接后,我们就可以开始组装循迹机器人了。要制作这个机器人,首先我们需要一个机器人底盘,本文我使用的是自制底盘。您可以使用现成的底盘,也可以自己组装。


现在,通过热熔胶将电机放置到底盘上,如下图所示。

Line-Follower-Motor-Assembly.png


下一步是将电机驱动器放在底盘上,并将电机线连接到电机驱动器的输出端。


接下来,如图所示焊接红外传感器。

IR-LED-Sensor.png


然后将传感器放在机器人底部,根据轨道宽度和机器人宽度调整传感器。请记住,一个传感器用于左侧检测,另一个用于右侧检测。

Line-Follower-Robot-Assembly.jpg


现在使用胶水放置Arduino Uno开发板,并将传感器输出引脚连接到Arduino的数字引脚2和4。

Line-Follower-Robot.jpg


将VCC引脚连接到 5V,将GND引脚连接到地。


现在,将电机驱动器的使能引脚连接到Arduino的引脚5和8,并将电机驱动器输入引脚分别连接到Arduino的引脚6、7、9和10。


最后,将电池连接到电路并将电池放在底盘上。现在将底盘倒置,使用热熔胶安装脚轮,如下图所示。

Line-Follower-Chasis-Board.jpg


最后一步,添加车轮。

Arduino Line Follower.jpg

回复

使用道具 举报

风筝
发表于: 2021-9-14 10:10:36 | 显示全部楼层

Arduino循迹机器人的代码

循迹机器人的编程部分非常简单,我们只需要基础的Arduino功能。程序说明如下。


首先定义我们使用的每个Arduino引脚号。从驱动驱动器的引脚和传感器引脚开始。在这里,我对每一行代码都做了注释,方便大家理解。

  1. #define enA 5 //Enable1 L293 Pin enA
  2. #define in1 6 //Motor1  L293 Pin in1
  3. #define in2 7 //Motor1  L293 Pin in1
  4. #define in3 9 //Motor2  L293Pin in1
  5. #define in4 10 //Motor2  L293 Pin in1
  6. #define enB 8 //Enable2 L298 Pin enB
  7. #define R_S 4 // Right sensor
  8. #define L_S 2 // Left sensor
复制代码

setup()函数中,声明每个引脚的引脚模式。我们需要读取红外传感器的输出,因此将这些引脚定义为输入。电机需要由Arduino驱动,因此将电机驱动器引脚定义为输出。最后,将启用引脚拉高。

  1. pinMode(R_S, INPUT);
  2. pinMode(L_S, INPUT);
  3. pinMode(enA, OUTPUT);
  4. pinMode(in1, OUTPUT);
  5. pinMode(in2, OUTPUT);
  6. pinMode(in3, OUTPUT);
  7. pinMode(in4, OUTPUT);
  8. pinMode(enB, OUTPUT);
  9. digitalWrite(enA, HIGH);
  10. digitalWrite(enB, HIGH);
复制代码

loop()函数中,我们首先读取红外传感器的值,然后使用if条件控制电机的运动。下面解释四种运动条件。


向前进:

  1. if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();}
复制代码

在这种情况下,如果右侧传感器和左侧传感器同时位于白线之上,则机器人应该向前移动,这时我们调用forward函数。(注意:这里0表示红外传感器输出高,因为传感器在白线上)


转向右侧:

  1. if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();}
复制代码

如果右侧检测到黑线,而左侧传感器没有检测到任何黑线,则会调用turnRight函数向右转向。


转向左侧:

  1. if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();}
复制代码

如果右侧传感器在白线上并且左侧传感器检测到黑色,则它将调turnLeft函数向左转向。


停止:

  1. if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();}
复制代码

如果右侧传感器和左侧传感器位于黑线,则它将调用Stop函数。在这种情况下,机器人将完全停止。


我们定义了机器人工作的4个函数,分别Forward、turnLeft、turnRightStop。函数代码如下:


Forward函数:

  1. void forward(){
  2. digitalWrite(in1, HIGH);
  3. digitalWrite(in2, LOW);
  4. digitalWrite(in3, LOW);
  5. digitalWrite(in4, HIGH);
  6. }
复制代码

我们将电机驱动器的输入1和4拉高,因此,两个电机都会向前移动。


以上就是代码部分。使用USB电缆将Arduino与计算机连接,然后使用Arduino IDE上传代码。


测试和校准

我们已经组装了机器人并上传了代码,现在是时候看看它的运行情况了,如果它无法跟随线路,那么我们需要校准机器人。首先将机器人放在黑色表面上(两个传感器都应该在黑色表面的顶部)然后调整红外模块的可变电阻,直到红外模块的输出LED熄灭。接下来,将机器人放在白色表面上并检查LED是否亮,如果不亮,则只需调整可变电阻即可。再次重复该过程,以确保输出 LED 按照要求运行。

Line-Follower-Robot-Project.jpg


现在,由于我们已经校准了机器人,需要做的就是将机器人放在黑线上并观察它的运行情况。

Line-Follower.gif


如果您有任何问题,请随时在本帖下面进行回复。


回复

使用道具 举报

心不大
发表于: 2021-11-17 11:43:31 | 显示全部楼层

没有左转右转代码吗?
回复

使用道具 举报

风筝
发表于: 2021-11-17 11:52:26 | 显示全部楼层

心不大 发表于 2021-11-17 11:43
没有左转右转代码吗?

完整的代码:

  1. // Arduino Line Follower Robot Code

  2. #define enA 5//Enable1 L293 Pin enA
  3. #define in1 6 //Motor1  L293 Pin in1
  4. #define in2 7 //Motor1  L293 Pin in1
  5. #define in3 9 //Motor2  L293 Pin in1
  6. #define in4 10 //Motor2  L293 Pin in1
  7. #define enB 8 //Enable2 L293 Pin enB
  8. #define R_S 4//ir sensor Right
  9. #define L_S 2 //ir sensor Left
  10. void setup(){
  11. pinMode(R_S, INPUT);
  12. pinMode(L_S, INPUT);
  13. pinMode(enA, OUTPUT);
  14. pinMode(in1, OUTPUT);
  15. pinMode(in2, OUTPUT);
  16. pinMode(in3, OUTPUT);
  17. pinMode(in4, OUTPUT);
  18. pinMode(enB, OUTPUT);
  19. digitalWrite(enA, HIGH);
  20. digitalWrite(enB, HIGH);
  21. delay(1000);
  22. }
  23. void loop(){  
  24. if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();}   //if Right Sensor and Left Sensor are at White color then it will call forword function
  25. if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();} //if Right Sensor is Black and Left Sensor is White then it will call turn Right function  
  26. if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();}  //if Right Sensor is White and Left Sensor is Black then it will call turn Left function
  27. if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();} //if Right Sensor and Left Sensor are at Black color then it will call Stop function
  28. }
  29. void forward(){  //forword
  30. digitalWrite(in1, HIGH); //Right Motor forword Pin
  31. digitalWrite(in2, LOW);  //Right Motor backword Pin
  32. digitalWrite(in3, LOW);  //Left Motor backword Pin
  33. digitalWrite(in4, HIGH); //Left Motor forword Pin
  34. }
  35. void turnRight(){ //turnRight
  36. digitalWrite(in1, LOW);  //Right Motor forword Pin
  37. digitalWrite(in2, HIGH); //Right Motor backword Pin  
  38. digitalWrite(in3, LOW);  //Left Motor backword Pin
  39. digitalWrite(in4, HIGH); //Left Motor forword Pin
  40. }
  41. void turnLeft(){ //turnLeft
  42. digitalWrite(in1, HIGH); //Right Motor forword Pin
  43. digitalWrite(in2, LOW);  //Right Motor backword Pin
  44. digitalWrite(in3, HIGH); //Left Motor backword Pin
  45. digitalWrite(in4, LOW);  //Left Motor forword Pin
  46. }
  47. void Stop(){ //stop
  48. digitalWrite(in1, LOW); //Right Motor forword Pin
  49. digitalWrite(in2, LOW); //Right Motor backword Pin
  50. digitalWrite(in3, LOW); //Left Motor backword Pin
  51. digitalWrite(in4, LOW); //Left Motor forword Pin
  52. }
复制代码






回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-20 19:16 , Processed in 0.144377 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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