尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Johnny-Five Accelerometer 入门指南:在 Arduino 上读取三轴加速度、倾角与方向

Johnny-Five Accelerometer 入门指南:在 Arduino 上读取三轴加速度、倾角与方向 IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载导读本文以 Johnny-Five 的 docs/accelerometer.md 为基础系统讲解如何在 Node.js 中通过 Johnny-Five 的Accelerometer类读取三轴加速度计数据并实时换算为pitch俯仰角、roll横滚角、acceleration合加速度、inclination倾角与orientation方向等物理量。读完本文你将掌握模拟加速度计默认 LIS344AL的接线方法、配置参数pins、sensitivity、zeroV的含义与取值方式、基于change事件的事件驱动编程范式以及如何在 ADXL335、ADXL345、MMA7361、MPU6050 等常见控制器之间平滑切换。Fritzing 源文件docs/breadboard/accelerometer.fzz硬件接线三路模拟输出如何接入 Arduino模拟加速度计例如 LIS344AL、ADXL326、MMA7361通过X / Y / Z 三路模拟电压输出表征三轴受力因此只需要三个模拟输入引脚即可接入。接线要点如下加速度计的5V→ Arduino 的5V加速度计的GND→ Arduino 的GND加速度计的X→ Arduino 的模拟引脚示例中使用A3加速度计的Y→ Arduino 的模拟引脚示例中使用A4加速度计的Z→ Arduino 的模拟引脚示例中使用A5。Johnny-Five 仓库在 docs/breadboard 目录下为每种控制器都准备了接线图与 Fritzing 工程文件例如 docs/breadboard/accelerometer.png 与 docs/breadboard/accelerometer.fzz可以在动手接线前对照检查。第一个示例默认模拟控制器LIS344AL原文档给出的完整示例位于 eg/accelerometer.js运行方式node eg/accelerometer.js完整代码const { Accelerometer, Board } require(johnny-five); const board new Board(); board.on(ready, () { const accelerometer new Accelerometer({ pins: [A3, A4, A5], // Adjust the following for your device. // These are the default values (LIS344AL) // sensitivity: 96, // mV/degree/seconds zeroV: 478 // volts in ADC }); accelerometer.on(change, () { const {acceleration, inclination, orientation, pitch, roll, x, y, z} accelerometer; console.log(Accelerometer:); console.log( x : , x); console.log( y : , y); console.log( z : , z); console.log( pitch : , pitch); console.log( roll : , roll); console.log( acceleration : , acceleration); console.log( inclination : , inclination); console.log( orientation : , orientation); console.log(--------------------------------------); }); });这段代码做了三件事以默认的ANALOG控制器初始化三轴加速度计在每个采样点发生变化时解构出全部派生物理量将其打印到控制台。核心参数pins、sensitivity 与 zeroV 的物理含义原文档特别强调Adjust the following for your device即sensitivity与zeroV必须按器件数据手册调整。它们对应 lib/accelerometer.js 中Controllers.ANALOG的默认值ANALOG: { DEFAULTS: { value: { zeroV: 478, sensitivity: 96 } }, initialize: { value: analogInitialize }, toGravity: { value: analogToGravity } }两个参数的含义sensitivity灵敏度加速度计模拟输出的比例因子单位约mV/(deg/s²)源码注释中写作 mV/degree/seconds。LIS344AL 的默认值是96。它把 ADC 读数与重力的比值关联起来值越小同样 ADC 读数对应的加速度越大。zeroV零加速度基准电压设备静止在水平面上时各轴 ADC 读数的中心值即 0g 对应的读数。LIS344AL 的默认值是478。它既可以是一个标量也可以是长度为 3 的数组见下文的 MMA7361 控制器。从源码看模拟控制器把 ADC 原始读数换算成 g 值的过程是function analogToGravity(value, axis) { const state priv.get(this); let zeroV state.zeroV; if (Array.isArray(zeroV) zeroV.length 0) { const axisIndex axes.indexOf(axis); zeroV zeroV[axisIndex || 0]; } return (value - zeroV) / state.sensitivity; }即g (ADC读数 - zeroV) / sensitivity。zeroV支持传入三元数组为每个轴单独指定 0g 基准这对存在装配偏差或三轴输出不对称的器件很有用。事件驱动的数据流data、change 与派生属性Accelerometer继承自 lib/mixins/emitter.js 的事件发射器基类定义见 lib/accelerometer.js 中的class Accelerometer extends Emitter初始化时对每个引脚调用io.analogRead在 lib/board.js 的采样时钟驱动下不断触发事件data事件每次采样窗口刷新后触发载荷为{ x, y, z }三个轴的原始换算值见 lib/accelerometer.js。change事件当acceleration、orientation或inclination任一发生数值变化时触发见 lib/accelerometer.js。原文档示例正是监听该事件来打印全部属性。读取到的原始值会先进入一个长度为 5 的滑动窗口stash做均值平滑再经toGravity换算sensor.previous sensor.value; sensor.stash.shift(); sensor.stash.push(value); sensor.value (sum(sensor.stash) / 5) | 0;在 lib/accelerometer.js 中以下派生物理量以只读 getter 形式暴露属性含义计算方式源码要点x/y/z各轴加速度单位 gtoGravity(state.axis.value, axis)Z 轴在缺少第三个引脚时返回 0pitch俯仰角度有 Z 轴时Math.atan2(x, Math.hypot(y, z))否则Math.asin(constrain(x, -1, 1))再乘RAD_TO_DEG并保留两位小数roll横滚角度有 Z 轴时Math.atan2(y, Math.hypot(x, z))否则Math.asin(constrain(y, -1, 1))acceleration三轴合加速度Math.sqrt(x² y² z²)使用fma累加见magnitude()inclination倾角度Math.atan2(y, x) * RAD_TO_DEGorientation方向标识比较各轴绝对值返回±1X 轴、±2Y 轴、±3Z 轴或0pitch与roll的完整定义可对照 lib/accelerometer.js。这两类角度通过Math.atan2与Math.hypot计算避免了单一轴反三角函数的象限歧义是加速度计做姿态解算的标准做法。控制器体系从模拟到 I2C 的完整支持矩阵原文档的 Additional Notes 列出了三类可替换器件MMA7361、ADXL326、LIS344AL。实际上 lib/accelerometer.js 的Controllers对象还注册了更多控制器并在末尾做了别名映射Controllers.TINKERKIT Controllers.ANALOG; Controllers.MMA8452Q Controllers.MMA8452; Controllers.DEFAULT Controllers.ANALOG;仓库中每种控制器都有独立的示例与接线文档控制器通信方式对应文档对应示例ANALOG默认LIS344AL模拟引脚docs/accelerometer.mdeg/accelerometer.jsADXL335模拟引脚docs/accelerometer-adxl335.mdeg/accelerometer-adxl335.jsMMA7361模拟引脚docs/accelerometer-mma7361.mdeg/accelerometer-mma7361.jsADXL345I2Cdocs/accelerometer-adxl345.mdeg/accelerometer-adxl345.jsMPU6050I2C通过sip.js的Driversdocs/accelerometer-mpu6050.mdeg/accelerometer-mpu6050.jsMMA8452/MMA8452QI2Cdocs/accelerometer-MMA8452.mdeg/accelerometer-MMA8452.jsLIS3DHI2Cdocs/accelerometer-LIS3DH.mdeg/accelerometer-LIS3DH.jsMMA7660I2Cdocs/accelerometer-mma7660.mdeg/accelerometer-mma7660.js每个控制器都通过DEFAULTS默认参数、initialize初始化与数据回调和toGravity原始值 → g 值换算三个槽位接入统一架构上层 API 完全一致因此只需修改controller与接线即可迁移硬件。进阶场景一ADXL335 模拟控制器接线图与 Fritzing 文件见 docs/breadboard/accelerometer-adxl335.png 与 docs/breadboard/accelerometer-adxl335.fzz示例运行命令node eg/accelerometer-adxl335.js核心代码const { Accelerometer, Board } require(johnny-five); const board new Board(); board.on(ready, () { const accelerometer new Accelerometer({ controller: ADXL335, pins: [A0, A1, A2] }); accelerometer.on(change, () { const {acceleration, inclination, orientation, pitch, roll, x, y, z} accelerometer; console.log(Accelerometer:); console.log( x : , x); console.log( y : , y); console.log( z : , z); console.log( pitch : , pitch); console.log( roll : , roll); console.log( acceleration : , acceleration); console.log( inclination : , inclination); console.log( orientation : , orientation); console.log(--------------------------------------); }); });从 lib/accelerometer.js 可以看到 ADXL335 内置了与 LIS344AL 不同的出厂默认值ADXL335: { DEFAULTS: { value: { zeroV: 330, sensitivity: 66.5 } }, ... toGravity: { value(value, axis) { // Page 3, Table 1 // Typical range - 3.6g // Sensitivity: 300mV/g // MaxSensitvity: 330mv/g return toFixed(analogToGravity.call(this, value, axis), 3); } } }即 ADXL335 的zeroV默认 330、sensitivity默认 66.5量程典型值为 ±3.6g、灵敏度 300mV/g。指定controller: ADXL335后无需再手动填写这两个参数当然也可以像默认示例那样显式覆盖。进阶场景二MMA7361 模拟控制器与自动校准接线与示例node eg/accelerometer-mma7361.js核心代码含原文档中的完整注释const { Accelerometer, Board } require(johnny-five); const board new Board(); board.on(ready, () { // --- Sleep Pin // The sleepPin is used to enable/disable the device and put it into sleep mode // You can also tie the sleep pin to high with a 10k resistor and omit // this option // --- Calibration of zero-G readings (zeroV) // This device also benefits from a calibration step. You can autoCalibrate // by placing the device level on startup. You can also read the calibrated // centers by reading the accelerometer.zeroV array after calibration. Subsequent // initializations, you can omit the autoCalibrate and set the zeroV array // in the options instead const accelerometer new Accelerometer({ controller: MMA7361, pins: [A0, A1, A2], sleepPin: 13, autoCalibrate: true }); accelerometer.on(change, () { const {acceleration, inclination, orientation, pitch, roll, x, y, z} accelerometer; console.log(Accelerometer:); console.log( x : , x); console.log( y : , y); console.log( z : , z); console.log( pitch : , pitch); console.log( roll : , roll); console.log( acceleration : , acceleration); console.log( inclination : , inclination); console.log( orientation : , orientation); console.log(--------------------------------------); }); });该示例引入两个原文档docs/accelerometer-mma7361.md重点讲解的机制sleepPin休眠引脚sleepPin: 13让 Johnny-Five 在初始化时将该引脚置高以唤醒器件并通过enable()/disable()方法控制休眠与唤醒见 lib/accelerometer.js 的MMA7361控制器与enabledChanged。若硬件上将 sleep 引脚经 10k 电阻上拉到高电平则可省略该选项。autoCalibrate自动校准启动时保持器件水平autoCalibrate: true会让库在前 10 个采样点内自动采集各轴中心值并写入zeroV其中 Z 轴还会再减去一个sensitivity以抵消重力偏置。校准完成后可通过accelerometer.zeroV数组读取结果后续初始化即可直接传入该数组、去掉autoCalibrate。相关实现见 lib/accelerometer.js。MM7361 的出厂默认值为zeroV: [372, 372, 287]、sensitivity: 170对应 1.5g 档 800mV/g、6g 档 221.5mV/g 的灵敏度lib/accelerometer.js。进阶场景三ADXL345 等 I2C 控制器当使用 I2C 加速度计如 ADXL345、MMA8452、MPU6050、LIS3DH时不再需要pins选项。以 ADXL345 为例node eg/accelerometer-adxl345.jsconst { Accelerometer, Board } require(johnny-five); const board new Board(); board.on(ready, () { const accelerometer new Accelerometer({ controller: ADXL345, // Optionally set the range to one of // 2, 4, 8, 16 (±g) // Defaults to ±2g // range: ... }); accelerometer.on(change, () { const {acceleration, inclination, orientation, pitch, roll, x, y, z} accelerometer; console.log(Accelerometer:); console.log( x : , x); console.log( y : , y); console.log( z : , z); console.log( pitch : , pitch); console.log( roll : , roll); console.log( acceleration : , acceleration); console.log( inclination : , inclination); console.log( orientation : , orientation); console.log(--------------------------------------); }); });ADXL345 控制器的初始化逻辑lib/accelerometer.js展示了 Johnny-Five 的 I2C 驱动模式默认地址0x53通过i2cWrite写入POWER(0x2D)寄存器退出待机、使能测量通过DATA_FORMAT(0x31)设置量程与全分辨率位最后用i2cRead从DATAX0(0x32)连续读取 6 字节X/Y/Z 各 16 位补码并回调。可配置项包括range量程取2 / 4 / 8 / 16±g默认2。源码中FULL_RES位开启后各量程均保持 256 LSB/g 分辨率0.00390625 g/LSB。addressI2C 地址默认0x53。同样MPU6050 只需要controller: MPU6050示例见 eg/accelerometer-mpu6050.js其灵敏度默认 16384 LSB/g对应 ±2g 全量程 16 位 ADC见 lib/accelerometer.js数据来自sip.js的Drivers驱动层。这也说明无论底层是模拟引脚还是 I2C 总线Accelerometer对外暴露的事件与派生属性都保持统一。编程接口速查方法、属性与事件Accelerometer实例原型方法见 test/accelerometer.js 中this.proto与this.instance的断言清单对外提供方法enable()/disable()启用 / 停用采样对支持 sleep 引脚的器件如 MMA7361 会同步控制硬件休眠见 lib/accelerometer.js。hasAxis(axis)判断某轴是否已有数据x | y | zZ 轴缺失时pitch/roll会退化为基于单轴的asin近似计算。属性只读x、y、z、pitch、roll、acceleration、inclination、orientation、zeroV。事件data每次采样窗口刷新载荷{ x, y, z }。change派生量变化时触发原文档示例监听该事件。部分 I2C 控制器MMA8452、LIS3DH额外支持tap、tap:single、tap:double敲击检测见 lib/accelerometer.js 与 lib/accelerometer.js。从模拟到 I2C如何选择合适的控制器结合本文与仓库各控制器文档选择原则可以总结为模拟三轴器件LIS344AL / ADXL335 / MMA7361接线简单、即插即用适合原型验证必须按数据手册填写或校准zeroV与sensitivity。I2C 器件ADXL345 / MMA8452 / MPU6050 / LIS3DH占用引脚少、可配置量程与采样率部分支持敲击检测只需指定controller可选range/address/odr。需要姿态角度时监听change直接读取pitch/roll/inclination/orientationacceleration是三轴合加速度可用于振动与运动检测。各控制器的详细接线与示例文档可在 docs 目录下按accelerometer-*.md命名检索对应的可运行示例统一位于 eg 目录可直接用node eg/accelerometer-controller.js启动验证。参考资料原文档docs/accelerometer.md核心实现lib/accelerometer.js默认示例eg/accelerometer.js相关控制器文档docs/accelerometer-adxl335.md、docs/accelerometer-adxl345.md、docs/accelerometer-mma7361.md、docs/accelerometer-mpu6050.md、docs/accelerometer-MMA8452.md、docs/accelerometer-LIS3DH.md测试用例test/accelerometer.js赞分享IoT机器人嵌入式【免费下载链接】johnny-fiveJavaScript Robotics and IoT programming framework, developed at Bocoup.项目地址https://gitcode.com/gh_mirrors/jo/johnny-five点击查看免费下载相关推荐Johnny-Five 指南使用 HMC5883L 三轴数字罗盘传感器获取方向角与方位角Johnny Five 指南使用 HMC5883L 三轴数字罗盘传感器获取方向角与方位角 本文是一份围绕 Johnny Five 开源库JavaScriptIoT机器人嵌入式Johnny-Five 温度传感器实战在 Arduino 上使用 MPL3115A2 读取温度Thermometer 指南Johnny Five 温度传感器实战在 Arduino 上使用 MPL3115A2 读取温度Thermometer 指南 导读 本文以 Johnny FIoT机器人嵌入式Johnny-Five 加速度计驱动云台基于 Accelerometer 的 Pan/Tilt 双轴随动控制实战Johnny Five 加速度计驱动云台基于 Accelerometer 的 Pan/Tilt 双轴随动控制实战 导读 本文围绕 Johnny Five 官方IoT机器人嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表