基于Arduino控制的网格循迹小车
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 |
小车:采用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控制的网格循迹小车相关推荐
- 基于arduino的5路循迹小车(1)
基于arduino的5路循迹小车(1) 初步小车运动 1.硬件选用 1.开发板使用arduino 2560 2.电机驱动板使用 大功率电机驱动板(PWM由两个端子控制) 3.电源12V锂电池 4.降压 ...
- 基于arduino的5路循迹小车(4)与舵机控制板的通信控制
基于arduino的5路循迹小车(4) arduino与舵机控制板的通信控制 以及语音播报模块 接第一篇链接 https://blog.csdn.net/weixin_45984029/article ...
- 基于arduino的5路循迹小车(2)
基于arduino的5路循迹小车(2) 小车5路红外循线 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347 ...
- 基于arduino的5路循迹小车(3)
基于arduino的5路循迹小车(3) 使用红外模块的定位停车 以及超声波避障 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details ...
- 基于MSP432控制的红外循迹爬坡小车设计报告
基于MSP432控制的红外循迹爬坡小车设计报告 竞赛选题:坡道行驶电动小车(C题) 摘要 本小车基于TI的MSP432平台,设计了可以沿指定路线在坡道上循迹行驶的四轮小车.小车采用L298N驱动芯片控 ...
- ARDUINO NANO 的 PID 循迹小车
[Arduino项目]使用 ARDUINO NANO 的 PID 循迹小车 -------------------------------------------------------------- ...
- 基于STM32芯片的四驱循迹小车
循迹小车包括三个基本模块: 1.宏定义模块 2.电机驱动模块 3.红外循迹模块 4.PWM调速模块 我将代码部分分为4个模块进行模块化编程:interface(各个引脚口的宏定义,方便记忆).moto ...
- 基于STM32开发板的循迹小车设计
STM32的简单应用之循迹小车 前言 智能寻迹基于自动引导机器人系统,可以实现小车自动识别路线.智能寻迹小车运用传感器.单片机.电机驱动及自动控制等技术实现,管理时自动寻迹导航.该技术已经应用于无人驾 ...
- 基于STC89c52rc单片机的红外循迹小车
循迹小车 由于要准备明年的恩智浦飞思卡尔智能车比赛,飞思卡尔智能车用的是K60系列的单片机,以我目前的阶段来说还处于学习阶段,所以先试着用51单片机做一个智能循迹小车.学习一下小车硬件以及软件程序,这 ...
最新文章
- Zxing生成二维码思路和源码解析
- Java多线程闲聊(五):AQS
- HTML-CSS- JavaScript——网页三剑客
- OkHttp实现分析之Websocket
- Redis 中的过期元素是如何被处理的?「视频版」——面试突击 002 期
- 水表读数自动识别,基于DB和CRNN的方法
- JavaScript 编程精解 中文第三版 十二、项目:编程语言
- leetcode力扣64. 最小路径和
- 阿里云徐栋:“下一代互联网”三大技术趋势
- Linux双网卡bonding举例
- 区块链“不可能三角”
- 微信支付委托代扣的服务商模式和直连模式
- Python学习笔记(十五):python 中的面向对象
- 电脑安装android2.0,应用多开 这才是最适用电脑的安卓—凤凰系统2.0
- 数据结构单向链表(C++)
- 卸载3dMax2012流程
- ubuntu 自定义开机画面
- iOS 学习之旅 - OC 篇
- I Try - Macy Gray
- 云计算系统测试之技术概念