使用AVR微控制器ATmega16的循迹机器人

发布者:真诚相伴最新更新时间:2022-07-26 来源: csdn关键字:AVR微控制器  ATmega16 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


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


循迹机器人的概念

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


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




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


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


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


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


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


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


需要的组件

●    直流减速电机(2台)

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

●    L293D模块

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

●    机器人底座

●    Atmega16微控制器IC

●    跳线

●    面包板

●    USBASP v2.0


电路原理图

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



为循迹机器人编程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是右传感器。以下条件将决定机器人的运动。


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


代码

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

  1. /* Line Follower Robot Using Atmega16

  2.    Circuit Digest(www.circuitdigest.com) */


  3. #include

  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. }


关键字:AVR微控制器  ATmega16 引用地址:使用AVR微控制器ATmega16的循迹机器人

上一篇:了解Atmega16 / 32 AVR微控制器中的脉冲宽度调制(PWM)
下一篇:Atmega16微控制器连接ESP8266 NodeMCU实现发送电子邮件

推荐阅读最新更新时间:2024-11-17 03:01

AVR单片机的BOOT区
BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。   使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。   AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控
[单片机]
atmega16/32加锁后的解锁方法
先介绍我的开发环境,笔记本用的操作系统是win7 64位,我用的avr是atmega16A,用progisp烧写程序,今天下午烧了一个程序后再往里烧程序就弹出“进入编程模式错误,请减产编程器与目标板的连接是否正确”,也就是传说中的“Chip Enable Program Error”对话框。 到网上找问题,大部分都是自己焊的板子出的问题,解决方法要么是换块新的atmega16,要么是重新检查电路,修改电路,对于我这种用着用着突然变成这样的介绍几乎没有,我以为是什么东西烧了,但感觉没闻到什么味道,也没乱写什么程序,挺奇怪的。 还是感谢progisp那个软件,在我下的软件里有个isp编程进入不了编程模式的总结,里面有句话说电压
[单片机]
AVR单片机定时器T0的基本中断使用ICCAVR
#include iom128v.h void main(void) { TCNT0=0x83; TCCR0=0x07; TIMSK=0x01; SEI(); DDRC=0xff; PORTC=0; OCR0=0X00; while(1); } #pragma interrupt_handler Timer0:iv_TIMER0_OVF void Timer0() { TCNT0=0x83; PORTC=~PORTC; } 得出一个结论:别指望巧合。
[单片机]
Atmega16的自动装水系统
//题目要求设计一个自动装水系统,使用两根水管给水罐灌水,能显示时间和质量 //以下为自动装水系统程序,使用红外遥控器设定水位,可设定500g,1000g,1500g,2000g四个刻度 //使用电极法,即往水罐里通12V,在设定好的刻度线放置四跟导线,分别连接Atmega16的四个I/O口 //通过控制5V继电器来控制12V的抽水泵,当灌入的水到达设定的水位,抽水泵停止抽水,蜂鸣器响,LED灯闪烁 #include avr/io.h #include avr/interrupt.h #include util/delay.h #include 12864.h #define BIT(bit) (1 (bit)) uchar
[单片机]
AVR单片机判断脉冲宽度的方法
定时/计数器(Timer/counter)是单片机芯片中最基本的外围接口,它的用途非常广泛,常用于测量时间、速度、频率、脉宽、提供定时脉冲信号等。相对于一般8位单片机而言,AVR不仅配备了更多的定时/计数器接口,而且还是增强型的,功能非常强大。ATmega128一共配置了2个8位和2个16位,共4个定时/计数器,本小节重点对它的一些增强功能的应用做基本的介绍。 5.9.1 预分频器 定时/计数器最基本的功能就是对脉冲信号计数,当计数器计满后(8位为255,16位为65535),再来一个脉冲它就翻转到0,并产生中断信号。同其他单片机类似,AVR的定时/计数器的计数脉冲可以来自外部的引脚,也可以由从内部系统时钟获得;但AVR的定时/
[单片机]
avr单片机的特点及优点
AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。 avr单片机的特点及优点   高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能的重要指标,也是单片机占领市场、赖以生存的必要条件。   早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,
[单片机]
SHT11温湿度传感器AVR单片机程序
#include shtxx.h void shtxx_init(void) { shtxx_temp = shtxx_humi = 0; SHTXX_ SCK _LOW(); SHTXX_DAT_1(); shtxx_reconnect(); } void shtxx_reconnect(void) { SHTXX_DAT_1(); SHTXX_SCK_LOW(); for(uint8 i=0; i 9; i++) { SHTXX_SCK_HIGH(); SHTXX_SCK_LOW(); } SHTXX_START(); } uint8 shtxx_ SOF trst(voi
[单片机]
AVR单片机新手避免锁死的方法
新手尽量不要设定熔丝,但是下载程序又必须设定一些,因此下面这些显得十分必要: 1、针对新买的AVR,它的内部没有程序,在电路板第一次通电写程序前设置与实际工作相符的熔丝位。特别是没有外部晶振时设置成外部时钟那肯定必死无疑。 2、如果AVR已有程序,且之前没有用外部晶振电路,中途想加外部晶振怎么办,焊接好外部晶振后,不要急着修改熔丝位,否则后果你懂得。先在内部RC工作模式下清除FLASH程序,然后再将熔丝位修改成外部晶振时钟。 3、如果熔丝锁死已经发生,没办法,要么用高压编程,要么自己买个大于4M的有源晶振(4个脚)直接给AVR提供时钟解锁。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved