这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
毕业设计 单片机循迹机器人小车
学长这里给一个题目综合评分(每项满分5分)
选题指导, 项目分享:
https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md
循迹机器人现在广泛用于制造业、医疗、家庭应用和货物仓库。机器人不仅限于这些应用,并且可以在许多未来的应用中扩展其应用。
本项目是基于AVR微控制器ATmega16的循迹机器人,使用AVR Atmega16微控制器制作。
电子初学者最常制作的机器人之一是循迹机器人。顾名思义,机器人将遵循表面上绘制的线条。线不必是直线。此外,线条可以是任何颜色。
大多数红外传感器用于检测线条。红外传感器可以很好地检测白色或黑色表面。虽然您可以使用其他能够检测所有颜色的复杂传感器,并且可以制作可以跟随所有颜色线的机器人。即使通过改变角度改变路径并保持跟随线路,机器人也应该能够检测线。此外,它应该停在停止区进入线的任何地方。
红外传感器是该项目的关键组件。红外传感器放置在机器人的前侧,以跟踪绘制的黑线和表面。机器人放置在线路之间,借助IR传感器,机器人可以跟踪线路。红外传感器将读数反馈给微控制器,在红外读数的帮助下,微控制器将电机左侧或右侧移动,并再次将机器人带到路径上。
循迹机器人能够借助IR传感器跟踪线路。该传感器具有红外发射器和红外接收器。 IR发射器(IR LED)发射光,接收器(光电二极管)等待发射的光返回。只有当表面反射时,红外光才会返回。然而,所有表面都不反射红外光,只有白色的颜色表面可以完全反射它们,黑色表面将完全吸收它们,如下图所示。
现在我们将使用两个红外传感器来检查机器人是否与线路一起跟踪,如果机器人移出轨道,则需要两个马达来校正机器人。这些电机需要大电流,应该是双向的;因此我们使用像L293D这样的电机驱动模块。我们还需要一个像ATmega16这样的微控制器来根据红外传感器的值来指示电机。其简化框图如下所示。
这两个红外传感器将放置在线路的两侧。如果没有传感器检测到黑线,则AVR微控制器指示电机向前移动,如下所示
如果左侧传感器出现黑线,则微控制器通过单独旋转右侧车轮指示机器人向左转。
如果右侧传感器出现黑线,则微控制器通过单独旋转左侧车轮指示机器人向右转。
如果两个传感器都是黑线,则机器人停止。
现在让我们看看代码是怎样的。
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
}
}
}