实验目的

通过使用 Arduino 控制避障智能小车,学习 Arduino 编程和电路控制的基本原理,并实现小车的自动避障功能。

实验材料

  1. Arduino Uno 控制板
  2. L298N 电机驱动模块
  3. HC-SR04 超声波传感器
  4. SG90 小型舵机
  5. 小车底盘、电池、电机等
  6. 杜邦线、面包板等

实验原理

小车控制原理

小车控制采用 Arduino Uno 板作为控制器,驱动两个电机分别控制小车前进、后退、左转、右转等动作。电机驱动使用 L298N 模块,由 Arduino 控制模块输出 PWM 控制信号,通过 L298N 模块转换为电机控制信号,实现电机的正转、反转、停止等控制动作。

超声波测距原理

超声波传感器 HC-SR04 是一种常用的测距传感器,利用超声波的反射原理测量物体与传感器之间的距离。传感器发送一个高频声波信号,然后接收来自物体反射回来的声波信号,并通过计算发送和接收之间的时间差,可以计算出物体与传感器之间的距离。

舵机控制原理

舵机是一种小型电机,可以通过控制 PWM 信号的占空比来控制其旋转的角度。在小车避障中,我们使用舵机控制超声波传感器的旋转角度,实现对周围障碍物的检测。

避障控制原理

当超声波传感器检测到前方有障碍物时,舵机会转动一定角度,使超声波传感器的探测范围扩大,然后小车会根据超声波传感器检测到的距离信息,调整行驶方向,避开障碍物。

实验步骤

  1. 将 L298N 模块和 Arduino Uno 连接,将电机接到 L298N 模块上。
  2. 将超声波传感器和舵机连接到 Arduino Uno 上。
  3. 编写 Arduino 程序,实现小车的避障控制。
  4. 将程序上传到 Arduino Uno 控制板,测试小车避障控制效果。

实验代码

#include <Servo.h>
Servo myservo;    //定义舵机对象
int pos = 90;     //定义舵机初始角度
int trigPin = 7;  //超声波信号发射引脚
int echoPin = 6;  //超声波信号接收引脚
int motorPin1 = 9; //电机控制引脚1
int motorPin2 = 10; //电机控制引脚2
int motorSpeed = 200; //电机转速
int safeDistance = 20; //安全距离

void setup(){
  pinMode(trigPin, OUTPUT); //设置超声波信号发射引脚为输出模式
  pinMode(echoPin, INPUT); //设置超声波信号接收引脚为输入模式
  pinMode(motorPin1, OUTPUT); //设置电机控制引脚1为输出模式
  pinMode(motorPin2, OUTPUT); //设置电机控制引脚2为输出模式
  myservo.attach(11); //将舵机连接到引脚11
  myservo.write(pos); //将舵机初始角度设为90度
}

void loop(){
  int distance = measureDistance(); //测量前方障碍物距离
  if(distance < safeDistance){ //如果距离小于安全距离
    avoidObstacle(); //避开障碍物
  }else{ //否则前进
    forward();
  }
}

int measureDistance(){
  digitalWrite(trigPin, LOW); //将超声波信号发射引脚设置为低电平
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); //将超声波信号发射引脚设置为高电平
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW); //将超声波信号发射引脚设置为低电平
  int duration = pulseIn(echoPin, HIGH); //计算超声波信号往返时间
  int distance = duration / 58; //计算距离
  return distance;
}

void forward(){
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  analogWrite(motorSpeed);
}

void backward(){
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  analogWrite(motorSpeed);
}

void left(){
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  analogWrite(motorSpeed);
}

void right(){
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  analogWrite(motorSpeed);
}

void avoidObstacle(){
  int left_distance = measureDistance(); //测量左侧距离
  myservo.write(pos - 45); //将舵机转向左侧
  delay(500);
  int right_distance = measureDistance(); //测量右侧距离
  myservo.write(pos + 45); //将舵机转向右侧
  delay(500);
  if(left_distance < safeDistance && right_distance < safeDistance){
    backward(); //后退
    delay(1000);
    left(); //左转
    delay(1000);
  }else if(left_distance < safeDistance){
    right(); //右转
    delay(1000);
  }else if(right_distance < safeDistance){
    left(); //左转
    delay(1000);
  }else{
    forward();
  }
  myservo.write(pos);
}

实验结果

完成实验后,我们可以通过电脑串口监视器查看小车的运行情况。当小车检测到前方有障碍物时,会自动避开障碍物,保持安全距离。我们也可以通过调整程序中的参数,改变小车的运行速度、安全距离等参数,进一步优化小车的性能。

实验总结

通过本次实验,我们学习了 Arduino 编程和电路控制的基本原理,了解了超声波传感器、舵机和 L298N 电机驱动模块的工作原理,并成功实现了基于 Arduino 的避障智能小车控制。这些知识和技能对于我们今后的学习和工作都有很大的帮助。

Arduino 避障智能小车控制实验报告(含代码)

原文地址: https://www.cveoy.top/t/topic/nXgI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录