如何使用PIC微控制器构建一个线路跟随机器人

机器人

518人已加入

描述

线路跟随机器人是一个简单而迷人的机器人,适合大多数学生/业余爱好者建造。在本教程中,我们将学习线路跟随机器人的工作原理以及如何使用PIC 微控制器 PIC16F877A构建一个。PIC16F877A是Microchip的40引脚多用途MCU,我们在完整的PIC教程系列中使用了该IC。

所需材料:

PIC16F877A

红外传感器 (2否)

直流减速电机 (2Nos)

L293D 电机驱动器

贵妃椅(您也可以使用纸板建造自己的躺椅)

移动电源(任何可用的电源)

线路跟随器的概念

线路跟随机器人能够在红外传感器的帮助下跟踪线路。该传感器具有红外发射器和红外接收器。红外发射器 (IR LED) 传输光,接收器(光电二极管)等待透射光返回。红外光只有在被表面反射时才会返回。然而,所有表面都不反射红外光,只有白色彩色表面可以完全反射它们,黑色表面将完全观察它们,如下图所示。

机器人

 

机器人

 

机器人

现在,我们将使用两个红外传感器来检查机器人是否与线路一起在轨道上,并使用两个电机来纠正机器人是否移出轨道。这些电机需要大电流,应该是双向的;因此,我们使用L293D等电机驱动器模块。我们还需要一个像PIC这样的微控制器,根据红外传感器的值来指导电机。简化的框图如下所示。

机器人

这两个红外传感器将放置在线路的两侧。如果没有传感器检测到黑线,则PIC微控制器指示电机向前移动,如下所示

机器人

如果左侧传感器出现在黑线上,则微控制器通过单独旋转右轮来指示机器人向左转动。

机器人

如果右传感器出现在黑线上,则微控制器通过单独旋转左轮来指示机器人向右转。

机器人

如果两个传感器都位于黑线上,则机器人停止。

机器人

这样,机器人将能够在不离开轨道的情况下跟随线路。现在让我们看看电路和代码是什么样的。

电路图及说明:

这款基于 PIC 的线路跟随机器人的完整电路图如下所示

机器人

该电路采用两个红外传感器和一对直流减速电机以及一个电机驱动器模块,如上所示。本项目中使用的电机驱动器模块是L293D,我们需要一个电机驱动器,因为PIC微控制器的输出引脚无法为电机驱动提供足够的电流。该模块将直接由电路中所示的电源(5V)供电。该模块有四个引脚(每个电机两个),连接到PIC以控制电机的方向。我们还有两个红外传感器,用作PIC微控制器的输入。如果这些传感器在白色表面上,它们将变为高电平(1),而在黑色表面上时,它们将变为低(0)。下表显示了完整的引脚连接。

 

S.No 连接自 已连接到
1 红外传感器 左边引脚 RD2(引脚 21)
2 红外传感器 右输出引脚 RD3(引脚 22)
4 电机 1 通道 A 引脚 RC4(引脚 23)
5 电机 1 通道 B 引脚 RC5(引脚 25)
6 电机 2 通道 A 引脚 RC6(引脚 26)
7 电机 2 通道 B 引脚 RC7(引脚 27)

 

在实际硬件中,我使用了一个移动电源,它将直接通过其USB端口提供+ 5V的输出;因此,我绕过了 7805 稳压器,并使用它为 PIC、传感器和电机供电。您可以执行相同的操作,例如使用12V电池和稳压器,如电路所示。

机器人

 

机器人

PIC微控制器编程:
准备好硬件后,就该开始编程了。本页末尾给出了此PIC线路跟随器机器人项目的完整程序。但是,重要的块解释如下。

通过以下行初始化 I/O 引脚。2 个红外传感器引脚用作输入,4 个电机引脚充当输出引脚。

TRISD2 = 1; TRISD3 = 1; //Bath the IR sensor pins are declared as input
TRISC4 = 0; TRISC5 = 0; //Motor 1 pins declared as output
TRISC6 = 0; TRISC7 = 0; //Motor 2 pins declared as output
现在,我们必须读取红外传感器的状态并相应地控制电机。例如,如果两个传感器都很高(不在黑线下),那么我们将两个电机向前移动,如下程序所示。

if (RD2==1 && RD3==1) //Both sensor not over balck line
{
RC4=0; RC5=1; //Motor 1 forward
RC6=1; RC7=0; //Motor 2 forward
}
如果左侧传感器越过黑线,则我们通过保持电机 1 静止并向前旋转电机 2 来右转。这种类型的车削称为差速车削。

else if (RD2==0 && RD3==1) //Left sensor is over black line
{
RC4=1; RC5=1; //Motor 1 stop
RC6=1; RC7=0; //Motor 2 forward
}
同样,如果右侧传感器越过黑线,则机器人通过保持第二个电机静止并单独向前旋转第一个电机来左转,如下所示。

else if (RD2==1 && RD3==0) //Right sensor is over black line
{
RC4=0; RC5=1; //Motor 1 forward
RC6=1; RC7=1; //Motor 2 stop
}
最后,如果两个传感器都处于黑线下方,那么是时候停止机器人了。这可以通过将两个电机的所有引脚调高来完成。执行相同操作的代码如下所示

else //Both Sensor over black line
{
RC4=1; RC5=1; //Motor 1 stop
RC6=1; RC7=1; //Motor 2 stop
}
也就是说,程序已经准备就绪,可以使用任何程序员(如PicKit)上传到PIC。

PIC 线路跟随器的实际应用:

一旦硬件和代码准备就绪,就该采取一些行动了。如前所述,我已经使用移动电源为机器人供电,所以我所要做的就是简单地将移动电源连接到已经设置硬件并上传代码的机器人。

PIC Perf 板是为我们的 PIC 教程系列制作的,在该系列中,我们学习了如何使用 PIC 微控制器。如果您不知道如何使用 Pickit 3 刻录程序,您可能希望回到使用 MPLABX 和 XC8 的 PIC 微控制器教程,因为我将跳过所有这些基本信息。

机器人

现在,只需在黑线上启动机器人,您应该按照黑线观察它。

在这种情况下,您可能会在开始时遇到一些困难,请进一步阅读。如果车轮以相反的方向旋转,只需互换电机的极性,而电机的车轮则以相反的方向旋转。如果机器人偏离线路,请交换红外传感器,一切都应该很好。

/*

Line Follower using PIC16F877A

* Code by: B.Aswinth Raj

* Dated: 11-09-2017

* More details at: www.CircuitDigest.com

*/


#include


#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)

#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)



void main()

{

TRISD2 = 1; TRISD3 = 1; //Bath the IR sensor pins are declared as input

TRISC4 = 0; TRISC5 = 0; //Motor 1 pins declared as output

TRISC6 = 0; TRISC7 = 0; //Motor 2 pins declared as output





while(1)

{



if (RD2==1 && RD3==1) //Both sensor not over balck line

{

RC4=0; RC5=1; //Motor 1 forward

RC6=1; RC7=0; //Motor 2 forward

}



else if (RD2==0 && RD3==1) //Left sensor is over black line

{

RC4=1; RC5=1; //Motor 1 stop

RC6=1; RC7=0; //Motor 2 forward





else if (RD2==1 && RD3==0) //Right sensor is over black line

{

RC4=0; RC5=1; //Motor 1 forward

RC6=1; RC7=1; //Motor 2 stop





else //Both Sensor over black line

{

RC4=1; RC5=1; //Motor 1 stop

RC6=1; RC7=1; //Motor 2 stop 

}



}

}

 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分