当前位置: 首页 > news >正文

使用Arduino Uno构建一个巡线机器人

使用Arduino Uno构建一个巡线机器人

原文

MX

基于Arduino的巡线机器人

巡线机器人(**LFR)**是一种简单的自主引导机器人,它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线。在本教程中,使用 Arduino Uno 和一些易于访问的组件构建黑线跟随机器人。

巡线机器人的原理

如前所述,巡线机器人(LFR)跟随一条线,为了跟随一条线,机器人必须首先检测这条线。现在的问题是如何在LFR中实现线路检测机制。我们都知道,光在白色表面上的反射最大,在黑色表面上最小,因为黑色表面吸收的光量最大。因此,我们将使用光的这种特性来检测线。为了检测光,可以使用LDR(光相关电阻)或红外传感器。对于这个项目,我们将使用红外传感器,因为它的精度更高。为了检测生产线,我们使用两个红外传感器,一个放置在机器人的左侧,另一个位于机器人的右侧,如下图所示。然后,我们将机器人放在生产线上,使生产线位于两个传感器的中间。我们已经介绍了详细的Arduino IR传感器教程,您可以查看该教程以了解有关Arduino Uno红外传感器工作的更多信息。

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

巡线器机器人如何导航?

一个典型的巡线机器人有两组电机,我们称它们为左电机和右电机。两个电机分别根据从左侧和右侧传感器接收到的信号旋转。机器人需要执行 4 组运动,包括向前移动、向左转、向右转和停止。下面对这些案例进行了描述。

向前移动

巡线器导航

在这种情况下,当两个传感器都在白色表面上并且线位于两个传感器之间时,机器人应该向前移动,即两个电机都应该旋转,使机器人向前移动(实际上两个电机都应该以相反的方向旋转,因为电机在我们的设置中放置了。但为了简单起见,我们将电机称为向前旋转。

左转:

巡线器左侧导航

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

右转:

巡线器右导航

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

停止:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DibJ5Kgx-1678253327381)(null)]

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

制造Arduino线跟随机器人所需的组件

  1. Arduino Uno - 1Nos
  2. L293D 电机驱动板 - 1 Nos
  3. 红外传感器模块 -2 Nos
  4. 7.4 或 9V 电池 -1 Nos
  5. BO 电机 - 2 Nos
  6. 电机轮(Motor wheel ) - 2 Nos
  7. 脚轮(Castor wheel) - 1 Nos
  8. 机器人底盘(robot chassis) - 1 Nos
  9. 电线(Wires)
  10. 螺 杆(Screw)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JyuvlMG-1678253327877)(null)]

电路图和组装基于 Arduino 的巡线器机器人

Arduino巡线器机器人电路图

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

为什么我们需要电机驱动板?

这里使用电机驱动板的原因是因为 Arduino 的输出信号不足以驱动电机,此外,我们需要在两个方向上旋转电机,因此我们使用电机驱动板根据需要驱动电机,并且电机驱动板能够提供足够的电流来驱动电机。在这里,我们使用L293D电机驱动板,这是一个双h桥电机驱动板,足以满足我们的2个电机的需求。

L293D 有 16 个引脚,L293D 的引脚排列如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GC9eTfR-1678253329173)(null)]

电机驱动板引脚的连接如下:

引脚 1 和 9 是使能引脚,我们将这两个引脚连接到 5v 输入以启用电机。

引脚编号 1A、2A、3A 和 4A 是控制引脚。

例如。如果引脚 1A 变低而 2A 变高,电机将向右转动,如果 1A 变低,2A 变高,电机将向左转动。因此,我们将这些引脚连接到解码器的输出引脚。

引脚 1Y、2Y、3Y 和 4Y 是电机连接引脚。

注意:Vcc2 是电机驱动电压引脚,仅在使用高压电机时使用。

Arduino Uno与电机驱动板的引脚连接如下:

电机驱动板和 Arduino 连接

在这里,我们使用7.4锂离子电池为整个电路供电。您可以使用 6-12 伏的任何电池类型。为了移动机器人,我们需要使用低转速但扭矩足够高的电机来承载机器人的重量。因此,我为该机器人选择了两个60 RPM 6V电池供电的减速电机。

装配巡线机器人

一旦我们了解了所有组件的连接,我们就可以开始组装我们的LFR。我已经在页面底部提供的视频中解释了机器人的分步组装过程。

基于Arduino的巡线机器人

要制造这个机器人,首先我们需要一个机器人身体;在这里,我使用的是自制机箱。您可以使用现成的机箱,也可以自己构建一个。

现在,借助一些热胶将BO电机放在机箱上,如下图所示。

巡线电机组件

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

接下来,弯曲红外 LED 和传感器,如图所示。

红外发光二极管传感器

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

DIY阿杜伊诺乌诺巡线机器人

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0akTEwc-1678253328528)(null)]

将 VCC 引脚连接到 5 伏,将接地引脚接地。

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

最后,将电池与电路连接,并将电池放在机箱上。在这里,我用跳线连接了所有东西。要进行永久设置,您可以直接将所有内容焊接在一起。

现在将电路板倒置,在热胶枪的帮助下,如下图所示安装脚轮。

巡线器机器人底盘板

最后,添加轮子。为了提高安全性,我还添加了塑料板作为保险杠。

Arduino巡线机器人工作

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

在循环部分中,声明每个引脚的引脚模式。在这里,我们需要读取红外传感器的输出,因此我将这些引脚定义为输入。电机需要由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);

在回路部分,我们首先读取红外传感器的值,然后根据我们的要求使用“if condition”控制电机的运动。下面解释四种运动条件。

前进:

if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 0)){forward();} 

在这种情况下,如果右传感器和左传感器位于白色之上,则机器人应该向前移动,因此我们调用向前函数。

(注意:这里0表示红外传感器的输出很高,因为传感器在白色表面上)

转向右侧:

if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 0)){turnRight();} 

如果右传感器检测到黑色并且左传感器未检测到任何黑线,则它将调用右函数,通过调用右转函数启动右转的协议。

转向左侧:

 if((digitalRead(R_S) == 0)&&(digitalRead(L_S) == 1)){turnLeft();} 

如果右传感器在白色上,而左传感器检测到黑色,那么它将调用 turnLeft 函数。它将启动将机器人向左转动的步骤。

停止机器人:

 if((digitalRead(R_S) == 1)&&(digitalRead(L_S) == 1)){Stop();} 

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

我们将机器人的 4 个功能定义为前进、左转、右转和停止。执行这些功能的代码如下:

转发功能:

void forward(){ 
digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH);}

这意味着我们将电机驱动板的输入 1 和 4 拉到高电平,因此,两个电机都将像这样向前移动 我做了其他功能

右转功能:

void turnRight(){
digitalWrite(in1, LOW);  //Right Motor forword Pin
digitalWrite(in2, HIGH); //Right Motor backword Pin 
digitalWrite(in3, LOW);  //Left Motor backword Pin
digitalWrite(in4, HIGH); //Left Motor forword Pin}

左转功能:

void turnLeft(){digitalWrite(in1, HIGH); //Right Motor forword PindigitalWrite(in2, LOW);  //Right Motor backword PindigitalWrite(in3, HIGH); //Left Motor backword PindigitalWrite(in4, LOW);  //Left Motor forword Pin}

停止功能:

void Stop(){digitalWrite(in1, LOW); //Right Motor forword Pin 
digitalWrite(in2, LOW); //Right Motor backword Pin
digitalWrite(in3, LOW); //Left Motor backword Pin 
digitalWrite(in4, LOW); //Left Motor forward Pin

所以,这就是编码的全部内容。现在我们需要将代码上传到Arduino,为此,请使用USB电缆将Arduino与计算机连接,然后使用Arduino IDE上传此代码。

测试和校准

Arduino巡线机器人

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

现在,既然我们已经校准了机器人,我们需要做的就是将机器人放在黑线的顶部,看看它是如何运作的。

DIY从线机器人

生产线跟随机器人的完整制作可以在本页底部链接的视频中找到。如果您有任何疑问,请在评论部分留下。

代码

// Arduino Line Follower Robot Code
#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  L293 Pin in1
#define in4 10  //Motor2  L293 Pin in1
#define enB 8   //Enable2 L293 Pin enB
#define R_S 4   //ir sensor Right
#define L_S 2   //ir sensor Left
void setup() {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);delay(1000);
}
void loop() {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 functionif ((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 functionif ((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 functionif ((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
}
void forward() {            //forworddigitalWrite(in1, HIGH);  //Right Motor forword PindigitalWrite(in2, LOW);   //Right Motor backword PindigitalWrite(in3, LOW);   //Left Motor backword PindigitalWrite(in4, HIGH);  //Left Motor forword Pin
}
void turnRight() {          //turnRightdigitalWrite(in1, LOW);   //Right Motor forword PindigitalWrite(in2, HIGH);  //Right Motor backword PindigitalWrite(in3, LOW);   //Left Motor backword PindigitalWrite(in4, HIGH);  //Left Motor forword Pin
}
void turnLeft() {           //turnLeftdigitalWrite(in1, HIGH);  //Right Motor forword PindigitalWrite(in2, LOW);   //Right Motor backword PindigitalWrite(in3, HIGH);  //Left Motor backword PindigitalWrite(in4, LOW);   //Left Motor forword Pin
}
void Stop() {              //stopdigitalWrite(in1, LOW);  //Right Motor forword PindigitalWrite(in2, LOW);  //Right Motor backword PindigitalWrite(in3, LOW);  //Left Motor backword PindigitalWrite(in4, LOW);  //Left Motor forword Pin
}
http://www.lryc.cn/news/34553.html

相关文章:

  • 【C++】类和对象(收尾)
  • Linux延迟操作
  • np.insert()函数用法
  • 学习笔记-架构的演进之容器的封装-3月day06
  • Gorm根据关系模型中的属性查询原模型数据
  • 车载技术【USB接口】—Android配件协议AOA【AOA连接】
  • SpringBoot的基本概念和使用
  • 基于计算机软件技术的化工设计特点
  • Nativefier把网页打包成exe
  • STM32U5开发(1)----通过 USART1 发送数据
  • 20230308 Apdl lsdyna两杆撞击案例学习笔记
  • 互相关延时估计 Matlab仿真
  • 谷歌插件Fetch在不同页面之间Cookie携带情况详解
  • Vue学习笔记(8)
  • 知道一个服务器IP应该怎么进入
  • 【计算机基础】Socket IO
  • mingw编译opencv
  • 数据结构(八)排序
  • 函数习题:用函数实现判断一个整数是否能被n整除
  • SAP 创建会计冲销凭证
  • Jetson(Ubuntu18.04)设备无法ping通百度能ping通局域网错误集合,(神奇的是这样的情况下Todesk等远程确没有问题)
  • Spring的@Conditional注解
  • 剑指 Offer 67 把字符串转换成整数
  • 【教学典型案例】18.开门小例子理解面向对象
  • Linux环境ENV的概念
  • AcWing数据结构 - 数据结构在算法比赛中的应用(下)
  • 基于嵌入式libxml2的ARM64平台的移植(aarch64)
  • 8. 字符串转换整数 (atoi)
  • [Tomcat]解决IDEA中的Tomcat中文乱码问题
  • python之dataclasses