Arduino 避障智能小车控制实验报告(含代码)
实验目的
通过使用 Arduino 控制避障智能小车,学习 Arduino 编程和电路控制的基本原理,并实现小车的自动避障功能。
实验材料
- Arduino Uno 控制板
- L298N 电机驱动模块
- HC-SR04 超声波传感器
- SG90 小型舵机
- 小车底盘、电池、电机等
- 杜邦线、面包板等
实验原理
小车控制原理
小车控制采用 Arduino Uno 板作为控制器,驱动两个电机分别控制小车前进、后退、左转、右转等动作。电机驱动使用 L298N 模块,由 Arduino 控制模块输出 PWM 控制信号,通过 L298N 模块转换为电机控制信号,实现电机的正转、反转、停止等控制动作。
超声波测距原理
超声波传感器 HC-SR04 是一种常用的测距传感器,利用超声波的反射原理测量物体与传感器之间的距离。传感器发送一个高频声波信号,然后接收来自物体反射回来的声波信号,并通过计算发送和接收之间的时间差,可以计算出物体与传感器之间的距离。
舵机控制原理
舵机是一种小型电机,可以通过控制 PWM 信号的占空比来控制其旋转的角度。在小车避障中,我们使用舵机控制超声波传感器的旋转角度,实现对周围障碍物的检测。
避障控制原理
当超声波传感器检测到前方有障碍物时,舵机会转动一定角度,使超声波传感器的探测范围扩大,然后小车会根据超声波传感器检测到的距离信息,调整行驶方向,避开障碍物。
实验步骤
- 将 L298N 模块和 Arduino Uno 连接,将电机接到 L298N 模块上。
- 将超声波传感器和舵机连接到 Arduino Uno 上。
- 编写 Arduino 程序,实现小车的避障控制。
- 将程序上传到 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 的避障智能小车控制。这些知识和技能对于我们今后的学习和工作都有很大的帮助。
原文地址: https://www.cveoy.top/t/topic/nXgI 著作权归作者所有。请勿转载和采集!