毕业设计 单片机循迹机器人小车

201 篇文章 119 订阅
151 篇文章 41 订阅


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 单片机循迹机器人小车

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

1 简介

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

本项目是基于AVR微控制器ATmega16的循迹机器人,使用AVR Atmega16微控制器制作。

电子初学者最常制作的机器人之一是循迹机器人。顾名思义,机器人将遵循表面上绘制的线条。线不必是直线。此外,线条可以是任何颜色。

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

2 主要器件

  • 直流减速电机(2台)
  • 红外传感器模块(2个单元)
  • L293D模块
  • 无线电源(例如电池,移动电源)
  • 机器人底座
  • Atmega16微控制器IC
  • 跳线
  • 面包板
  • USBASP v2.0

3 实现效果

在这里插入图片描述

4 设计原理

循迹机器人的概念

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

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

如果右侧传感器出现黑线,则微控制器通过单独旋转左侧车轮指示机器人向右转。在这里插入图片描述

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

在这里插入图片描述
通过这种方式,机器人将能够在不离开赛道的情况下跟随线路。

电路原理图

在这里插入图片描述

5 部分核心代码

现在让我们看看代码是怎样的。

为循迹机器人编程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<avr/io.h>
#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
    }
   }
 }

最后

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #define uchar unsigned char #define uint unsigned int void main() { DDRA=0X00; DDRB=0XFF; DDRD|=0X30; TCCR1A=0x91; //8位相位修正PWM 8000000/(64*2*256)=244.14hz TCCR1B=0x03; //clk/64 OCR1A=250; //初值占空比100% while(1) { if(PINA==0xe7)//加速前进4、5灯 { OCR1A=202;//占空比100% turn();//居中 } if(PINA==0xcf)//速度稍减前进5、6灯 { OCR1A=202;//占空比90% turnL();//左转-15度 } if(PINA==0x9f)//速度再减前进6、7灯 { OCR1A=176;//占空比80% turnLL();//左转-30度 } if(PINA==0x3f)//速度减前进7、8灯 { OCR1A=176;//占空比70% turnLLL();//左转-45度 } if(PINA==0X7f)//速度稍减前进8灯 { OCR1A=176;//占空比70% turnLLL();//右转45度 } if(PINA==0xf3)//速度稍减前进3、4灯 { OCR1A=202;//占空比90% turnR();//右转15度 } if(PINA==0Xf9)//速度再减前进2、3灯 { OCR1A=176;//占空比80% turnRR();//右转30度 } if(PINA==0Xfc)//速度稍减前进1、2灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } if(PINA==0Xfe)//速度稍减前进1灯 { OCR1A=176;//占空比70% turnRRR();//右转45度 } } } /*-45度*/ void turnLLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(4); } } /*-30度*/ void turnLL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(6); } } /*-15度*/ void turnL() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(8); } } /*0度居中*/ void turn()//居中 { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(10); } } /*15度*/ void turnR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(12); } } /*30度*/ void turnRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(14); } } /*45度*/ void turnRRR() { uchar i; DDRB=0XFF; PORTB=0XFF; for(i=0;i<30;i++) { PORTB&=~BIT(0); delay(18); PORTB|=BIT(0); delay(17); } } /*定时0.1MS*/ void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<90;j++); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值