本文共 4505 字,大约阅读时间需要 15 分钟。
该小车采用Arduino UNO主控制核心,通过传感器传来的信号,对当前环境作出判断,最后对电机做出相应的动作。单片机通过红外传感器检测场地黑线,从而控制电机驱动模块,改变电机转速来控制小车方向,从而达到循迹的目的。
整个系统包括Arduino UNO控制模块、电机驱动模块、循迹模块、电源和小车车体
通过高发射功率红外光电二极管和高灵敏光电晶体管组成的传感器循迹模块判断黑线路径。
然后由Arduino UNO通过IO口控制L298N驱动模板改变两个直流电机的工作状态。 最后实现小车循迹。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWBrmP3y-1624623473333)(C:\Users\86182\Desktop\IMG_20210622_231300_edit_482206866577982.jpg)]
选用双轴直流减速马达电机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 停止
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接入直流电机的端口接法:
直流电机 | 旋转方式 | IN1 | IN2 | IN3 | IN4 | 使能端A | 使能端B |
---|---|---|---|---|---|---|---|
正转 | 0 | 1 | / | / | 1 | / | |
M1 | 反转 | 1 | 0 | / | / | 1 | / |
停止 | 0 | 0 | / | / | 1 | / | |
正转 | / | / | 0 | 1 | / | 1 | |
M2 | 反转 | / | / | 1 | 0 | / | 1 |
停止 | / | / | 0 | 0 | / | 1 |
循迹原理: 利用红外线对于不同颜色具有不同的反射性质的特点。在小车行驶过程中传感器的红外发射二极管不断发射红外光,当红外光遇到白色地面时发生漫反射,红外对管接收管接收反射光;如果遇到黑线则红外光被吸收,则红外管接收不到信号。
红外对管采集回来的信号通过2路循迹传感器模块里面的LM339比较器后输出高或低电平,从而实现信号的检测。所谓的差速,是指左右两车轮的速度差,假如左边车轮比右边快,则小车会偏向右。同时,左边的车轮转速比右的满,那么小车会向左边转动。
目前主要有以下两种方式: 小车向左转,可以左轮停止,左轮继续转动,这样可实现左转,这种方式实现小角度的转弯,在角度不大时可采用此种方式。 小车向左转,可以是左轮反转,右轮正转,这样可以实现大角度的左转,甚至可以进行原地打转。 同理可推出小车如何向右转向。采用TCRT5000
脉宽调制(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;//左电机1int a2 = 7;//左电机2int b1 = 8;//右电机1int b2 = 9;//右电机2int 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]);}
转载地址:http://voixi.baihongyu.com/