文章目录
-
- L298P工作原理:
- L298P与其他元件的连接方式:laughing:
-
- 与Arduino的连接
- 连接红外传感器:smile_cat:
- 电机的连接
- 程序编写:smiley:
- Aruino函数说明
-
- 初始宏定义
- 定义功能函数
- 初始化函数
- 主任务循环
- 完整代码如下:haircut:
- 如何调整,如何调整错误:apple:
L298P工作原理:
本文使用了上图L298P驱动,他的功能是输入3.3V或5V将低压信号转换为高压信号。
上图是L298P从上图可以看出原理图L298P芯片而言当In1()平时输出高电Out1将会和Vs(电源)连接也是高电平,当它是低电平时Out将与地相连。(In2-Out2)(In3-Out3)(In4-Out4)这三种组合也是如此。通过电路结构,我们发现只有图中的组合在高电平时,四个输出接口(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引脚号。value0-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脚中。