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

星期日, 11月 10, 2024 | 5分钟阅读 | 更新于 星期日, 12月 8, 2024

YuanFeng Xie

历史回顾

概要

本节课关注于舵机模块的使用和陀螺仪模块的使用。舵机模块在小车中控制小车转向,陀螺仪模块模块可以控制小车电机的运行速度。

安全须知

    / [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.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 秒
}

思考

  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 通信,并通过 I2CdevMPU6050 库来简化与 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 毫秒
}

代码解析

  1. #include "Wire.h"Wire 库用于 I2C 通信,Arduino 的 A4 和 A5 引脚分别连接 SDA 和 SCL,允许 Arduino 与 MPU6050 进行数据通信。

  2. #include "I2Cdev.h"#include "MPU6050.h"I2CdevMPU6050 库用于简化 I2C 设备的读写操作和 MPU6050 传感器的初始化与数据读取。

  3. MPU6050 Accelgyro;:创建一个 MPU6050 类的对象 Accelgyro,用于访问 MPU6050 的数据和方法。

  4. Accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);:调用 getMotion6() 函数一次性读取加速度计和陀螺仪的所有轴数据,并将其存储在 axayazgxgygz 变量中。

  5. 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++代码

三方库与对应代码的位置参考

© 2024 小谢同学的修行小屋

🌱 Powered by Hugo with theme Dream.

关于我

一名喜欢RUST的菜鸟程序员

教育背景(研二在读)

  • 2019.09 - 2023.06 天津大学 · 智能与计算学部 · 网络安全专业 · 全日制 · 本科
  • 2023.09 - 2026.06 天津大学 · 智能与计算学部 · 电子信息专业 · 全日制 · 硕士研究生
浏览器漏洞挖掘项目

V8引擎的模糊测试工具改进

时间:2021.09-2022.04

内容:聚焦于优化JavaScript引擎的测试方法。研究团队基于SOAT改进部署了V8引擎测试环境,并通过分析测例覆盖率和已知CVE,优化了测试流程。

成果:成功捕获了一个谷歌引擎的逻辑漏洞,获得了修复反馈

JS引擎WASM模块漏洞挖掘研究

时间:2023.11-2024.4

内容:阅读标准手动编写了WASM语法规则,调研了主流JS引擎的WASM支持情况,并基于V8构建了WASM二进制框架。

成果:语法规则、调研报告和二进制构建框架,成功捕获特性缺陷并得到修复

数据库缺陷研究项目

关系型数据库缺陷的实证研究

时间:2022.12-2023.11

内容:通过构建统一的数据库逻辑框架,系统收集并分析了大量数据库缺陷。对777个缺陷进行了深入分析,特别聚焦SQL数据类型问题,并据此改进了模糊测试方法。

成果:构建缺陷数据集, 开发SQLT测试框架

网络协议漏洞挖掘项目

基于 RFC的 SSL/TLS模糊测试

时间:2024.4 – today

内容:梳理TLS协议模糊测试的相关工作,关注基于状态机的网络协议模糊测试方法。复现历史漏洞,了解TLS报文结构,追溯相关漏洞代码。分析RFC文档,提取字段约束,构建状态转移范式,并据此完善了TLS协议的有限状态机模型。

成果:完成相关工作调研, 漏洞复现报告, 状态范式数据集