zoukankan      html  css  js  c++  java
  • 电子指南针Arduino笔记四电子指南针罗盘HMC5883L

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--电子指南针

        电子指南针罗盘HMC5883L是三轴磁阻传感器,用来测量四周的磁感应强度,测量范围-8g~8g单位是高斯。提到磁感应强度最熟习的应该是高中时学的B单位T特斯拉,其实高斯也是磁感应强度单位,只不过高斯是很小的单位,10000高斯等于1特斯拉。网上是这么定义的:一段导线,若放在磁感应强度平均的磁场中,方向与磁感应强度方向垂直的长直导在线通有1电磁系单位(emu)的稳恒电流(等于10安培)时,在每厘米长度的导线遭到电磁力为1达因,则该磁感应强度就定义为1高斯。即1T(特斯拉)=10000g(高斯)

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

        目标:读三轴方向的磁感应强度,并通过串口显示

        一、硬件分析

        电子指南针罗盘HMC5883L内嵌12-Bit ADC,测量磁感应强度范围-8g~8g单位高斯。HMC5883L模块原理图如下:

        电子和指南针

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

        二、编写测试代码

        在Arduino上写代码非常简单,很多库都帮你做好了,直接调用便可,十分便利。但Arduino的版本很多,特别是Arduino-1.0以后,有些库有所改变,需要看对应版本的参考手册arduino-1.5.2-windows\arduino-1.5.2\reference上面有具体说明,我也是结合网上找的程序参考这些修改。代码如下:
    文件HMC5883.ino

        每日一道理
    如果你们是蓝天,我愿做衬托的白云;如果你们是鲜花,我愿做陪伴的小草;如果你们是大树,我愿做点缀的绿叶……我真诚地希望我能成为你生活中一个欢乐的音符,为你的每一分钟带去祝福。
    #include <Wire.h> //I2C Arduino Library
    
    #define address 0x1E //0011110b, I2C 7bit address of HMC5883
    
    void setup(){
      //Initialize Serial and I2C communications
      Serial.begin(9600);
      Wire.begin();
      
      //Put the HMC5883 IC into the correct operating mode
      Wire.beginTransmission(address); //open communication with HMC5883
      Wire.write(0x02); //select mode register
      Wire.write(0x00); //continuous measurement mode
      Wire.endTransmission();
    }
    
    void loop(){
      
      int x,y,z; //triple axis data
    
      //Tell the HMC5883 where to begin reading data
      Wire.beginTransmission(address);
      Wire.write(0x03); //select register 3, X MSB register
      Wire.endTransmission();
      
     
     //Read data from each axis, 2 registers per axis
      Wire.requestFrom(address, 6);
      if(6<=Wire.available()){
        x = Wire.read()<<8; //X msb
        x |= Wire.read(); //X lsb
        z = Wire.read()<<8; //Z msb
        z |= Wire.read(); //Z lsb
        y = Wire.read()<<8; //Y msb
        y |= Wire.read(); //Y lsb
      }
      
      //Print out values of each axis
      Serial.print("x: ");
      Serial.print(x);
      Serial.print("  y: ");
      Serial.print(y);
      Serial.print("  z: ");
      Serial.println(z);
      
      delay(250);
    }

        这个不懂只能对着手册看了。

        三、编译、测试

        Arduino还是很便利操作的,选择好单板、参考,直接点上面的“对勾”就开始编译,编译没问题,点“->”箭头状的,开始上传程序,直至上传进度条实现。
    接着打开Tools/Serial Monitor 显示如下:

        电子和指南针

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

    文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!

    --------------------------------- 原创文章 By
    电子和指南针
    ---------------------------------

  • 相关阅读:
    平稳退化,JS和HTML标记分离,极致性能的JavaScript图片库
    简单选择排序(Simple Selection Sort)的C语言实现
    堆排序(Heap Sort)的C语言实现
    快速排序(Quick Sort)的C语言实现
    希尔排序(Shell's Sort)的C语言实现
    2-路插入排序(2-way Insertion Sort)的C语言实现
    折半插入排序(Binary Insertion Sort)的C语言实现
    直接插入排序(Straight Insertion Sort)的C语言实现
    栈的链式存储方法的C语言实现
    栈的顺序存储方式的C语言实现
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3100776.html
Copyright © 2011-2022 走看看