【Arduino】基于Arduino的循迹小车电路连接与程序编写


Author:1071094493@qq.com


L298P工作原理:

在这里插入图片描述

​ 上图是本文中使用的L298P驱动,他的作用是将输入的3.3V或5V低压信号转换为高压信号。

在这里插入图片描述

​ 上图是L298P的原理图,从上图可以看出对于L298P芯片而言当In1(单片机输入)为高电平时输出Out1将会和Vs(电源)连通也为高电平,当为低电平时Out1将会和地相连。对于(In2-Out2)(In3-Out3)(In4-Out4)这三种组合也是同样的道理,通过电路结构我们发现,只有图中的EnA与EnB同时为高电平时,四个输出接口(Out1、Out2、Out3、Out4)才会出现有效值。利用这个特点我们可以通过拉低EnA和EnB的值来关闭输出实现刹车的目的。

L298P与其他元件的连接方法😆

与Arduino的连接

首先将L298P电机驱动板插到Arduno板上如下图所示:
在这里插入图片描述

安装效果如下图
在这里插入图片描述

与红外传感器的连接😸

​ 本次实验采用的红外传感器如下图所示,有三个引脚VCC、GND和Out引脚。其中VCC为电源正极引脚,GND为电源负极引脚,Out为输出脚。白色小灯泡发射红外线,黑色小灯泡负责接收红外信号。调节模块上面蓝色可调变阻器的阻值可以调节红外传感器的探测范围

​ 当模块可以收到红外信号时模块信号灯亮起,此时可以看到模块上有两个红灯会亮(一个为电源灯,另一个为信号灯)。同时Out端电压由高电平变为低电平。同样的道理由于黑色吸收红外光线能力强、白色反射能力强,当红外对准白色区域时红外线会被反射回来,Out由高到低,当对准黑线时白灯发射的红外信号会被黑线吸收,模块收不到红外信号Out端就会被拉高,输出高电平。

在这里插入图片描述

电机的连接

在这里插入图片描述

将电机驱动板与Arduino开发板按照第一步插在一起后按照上图连好电机与红外传感器即可。

程序编写😃

Aruino函数说明

函数名函数写法参数说明
PWM输出函数analogWrite(number,value);number是十进制数字,对应Arduino引脚号。value为0-255之间的值。
开关数字量函数digitalWrite(number,HIGH/LOW)number同上,第二个参数为HIGH时引脚输出高电平,为LOW时输出低。

初始宏定义

下方代码是对接口的宏定义,采用宏定义而非变量原因在于,宏定义在程序运行时不可改变。

//对接口进行重命名(此处需要根据自己的驱动引脚分布进行改变-本文以L298P为例)
#define ENA 10
#define ENB 11

//IN1与IN2在电路中通过反相芯片进行反相因此不必再定义In2和In4
//IN3与IN4反相
#define IN1 12
#define IN3 13

//将电机接口朝上
//L298P 从左至右分别为OUT 1 2 3 4

//定义红外传感器输入接口
//左侧红外使用8脚输入,右侧使用9脚
//压到白线为低电平,压到黑线输出高电平
#define L_SENSE 8
#define R_SENSE 9

红外传感器信号采集变量定义

//定义全局变量用于读取红外传感器的值
int L=0;
int R=0;

功能函数定义

void start_run()     
{
   //开始运行
  analogWrite(ENA,100);
  analogWrite(ENB,100);

  digitalWrite(IN1,HIGH);
  digitalWrite(IN3,HIGH);
}

void stop_run()
{
  //刹车
  analogWrite(ENA,0);
  analogWrite(ENB,0);

  digitalWrite(IN1,HIGH);
  digitalWrite(IN3,HIGH);
}

void direct_run()
{
  //直行
  analogWrite(ENA,100);
  analogWrite(ENB,100);

  digitalWrite(IN1,HIGH);
  digitalWrite(IN3,HIGH);
}

void left_run()
{
  //向左转
  analogWrite(ENA,100);
  analogWrite(ENB,50);

  digitalWrite(IN1,HIGH);
  digitalWrite(IN3,HIGH);
}

void right_run()
{
  //向右转
  analogWrite(ENA,50);
  analogWrite(ENB,100);

  digitalWrite(IN1,HIGH);
  digitalWrite(IN3,HIGH);
}

初始化函数

void setup() {
  //初始化接口模式输出
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN3,OUTPUT);

  //定义接口模式红外输入
  pinMode(L_SENSE, INPUT);
  pinMode(L_SENSE, INPUT);

  //设置串口波特率为9600
  Serial.begin(9600);

  //上电即开始运行
  start_run();
}

主任务循环

void loop()
{
  //分别读取左右两个红外传感器的状态
  L=digitalRead(L_SENSE);
  R=digitalRead(R_SENSE);

  //当两侧同时为低电平时左右都不压线
  if(L==LOW&&R==LOW)
  {
    direct_run();
  }else if(L==LOW&&R==HIGH)//当右侧压线时向左转
  {
    right_run();
  }else if(L==HIGH&&R==LOW)//当左侧压线时向右转
  {
    left_run();
  }else
  {
    direct_run();//默认情况下直行  
  }   
}

完整代码如下💇

//对接口进行重命名
#define ENA 10
#define ENB 11

//IN1与IN2在电路中通过反相芯片进行反相
//IN3与IN4反相
#define IN1 12
#define IN3 13

//将电机接口朝上
//L298P 从左至右分别为OUT 1 2 3 4

//定义红外传感器输入接口
//左侧红外使用8脚输入,右侧使用9脚
//压到白线为低电平,压到黑线输出高电平
#define L_SENSE 8
#define R_SENSE 9

//定义全局变量用于读取红外传感器的值
int L=0;
int R=0;

void setup() {
  //初始化接口模式输出
  pinMode(ENA,OUTPUT);
  pinMode(ENB,OUTPUT);
  pinMode(IN1,OUTPUT);
  pinMode(IN3,OUTPUT);

  //定义接口模式红外输入
  pinMode(L_SENSE, INPUT);
  pinMode(L_SENSE, INPUT);

  //设置串口波特率为9600
  Serial.begin(9600);

  start_run();
}

无法循迹、出现错误怎么调🍎

1:检查电池电量是否充足

2:代码没有问题,经过检验可以进行循迹,不必随便修改。

3:采用两个红外传感器就行,传感器之间距离不要太远,也不要太靠近。两传感器分置黑线两侧、距离黑线2-3CM为佳。

4:红外传感器不要和驱动轮在同一条直线上,否则小车来不及反应,容易跑偏。

5:上电之后默认为直行,检查两个电机是否均为向前转动,如果不是调换下电机两个接口使其正向转动。

6:此处定义红外信号采集脚为8、9脚,如果无法循迹调换左右两个红外传感器输入脚试试,比如左侧传感器插入到9脚中。

  • 25
    点赞
  • 278
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值