一、材料同上篇文章;
二、接线同上篇文章。
L298N红板有两个使能端口ENA和ENB,这两个端口默认是有跳线帽的,也就是接5V的,此时输出就是HIGH或者LOW。摘掉跳线帽,将外边端口分别接arduino的PWM接口就好,本文接的是3和11,可以在0~255间调整。
三、MIXLY代码
四、arduino代码
#include <Servo.h> // 控制舵机的头文件
Servo myservo; // 创建伺服对象控制伺服
const int TrigPin = 12; //超声波
const int EchoPin = 13; // 超声波
unsigned int distance;
unsigned char pos = 90; // 舵机伺服的位置
int right_distance = 0; // 右边测距的距离
int left_distance = 0; //左边测距的距离
const int L298pin1 = 5; // 模块控制信号
const int L298pin2 = 6;
const int L298pin3 = 9;
const int L298pin4 = 10;
const int ENA = 3;
const int ENB = 11;
void setup()
{
pinMode(L298pin1,OUTPUT);
pinMode(L298pin2,OUTPUT);
pinMode(L298pin3,OUTPUT);
pinMode(L298pin4,OUTPUT);
pinMode(ENA,OUTPUT);
pinMode(ENB,OUTPUT);
// 初始化串口通信及连接SR04的引脚
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
// Serial.println("Ultrasonic sensor:");
myservo.attach(7); // 使用第11脚控制舵机伺服位置
}
void loop()
{
myservo.write(pos); // 舵机伺服控制初始化
delay(200);
int temp = dis();
if(temp >= 50)
{
go();
}
else
{
back();//加了倒退500毫秒完美运行
delay(50);
stops(); // 小车停止
myservo.write(0); //右边测距
delay(600);
right_distance = dis();
myservo.write(180); //左边测距
delay(600);
left_distance = dis();
if(right_distance >= left_distance) // 右边的距离是否大于左边
{
right(); //右转
delay(300);
} else
{
left(); // 小车左转
delay(300);
}
}
}
unsigned int dis() // 测距
{
// 产生一个10us的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
// 检测脉冲宽度,并计算出距离
distance = pulseIn(EchoPin, HIGH);
distance=distance/58;
// Serial.println(distance);
return distance; // 返回数据
}
void go() // 小车前进
{
digitalWrite(L298pin1,HIGH);
digitalWrite(L298pin2,LOW);
digitalWrite(L298pin3,HIGH);
digitalWrite(L298pin4,LOW);
analogWrite(ENA,100);
analogWrite(ENB,100);
}
void back() //小车后退
{
digitalWrite(L298pin1,LOW);
digitalWrite(L298pin2,HIGH);
digitalWrite(L298pin3,LOW);
digitalWrite(L298pin4,HIGH);
analogWrite(ENA,100);
analogWrite(ENB,100);
}
void left() // 小车左转
{
digitalWrite(L298pin1,LOW);
digitalWrite(L298pin2,HIGH);
digitalWrite(L298pin3,HIGH);
digitalWrite(L298pin4,LOW);
analogWrite(ENA,0);
analogWrite(ENB,100);
}
void right() // 小车右转
{
digitalWrite(L298pin1,HIGH);
digitalWrite(L298pin2,LOW);
digitalWrite(L298pin3,LOW);
digitalWrite(L298pin4,HIGH);
analogWrite(ENA,100);
analogWrite(ENB,0);
}
void stops() // 小车停止 暂停
{
digitalWrite(L298pin1,LOW);
digitalWrite(L298pin2,LOW);
digitalWrite(L298pin3,LOW);
digitalWrite(L298pin4,LOW);
analogWrite(ENA,0);
analogWrite(ENB,0);
}