在本篇文章中,我们将使用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上传程序,如前一篇教程中所述。
我们尽力保持代码简洁明了。所以我们在这段代码中使用了宏和特殊功能寄存器。
if(bit_is_clear(PINA,leftSen)){ // check if left sensor is OFF
复制代码
该语句检查左传感器所连接的PA0是低还是高。
我们有四个条件来读取红外传感器。红外传感器根据它们在机器人前侧的位置命名。左IR是左传感器,右IR是右传感器。以下条件将决定机器人的运动。
我们根据上述条件编写了代码。唯一的变化是我们只使用L293D的两个输入引脚来驱动两个电机。
代码
下面给出了本篇文章的完整代码。
/* Line Follower Robot Using Atmega16
Circuit Digest(www.circuitdigest.com) */
#include
#define leftSen PA0 //Connect Left Sensor At PA0
#define rightSen PA1 //Connect Right Sensor At PA1
int main(void)
{
DDRA=0xFC; // make PA0,PA1 as input for both sensors 0x0b11111100
DDRC=0xFF; // make Port as output to connect motor pins
while(1)
{
PINA=0x03; //initialize PA0 and PA1
if(bit_is_clear(PINA,leftSen)){ // check if left sensor is OFF
if(bit_is_clear(PINA,rightSen)) { // check if right sensor is OFF
PORTC=0b00000000; // if both sensor zero
} // then stop the robot
else{
PORTC=0b00000001; // if right is ON then take left
}
}
else // check if left sensor in ON
{
if(bit_is_clear(PINA,rightSen)) { // check if right sensor is OFF
PORTC=0b00000010; // it means left sensor is ON
} // so take right
else{
PORTC=0b00000011; // if both sensor is ON
} // then keep moving the robot
}
}
}
上一篇:了解Atmega16 / 32 AVR微控制器中的脉冲宽度调制(PWM)
下一篇:Atmega16微控制器连接ESP8266 NodeMCU实现发送电子邮件
推荐阅读最新更新时间:2024-11-17 03:01
设计资源 培训 开发板 精华推荐
- AD8602WARZ-RL 高端运算放大器电流监控器的典型应用
- LTC4440A-5 的典型应用 - 高速、高电压、高侧栅极驱动器
- LTC2946CMS-1 12V、50A 功率、充电和能量监视器的典型应用
- LTC3612EFE 演示板、3A、4MHz、单片同步降压型稳压器
- 电磁电容安装板
- ESP8266 4路分控插排 接入HASS
- pcb NFC card
- LTC3375 的典型应用 - 8 通道可编程、可并联 1A 降压 DC/DC
- ZXLD1322 用于 LED 驱动的降压/升压模式 DC-DC 转换器的典型应用,具有 700mA 输出和电流控制
- 基于STNRGPF02数字控制器、2kW双通道交错式PFC参考设计