如何使用AVR单片机构建一个线跟随机器人

机器人

524人已加入

描述

  今天我们将使用AVR 单片机构建一个线跟随机器人。

  大多数红外传感器用于检测线路。红外传感器擅长检测白色或黑色表面。尽管您可以使用其他能够检测所有颜色的复杂传感器,并且可以制造出可以遵循所有颜色线的机器人。即使通过改变角度改变路径并保持跟随线,机器人也应该能够检测到线。此外,它应该在停止区进入线路的任何地方停止。

  线跟随机器人现在广泛用于制造业、医疗、家庭应用和货物仓库。机器人不仅限于这些应用,还可以在未来的许多应用中扩展其应用。

  线跟随机器人的概念

  红外传感器是该项目的关键参与者。红外传感器放置在机器人的前面,以跟踪绘制的黑线和表面。机器人放置在生产线之间,在红外传感器的帮助下,机器人跟踪生产线。红外传感器将读数反馈给微控制器,在红外读数的帮助下,微控制器向左侧或右侧移动电机,并再次将机器人带到路径上。

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

ATmega16

ATmega16

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

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

ATmega16

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

ATmega16

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

ATmega16

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

ATmega16

  这样,机器人将能够在不超出轨道的情况下跟随线路。现在让我们看看电路和代码的样子。

  所需组件

  直流齿轮马达(2台)

  红外传感器模块(2个)

  L293D 模块

  无线电源(例如电池、移动电源)

  机器人躺椅

  Atmega16微控制器IC

  16Mhz 晶体振荡器

  两个 100nF 电容器

  两个 22pF 电容器

  按钮

  跳线

  面包板

  USBASP v2.0(Atmega16编程)

  电路原理图

  如下图所示连接所有组件

ATmega16

  为线跟随机器人编程 Atmega16

  这里 Atmega16 使用 USBASP 和 Atmel Studio7.0 进行编程。如果您不知道如何使用 USBASP 对 Atmega16 进行编程,请访问链接。完整的程序在项目结束时给出,只需使用 JTAG 编程器和 Atmel Studio 7.0 上传 Atmega16 中的程序,如上一教程所述。

  我们试图使代码尽可能简短。所以我们在这段代码中使用了宏和特殊功能寄存器。

  if (bit_is_clear( PINA , leftSen )){ // 检查左传感器是否关闭

  该语句检查连接左侧传感器的 PA0 是低电平还是高电平。

  我们遵循四个条件来读取槽式红外传感器。红外传感器根据它们在机器人正面的位置命名。左红外是左传感器,右红外是右传感器。以下条件将决定机器人的运动。

ATmega16

  我们根据上述条件编写了代码。唯一的变化是我们只使用 L293D 的两个输入引脚来驱动两个电机。

/* 使用 Atmega16 的线跟随机器人

电路文摘(www.circuitdigest.com)*/



#include

#define leftSen PA0 //在 PA0 处连接左侧传感器

#define rightSen PA1 //在 PA1 处连接右传感器



诠释主要(无效)

{

DDRA=0xFC;// 使 PA0,PA1 作为两个传感器的输入 0x0b11111100

DDRC=0xFF;// 使端口作为输出连接电机引脚



而(1)

{

PINA=0x03;//初始化PA0和PA1

if(bit_is_clear(PINA,leftSen)){ // 检查左传感器是否关闭



if(bit_is_clear(PINA,rightSen)) { // 检查右传感器是否关闭

端口C=0b00000000;// 如果两个传感器都为零

} // 然后停止机器人

别的{

PORTC=0b00000001;// 如果右为ON,则向左走

}

}



else // 检查左传感器是否打开

{

if(bit_is_clear(PINA,rightSen)) { // 检查右传感器是否关闭

PORTC=0b00000010;// 这意味着左传感器打开

} // 所以向右走

别的{

端口C=0b00000011;// 如果两个传感器都打开

} // 然后继续移动机器人

}

}

}

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

全部0条评论

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

×
20
完善资料,
赚取积分