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

news2024/10/1 19:21:21

使用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 Pin
 digitalWrite(in2, LOW);  //Right Motor backword Pin
 digitalWrite(in3, HIGH); //Left Motor backword Pin
 digitalWrite(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 function
  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
  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
  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
}
void forward() {            //forword
  digitalWrite(in1, HIGH);  //Right Motor forword Pin
  digitalWrite(in2, LOW);   //Right Motor backword Pin
  digitalWrite(in3, LOW);   //Left Motor backword Pin
  digitalWrite(in4, HIGH);  //Left Motor forword Pin
}
void turnRight() {          //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() {           //turnLeft
  digitalWrite(in1, HIGH);  //Right Motor forword Pin
  digitalWrite(in2, LOW);   //Right Motor backword Pin
  digitalWrite(in3, HIGH);  //Left Motor backword Pin
  digitalWrite(in4, LOW);   //Left Motor forword Pin
}
void Stop() {              //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 forword Pin
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/397953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划——01背包,完全背包,力扣题型讲解

目录 背包问题 01背包及基础 压缩空间(一维dp滚动数组) 416.分割等和子集 1049.最后一块石头的重量 494.目标和 474.一和零 完全背包 理论基础 518.零钱兑换 Ⅱ 377.组合总和 Ⅳ 70.爬楼梯(n阶,完全背包解法&#xff0…

邻桌为何一天就学完了SQL基础语法,数据分析必学的SQL,满满硬货

因为开学原因,导致好久没有更新博客了,谁家大学生一周五天早八, 今天这篇分享数据库操作和 SQL。 SQL 全称是 Structured Query Language,翻译后就是结构化查询语言,是一种数据库查询和程序设计语言,用于…

SpringSecurity学习(三)自定义数据源、前后端分离案例

文章目录一、自定义数据源1. 认证流程与原理分析AuthenticationManager、ProviderManager、AuthenticationProvider三者关系2. 全局配置AuthenticationManager方式由于WebSecurityConfigurerAdapter过期,我们使用以下写法:3. 编码3.1 创建数据库表与插入…

一张图搞定研发团队管理全景图实例

研发团队往往是公司的生命力“源泉”但是研发团队的管理,往往都会“极端化”:※要不然极端的管理,导致创新力下降;※要不然极端的不管理,导致创新的方向太多,蔓延生长,没有边界,企业…

LearnOpenGL-光照-1.颜色

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject 文章目录颜色OpenGL代码例子颜色 物体颜色简介 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有…

C++ Primer Plus 第6版 读书笔记(5)第5章 循环和关系表达式

第5章 循环和关系表达式 本章内容包括&#xff1a;for 循环。表达式和语句。递增运算符和递减运算符&#xff1a;和−−。组合赋值运算符。复合语句&#xff08;语句块&#xff09;。逗号运算符。关系运算符&#xff1a;>、>、 、<、<和!。while 循环。typedef 工…

java怎么写接口,java开发api接口教程

在大家的工作中&#xff0c;经常写界面。 而且&#xff0c;最常用的是http接口。 但是&#xff0c;对于初学者Java工作人员来说&#xff0c;写http界面还很难。 那么&#xff0c;用实例来说明吧。 一、建设项目 首先&#xff0c;生成SpringBoot项目。 省略如何构建此处&#x…

proteus中仿真arduino驱动模拟器件(蜂鸣器继电器电机)

模拟器件如蜂鸣器、继电器、直流电机等在arduino电路中&#xff0c;如果我们接在数字管脚上来驱动往往可能因为驱动电流不够而达不到预期效果&#xff0c;或者没有动作或者没有动静。这篇博文我们专门来讨论一下如何驱动他们。 文章目录一、典型电路1、蜂蜜器(1)蜂鸣器的种类:(…

tun驱动之write

tun的write执行类型下面的代码 int fd open("/dev/net/tun", O_RDWR) write(fd, buf, len); 首先要明确一点&#xff0c;向tun驱动写的数据&#xff0c;最后会进入网络协议栈&#xff0c;相当于外部的数据通过网卡进入网络协议栈。所以写入tun驱动的数据&#xff0…

LSTM网络:一种强大的时序数据建模工具

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

32位Ubuntu系统安装visual studio code

Step.01 下载vscode安装包 vscode自1.36版本后停止支持32位linux系统&#xff0c;所以要使用<1.36版本。1.33版本下载地址&#xff1a; Visual Studio Code March 2019See what is new in the Visual Studio Code March 2019 Release (1.33)https://code.visualstudio.com…

nvm的使用

nvm工具 nvm是什么nvm下载与安装nvm的基本使用 1、nvm介绍 1.1、基于node的开发 在介绍nvm之前&#xff0c;先介绍下前端开发中关于node的使用。目前前端不管是基于vue或者react框架的开发&#xff0c;都是基于node环境下&#xff0c;进行包的管理与开发的。而不同项目组&a…

work-notes(23):结合typora、git、gitee实现云存储笔记完成的操作过程

时间&#xff1a;2023-03-07 文章目录摘要一、下载 typora二、安装 Git三、创建连接远程仓库四、使用 Git 上传到远程仓库五、到gitee上查看总结摘要 由于很想找一个好用&#xff0c;又有云存储的笔记软件。之前用过 有道笔记&#xff08;还行&#xff0c;量大了难找&#xff…

「MySQL进阶」为什么MySQL用B+树做索引而不用二叉查找树、平衡二叉树、B树

「MySQL进阶」为什么MySQL用B树做索引而不用二叉查找树、平衡二叉树、B树 文章目录「MySQL进阶」为什么MySQL用B树做索引而不用二叉查找树、平衡二叉树、B树一、概述二、二叉查找树三、平衡二叉树四、B树五、B树六、聚集索引和非聚集索引七、利用聚集索引和非聚集索引查找数据利…

剑指 Offer 67 把字符串转换成整数

摘要 面试题67. 把字符串转换成整数 一、字符串解析 根据题意&#xff0c;有以下四种字符需要考虑&#xff1a; 首部空格&#xff1a; 删除之即可&#xff1b;符号位&#xff1a;三种情况&#xff0c;即 , − , 无符号"&#xff1b;新建一个变量保存符号位&#xff0…

螯合剂p-SCN-Bn-TCMC,282097-63-6,双功能配体化合物应用于光学成像应用

p-SCN-Bn-TCMC 反应特点&#xff1a;p-SCN-Bn-TCMC属于双功能配体是螯合剂&#xff0c;也具有共价连接到生物靶向载体&#xff08;如抗体、肽和蛋白质&#xff09;的反应位点。应用于核医学、MRI和光学成像应用。西安凯新生物科技有限公司供应的杂环化合物及其衍生物可制作为具…

消息队列理解

为什么使用消息队列 使⽤消息队列主要是为了&#xff1a; 减少响应所需时间和削峰。降低系统耦合性&#xff08;解耦/提升系统可扩展性&#xff09;。 当我们不使⽤消息队列的时候&#xff0c;所有的⽤户的请求会直接落到服务器&#xff0c;然后通过数据库或者 缓存响应。假…

GPU是什么

近期ChatGPT十分火爆&#xff0c;随之而来的是M国开始禁售高端GPU显卡。M国想通过禁售GPU显卡的方式阻挡中国在AI领域的发展。 GPU是什么&#xff1f;GPU&#xff08;英语&#xff1a;Graphics Processing Unit&#xff0c;缩写&#xff1a;GPU&#xff09;是显卡的“大脑”&am…

给比特币“雕花” 增值还是累赘?

比特币网络也能发NFT了&#xff0c;大玩家快速入场。3月6日&#xff0c;Yuga Labs开启了TwelveFold拍卖会&#xff0c;该项目是Yuga Labs在比特币区块链网络上发行的首个NFT合集&#xff0c;内含300个艺术品。 在没有智能合约的比特币网络造NFT&#xff0c;没那么友好。但Web3…

Jmeter+Ant+Jenkins自动化搭建之报告优化

平台简介一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter支持接口的测试&#xff0c;Ant支持自动构建&#xff0c;而Jenkins支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动化测…