【雕爷学编程】Arduino动手做(48)---三轴ADXL345模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验,不管能否成功,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 

 

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)

实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)

ADXL345芯片

ADXL345是一款小而薄的低功耗3轴加速度计,分辨率高(13位),测量范围达±16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(4 mg/LSB),能够测量不到1.0°的倾斜角度变化。该器件提供多种特殊检测功能。活动和非活动检测功能检测有无运动发生,以及任意轴上的加速度是否超过用户设置的限值。敲击检测功能可以检测单击和双击动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以映射到两个中断输出引脚中的一个。正在申请专利的32级先进先出(FIFO)缓冲器可用于存储数据,最大程度地减少主机处理器的干预。低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。

ADXL345采用3 mm × 5 mm × 1 mm、14引脚小型超薄塑料封装。

主要特性
超低功耗:V S = 2.5 V 时(典型值),测量模式下低至23ì A ,
待机模式下为0.1μA
功耗随带宽自动按比例变化
用户可选的分辨率
10 位固定分辨率
全分辨率,分辨率随g范围提高而提高,± 16g 时高达13 位
(在所有g范围内保持4 mg/L S B 的比例系数)
正在申请专利的嵌入式存储器管理系统采用FI FO 技术,可将
主机处理器负荷降至最低
单振/双振检测
活动/非活动监控
自由落体检测
电源电压范围:2.0 V 至3.6 V
I / O电压范围:1.7 V 至V S
S PI (3线和4线)和I 2 C数字接口
灵活的中断模式,可映射到任一中断引脚
通过串行命令可选测量范围
通过串行命令可选带宽
宽温度范围(- 40° C 至+ 85 ℃)
抗冲击能力:10, 000 g
无铅/符合Ro HS标准

工作原理
ADXL345是一款完整的3轴加速度测量系统,可选择的测量范围有±2 g,±4 g,±8 g或±16 g。既能测量运动或冲击导致的动态加速度,也能测量静止加速度,例如重力加速度,使得器件可作为倾斜传感器使用。该传感器为多晶硅表面微加工结构,置于晶圆顶部。由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力。差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量。加速度使惯性质量偏转、差分电容失衡,从而传感器输出的幅度与加速度成正比。相敏解调用于确定加速度的幅度和极性。

ADXL345三轴加速度模块
采用ADXL345芯片,具有体积小,功耗低的特点,13位数字精度分辨能够测量超过±16g的加速度变换。信号输出为16位数字输出,可以通过SPI与I2C接口实现信号采集。ADXL345适用于倾斜角度测量,能够进行静态重力加速度检测。同时也适用于运动状态的追踪,测量运动或冲击过程造成的瞬时加速度。其高分辨率(4mg/LSB)使之能够感应变化小于1°的倾斜角度。ADXL345三轴加速度计还内置一款LDO模块让你的加速度计能够工作于3.3~6v的工作电压之下。同时传感器提供了几个特殊的功能。能够在静态或动态情况下检测是否有运动或停止出现,另外能够感知单轴的加速度值是否超出用户的设定值。检测单击/双击。如果该设备正在下降,能进行自由落体感应检测。这些功能能够被映射到两个中断输出引脚上。在低功耗模式是用户能够基于ADXL345动作感应,进行电源管理,同时只损耗极低的功耗。

ADXL345三轴加速度模块
采用ADXL345芯片,具有体积小,功耗低的特点,13位数字精度分辨能够测量超过±16g的加速度变换。信号输出为16位数字输出,可以通过SPI与I2C接口实现信号采集。ADXL345适用于倾斜角度测量,能够进行静态重力加速度检测。同时也适用于运动状态的追踪,测量运动或冲击过程造成的瞬时加速度。其高分辨率(4mg/LSB)使之能够感应变化小于1°的倾斜角度。ADXL345三轴加速度计还内置一款LDO模块让你的加速度计能够工作于3.3~6v的工作电压之下。同时传感器提供了几个特殊的功能。能够在静态或动态情况下检测是否有运动或停止出现,另外能够感知单轴的加速度值是否超出用户的设定值。检测单击/双击。如果该设备正在下降,能进行自由落体感应检测。这些功能能够被映射到两个中断输出引脚上。在低功耗模式是用户能够基于ADXL345动作感应,进行电源管理,同时只损耗极低的功耗。

模块的电原理图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
 
【Arduino】168种传感器模块系列实验(48)
 
实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)
 
简单实验,之一
 
*/
 
  
 
void setup()
 
{
 
 Serial.begin(9600);    
 
 pinMode(A4, INPUT);
 
 pinMode(A5, INPUT);
 
}
 
  
 
void loop()
 
{
 
 Serial.println(analogRead(A4));
 
 Serial.println(analogRead(A5));
 
  
 
 delay(100);
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 
【Arduino】168种传感器模块系列实验(48)
 
实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)
 
实验代码之二
 
*/
 
  
 
#include <Wire.h>
 
  
 
#define DEVICE (0x53) 
 
#define TO_READ (6)   
 
  
 
byte buff[TO_READ] ;      
 
char str[512];            
 
int regAddress = 0x32;    
 
int x, y, z;                       
 
double roll = 0.00, pitch = 0.00;      
 
  
 
void setup() {
 
  Wire.begin();        
 
  Serial.begin(9600); 
 
   
 
  writeTo(DEVICE, 0x2D, 0);     
 
  writeTo(DEVICE, 0x2D, 16);
 
  writeTo(DEVICE, 0x2D, 8);
 
}
 
  
 
void loop() {
 
  
 
  readFrom(DEVICE, regAddress, TO_READ, buff);
 
                                               
 
  x = (((int)buff[1]) << 8) | buff[0];  
 
  y = (((int)buff[3])<< 8) | buff[2];
 
  z = (((int)buff[5]) << 8) | buff[4];
 
  
 
  //we send the x y z values as a string to the serial port
 
  Serial.print("The acceleration info of x, y, z are:");
 
  sprintf(str, "%d %d %d", x, y, z); 
 
  Serial.print(str);
 
  Serial.write(10);
 
   
 
  RP_calculate();
 
  Serial.print("Roll:"); Serial.println( roll );
 
  Serial.print("Pitch:"); Serial.println( pitch );
 
  Serial.println("");
 
   
 
  delay(300);
 
}
 
  
 
void writeTo(int device, byte address, byte val) {
 
  Wire.beginTransmission(device);
 
  Wire.write(address);       
 
  Wire.write(val);      
 
  Wire.endTransmission();
 
}
 
  
 
void readFrom(int device, byte address, int num, byte buff[]) {
 
  Wire.beginTransmission(device);
 
  Wire.write(address);       
 
  Wire.endTransmission();
 
  
 
    Wire.beginTransmission(device);
 
  Wire.requestFrom(device, num);   
 
  
 
  int i = 0;
 
  while(Wire.available())   
 
  {
 
    buff = Wire.read();
 
    i++;
 
  }
 
  Wire.endTransmission();
 
}
 
  
 
void RP_calculate(){
 
  double x_Buff = float(x);
 
  double y_Buff = float(y);
 
  double z_Buff = float(z);
 
  roll = atan2(y_Buff , z_Buff) * 57.3;
 
  pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
 
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
【Arduino】168种传感器模块系列实验(48)
实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)
实验代码之三
*/
  
#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
  
int ADXAddress = 0xA7 >> 1;
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
  
void setup()
{
   Wire.begin();        
   Serial.begin(9600); 
   delay(100);
    
   Wire.beginTransmission(ADXAddress);
   Wire.write(Register_2D);
   Wire.write(8);               
   Wire.endTransmission();    
}
  
void loop()
{
    
   Wire.beginTransmission(ADXAddress);
   Wire.write(Register_X0);
   Wire.write(Register_X1);
   Wire.endTransmission();
   Wire.requestFrom(ADXAddress,2);
   if(Wire.available()<=2)  
   {
     X0 = Wire.read();
     X1 = Wire.read();
     X1=X1<<8;
     X_out=X0+X1;  
   }
  
   
   Wire.beginTransmission(ADXAddress);
   Wire.write(Register_Y0);
   Wire.write(Register_Y1);
   Wire.endTransmission();
   Wire.requestFrom(ADXAddress,2);
   if(Wire.available()<=2)  
   {
     Y0 = Wire.read();
     Y1 = Wire.read();
     Y1=Y1<<8;
     Y_out=Y0+Y1;
   }
   
   Wire.beginTransmission(ADXAddress);
   Wire.write(Register_Z0);
   Wire.write(Register_Z1);
   Wire.endTransmission();
   Wire.requestFrom(ADXAddress,2);
   if(Wire.available()<=2)  
   {
     Z0 = Wire.read();
     Z1 = Wire.read();
     Z1=Z1<<8;
     Z_out=Z0+Z1;
   }
   
    Xg=X_out; 
    Yg=Y_out; 
    Zg=Z_out; 
   Serial.print("X= ");
   Serial.print(Xg);
   Serial.print("       ");
   Serial.print("Y= ");
   Serial.print(Yg);
   Serial.print("       ");
   Serial.print("Z= ");
   Serial.print(Zg);
   Serial.println("  ");
   delay(200);
}

 

posted @   行者花雕  阅读(1892)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示