简介
在之前的文章中,介绍了MPU6050
《12.树莓派3B+ MPU6050 两轴姿态显示》和HMC5883L
《14.树莓派3B+ 获取HMC5883L的磁场数据》。这里的ADXL345
又是IIC的操作,是代码没什么区别,就是每个传感器芯片的寄存器的差异和数据转换问题。
ADXL345
是一款小而薄的超低功耗3轴加速度计,分辨率 高(13位),测量范围达± 16g。数字输出数据为16位二进制补码格式,可通过SPI
(3线或4线)或I2C
数字接口访问。ADXL345
非常适合移动设备应用。它可以在倾斜检测应用 中测量静态重力加速度,还可以测量运动或冲击导致的动 态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的 倾斜角度变化。
工作原理
ADXL345
是一款完整的3轴加速度测量系统,可选择的测量范围有±2 g,±4 g,±8 g或±16 g。既能测量运动或冲击导致的动 态加速度,也能测量静止加速度,例如重力加速度,使得器 件可作为倾斜传感器使用。该传感器为多晶硅表面微加工结构,置于晶圆顶部。由于应 用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力 量阻力。差分电容由独立固定板和活动质量连接板组成,能对结构偏 转进行测量。加速度使惯性质量偏转、差分电容失衡,从而 传感器输出的幅度与加速度成正比。相敏解调用于确定加速 度的幅度和极性。
从这个图看这个芯片也是很简单的,实际看寄存器表,发现也没几个需要我们操作的寄存器。
也就是几个可以读写的寄存器中的一部分是需要我们设置的,如果需要的进度要求高就需要仔细阅读数据手册和操作了。
驱动代码
var i2c = require('i2c-bus');
var EARTH_GRAVITY_MS2 = 9.80665;
var SCALE_MULTIPLIER = 0.004;
function adxl345( i2cbus, mpuaddress ) {
if (!(this instanceof adxl345)) {
return new adxl345(i2cbus, mpuaddress);
}
this.address = mpuaddress;
this.bus = i2c.openSync(i2cbus);
this.bus.writeByteSync(this.address, 0x31,0x0B); // 全分辨率 ±16g
this.bus.writeByteSync(this.address, 0x2C,0x08); // 数据输出 25Hz 带宽12.5Hz
this.bus.writeByteSync(this.address, 0x2D,0x08); // 测量模式 普通工作模式
this.bus.writeByteSync(this.address, 0x2E,0x80); // 使能 DATA_READY 中断
}
// i2c读取adxl345原始数据
adxl345.prototype.read_raw_data = function (addr) {
var high = this.bus.readByteSync(this.address, addr);
var low = this.bus.readByteSync(this.address, addr+1);
var value = (high << 8) + low; // 高8位 左移8位 组装成16位的数据
if (value > 32768) {
value = value - 65536;
}
return value;
};
// 读取器件ID
adxl345.prototype.get_devid = function() {
var devid = this.bus.readByteSync(this.address, 0x00);
return devid;
}
// 读取角速度值
// False (default): result is returned in m/s^2
// True : result is returned in gs
adxl345.prototype.get_xyz_data = function(gforce = False) {
var x = this.read_raw_data(0x32);
var y = this.read_raw_data(0x34);
var z = this.read_raw_data(0x36);
var gyro_xyz = {
x:x,
y:y,
z:z
}
x = x * SCALE_MULTIPLIER;
y = y * SCALE_MULTIPLIER;
z = z * SCALE_MULTIPLIER;
var accel = {
x: gforce ? x : x * EARTH_GRAVITY_MS2,
y: gforce ? y : y * EARTH_GRAVITY_MS2,
z: gforce ? z : z * EARTH_GRAVITY_MS2
}
return {
gyro_xyz: gyro_xyz,
accel: accel
};
}
// 获取adxl345数据
adxl345.prototype.get_adxl345Data = function() {
var xyzData = this.get_xyz_data();
var devid = this.get_devid();
var adxl345Data = {
gyro_xyz: xyzData.gyro_xyz,
accel: xyzData.accel,
devid: devid
}
return adxl345Data;
}
module.exports = adxl345;
其实这个芯片是不准备玩的,但是在研究MPU6050
,这个也可以IIC
操作就一起顺带玩下,发现网上树莓派操作它的资料也不多,使用Node.js
的就更加不多了。