智能小车(三):舵机模块与陀螺仪模块
星期日, 11月 10, 2024 | 5分钟阅读 | 更新于 星期日, 12月 8, 2024
历史回顾
概要
本节课关注于舵机模块的使用和陀螺仪模块的使用。舵机模块在小车中控制小车转向,陀螺仪模块模块可以控制小车电机的运行速度。
安全须知
舵机模块
Servo.h
库
Servo.h
是 Arduino 的标准库,用于控制舵机。它可以控制 0-180 度的旋转角度,通过 PWM 信号来驱动伺服电机,广泛应用于小车、机器人转向等场景。
Servo myservo;
:创建一个舵机对象。
Servo myservo;
myservo.attach(pin);
将舵机连接到指定的 Arduino 引脚上。- 参数:pin:舵机信号连接的引脚(如 9)。
myservo.attach(9); // 将舵机连接到 9 号引脚
myservo.write(angle);
设置舵机的角度,控制舵机转到指定位置。- 参数:angle:舵机的目标角度(20-160 度)避免舵机卡死。
myservo.write(90); // 将舵机设置到 90 度
myservo.detach();
从引脚上分离舵机,停止控制舵机。
myservo.detach(); // 停止控制舵机
示例代码
#include <Servo.h>
Servo myservo; // 创建舵机对象
int TurnPin = 9; //转向舵机接口
void setup() {
myservo.attach(TurnPin); // 将舵机连接到 9 号引脚
}
void loop() {
myservo.write(90); // 转到 90 度
delay(1000); // 延时 1 秒
myservo.write(160); // 转到 160 度
delay(1000); // 延时 1 秒
myservo.write(40); // 转到 40 度
delay(1000); // 延时 1 秒
myservo.write(90); // 转到 90 度
delay(1000); // 延时 1 秒
}
思考
- 观察舵机控制部分的代码,它实现了什么样的运动模式?
提示 思考舵机角度变化的顺序和幅度
解析:
舵机控制的是前轮的转向,其运动序列(90° → 160° → 40° → 90°)模拟了一个完整的转向周期:
- 90°: 直行位置
- 160°: 最大右转
- 40°: 最大左转
- 回到90°: 恢复直行
函数封装与优化
- 代码优化
- 提高代码可读性:通过将功能相似的代码封装成函数,loop()函数变得更加简洁,逻辑更清晰。
- 便于维护和扩展:如果需要修改某个动作的实现,只需修改对应的函数,无需遍历整个代码。
- 代码重用性:封装的函数可以在其他地方重复使用,避免代码冗余。
// 添加函数封装和函数异常管理
#include <Servo.h>
Servo myservo; // 舵机对象
// 舵机引脚
const int TurnPin = 9;
// 初始化设置
void setup() {
Serial.begin(9600);
// 舵机初始化
myservo.attach(TurnPin);
}
// 控制舵机转向的函数,增加异常控制
void setServoAngle(int angle, int delayTime) {
// 限制角度范围
if (angle > 160) {
angle = 160;
} else if (angle < 20) {
angle = 20;
}
myservo.write(angle); // 设置舵机角度
delay(delayTime); // 延时
}
// 主循环函数
void loop() {
// 控制舵机
setServoAngle(90, 1000); // 中间位置
setServoAngle(160, 1000); // 向右转
setServoAngle(40, 1000); // 向左转
setServoAngle(180, 1000); // 超过最大角度,自动设为160
setServoAngle(10, 1000); // 低于最小角度,自动设为40
}
陀螺仪模块
MPU6050 是一款集成了三轴陀螺仪和三轴加速度计的传感器,可以测量物体的角速度和加速度。以下代码展示了如何使用 Arduino 读取 MPU6050 的陀螺仪和加速度数据。代码使用了 Wire
库进行 I2C 通信,并通过 I2Cdev
和 MPU6050
库来简化与 MPU6050 的数据交互。
代码说明
#include "Wire.h" // 引入 Wire 库,进行 I2C 通信
#include "I2Cdev.h" // 引入 I2Cdev 库,用于 I2C 通信简化
#include "MPU6050.h" // 引入 MPU6050 库,简化对 MPU6050 的操作
MPU6050 Accelgyro; // 创建 MPU6050 对象
int16_t ax, ay, az; // 定义加速度计的 x, y, z 轴数据变量
int16_t gx, gy, gz; // 定义陀螺仪的 x, y, z 轴数据变量
void setup() {
Wire.begin(); // 初始化 I2C 通信
Accelgyro.initialize(); // 初始化 MPU6050 传感器
Serial.begin(9600); // 初始化串口通信
}
void loop() {
// 读取 MPU6050 的加速度计和陀螺仪数据
Accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// 将数据打印到串口监视器
Serial.print("a/g:\t");
Serial.print(ax); Serial.print("\t");
Serial.print(ay); Serial.print("\t");
Serial.print(az); Serial.print("\t");
Serial.print(gx); Serial.print("\t");
Serial.print(gy); Serial.println(gz);
delay(300); // 延时 300 毫秒
}
代码解析
#include "Wire.h"
:Wire
库用于 I2C 通信,Arduino 的 A4 和 A5 引脚分别连接 SDA 和 SCL,允许 Arduino 与 MPU6050 进行数据通信。#include "I2Cdev.h"
和#include "MPU6050.h"
:I2Cdev
和MPU6050
库用于简化 I2C 设备的读写操作和 MPU6050 传感器的初始化与数据读取。MPU6050 Accelgyro;
:创建一个MPU6050
类的对象Accelgyro
,用于访问 MPU6050 的数据和方法。Accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
:调用getMotion6()
函数一次性读取加速度计和陀螺仪的所有轴数据,并将其存储在ax
、ay
、az
、gx
、gy
、gz
变量中。Serial.print()
:将加速度和角速度的数值打印到串口监视器上,用于实时查看 MPU6050 传感器的数据。
主要 API 使用说明
Accelgyro.initialize()
- 功能:初始化 MPU6050 传感器,使其处于工作状态。
- 用法:
Accelgyro.initialize();
- 说明:该函数会设置 MPU6050 的配置寄存器和默认测量范围,使设备可以正常采集加速度和角速度数据。
Accelgyro.getMotion6(int16_t *ax, int16_t *ay, int16_t *az, int16_t *gx, int16_t *gy, int16_t *gz)
- 功能:一次性读取加速度计和陀螺仪的 x、y、z 轴数据。
- 参数:
ax, ay, az
:存储加速度计 x、y、z 轴的变量指针。gx, gy, gz
:存储陀螺仪 x、y、z 轴的变量指针。
- 用法:
Accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
- 说明:读取 MPU6050 的加速度和角速度数据,单位为原始数据格式,需要根据数据手册进行单位转换(如需要加速度的 m/s²,或角速度的 °/s)。
Accelgyro.getAcceleration(int16_t *ax, int16_t *ay, int16_t *az)
- 功能:单独读取加速度计的 x、y、z 轴数据。
- 参数:
ax, ay, az
:存储 x、y、z 轴加速度数据的变量指针。 - 用法:
Accelgyro.getAcceleration(&ax, &ay, &az);
- 说明:如果只需要加速度数据,可以用该函数替代
getMotion6()
。
Accelgyro.getRotation(int16_t *gx, int16_t *gy, int16_t *gz)
- 功能:单独读取陀螺仪的 x、y、z 轴数据。
- 参数:
gx, gy, gz
:存储 x、y、z 轴陀螺仪数据的变量指针。
- 用法:
Accelgyro.getRotation(&gx, &gy, &gz);
- 说明:如果只需要角速度数据,可以用该函数替代
getMotion6()
。
串口输出示例
在串口监视器中,将输出如下格式的数据(加速度和陀螺仪数据):
a/g: 152 -128 1024 50 -60 25
a/g: 150 -125 1020 45 -55 30
...
第三方库添加
陀螺仪模块代码需要调用第三方库的C++代码
- 添加library的参考博文
- 添加library的下载地址
- 添加library后的实现效果参考下图: