首页 > 其他 > 详细

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

时间:2014-04-24 13:15:14      阅读:1476      评论:0      收藏:0      [点我收藏+]
树莓派平台的ADXL345三轴加速度传感器编程

   ADXL345是ADI公司于2008年推出的采用MEMS技术具有SPII2C接口的三轴加速度计,具有小巧轻薄、超低功耗、可变量程、高分辨率等特点。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总线扫描:
bubuko.com,布布扣

I2C设备查询:
bubuko.com,布布扣

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

寄存器内容导出:
bubuko.com,布布扣

命令中的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{
	int x;
	int y;
	int z;
};

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

	wiringPiI2CWriteReg8(fd, 0x24, 0x01);
	wiringPiI2CWriteReg8(fd, 0x25, 0x0f);
	wiringPiI2CWriteReg8(fd, 0x26, 0x2b);
	wiringPiI2CWriteReg8(fd, 0x27, 0x00);
	
	wiringPiI2CWriteReg8(fd, 0x28, 0x09);
	wiringPiI2CWriteReg8(fd, 0x29, 0xff);
	wiringPiI2CWriteReg8(fd, 0x2a, 0x80);
	wiringPiI2CWriteReg8(fd, 0x2c, 0x0a);
	wiringPiI2CWriteReg8(fd, 0x2f, 0x00);
	wiringPiI2CWriteReg8(fd, 0x38, 0x9f);
}

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

	x0 = 0xff - wiringPiI2CReadReg8(fd, 0x32);
	x1 = 0xff - wiringPiI2CReadReg8(fd, 0x33);
	y0 = 0xff - wiringPiI2CReadReg8(fd, 0x34);
	y1 = 0xff - wiringPiI2CReadReg8(fd, 0x35);
	z0 = 0xff - wiringPiI2CReadReg8(fd, 0x36);
	z1 = 0xff - wiringPiI2CReadReg8(fd, 0x37);

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

	return acc_xyz;
}

int main(void)
{
	int fd;
	struct acc_dat acc_xyz;

	fd = wiringPiI2CSetup(DevAddr);
	
	if(-1 == fd){
		perror("I2C device setup error");	
	}

	adxl345_init(fd);

	while(1){
		acc_xyz = adxl345_read_xyz(fd);
		printf("x: %05d  y: %05d  z: %05d\n", acc_xyz.x, acc_xyz.y, acc_xyz.z);
		
		delay(1000);
	}
	
	return 0;
}


编译:
              gcc adxl345.c -o adxl345 -lwiringPi
    实测发现,代码可能还有很多问题。本小伙不才,还希望大神们拍砖、指点!

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




树莓派平台的ADXL345三轴加速度传感器编程,布布扣,bubuko.com

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

原文:http://blog.csdn.net/jcdjx/article/details/24356035

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!