实验08:板载六轴,加速度计与陀螺仪
这个实验做完你会得到什么
不接任何元件,倾斜 Arduino 101,手机上的小球跟着滚;转动板子,屏幕上显示两个方向的 倾角;用力晃一下,弹出提示。
Arduino 101 板载 Intel Curie 的六轴传感器(三轴加速度 + 三轴陀螺),
这两个组件不需要 Pin 属性 —— 传感器就在芯片里。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 35 分钟 |
| 前置 | 实验01:板载 LED 闪烁 |
改编自 MIT 官方教程 Accelerometer 与 Gyroscope,两者合并为一篇(都是板载六轴, 用法一致)。完成品工程:Arduino101Accelerometer.aia / Arduino101Gyroscope.aia
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | 不需要任何外接元件 |
固件:.ino 里把 ACCELEROMETER(或 GYROSCOPE)设为 ENABLED,其余 DISABLED。
两个都想玩就都开。
二、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 画布 | 画布1 |
宽度充满、高度 300 |
| 图像精灵 | 图像精灵_小球 |
30×30 |
| 标签 | 标签_三轴 |
文本「X – Y – Z –」 |
| 标签 | 标签_角度 |
文本「倾角 – / –」 |
| 对话框 | 对话框1 |
不可见 |
| Arduino101Accelerometer | Arduino101Accelerometer1 |
不可见,BluetoothDevice = BluetoothLE1(无 Pin 属性) |
| Arduino101Gyroscope | Arduino101Gyroscope1 |
不可见,BluetoothDevice = BluetoothLE1(无 Pin 属性) |
这两个组件没有
Pin属性 —— 传感器集成在主控芯片里,不占用任何引脚。
三、分步搭代码块
第 1 步:订阅两路数据
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接,倾斜板子试试"
Arduino101Accelerometer1.RequestAccelerometerDataUpdates()
Arduino101Gyroscope1.RequestGyroscopeDataUpdates()
}
中途验证:状态标签更新。
第 2 步:加速度计驱动小球
global 平滑X = 0
global 平滑Y = 0
when Arduino101Accelerometer1.AccelerometerDataReceived(Accelerometer_X, Accelerometer_Y, Accelerometer_Z) {
global 平滑X = 平滑X * 0.6 + Accelerometer_X * 0.4
global 平滑Y = 平滑Y * 0.6 + Accelerometer_Y * 0.4
标签_三轴.Text = join("X ", round(Accelerometer_X * 100) / 100, " Y ", round(Accelerometer_Y * 100) / 100, " Z ", round(Accelerometer_Z * 100) / 100)
var 新X = 画布1.Width / 2 + 平滑X * (画布1.Width / 2)
var 新Y = 画布1.Height / 2 - 平滑Y * (画布1.Height / 2)
图像精灵_小球.MoveTo(max(0, min(画布1.Width - 30, 新X)), max(0, min(画布1.Height - 30, 新Y)))
}
中途验证:板子平放时小球在中间,倾斜时小球朝低的一侧滚。
量程:组件文档写明三轴值的单位是 G(1 G = 9.8 m/s²)的倍数,平放时某一轴约 ±1, 所以直接乘半个画布宽即可 —— 不需要像 micro:bit 那样除以 1000(那边是毫 G)。
Y 轴用减号:屏幕坐标 Y 向下,传感器 Y 向上,不取反会上下颠倒。
第 3 步:陀螺仪显示倾角
when Arduino101Gyroscope1.GyroscopeDataReceived(X_Angle, Y_Angle) {
标签_角度.Text = join("倾角 X ", round(X_Angle), "° Y ", round(Y_Angle), "°")
}
中途验证:转动板子,两个角度值跟着变。
注意这个事件只有两个参数(X_Angle、Y_Angle),不是三个 —— 组件已经把陀螺仪的 角速度积分成了倾角,直接可用。
第 4 步:摇晃检测
global 上次强度 = 0
when Arduino101Accelerometer1.AccelerometerDataReceived(Accelerometer_X, Accelerometer_Y, Accelerometer_Z) {
var 强度 = abs(Accelerometer_X) + abs(Accelerometer_Y) + abs(Accelerometer_Z)
if 强度 - 上次强度 > 1.2 {
对话框1.ShowAlert("检测到摇晃")
画布1.BackgroundColor = "&HFFFFC107"
}
global 上次强度 = 强度
}
中途验证:用力晃一下板子弹出提示;轻轻挪动不会误触发。
比较的是变化量不是绝对值:静止时三轴绝对值之和本来就约等于 1(重力), 只有突变才是摇晃。阈值 1.2 偏保守,想灵敏就降到 0.8。
四、排错表
| 现象 | 原因与处理 |
|---|---|
| 收不到数据 | ① 没订阅;② 固件里对应项没 ENABLED;③ BluetoothDevice 没设 |
想设 Pin 但找不到 |
这两个组件没有 Pin —— 板载传感器不占引脚 |
| 小球瞬间飞出屏幕 | 剧烈晃动时瞬时加速度会远超 1 G。max/min 夹紧已经兜住,若仍太灵敏就把系数减半 |
| 小球上下反了 | Y 轴没取反,公式里要用减号 |
| 小球乱抖 | 加大平滑(0.4 降到 0.2) |
| 陀螺仪事件参数写了三个 | 只有两个(X_Angle、Y_Angle),多写会报错 |
| 摇晃误触发 | 用了绝对值而非变化量;或阈值太低 |
五、下一步
- 实验09:PWM 电机 —— 让东西转起来
- 实验10:舵机 —— 精确角度控制
相关文档
- Arduino101Accelerometer 组件参考 / Arduino101Gyroscope
- 官方原版教程(英文,已标注过时):加速度计 / 陀螺仪
扫码添加客服咨询