目录
大学生第一次写博客,想帮助大家更好的入门单片机的实际开发,如有错误,欢迎评论区改正
驱动采用L298N
供电控制:
只需要在12V供电处接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电,做小车时最常用的就是这种方式。使用这种方式时,板载5V使能不用管。
PWM连线实例
L298N | 电源 |
12V | 电源12V |
GND | 电源负 |
L298N | UNO |
OUT1和OUT2 | 电机1的两个端子 |
OUT3和OUT4 | 电机2的两个端子 |
ENA | 5 |
ENB | 9 |
IN1和IN2 | 6和7 |
IN3和IN4 | 10和11 |
VSS | 5V |
GND | GND |
L298N详细信息大家可以看电机驱动----L298N,这里就不再重复了。
硬件:
单片机选用UNO或ESP32(本文代码是UNO的,ESP32改个引脚就好)。
基础函数
pinMode(引脚,状态) //(INPUT输入,OUTPUT输出)
analogWrite(引脚,PWM(0-255)) //PWM函数
digitalWrite(引脚, 高低电平); //引脚设置
digitalRead(引脚) //读取引脚高低电平
代码
#include <Arduino.h>
int ENA=5, IN1=6, IN2=7, ENB=9, IN3=10,IN4=11; //电机驱动
int L1=2, L2=4, R1=12, R2=13; //循迹模块
int La, Lb, Ra, Rb;
void setup() {
pinMode(L1, INPUT);
pinMode(L2, INPUT);
pinMode(R1, INPUT);
pinMode(R2, INPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
La = digitalRead(L1);
Lb = digitalRead(L2);
Ra = digitalRead(R1);
Rb = digitalRead(R2);
if (La == 0 && Lb == 0 && Ra == 0 && Rb == 0) {
analogWrite(ENA, 50);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 50);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
if (La == 1 && Lb == 0 && Ra == 0 && Rb == 0) {
analogWrite(ENA, 80);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 80);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
delay(150);
}
if (La == 0 && Lb == 1 && Ra == 0 && Rb == 0) {
analogWrite(ENA, 60);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 50);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
if (La == 0 && Lb == 0 && Ra == 1 && Rb == 0) {
analogWrite(ENA, 50);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 60);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
if (La == 0 && Lb == 0 && Ra == 0 && Rb == 1) {
analogWrite(ENA, 80);
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
analogWrite(ENB, 80);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
delay(150);
}
if (La == 1 && Lb == 1 && Ra == 0 && Rb == 0) {
analogWrite(ENA, 80);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 80);
digitalWrite(IN3, 0);
digitalWrite(IN4, 1);
}
if (La == 0 && Lb == 0 && Ra == 1 && Rb == 1) {
analogWrite(ENA, 80);
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
analogWrite(ENB, 80);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
if (La == 1 && Lb == 1 && Ra == 1 && Rb == 1) {
analogWrite(ENA, 60);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 60);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
if (La == 1 && Lb == 0 && Ra == 0 && Rb == 1) {
analogWrite(ENA, 60);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
analogWrite(ENB, 60);
digitalWrite(IN3, 1);
digitalWrite(IN4, 0);
}
delay(1);
}
正常应该封装模块化的,但我觉得这样其实也行(毕竟我是写好一个判断就开始Ctrl+v了)
代码有问题欢迎指正
下面有一个UNO循迹小车的照片和ESP32小车(因为我真的做了两个车...)
UNO小车战损版