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

本文介绍ADXL345这款低功耗3轴加速度计的工作原理及特性,并提供了基于Node.js的树莓派驱动代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

在之前的文章中,介绍了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的就更加不多了。
在这里插入图片描述

#include #include //Keil library #include //Keil library #include #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD1602数据端口 sbit SCL=P1^0; //IIC时钟引脚定义 sbit SDA=P1^1; //IIC数据引脚定义 sbit LCM_RS=P2^0; //LCD1602命令端口 sbit LCM_RW=P2^1; //LCD1602命令端口 sbit LCM_EN=P2^2; //LCD1602命令端口 #define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0xA6,接源时地址为0x3A typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量 int dis_data; //变量 void delay(unsigned int k); void InitLcd(); //初始化lcd1602 void Init_ADXL345(void); //初始化ADXL345 void WriteDataLCM(uchar dataW); void WriteCommandLCM(uchar CMD,uchar Attribc); void DisplayOneChar(uchar X,uchar Y,uchar DData); void conversion(uint temp_data); void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据 uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据 void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据 //------------------------------------ void Delay5us(); void Delay5ms(); void ADXL345_Start(); void ADXL345_Stop(); void ADXL345_SendACK(bit ack); bit ADXL345_RecvACK(); void ADXL345_SendByte(BYTE dat); BYTE ADXL345_RecvByte(); void ADXL345_ReadPage(); void ADXL345_WritePage(); //-----------------------------------
### 使用树莓派控制ADXL345加速度传感器 #### 安装必要的软件包 为了能够通过树莓派读取ADXL345数据,需要先安装一些必备的工具和库文件。可以通过命令行执行以下操作来完成这些设置: ```bash sudo apt-get update sudo apt-get install python-smbus i2c-tools ``` 接着启用树莓派上的I2C接口[^1]。 #### 配置硬件连接 按照标准的I2C协议配置ADXL345树莓派之间的连线。通常情况下,这涉及将VCC、GND、SDA以及SCL分别对应到树莓派的相关针脚上[^3]。 #### 编写Python代码实现数据采集 下面提供一段基于Python语言编写的简单程序用于从ADXL345获取加速信息: ```python import smbus import time class ADXL345: def __init__(self, address=0x53): self.bus = smbus.SMBus(1) self.address = address # 初始化设备 self.set_power_ctl() def set_power_ctl(self): """ 设置源管理寄存器 """ power_ctl_reg_value = 0b00001000 # 测量模式 self.write_register(0x2D, power_ctl_reg_value) def read_acceleration(self): data = [] for axis in [&#39;X&#39;, &#39;Y&#39;, &#39;Z&#39;]: high_byte = self.read_register(f"{axis.lower()}_DATAX0".replace(&#39;X&#39;, &#39;&#39;)) low_byte = self.read_register(f"{axis.lower()}_DATAX1".replace(&#39;X&#39;, &#39;&#39;)) value = (high_byte << 8) | low_byte if value & (1 << 16 - 1): # 如果最高位为1,则表示负数 value -= (1 << 16) data.append(value / 256.0) # 转换为 g 单位 return tuple(data) def write_register(self, register_address, value): self.bus.write_byte_data(self.address, register_address, value) def read_register(self, register_address): return self.bus.read_byte_data(self.address, register_address) if __name__ == "__main__": adxl345 = ADXL345() while True: x, y, z = adxl345.read_acceleration() print(f"Acceleration X={x:.2f} Y={y:.2f} Z={z:.2f}") time.sleep(0.5) ``` 上述代码定义了一个`ADXL345`类以便更方便地操控此芯片,并实现了基本的功能如初始化设备状态、读取三维方向上的加速度数值等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值