1.元器件选型

电子元器件清单

序号

标号

名称

规格

数量

1

/

Arduino板

/

1

2

/

驱动模块

LM298N

1

3

/

巡线模块

5

机械零部件清单

序号

标号

名称

规格

数量

1

M1

直流电机

/

2

2

M2

2

3

/

车轮

/

4

4

/

硅胶轮胎

25*2.5

4

序号

标号

名称

规格

数量

1

/

连接导线

红色

n

2

/

黑色

n

2.机械结构设计

小车:采用4个直流减速电机,一个五路循迹模块,一个12V电池组,1个LM298N驱动模块和一个arduino控制板。

3.代码部分:

#include<SoftwareSerial.h>

#include<FlexiTimer2.h>//中断函数引用

#define TURNLEFT 0

#define TURNRIGHT 1

#define STOP 2

#define BACK 3

#define GO 4

#define leftrun 5

#define rightrun 6#define LMotor_1 8

#define LMotor_2 9

#define RMotor_1 10

#define RMotor_2 11

#define pwmLMotor_1 5//int ENA=6;//定义EA(PWM调速)接口

#define pwmRMotor_2 6//int ENB=5;//定义EB(PWM调速)接口

//四路红外循迹模块

#define X1 A0//定义中间第二个寻线传感器接口

#define X2 A1//定义左侧寻线传感器接口

#define X3 A2//定义中间第二个寻线传感器接口

#define X4 A3//定义左侧寻线传感器接口

#define L1 2//定义左侧中间寻线传感器接口

volatile int i;

void setup() {

Serial.begin(9600);

pinMode(LMotor_1,OUTPUT);

pinMode(LMotor_2,OUTPUT);

pinMode(RMotor_1,OUTPUT);

pinMode(RMotor_2,OUTPUT);

pinMode(pwmLMotor_1,OUTPUT);

pinMode(pwmRMotor_2,OUTPUT)

pinMode(X1,INPUT);//红外循迹

pinMode(X2,INPUT);

pinMode(X3,INPUT);

pinMode(X4,INPUT);

pinMode(L1,INPUT);

attachInterrupt(0, attachPinInterrupt_fun_0, RISING);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式

}

void loop(){

xunji();

Motorrun(GO,85);

if (i==1){

delay(100);

detachInterrupt(0);

Motorrun(STOP,0);

delay(2000);

Motorrun(TURNLEFT,95);

delay(1000);

Motorrun(STOP,0);

delay(1000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

if (i==8){

delay(100);

detachInterrupt(0);

Motorrun(STOP,0);

delay(2000);

Motorrun(TURNLEFT,95);

delay(1000);

Motorrun(STOP,0);

delay(1000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

if (i==12){

delay(100);

detachInterrupt(0);

Motorrun(STOP,0);

delay(2000);

Motorrun(TURNLEFT,95);

delay(1000);

Motorrun(STOP,0);

delay(1000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

if (i==14){

delay(100);

detachInterrupt(0);

Motorrun(STOP,0);

delay(2000);

Motorrun(TURNRIGHT,95);

delay(1000);

Motorrun(STOP,0);

delay(1000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

if (i==25){

delay(100);

detachInterrupt(0);

Motorrun(STOP,0);

delay(2000);

Motorrun(TURNRIGHT,95);

delay(1000);

Motorrun(STOP,0);

delay(1000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

if (i==27){

detachInterrupt(0);

Motorrun(STOP,0);

delay(50000);

attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

}

}

void attachPinInterrupt_fun_0() {//定义侧边红外模块检测

if (digitalRead(0) == HIGH) {

delay(50);

if (digitalRead(0) == HIGH) {

i = i + 1;}

}

Serial.println(i);

}

//电机运动

void Motorrun(int cmd,int value){

analogWrite(pwmLMotor_1,value);

analogWrite(pwmRMotor_2,value);

switch(cmd){

//前进

case GO:

digitalWrite(LMotor_1,HIGH);

digitalWrite(LMotor_2,LOW);

digitalWrite(RMotor_1,HIGH);

digitalWrite(RMotor_2,LOW);

break;

//后退

case BACK:

digitalWrite(LMotor_1,LOW);

digitalWrite(LMotor_2,HIGH);

digitalWrite(RMotor_1,LOW);

digitalWrite(RMotor_2,HIGH);

break;

//左转

case TURNRIGHT:

digitalWrite(LMotor_1,HIGH);

digitalWrite(LMotor_2,LOW);

digitalWrite(RMotor_1,LOW);

digitalWrite(RMotor_2,HIGH);

break;

//右转

case TURNLEFT:

digitalWrite(LMotor_1,LOW);

digitalWrite(LMotor_2,HIGH);

digitalWrite(RMotor_1,HIGH);

digitalWrite(RMotor_2,LOW);

break;

//停止

case STOP:

digitalWrite(LMotor_1,LOW);

digitalWrite(LMotor_2,LOW);

digitalWrite(RMotor_1,LOW);

digitalWrite(RMotor_2,LOW);

default:

digitalWrite(LMotor_1,LOW);

digitalWrite(LMotor_2,LOW);

digitalWrite(RMotor_1,LOW);

digitalWrite(RMotor_2,LOW);

}

}

void xunji(){

int r,m,m2,l;

r=digitalRead(X1);

m=digitalRead(X2);

m2=digitalRead(X3);

l=digitalRead(X4);

if(l==HIGH and m==LOW and m2==LOW and r==LOW){

Motorrun(TURNLEFT,90);

delay(50);

}

if(l==LOW and m==LOW and m2==LOW and r==HIGH){

Motorrun(TURNRIGHT,90);

delay(50);

}

if(l==HIGH and m==HIGH and m2==LOW and r==LOW){

Motorrun(TURNLEFT,90);

delay(30);

}

if(l==LOW and m==LOW and m2==HIGH and r==HIGH){

Motorrun(TURNRIGHT,90);

delay(30);

}

if(l==LOW and m==HIGH and m2==LOW  and r==LOW){

Motorrun(TURNLEFT,90);

delay(20);

}

if(l==LOW and  m==LOW and m2==HIGH  and r==LOW){

Motorrun(TURNRIGHT,90);

delay(20);

}

4.分析及改进

问题一及改进(采用四轮或三轮小车):刚开始,采用的是三轮小车,但三轮小车的稳定性,十分差劲。(干扰因素,万向轮从动轮的状态,对小车的影响较大。)后采用四个轮子,小车的稳定性得到极大的改善,小车的循迹功能变得十分稳定且流畅。  因此,建议采用四轮小车进行循迹。

问题二及改进(电机的选择):直到比赛,我们采用的是四个玩具电机,由于玩具电机不够准确且极易受到外界的干扰(电压,地面摩擦等),小车的拐弯精度调节,一度陷入困境,刚开始一直认为是代码问题,不断调试代码,比赛时依然出错。比赛后用直流减速电机,问题瞬间解决。    因此,建议采用直流减速电机。

问题三及改进(计数模块的选择):计数模块有四路循迹模块同时计数和计数或采用5个循迹模块(其中四个用来循迹,剩下一个用来计数),经过尝试,采用5路循迹模块的计数更为准确。建议采用直流减速电机,但计数模块最好可以进行遮挡,减少外界光的干扰。

问题四及改进(左右转方式选择):左右转建议采用一边正传,一边倒转。这样的转弯具有调节的灵敏度较高,且转弯处于原地转弯,定位能力也较高。

基于Arduino控制的网格循迹小车相关推荐

  1. 基于arduino的5路循迹小车(1)

    基于arduino的5路循迹小车(1) 初步小车运动 1.硬件选用 1.开发板使用arduino 2560 2.电机驱动板使用 大功率电机驱动板(PWM由两个端子控制) 3.电源12V锂电池 4.降压 ...

  2. 基于arduino的5路循迹小车(4)与舵机控制板的通信控制

    基于arduino的5路循迹小车(4) arduino与舵机控制板的通信控制 以及语音播报模块 接第一篇链接 https://blog.csdn.net/weixin_45984029/article ...

  3. 基于arduino的5路循迹小车(2)

    基于arduino的5路循迹小车(2) 小车5路红外循线 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347 ...

  4. 基于arduino的5路循迹小车(3)

    基于arduino的5路循迹小车(3) 使用红外模块的定位停车 以及超声波避障 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details ...

  5. 基于MSP432控制的红外循迹爬坡小车设计报告

    基于MSP432控制的红外循迹爬坡小车设计报告 竞赛选题:坡道行驶电动小车(C题) 摘要 本小车基于TI的MSP432平台,设计了可以沿指定路线在坡道上循迹行驶的四轮小车.小车采用L298N驱动芯片控 ...

  6. ARDUINO NANO 的 PID 循迹小车

    [Arduino项目]使用 ARDUINO NANO 的 PID 循迹小车 -------------------------------------------------------------- ...

  7. 基于STM32芯片的四驱循迹小车

    循迹小车包括三个基本模块: 1.宏定义模块 2.电机驱动模块 3.红外循迹模块 4.PWM调速模块 我将代码部分分为4个模块进行模块化编程:interface(各个引脚口的宏定义,方便记忆).moto ...

  8. 基于STM32开发板的循迹小车设计

    STM32的简单应用之循迹小车 前言 智能寻迹基于自动引导机器人系统,可以实现小车自动识别路线.智能寻迹小车运用传感器.单片机.电机驱动及自动控制等技术实现,管理时自动寻迹导航.该技术已经应用于无人驾 ...

  9. 基于STC89c52rc单片机的红外循迹小车

    循迹小车 由于要准备明年的恩智浦飞思卡尔智能车比赛,飞思卡尔智能车用的是K60系列的单片机,以我目前的阶段来说还处于学习阶段,所以先试着用51单片机做一个智能循迹小车.学习一下小车硬件以及软件程序,这 ...

最新文章

  1. Zxing生成二维码思路和源码解析
  2. Java多线程闲聊(五):AQS
  3. HTML-CSS- JavaScript——网页三剑客
  4. OkHttp实现分析之Websocket
  5. Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
  6. 水表读数自动识别,基于DB和CRNN的方法
  7. JavaScript 编程精解 中文第三版 十二、项目:编程语言
  8. leetcode力扣64. 最小路径和
  9. 阿里云徐栋:“下一代互联网”三大技术趋势
  10. Linux双网卡bonding举例
  11. 区块链“不可能三角”
  12. 微信支付委托代扣的服务商模式和直连模式
  13. Python学习笔记(十五):python 中的面向对象
  14. 电脑安装android2.0,应用多开 这才是最适用电脑的安卓—凤凰系统2.0
  15. 数据结构单向链表(C++)
  16. 卸载3dMax2012流程
  17. ubuntu 自定义开机画面
  18. iOS 学习之旅 - OC 篇
  19. I Try - Macy Gray
  20. 云计算系统测试之技术概念

热门文章

  1. 纽约的雪-我的西行漫记
  2. 教你路由器端口映射设置方法
  3. flink笔记1(初识 Flink)
  4. python程序性能监控
  5. Linux云服务器VPS一键数据盘和系统盘合并磁盘方法
  6. 手把手教你读懂源码,View事件的注册和接收详细剖析
  7. vue 高德地图api爬坑之路(三)Autocomplete 和 PlaceSearch
  8. 磁悬浮惯性动量轮技术_第2章_磁悬浮惯性动量轮的总体结构
  9. 机器学习工程师 — Udacity 基于CNN和迁移学习创建狗品种分类器
  10. SQL窗口函数-截止至某天的累计值