zoukankan      html  css  js  c++  java
  • Arduino笔记五三轴陀螺仪L3G4200D

    L3G4200D是意法(ST)半导体公司推出的一款MEMS运动传感器:三轴数字输出陀螺仪。可选-250~250、-500~500、-2000-2000dps

    开发环境:
    系统:XP
    单板:Arduino Leonardo
    平台:arduino-1.0.1

    目标:读三轴陀螺仪的原始数据,并通过串口显示

    一、硬件介绍

    三轴陀螺仪L3G4200D模块的原理图如下:


    这里只用到SCL、SDA、VCC_3.3V、GND分别连接到Arduino的对应接口上。Arduino Leonardo上直接标有SDA、SCL连上即可,其它Arduino根据自己的板子连接。

    二、编写测试代码

    现在的arduino版本高,在网上找的例程都编译通不过,换了个低版本才编译通过。可以参考这个上面的代码 https://github.com/pololu/L3G4200D/tree/66f1448d7f6767e12d0fe0c5c50d4e037aedc27c/L3G4200D 找到这两个文件L3G4200D.cpp   L3G4200D.h,但文件好像不能直接下,代码都贴在网页上,直接copy下来。然后还要在arduino-1.0.1-windows\arduino-1.0.1\libraries下新建L3G4200D目录,将L3G4200D.cpp   L3G4200D.h拷到刚建的L3G4200D,就可以在Android中使用L3G4200D类。

    文件L3G4200D.cpp

    #include <L3G4200D.h>
    #include <Wire.h>
    #include <math.h>
    
    // 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;
    }

    文件L3G4200D.h:

    #ifndef L3G4200D_h
    #define L3G4200D_h
    
    #include <Arduino.h> // 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

    文件L3G4200D.ino

    #include <Wire.h>
    #include <L3G4200D.h>
    
    L3G4200D gyro;
    
    void setup() {
      Serial.begin(9600);
      Wire.begin();
      gyro.enableDefault();
    }
    
    void loop() {
      gyro.read();
    
      Serial.print("G ");
      Serial.print("X: ");
      Serial.print((int)gyro.g.x);
      Serial.print(" Y: ");
      Serial.print((int)gyro.g.y);
      Serial.print(" Z: ");
      Serial.println((int)gyro.g.z);
    
      delay(100);
    }

    三、编译测试

    Arduino还是很方便操作的,选择好单板、参考,直接点上面的“对勾”就开始编译,编译没问题,点“->”箭头状的,开始上传程序,直至上传进度条完成。


    接着打开Tools/Serial Monitor 显示如下:


    这是水平放置的结果,倾斜模块会看到值变化。






  • 相关阅读:
    oc获得设备类型
    oc代码规范
    图片下载进度
    Nsdate的各种常用操作
    学习视频
    ios 编码转换 保存文件
    免费代码托管网站
    两年JAVA程序员的面试总结
    Java 性能优化的 45 个细节
    7年Java游戏后端,被淘汰辛酸史
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3100668.html
Copyright © 2011-2022 走看看