带调速功能的arduino摇头避障小车

在这里插入图片描述
一、材料同上篇文章;
二、接线同上篇文章。
在这里插入图片描述
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);
    
}

版权声明:本文为nkd50000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。