基于Arduino的循迹小车

基于Arduino的循迹小车

前言

该小车采用Arduino UNO主控制核心,通过传感器传来的信号,对当前环境作出判断,最后对电机做出相应的动作。单片机通过红外传感器检测场地黑线,从而控制电机驱动模块,改变电机转速来控制小车方向,从而达到循迹的目的。
在这里插入图片描述

一、系统概述1

整个系统包括Arduino UNO控制模块、电机驱动模块、循迹模块、电源和小车车体

1.工作原理

通过高发射功率红外光电二极管和高灵敏光电晶体管组成的传感器循迹模块判断黑线路径。
然后由Arduino UNO通过IO口控制L298N驱动模板改变两个直流电机的工作状态。 最后实现小车循迹。

二、循迹小车硬件

1.Arduino UNO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWBrmP3y-1624623473333)(C:\Users\86182\Desktop\IMG_20210622_231300_edit_482206866577982.jpg)]

2.电机模块

选用双轴直流减速马达电机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b0NP2AiC-1624623473335)(file:///C:\Users\86182\Documents\Tencent Files\185746080\Image\C2C\7AE20E026DA4751A18C0817431F58F19.jpg)]

电机驱动电路控制小车运行方法

a1 a2 b1 b2

1 0 1 0 前进

0 1 0 1 后退

1 0 0 1 左转弯

0 1 1 0 右转弯

0 0 0 0 停止

3.电机驱动模块

L298N实物接线图及驱动原理图:

在这里插入图片描述

L298N是一个内部有两个H桥的驱动芯片,这样电机的运转只需要用三个信号控制:两个方向信号和一个使能信号。(输入的电压不可超过它的额定电压)
L298N芯片的工作电压需要两路:
第一路:输出供给电机回路的工作电源
第二路:输入逻辑控制回路电源5V(电源出/入)

**+12V:**该引脚接的电压是驱动模块所能输出给电机的最大电压,一般 直接接电池。12V是由L298N芯片所能接受最大电压而定,一般介入5~12V电压。在此我们接入的电压为两节18650串联的电压,即3.7+3.7=7.4V;

GND: 在该项目中GND即为电源的负极,同时要保证Arduino开发板,驱动模块等所有模块的GND连在一起才可以正常工作。在某些复杂的项目中还需要区分数字地和模拟地,在此不做详细介绍。

+5V: L298N模块内含稳压电路,在模块内部将"+12V"引脚输入的电压转化为可供开发板使用的+5V电压,一般将次输出接入到开发板为开发板供电。

L298N有两路输出,所以可以控制小车前进、后退、转弯,其中:
ENA: 代表第一路输出的电压大小。驱动模块输出电压越高,电机转速越快。
1.当其输入为0V的时候,驱动模块输出对第一路电机输出电压为0V;
2.当其输入为3.3V的时候,驱动模块对第一路电机输出电压为"+12V"引脚的输入电压。
3.由于ENA输入电压的高低控制驱动对电机的输出电压,因此当我们需要对小车运动速度进行控制的时候,一般通过PWM对"ENA"引脚进行控制。

**IN1/IN2:**这两个引脚控制电机正反转方向。

**OUT1/OUT2:**这两个引脚分别接电机的两极。

ENB,IN3/IN4,OUT3/OUT4引脚控制第二路输出,与上述ENB,IN3/IN4,OUT3/OUT4功能相似。

L298N接入直流电机的端口接法:

直流电机旋转方式IN1IN2IN3IN4使能端A使能端B
正转01//1/
M1反转10//1/
停止00//1/
正转//01/1
M2反转//10/1
停止//00/1

4.循迹模块

循迹原理: 利用红外线对于不同颜色具有不同的反射性质的特点。在小车行驶过程中传感器的红外发射二极管不断发射红外光,当红外光遇到白色地面时发生漫反射,红外对管接收管接收反射光;如果遇到黑线则红外光被吸收,则红外管接收不到信号。
红外对管采集回来的信号通过2路循迹传感器模块里面的LM339比较器后输出高或低电平,从而实现信号的检测。

所谓的差速,是指左右两车轮的速度差,假如左边车轮比右边快,则小车会偏向右。同时,左边的车轮转速比右的满,那么小车会向左边转动。
目前主要有以下两种方式:
小车向左转,可以左轮停止,左轮继续转动,这样可实现左转,这种方式实现小角度的转弯,在角度不大时可采用此种方式。
小车向左转,可以是左轮反转,右轮正转,这样可以实现大角度的左转,甚至可以进行原地打转。
同理可推出小车如何向右转向。

采用TCRT5000

5.PWM调速

脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZ1MZfqG-1624623473340)(C:\Users\86182\Desktop\20170831114514554.gif)]

三、程序模块

#define STOP      0 //停止
#define RUN       1 //前进
#define BACK      2 //后退
#define LEFT      3 //左转
#define RIGHT     4 //右转
int a1 = 6;//左电机1
int a2 = 7;//左电机2
int b1 = 8;//右电机1
int b2 = 9;//右电机2
int sensor1 = 5; //从车头方向的最右边开始排序 探测器
int sensor2 = 4; 
int sensor3 = 3; 
int sensor4 = 2; 
int leftPWM = 10;//L298N使能端左
int rightPWM = 11;//L298N使能端右
void setup()
{
  Serial.begin(9600);//电机控制引脚初始化
  pinMode(a1, OUTPUT);
  pinMode(a2, OUTPUT);
  pinMode(b1, OUTPUT);
  pinMode(b2, OUTPUT);
  pinMode(leftPWM, OUTPUT);
  pinMode(rightPWM, OUTPUT);
  pinMode(sensor1, INPUT//寻迹模块引脚初始化
  pinMode(sensor2, INPUT);
  pinMode(sensor3, INPUT);
  pinMode(sensor4, INPUT);
}
void loop() 
{
  tracing();       
}
void Work(int c,int value)
{
  analogWrite(leftPWM, value);  //设置PWM输出,设置速度
  analogWrite(rightPWM, value);
  switch(c)
  {
     case RUN:
      Serial.println("RUN"); //前进输出状态
      digitalWrite(a1, HIGH);
      digitalWrite(a2, LOW);
      digitalWrite(b1, HIGH);
      digitalWrite(b2, LOW);
      break;
     case BACK:
      Serial.println("BACK"); //后退输出状态
      digitalWrite(a1, LOW);
      digitalWrite(a2, HIGH);
      digitalWrite(b1, LOW);
      digitalWrite(b2, HIGH);
      break;
     case LEFT:
      Serial.println("LEFT"); //左转输出状态
      digitalWrite(a1, HIGH);
      digitalWrite(a2, LOW);
      digitalWrite(b1, LOW);
      digitalWrite(b2, HIGH);
      break;
     case RIGHT:
      Serial.println("RIGHT"); //右转弯输出状态
      digitalWrite(a1, LOW);
      digitalWrite(a2, HIGH);
      digitalWrite(b1, HIGH);
      digitalWrite(b2, LOW);
      break;
     default:
      Serial.println("STOP"); //停止输出状态
      digitalWrite(a1, LOW);
      digitalWrite(a2, LOW);
      digitalWrite(b1, LOW);
      digitalWrite(b2, LOW);
  }
}
void tracing()
{
  int d[4];
  d[0] = digitalRead(5);
  d[1] = digitalRead(4);
  d[2] = digitalRead(3);
  d[3] = digitalRead(2);
  if(!d[0] && !d[1] && !d[2] && !d[3]) //左右都没有检测到黑线
  {
    Work(RUN, 200);
  }
  if(d[0] || d[1]) //右边检测到黑线
  {
    Work(RIGHT, 150);
  }
  if(d[2] || d[3]) //左边检测到黑线
  {
    Work(LEFT, 150);
  }
  if(d[0] && d[3]) //左右都检测到黑线是停止
  {
    Work(STOP, 0);
    while(1);
  }
  Serial.print(d[0]);
  Serial.print("---");
  Serial.print(d[1]);
  Serial.print("---");
  Serial.print(d[2]);
  Serial.print("---");
  Serial.println(d[3]);
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值