风筝
发表于: 2019-3-2 15:13:49 | 显示全部楼层

在本篇文章中,我们将使用AVR Atmega16微控制器制作另一个小工具。如果您是AVR微控制器的新手,那么您可以参考之前的AVR项目和教程


制作一个机器人对所有电子爱好者来说都是一项挑战。如果机器人可以在没有任何外部指令的情况下自动执行某些操作,那么可以最大化这种挑战。电子初学者最常制作的机器人之一是循迹机器人。顾名思义,机器人将遵循表面上绘制的线条。线不必是直线。此外,线条可以是任何颜色。


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


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


循迹机器人的概念

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


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

Concept-of-White-Line-Follo.gif

Concept-of-Black-Line-Follo.gif

IR-sensor-module.jpg

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


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

Working-of-Arduino-Line-Fol.gif

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

Turning-left-to-line-follow.gif

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

Turning-right-to-line-follo.gif

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

Stopping-Line-Follower-Robo.gif

通过这种方式,机器人将能够在不离开赛道的情况下跟随线路。现在让我们看看电路和代码是怎样的。


需要的组件

●    直流减速电机(2台)

●    红外传感器模块(2个单元)

●    L293D模块

●    无线电源(例如电池,移动电源)

●    机器人底座

●    Atmega16微控制器IC

●    跳线

●    面包板

●    USBASP v2.0


电路原理图

连接所有组件,如下图所示

Circuit-Diagram-for-Line-Follower-Robot-Using-AVR-Microcontroller-ATmega16.png


为循迹机器人编程Atmega16

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


我们尽力保持代码简洁明了。所以我们在这段代码中使用了宏和特殊功能寄存器。

  1. if(bit_is_clear(PINA,leftSen)){        // check if left sensor is OFF
复制代码

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


我们有四个条件来读取红外传感器。红外传感器根据它们在机器人前侧的位置命名。左IR是左传感器,右IR是右传感器。以下条件将决定机器人的运动。

IR-Sensor-Setup-for-Line-Follower-using-Atmega16_0.png

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

Line-Follower-Robot-Using-AVR-Microcontroller-ATmega16.jpg


代码

下面给出了本篇文章的完整代码。

  1. /* Line Follower Robot Using Atmega16
  2.    Circuit Digest(www.circuitdigest.com) */

  3. #include<avr/io.h>
  4. #define leftSen PA0                //Connect Left Sensor At PA0
  5. #define rightSen PA1               //Connect Right Sensor At PA1

  6. int main(void)
  7. {
  8. DDRA=0xFC;                // make PA0,PA1 as input for both sensors 0x0b11111100
  9. DDRC=0xFF;      // make Port  as output to connect motor pins

  10. while(1)
  11. {
  12. PINA=0x03;             //initialize PA0 and PA1
  13. if(bit_is_clear(PINA,leftSen)){        // check if left sensor is OFF

  14.    if(bit_is_clear(PINA,rightSen)) {    // check if right sensor is OFF
  15.     PORTC=0b00000000;       // if both sensor zero
  16.     }       // then stop the robot
  17.    else{
  18.     PORTC=0b00000001;                  // if right is ON then take left
  19.   }
  20. }

  21. else                                  // check if left sensor in ON
  22. {
  23.    if(bit_is_clear(PINA,rightSen)) {   // check if right sensor is OFF
  24.     PORTC=0b00000010;      // it means left sensor is ON
  25. }      // so take right
  26.    else{
  27.     PORTC=0b00000011;            // if both sensor is ON
  28.        }     // then keep moving the robot
  29.     }
  30.    }
  31. }
复制代码

跳转到指定楼层
kavent
发表于: 2019-3-6 20:44:59 | 显示全部楼层

路过看看,------------------------------------------------
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 41



手机版|

GMT+8, 2024-4-19 23:10 , Processed in 0.133749 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表