ADXL345加速度计Arduino怎么读倾角和震动?三轴加速度计避坑

算法老K硬件DIY 2026-10-14 19:54:45 9阅读 举报

想给机器人做姿态检测、给设备做震动报警、给手机做一个能判断朝向的小装置,ADXL345是一颗很小巧的三轴加速度计。它能同时读出X、Y、Z三个方向的重力加速度分解,常用来测倾角和运动冲击。走I2C或SPI,脚不多,但倾角怎么从加速度算出来、量程怎么选,有几个点新手容易卡。这篇写清楚。

I2C接法,四根脚就够

ADXL345模块用I2C接Arduino最方便:VCC接3.3V或5V(模块板载稳压了一般都行,Adafruit这类板子做了电平转换,5V单片机也能接)、GND接地、SDA接A4、SCL接A5。它的默认I2C地址是0x53。

有一点要知道:芯片是3.3V的,但很多带板载稳压的模块可以给3V或5V的MCU用。如果模块是裸芯片没做电平转换,就用3.3V或加逻辑电平转换。另外模块上有个CS脚,接高电平(VCC)工作在I2C模式,接低才是SPI,别接反了。

读三轴,算倾角

用Adafruit的ADXL345库(或通用的传感器库),初始化后每次读event.acceleration.x/y/z,就是三个方向的重力加速度分量,单位通常是m/s²。静止时合向量会约等于9.8左右,也就是1g。

倾角就是靠这个算的:比如要算俯仰角(Pitch),常用角度 = atan2(y轴加速度 , z轴加速度),然后乘以180/π转成度数;横滚角(Roll)用atan2(x轴 , z轴)。静止的物体上这样算倾角比较准,动态运动时三个轴都叠加了运动加速度,直接套公式会有偏差。

三个高频坑,提前绕开

第一是量程和分辨率。ADXL345有±2g、±4g、±8g、±16g几档量程,默认是±2g(分辨率最高)。测震动冲击或者放在运动剧烈的东西上,要用更高量程,否则数据会饱和削顶。setRange一步就能改。

第二是动态 vs 静态。静止测倾角很准,运动起来就别指望高精度姿势了,那是陀螺仪加滤波算法的活。想兼顾,可以ADXL345加陀螺仪做姿态融合,或直接上MPU6050。

第三是电源和接线。模块别和电机共用脏电源,否则读数乱跳;CS脚如果不接会浮空导致模式不确定,I2C模式务必把它接VCC拉高。把量程、CS拉高和静止倾角算法捋对,ADXL345就是一个能测倾角、能当震动开关的小家伙,做云台姿态、摔倒检测都顺手。

版权声明:
作者:算法老K
链接:https://www.aiddithome.com/p/f5fc5b047c872.html
来源:硬件DIY
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论

量程默认±2g测大震动会削顶,setRange到±16g就好了

线比代码多
2楼 · 2天前

先量后接、别和电机共电源,照着做读数就稳了

拆开看看再说
3楼 · 2天前

CS不接高是纯坑,我一直以为是固定的,接VCC后才能走I2C

静态测倾角准但运动起来求不出姿态,想兼顾得上MPU6050,说得实在