10.22 树莓派平台的ADXL345三轴加速度传感器编程

ADXL345是ADI公司于2008年推出的采用MEMS技术具有SPI和I2C接口的三轴加速度计,具有小巧轻薄、超低功耗、可变量程、高分辨率等特点。ADXL345提供一些特殊的运动侦测功能,可侦测出物体是否处于运动状态,并能敏感地感应出某一轴的加速度是否超过了用户设定的门限,可侦测物体是否正在跌落。此外,还集成了一个32级的FIFO缓冲器,用来缓存数据,以减轻处理器的负担。ADXL345可在倾斜敏感应用中测量静态重力加速度,也可在运动甚至震动环境中测动态加速度,非常适用于移动设备,在手机、导航等设备中已经得到了广泛的应用。

本次,我们通过ADXL345传感器模块的I2C总线连接树莓派,以读写数据。

连线方式如下:

Raspberry Pi ADXL345 Module

GND --------------------- GND

3.3V --------------------- 3.3V

SCL0 --------------------- SCL

SDA0 --------------------- SDA

3.3V --------------------- CS

GND --------------------- SDO

I2C总线扫描:

I2C设备查询:

0x53就是我们的I2C设备(ADXL345)的地址。

寄存器内容导出:

命令中的0x53代表I2C设备地址。

树莓派的I2C驱动程序内核已经实现了,我们操作I2C接口的外设时,只需写应用程序即可。以下是我写的通过I2C接口读写ADXL345的C程序:

#include <wiringpii2c.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define DevAddr 0x53 //device address

struct acc_dat{
\tint x;
\tint y;
\tint z;
};

void adxl345_init(int fd)
{
\twiringPiI2CWriteReg8(fd, 0x31, 0x0b);
\twiringPiI2CWriteReg8(fd, 0x2d, 0x08);
//\twiringPiI2CWriteReg8(fd, 0x2e, 0x00);
\twiringPiI2CWriteReg8(fd, 0x1e, 0x00);
\twiringPiI2CWriteReg8(fd, 0x1f, 0x00);
\twiringPiI2CWriteReg8(fd, 0x20, 0x00);
\t
\twiringPiI2CWriteReg8(fd, 0x21, 0x00);
\twiringPiI2CWriteReg8(fd, 0x22, 0x00);
\twiringPiI2CWriteReg8(fd, 0x23, 0x00);

\twiringPiI2CWriteReg8(fd, 0x24, 0x01);
\twiringPiI2CWriteReg8(fd, 0x25, 0x0f);
\twiringPiI2CWriteReg8(fd, 0x26, 0x2b);
\twiringPiI2CWriteReg8(fd, 0x27, 0x00);
\t
\twiringPiI2CWriteReg8(fd, 0x28, 0x09);
\twiringPiI2CWriteReg8(fd, 0x29, 0xff);


\twiringPiI2CWriteReg8(fd, 0x2a, 0x80);
\twiringPiI2CWriteReg8(fd, 0x2c, 0x0a);
\twiringPiI2CWriteReg8(fd, 0x2f, 0x00);
\twiringPiI2CWriteReg8(fd, 0x38, 0x9f);
}

struct acc_dat adxl345_read_xyz(int fd)
{
\tchar x0, y0, z0, x1, y1, z1;
\tstruct acc_dat acc_xyz;

\tx0 = 0xff - wiringPiI2CReadReg8(fd, 0x32);
\tx1 = 0xff - wiringPiI2CReadReg8(fd, 0x33);
\ty0 = 0xff - wiringPiI2CReadReg8(fd, 0x34);
\ty1 = 0xff - wiringPiI2CReadReg8(fd, 0x35);
\tz0 = 0xff - wiringPiI2CReadReg8(fd, 0x36);
\tz1 = 0xff - wiringPiI2CReadReg8(fd, 0x37);

\tacc_xyz.x = (int)(x1 << 8) + (int)x0;
\tacc_xyz.y = (int)(y1 << 8) + (int)y0;
\tacc_xyz.z = (int)(z1 << 8) + (int)z0;

\treturn acc_xyz;
}

int main(void)
{
\tint fd;
\tstruct acc_dat acc_xyz;

\tfd = wiringPiI2CSetup(DevAddr);
\t
\tif(-1 == fd){
\t\tperror("I2C device setup error");\t
\t}

\tadxl345_init(fd);

\twhile(1){
\t\tacc_xyz = adxl345_read_xyz(fd);
\t\tprintf("x: %05d y: %05d z: %05d\\n", acc_xyz.x, acc_xyz.y, acc_xyz.z);
\t\t
\t\tdelay(1000);
\t}
\t
\treturn 0;
}
/<errno.h>/<stdlib.h>/<stdio.h>/<wiringpii2c.h>

编译:

gcc adxl345.c -o adxl345 -lwiringPi

实测发现,代码可能还有很多问题。本小伙不才,还希望大神们拍砖、指点!

关于I2C Tools的用法,详情请参考以下链接:

http://blog.csdn.net/xukai871105/article/details/15029843