当前位置:知识百答>百科知识>arduino+L3G4200D的代码有吗

arduino+L3G4200D的代码有吗

2023-07-14 07:52:41 编辑:join 浏览量:599

arduino+L3G4200D的代码有吗

您好,这一行,但arduino1.01版的开发环境里并没带,楼主也没说是哪添加进来的。折腾了一晚上,终于在国外坛子里看到一个链接:

没错,这是老外公布出来的代码,经过试用可以让L3G4200D工作。但要注意几步:

1、下载这两个文件L3G4200D.cpp L3G4200D.h,但文件好像不能直接下,代码都贴在网页上,拷下来,还得在编辑器里把格式重新编辑一下(一行行换行,唉);

2、下好的文件放在你的arduino开发环境的libraries目录下,建一个L3G4200D的目录,两个文件就放这里;

3、可能要重新开启arduino程序才能用;

这样就OK了;代码我贴下面,不知道好不好提取:

#ifndef L3G4200D_h

#define L3G4200D_h

#include // for byte data type// register addresses

#define L3G4200D_WHO_AM_I 0x0F

#define L3G4200D_CTRL_REG1 0x20

#define L3G4200D_CTRL_REG2 0x21

#define L3G4200D_CTRL_REG3 0x22

#define L3G4200D_CTRL_REG4 0x23

#define L3G4200D_CTRL_REG5 0x24

#define L3G4200D_REFERENCE 0x25

#define L3G4200D_OUT_TEMP 0x26

#define L3G4200D_STATUS_REG 0x27

#define L3G4200D_OUT_X_L 0x28

#define L3G4200D_OUT_X_H 0x29

#define L3G4200D_OUT_Y_L 0x2A

#define L3G4200D_OUT_Y_H 0x2B

#define L3G4200D_OUT_Z_L 0x2C

#define L3G4200D_OUT_Z_H 0x2D

#define L3G4200D_FIFO_CTRL_REG 0x2E

#define L3G4200D_FIFO_SRC_REG 0x2F

#define L3G4200D_INT1_CFG 0x30

#define L3G4200D_INT1_SRC 0x31

#define L3G4200D_INT1_THS_XH 0x32

#define L3G4200D_INT1_THS_XL 0x33

#define L3G4200D_INT1_THS_YH 0x34

#define L3G4200D_INT1_THS_YL 0x35

#define L3G4200D_INT1_THS_ZH 0x36

#define L3G4200D_INT1_THS_ZL 0x37

#define L3G4200D_INT1_DURATION 0x38

class L3G4200D

{

public:

typedef struct vector

{

float x, y, z;

} vector;

vector g;

// gyro angular velocity readings

void enableDefault(void);

void writeReg(byte reg, byte value);

byte readReg(byte reg);

void read(void);

// vector functions

static void vector_cross(const vector *a, const vector *b, vector *out);

static float vector_dot(const vector *a,const vector *b);

static void vector_normalize(vector *a);

};

#endif

#include

#include

#include

// Defines ////////////////////////////////////////////////////////////////

// The Arduino two-wire interface uses a 7-bit number for the address,

// and sets the last bit correctly based on reads and writes

#define GYR_ADDRESS (0xD2 >> 1)

// Public Methods //////////////////////////////////////////////////////////////

// Turns on the L3G4200D's gyro and places it in normal mode.

void L3G4200D::enableDefault(void)

{

// 0x0F = 0b00001111

// Normal power mode, all axes enabled

writeReg(L3G4200D_CTRL_REG1, 0x0F);

}

// Writes a gyro register

void L3G4200D::writeReg(byte reg, byte value)

{

Wire.beginTransmission(GYR_ADDRESS);

Wire.write(reg);

Wire.write(value);

Wire.endTransmission();

}

// Reads a gyro register

byte L3G4200D::readReg(byte reg)

{

byte value;

Wire.beginTransmission(GYR_ADDRESS);

Wire.write(reg);

Wire.endTransmission();

Wire.requestFrom(GYR_ADDRESS, 1);

value = Wire.read();

Wire.endTransmission();

return value;

}

// Reads the 3 gyro channels and stores them in vector g

void L3G4200D::read()

{

Wire.beginTransmission(GYR_ADDRESS);

// assert the MSB of the address to get the gyro

// to do slave-transmit subaddress updating.

Wire.write(L3G4200D_OUT_X_L | (1 << 7));

Wire.endTransmission();

Wire.requestFrom(GYR_ADDRESS, 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();

g.x = xha << 8 | xla;

g.y = yha << 8 | yla;

g.z = zha << 8 | zla;

}

void L3G4200D::vector_cross(const vector *a,const vector *b, vector *out)

{

out->x = a->y*b->z - a->z*b->y;

out->y = a->z*b->x - a->x*b->z;

out->z = a->x*b->y - a->y*b->x;

}

float L3G4200D::vector_dot(const vector *a,const vector *b)

{

return a->x*b->x+a->y*b->y+a->z*b->z;

}

void L3G4200D::vector_normalize(vector *a)

{

float mag = sqrt(vector_dot(a,a));

a->x /= mag;

a->y /= mag;

a->z /= mag;

}

标签:arduino,L3G4200D,代码

版权声明:文章由 知识百答 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.zhshbaida.com/article/155840.html
热门文章