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總線掃描:

樹莓派平臺的ADXL345三軸加速度傳感器編程

I2C設備查詢:

樹莓派平臺的ADXL345三軸加速度傳感器編程

0x53就是我們的I2C設備(ADXL345)的地址。

寄存器內容導出:

樹莓派平臺的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


分享到:


相關文章: