使用Arduino Uno构建一个巡线机器人
使用Arduino Uno构建一个巡线机器人
原文
MX
巡线机器人(**LFR)**是一种简单的自主引导机器人,它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线。在本教程中,使用 Arduino Uno 和一些易于访问的组件构建黑线跟随机器人。
巡线机器人的原理
如前所述,巡线机器人(LFR)跟随一条线,为了跟随一条线,机器人必须首先检测这条线。现在的问题是如何在LFR中实现线路检测机制。我们都知道,光在白色表面上的反射最大,在黑色表面上最小,因为黑色表面吸收的光量最大。因此,我们将使用光的这种特性来检测线。为了检测光,可以使用LDR(光相关电阻)或红外传感器。对于这个项目,我们将使用红外传感器,因为它的精度更高。为了检测生产线,我们使用两个红外传感器,一个放置在机器人的左侧,另一个位于机器人的右侧,如下图所示。然后,我们将机器人放在生产线上,使生产线位于两个传感器的中间。我们已经介绍了详细的Arduino IR传感器教程,您可以查看该教程以了解有关Arduino Uno红外传感器工作的更多信息。
红外传感器由两个元件组成,发射器和接收器。发射器基本上是一个红外LED,它产生信号,红外接收器是一个光电二极管,它感测发射器产生的信号。红外传感器在物体上发射红外光,击中黑色部分的光被吸收,从而产生低输出,但击中白色部分的光反射回发射器,然后由红外接收器检测到,从而提供模拟输出。使用所述原理,我们通过驱动连接到电机的轮子来控制机器人的运动,电机由微控制器控制。
巡线器机器人如何导航?
一个典型的巡线机器人有两组电机,我们称它们为左电机和右电机。两个电机分别根据从左侧和右侧传感器接收到的信号旋转。机器人需要执行 4 组运动,包括向前移动、向左转、向右转和停止。下面对这些案例进行了描述。
向前移动:
在这种情况下,当两个传感器都在白色表面上并且线位于两个传感器之间时,机器人应该向前移动,即两个电机都应该旋转,使机器人向前移动(实际上两个电机都应该以相反的方向旋转,因为电机在我们的设置中放置了。但为了简单起见,我们将电机称为向前旋转。
左转:
在这种情况下,左侧传感器位于暗线顶部,而右侧传感器位于白色部分,因此左侧传感器检测到黑线并向微控制器发出信号。由于信号来自左侧传感器,因此机器人应转向左侧方向。因此,左电机向后旋转,右电机向前旋转。因此,机器人转向左侧。
右转:
这种情况类似于左情况,但在这种情况下,只有右传感器检测到线,这意味着机器人应该向正确的方向转动。为了使机器人朝右方向转动,左电机向前旋转,右电机向后旋转,结果机器人转向右方向。
停止:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DibJ5Kgx-1678253327381)(null)]
在这种情况下,两个传感器都位于线路顶部,它们可以同时检测黑线,微控制器被馈送以将这种情况视为停止过程。因此,两个电机都停止了,这导致机器人停止移动。
制造Arduino线跟随机器人所需的组件
- Arduino Uno - 1Nos
- L293D 电机驱动板 - 1 Nos
- 红外传感器模块 -2 Nos
- 7.4 或 9V 电池 -1 Nos
- BO 电机 - 2 Nos
- 电机轮(Motor wheel ) - 2 Nos
- 脚轮(Castor wheel) - 1 Nos
- 机器人底盘(robot chassis) - 1 Nos
- 电线(Wires)
- 螺 杆(Screw)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JyuvlMG-1678253327877)(null)]
电路图和组装基于 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与电机驱动板的引脚连接如下:
在这里,我们使用7.4锂离子电池为整个电路供电。您可以使用 6-12 伏的任何电池类型。为了移动机器人,我们需要使用低转速但扭矩足够高的电机来承载机器人的重量。因此,我为该机器人选择了两个60 RPM 6V电池供电的减速电机。
装配巡线机器人
一旦我们了解了所有组件的连接,我们就可以开始组装我们的LFR。我已经在页面底部提供的视频中解释了机器人的分步组装过程。
要制造这个机器人,首先我们需要一个机器人身体;在这里,我使用的是自制机箱。您可以使用现成的机箱,也可以自己构建一个。
现在,借助一些热胶将BO电机放在机箱上,如下图所示。
下一步是将电机驱动板放在底盘上,并将电机线连接到电机驱动板的输出。
接下来,弯曲红外 LED 和传感器,如图所示。
然后将传感器放在机器人的下侧,根据轨道宽度和机器人宽度调整传感器。请记住,一个传感器用于左侧检测,另一个传感器用于右侧检测。
现在使用胶水放置Arduino uno,并将传感器输出引脚连接到Arduino的数字引脚2和4。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0akTEwc-1678253328528)(null)]
将 VCC 引脚连接到 5 伏,将接地引脚接地。
现在,将电机驱动板的使能引脚连接到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
在循环部分中,声明每个引脚的引脚模式。在这里,我们需要读取红外传感器的输出,因此我将这些引脚定义为输入。电机需要由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上传此代码。
测试和校准
我们已经组装了机器人并上传了代码,所以现在是时候看看它的实际运行了,如果它无法遵循这条线,那么我们将不得不校准机器人。对于首先将机器人放在黑色表面上(两个传感器都应位于黑色表面上),然后调整红外模块的可变电阻,直到红外模块的输出LED熄灭。接下来,将机器人放在白色表面上并检查 LED 是否打开,如果没有,则只需调整可变电阻即可。再次重复该过程,以确保输出 LED 按照要求运行。
现在,既然我们已经校准了机器人,我们需要做的就是将机器人放在黑线的顶部,看看它是如何运作的。
生产线跟随机器人的完整制作可以在本页底部链接的视频中找到。如果您有任何疑问,请在评论部分留下。
代码
// 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
}
相关文章:

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

【C++】类和对象(收尾)
文章目录成员变量初始化问题初始化列表explicit关键字static成员特性:友元友元函数友元类内部类特性匿名对象成员变量初始化问题 在创建对象时,编译器通过调用构造函数,给了对象中各个成员变量一个合适的初始值。但是这并不能够称为对对象中成…...

Linux延迟操作
一、软中断Linux内核中定义了如下几种软中断:enum {HI_SOFTIRQ0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last soft…...

np.insert()函数用法
目录insert()函数定义程序举例说明行插入列插入多数值行插入完整的程序和显示结果:insert()函数定义 insert(arr, obj, values, axisNone) 参数说明: arr : 需要插入的数组,即Input array; obj:向数组中插入值的位置…...

学习笔记-架构的演进之容器的封装-3月day06
文章目录前言封装应用的Dockerwhy Docker not LXC?附前言 当文件系统、访问、资源都可以被隔离后,容器就已经具备它降生所需要的全部前置支撑条件了。为了降低普通用户综合使用 namespaces、cgroups 这些低级特性的门槛,2008 年 Linux Kernel 2.6.24 内…...

Gorm根据关系模型中的属性查询原模型数据
type ExamResult struct {gorm.ModelExamManagementID uintExamManagement ExamManagement json:"examManagement" // 一场考试,其中有试卷,有试题,有试题答案//MarkExamPaperRecord MarkExamPaperRecord //每一场考试对应的结…...

车载技术【USB接口】—Android配件协议AOA【AOA连接】
简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件…...

SpringBoot的基本概念和使用
文章目录一、什么是SpringBoot二、Spring Boot优点三、Spring Boot项目创建四、Spring Boot 配置文件1. yml语法2.properties与yml关系3.多系统的配置五、Spring Boot日志文件1.日志对象2.日志级别日志级别的设置System.out.println VS 日志的两个致命缺点3.日志持久化4.更简单…...

基于计算机软件技术的化工设计特点
2.1 便利性将计算机软件技术应用于化工设计环节,最大的优点就在于提升了化工企业生产的便利性。化工设计作为化工生产的基础,在化工设计环节需要到有关化学反应和工艺流程设计等的相关问题,通过利用计算机软件技术可以为上述工作提供很好的辅…...

Nativefier把网页打包成exe
前要: 今天遇到一个需求,之前的应用都是用的h5挂载在企业微信的小应用,但是现在需要电脑运行的exe安装包! 所以需要用到nativefier导报工具:nativefier是一个使用electron将网页转换为app的插件,写这篇博客…...

STM32U5开发(1)----通过 USART1 发送数据
概述 通过 USART1 发送一些数据。 最近在弄ST和GD的课程,需要样片的可以加群申请:6_15061293。 生成例程 使用STM32CUBEMX生成例程,这里使用NUCLEO-U575ZI开发板。 选择工程的时候,先不必选择加载了TrustZone。 样品申请 h…...

20230308 Apdl lsdyna两杆撞击案例学习笔记
本次模拟使用的是ANSYS 16.0 一、设置Element type 首先打开APDL界面 添加element type 在LS-DYNA Explicit选择条件下,选择3D solid 164 二、设置材料类型 选择material models 选择Elastic-Isotropic-输入 Density:密度 EX:杨氏模量 NUXY:泊松比 三、几何模型建…...

互相关延时估计 Matlab仿真
文章目录互相关延时估计什么是互相关延时估计?原理代码实现总结互相关延时估计 互相关延时估计是一种信号处理技术,用于计算两个信号之间的时间延迟。在本篇博客中,我们将使用MATLAB来实现互相关延时估计,并提供多个例子和代码&a…...

谷歌插件Fetch在不同页面之间Cookie携带情况详解
content script 和 script inject 表现情况 在碰到content script 注入和用script标签注入一样,即使服务端有写入Cookie到域名下在该tab标签应用下也不会被保存,所以在发送时也无法自动携带,所以通过content script和<script>这种方式…...

Vue学习笔记(8)
8.1 组件自定义事件 在 Vue 中,组件可以通过自定义事件来实现组件之间的通信。自定义事件可以让一个组件触发一个事件,并向其他组件传递数据。以下是自定义事件的实现步骤: 在组件中定义一个事件名:可以在组件中使用 $emit 方法来…...

知道一个服务器IP应该怎么进入
首先我是国内,访问国外的网站比如谷歌等,访问特别慢,有时候甚至登录不进去。现在知道了一个台湾或者国外的服务器应该怎么登录进去呢?知道服务器IP之后,你还需要知道服务器的远程端口帐号密码才能登录的。知道上面信息…...

【计算机基础】Socket IO
一、I/O 模型 一个输入操作通常包括两个阶段: 等待数据准备好从内核向进程复制数据 对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待数据到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复…...

mingw编译opencv
我这里是msys2 这个是msys2的教程 https://blog.csdn.net/qq_39942341/article/details/105931335?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167821146216800197067008%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&requ…...

数据结构(八)排序
一、排序的概念以及引用概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,…...

函数习题:用函数实现判断一个整数是否能被n整除
Description 输入一组整数,输入0结束(这组整数不包含0),输出其中能被n整除的所有整数之和(n为整数,不用考虑n为0的情况), n及这组整数均由键盘输入。首先输入n,再输入一…...

SAP 创建会计冲销凭证
“功能描述:根据传输过来数据创建会计冲销凭证,并返回消息和状态 *”---------------------------------------------------------------------- "“本地接口: *” IMPORTING *" VALUE(IW_ZTFKCX0010) TYPE ZTFKCX0010 *" EXP…...

Jetson(Ubuntu18.04)设备无法ping通百度能ping通局域网错误集合,(神奇的是这样的情况下Todesk等远程确没有问题)
一、.打开DNS,意思是取消注释添加114.114.114.114 ,文件如下 vim /etc/systemd/resolved.conf [Resolve] #DNS #FallbackDNS #Domains #LLMNRno #MulticastDNSno #DNSSECno #Cacheyes #DNSStubListeneryes然后重启服务sudo systemctl restart systemd-resolved.se…...

Spring的@Conditional注解
前言Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。Conditional的源码定义://此注解可以标注在类和方法上 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTI…...

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

【教学典型案例】18.开门小例子理解面向对象
目录一:背景介绍业务场景:业务分析:二:实现思路1、面向过程:2、面向对象(抽象、封装、继承、多态)3、面向对象(抽象、封装、继承、多态、反射)三:实现过程1、…...

Linux环境ENV的概念
一、基本概念 环境变量的含义:程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。 按变量的周期划为永久变量和临时性变量2种: 永久变量:通过修改配置文件,…...

AcWing数据结构 - 数据结构在算法比赛中的应用(下)
目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路: 设 idx索引用于构建树, 结点son[节点位置][节点分支指针],cnt[]记录单…...

基于嵌入式libxml2的ARM64平台的移植(aarch64)
由于libxml在移植过程中依赖于zlib的库文件,因此本节内容包含zlib(V1.2.13)的移植libxml2(V2.10.3)的移植两部分组成。 (一)zlib的移植(基于arm64) 1、在github上下载zlib的最新源码压缩包&am…...

8. 字符串转换整数 (atoi)
题目描述 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1&#x…...

[Tomcat]解决IDEA中的Tomcat中文乱码问题
目录 1、IDEA 2、VM options 3、IDEA启动程序的存放目录 4、Tomcat 写在前面:此方法亲测有效!!! 1、IDEA 2、VM options 加上这两行: -Dfile.encodingUTF-8 -Dconsole.encodingUTF-8 3、IDEA启动程序的存放目录…...