智能小车(三):舵机模块与陀螺仪模块

智能小车(三):舵机模块与陀螺仪模块

智能小车(三):舵机模块与陀螺仪模块星期日, 11月 10, 2024

| 5分钟阅读

| 更新于

星期日, 12月 8, 2024

YuanFeng Xie历史回顾智能小车(零):Arduino编程智能小车(一):Arduino介绍智能小车(二):超声波模块与蜂鸣器模块概要本节课关注于舵机模块的使用和陀螺仪模块的使用。舵机模块在小车中控制小车转向,陀螺仪模块模块可以控制小车电机的运行速度。

安全须知Previous

Next

/

[pdf]舵机模块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 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 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后的实现效果参考下图:

相关文章