Arduino 101 实验08 - 板载六轴:加速度计与陀螺仪

« 返回 Arduino101 平台  IoT 专题

实验08:板载六轴,加速度计与陀螺仪

这个实验做完你会得到什么

不接任何元件,倾斜 Arduino 101,手机上的小球跟着滚;转动板子,屏幕上显示两个方向的 倾角;用力晃一下,弹出提示。

Arduino 101 板载 Intel Curie 的六轴传感器(三轴加速度 + 三轴陀螺), 这两个组件不需要 Pin 属性 —— 传感器就在芯片里。

项目 说明
难度 ★★☆☆☆
用时 约 35 分钟
前置 实验01:板载 LED 闪烁

改编自 MIT 官方教程 AccelerometerGyroscope,两者合并为一篇(都是板载六轴, 用法一致)。完成品工程: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),多写会报错
摇晃误触发 用了绝对值而非变化量;或阈值太低

五、下一步


相关文档

文档反馈