(二十七)树莓派3B+ 获取ADXL345加速度计的数据

简介

在之前的文章中,介绍了MPU6050《12.树莓派3B+ MPU6050 两轴姿态显示》HMC5883L14.树莓派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的就更加不多了。
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页