topic
ADXL345传感器详解
https://blog.csdn.net/book_drabit/article/details/83963416
几种常用的传感器(加速度传感器、重力传感器、方向传感器、陀螺仪)简介
原博地址:[https://blog.csdn.net/LEON1741/article/details/77200220](https://blog.csdn.net/LEON1741/article/details/77200220)
三轴加速计数据计算倾斜角算法
地址:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/black_yu/article/details/52673718
陀螺仪、加速计、磁力计等传感器汇总
原博地址:https://blog.csdn.net/wave_1102/article/details/45016187
加速计得到的结果就是XYZ三个值,分别代表三个方向的加速度。关于XYZ三值的介绍,可以看这里:
android 重力感应和屏幕旋转关系
http://blog.csdn.net/lzx_bupt/archive/2010/04/20/5507165.aspx
用加速计和磁力计可以计算出orientation(方位计),orientation涉及到了三个概念:
Roll:左右倾斜角度,也叫滚转角 http://baike.baidu.com/view/1769672.htm
Pitch:前后倾斜,也叫俯仰角 http://baike.baidu.com/view/3832041.htm
Yaw:左右摇摆,也叫偏航角 http://baike.baidu.com/view/1769448.htm
加速计/陀螺仪/磁力计是什么,3轴/6轴/9轴传感器又是什么?
2018年06月27日 16:26:00 leon1741 阅读数:5115
版权声明:个人心得,欢迎来信来函交流。转载请注明出处! https://blog.csdn.net/LEON1741/article/details/80831169
[三轴加速度传感器角度值转换原理]
基于三轴加速度传感器的计步算法
原博地址:https://blog.csdn.net/Dancer__Sky/article/details/81504778
参考资料
http://www.analog.com/en/analog-dialogue/articles/pedometer-design-3-axis-digital-acceler.html
计步算法个人总结
[原博地址]
https://blog.csdn.net/Zxin94264/article/details/78716290
Android计步器算法实现
原博地址:Android计步器算法实现1
Android计步器算法实现(2)
加速度传感器的原理和应用:手机翻转、失重检测、运动检测、位置识别
链接地址: https://blog.csdn.net/u013286409/article/details/51605974
第五章 跌倒检测算法剖析(含跌到检测源码)
https://blog.csdn.net/baolinq/article/details/52400040
ADXL345调试心得
转载: https://blog.csdn.net/fxltsbl007/article/details/80894276
ADXL345库文件样例
ADXL345.cpp:
#include "ADXL345.h"
#include <Wire.h>
#include <math.h>
void ADXL345::enableDefault(void)
{
writeReg(ADXL345_DATA_FORMAT, 0x00);//测量范围,正负16g,13位模式
writeReg(ADXL345_BW_RATE, 0x0A); //速率设定为100 参考pdf13页
writeReg(ADXL345_POWER_CTL, 0x08); //选择电源模式 参考pdf24页
writeReg(ADXL345_INT_ENABLE, 0x80); //使能 DATA_READY 中断
writeReg(ADXL345_OFSX, 0x00); //X 偏移量 根据测试传感器的状态写入pdf29页
writeReg(ADXL345_OFSY, 0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页
writeReg(ADXL345_OFSZ, 0x00); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
// Writes a register
void ADXL345::writeReg(byte reg, byte value)
{
Wire.beginTransmission(ADXL345_SLA_ADDR);
Wire.write(reg);
Wire.write(value);
Wire.endTransmission();
}
// Reads a register
byte ADXL345::readReg(byte reg)
{
byte value;
Wire.beginTransmission(ADXL345_SLA_ADDR);
Wire.write(reg);
Wire.endTransmission();
Wire.requestFrom(ADXL345_SLA_ADDR, 1);
value = Wire.read();
Wire.endTransmission();
return value;
}
// Reads the 3 channels and stores them in vector g
void ADXL345::read()
{
Wire.beginTransmission(ADXL345_SLA_ADDR);
// assert the MSB of the address to get the gyro
// to do slave-transmit subaddress updating.
Wire.write(ADXL345_DATAX0 | (1 << 7));
Wire.endTransmission();
Wire.requestFrom(ADXL345_SLA_ADDR, 6);
while (Wire.available() < 6);
uint8_t xla = Wire.read();
uint8_t xha = Wire.read();
uint8_t yla = Wire.read();
uint8_t yha = Wire.read();
uint8_t zla = Wire.read();
uint8_t zha = Wire.read();
a.x = xha << 8 | xla;
a.y = yha << 8 | yla;
a.z = zha << 8 | zla;
}
ADXL345.h:
#ifndef __ADXL345__
#define __ADXL345__
#include <Arduino.h> // for byte data type
#define ADXL345_SLA_ADDR 0xA6>>1
#define ADXL345_DEVID 0x00
#define ADXL345_THRESH_TAP 0x1D
#define ADXL345_OFSX 0x1E
#define ADXL345_OFSY 0x1F
#define ADXL345_OFSZ 0x20
#define ADXL345_DUR 0x21
#define ADXL345_LATENT 0x22
#define ADXL345_WINDOW 0x23
#define ADXL345_THRESH_ACT 0x24
#define ADXL345_THRESH_INACT 0x25
#define ADXL345_TIME_INACT 0x26
#define ADXL345_ACT_INACT_CTL 0x27
#define ADXL345_THRESH_FF 0x28
#define ADXL345_TIME_FF 0x29
#define ADXL345_TAP_AXES 0x2A
#define ADXL345_ACT_TAP_STATUS 0x2B
#define ADXL345_BW_RATE 0x2C
#define ADXL345_POWER_CTL 0x2D
#define ADXL345_INT_ENABLE 0x2E
#define ADXL345_INT_MAP 0x2F
#define ADXL345_INT_SOURCE 0x30
#define ADXL345_DATA_FORMAT 0x31
#define ADXL345_DATAX0 0x32
#define ADXL345_DATAX1 0x33
#define ADXL345_DATAY0 0x34
#define ADXL345_DATAY1 0x35
#define ADXL345_DATAZ0 0x36
#define ADXL345_DATAZ1 0x37
#define ADXL345_FIFO_CTL 0x38
#define ADXL345_FIFO_STATUS 0x39
#define ADXL345_Z_OFF 10
#define ADXL345_Y_OFF -7
#define ADXL345_X_OFF -9
//percent of 1g per LSB
#define ADXL345_Z_SCALE 0.004F
#define ADXL345_Y_SCALE 0.00389F
#define ADXL345_X_SCALE 0.003937F
class ADXL345
{
public:
typedef struct vector
{
float x, y, z;
} vector;
vector a; // gyro angular velocity readings
void enableDefault(void);
void writeReg(byte reg, byte value);
byte readReg(byte reg);
void read(void);
};
#endif
---------------------
作者:lcokenm
来源:CSDN
原文:https://blog.csdn.net/lcokenm/article/details/24640357
版权声明:本文为博主原创文章,转载请附上博文链接!
ADXL345 程序实例
#include <Wire.h>//调用Arduino自带库
#define Register_ID 0 //器件ID 十六进制为0x00 十进制为0
#define Register_2D 0x2D //省电特性控制
#define Register_X0 0x32 //X轴数据0
#define Register_X1 0x33 //X轴数据1
#define Register_Y0 0x34 //Y轴数据0
#define Register_Y1 0x35 //Y轴数据1
#define Register_Z0 0x36 //Z轴数据0
#define Register_Z1 0x37 //Z轴数据1
//ADXL345寄存器映射地址
int ADXAddress = 0xA7 >> 1;// 转换为7位从地址
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(); //初始化I2C
Serial.begin(9600); //初始化串口
delay(100);
// enable to measute g data
Wire.beginTransmission(ADXAddress);//开启发送
Wire.write(Register_2D);//写入ADXL345寄存器映射地址
Wire.write(8); //测量使能
Wire.endTransmission(); // 停止发送
}
void loop()
{
//读取X轴数据
Wire.beginTransmission(ADXAddress); // 开启发送
Wire.write(Register_X0);//写入ADXL345寄存器映射地址
Wire.write(Register_X1);//写入ADXL345寄存器映射地址
Wire.endTransmission();//结束发送
Wire.requestFrom(ADXAddress,2); //请求 ADXL345 二个字节
if(Wire.available()<=2) //获取<=2个数据
{
X0 = Wire.read();
X1 = Wire.read();
X1=X1<<8;
X_out=X0+X1;
}
//读取Y轴数据↓
Wire.beginTransmission(ADXAddress); // 开启发送
Wire.write(Register_Y0);//写入ADXL345寄存器映射地址
Wire.write(Register_Y1);//写入ADXL345寄存器映射地址
Wire.endTransmission();//结束发送
Wire.requestFrom(ADXAddress,2); //请求ADXL345二个字节
if(Wire.available()<=2) //获取<=2个数据
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1=Y1<<8;
Y_out=Y0+Y1;
}
//读取Z轴数据
Wire.beginTransmission(ADXAddress); // 开启发送
Wire.write(Register_Z0);//写入ADXL345寄存器映射地址
Wire.write(Register_Z1);//写入ADXL345寄存器映射地址
Wire.endTransmission();//结束发送
Wire.requestFrom(ADXAddress,2); //请求ADXL345二个字节
if(Wire.available()<=2) //获取<=2个数据
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1=Z1<<8;
Z_out=Z0+Z1;
}
/*
Xg=X_out/256.0;
Yg=Y_out/256.0;
Zg=Z_out/256.0;
*/
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);
//串口输出
}
/*---------------------
作者:Neil-Yale
来源:CSDN
原文:https://blog.csdn.net/yalecaltech/article/details/80637735
版权声明:本文为博主原创文章,转载请附上博文链接!
*/