文档章节

Arduino 与指南针传感器HMC5883L

quanwei9958
 quanwei9958
发布于 2015/07/13 16:36
字数 889
阅读 1087
收藏 6

    首先Arduino默认的I2C地址是7位地址,手册上说明有,7位地址为0X1E,读地址为0x3D = (7位地址<<1 +1),写地址为0X3C (7位地址 << 1)

   如果要想与HMC5883L进行通信,则需要在HMC5883L上电5ms之后进行。 所以一般写入配置时需要先延时5ms再进行通信。

 


   连入设备后对传感器进行测试、识别的操作与 识别寄存器A、 识别寄存器B、识别寄存器C有关,所以想知道传感器是否正常工作就读取他们的值验证一下,因为他们三个都是只读寄存器,科技静态测试

    识别寄存器A 地址 0x0A  默认值为 0x48

    识别寄存器B 地址 0x0B  默认值为 0x34

    识别寄存器C 地址 0x0C  默认值为 0x33

读取寄存器的值以确保设备正常通信。

    

      对于传感器我们最关心的还是如何读取它的值和如何处理读出来的值。

      传感器的测量值放在X,Y,Z 16位寄存器中,关于测量模式有两种 连续测量和单次测量,单次测量我用了一下,感觉不太好,所以下面主要介绍连续测量。

     配置成连续测量方式很简单,就是上面的模式寄存器,地址0x02

      






   可以看到,配置成连续测量模式只需要给模式寄存器写入0x00就行。


    配置成连续,配置成连续读取模式之后有一个很重要的地方需要记住: 读取XYZ,一次一定要读取6个字节,也就是全部读取,不然的话数据不更新! 手册上没有给出具体的解释,不过我猜测应该是写地址与读地址公用了一个地址导致这个现象

   数据处理:

   X,Y,Z 16位数据读取完毕后需要用到转换出角度,刚开始转换出的角度一直不对,而且很纳闷因为看到网上现成的代码中都是那一套公式,atan2(y,x)*180/pi+180 可是自己计算的就是不对。

   原来是手册上的X,Y,Z寄存器并不是指的实际的X,Y,Z导致的

   实际上的X,Y,Z 是 X,Z,Y存储在数据区域的,伪代码表示为

   requestFrom(0x3D,6);

   x = Wire.read()<<8 | Wire.read()

   z = Wire.read()<<8 | Wire.read()

   y = Wire.read()<<8 | Wire.read()

 double degree=atan2(y,x) *180/PI+180

这样得出的degree才是HMC5883L与磁北方向的夹角。 我测试的结果为,基本上与iphone自带的传感器数值一致,误差在3-5度之间,这可能是干扰或者我的人工误差引起的,所以做出来的效果还算满意。

 

  下面是测试代码;

 

#include <math.h>
#include <Wire.h>
#define ADDRESS 0x1e
const int led_Pin=13;
const int rady=22;
void setup()
{
	pinMode(rady, INPUT);
	pinMode(led_Pin, OUTPUT);
	Serial.begin(115200);
	delay(5);
	Wire.begin();
	Wire.beginTransmission(ADDRESS);
	Wire.write(0x02);
	Wire.write(0x00);
	Wire.endTransmission();

	Wire.beginTransmission(ADDRESS);
	Wire.write(10);
	Wire.endTransmission();
	Wire.requestFrom(ADDRESS,1);
	if(Wire.available()==1&&Wire.read()==0x48){
		Serial.println("connect success");
	}else
		Serial.println("connect failure");
	Wire.beginTransmission(ADDRESS);
	Wire.write(0x02);
	Wire.endTransmission();
	Wire.requestFrom(ADDRESS,1);
	if(Wire.available()==1)
	{
		switch(Wire.read())
		{
			case 00: Serial.println("sequence measure"); break;
			case 01: Serial.println("single measure"); break;
			default: Serial.println("other measure"); break;
		}
	
	}
}

void loop()
{
	Wire.beginTransmission(ADDRESS);
	Wire.write(0x03);
	Wire.endTransmission();
	Wire.requestFrom(ADDRESS,6);
	//delay(10);
	if(Wire.available()==6&&digitalRead(rady)){
		Serial.print("receive:");
		int x=Wire.read();
		x=x<<8|(Wire.read());
		int z=Wire.read();
		z=z<<8|(Wire.read());
		int y=Wire.read();
		y=y<<8|(Wire.read());
		float rot=atan2(y,x)*180/PI+180;
		Serial.println(rot);
	}
	else{
		Serial.print("rady is ");
		Serial.println(digitalRead(rady)?"HIGH":"LOW");
	}
	delay(1000);
}



© 著作权归作者所有

quanwei9958

quanwei9958

粉丝 29
博文 79
码字总数 36250
作品 0
程序员
私信 提问
Android传感器API之:磁场Magnetic Field源码与示例

Android的磁场传感器,Magnetic Field。。读取磁场的变化,通过该传感器可开发出指南针、罗盘等磁场应用。该传感器读取的数据是空间坐标系三个方向的磁场值,其数据单位为uT,即微特斯拉。 ...

DSALK
2011/11/30
2.6K
2
Arduino教程汇总

原始链接:Arduino教程汇总贴 (有更新) 初识arduino http://www.arduino.cn/thread-1083-1-1.html 常见arduino版本比较 http://www.arduino.cn/thread-1192-1-1.html arduino驱动安装方法 ht......

小堤
2013/05/26
25.4K
15
用开源硬件和软件 (Arduino) 进行能源领域内的数据记录

探索在太阳能发电的环境中如何用 Arduino 监视简单的气候情况。具体而言,就是了解如何用 TMP36 芯片进行基本的温度感应、用发光二极管 (LED) 发光以及存储信息以备日后检索。然后整理选定的...

IBMdW
2011/09/20
2.3K
0
智能家居架构--My smart home

智能家居的概念(smart home , home auto)很早以前就有了,现在随着硬件成本的下降,及google收购nest等,智能家居热度升高。 My smart home 智能家居的架构,包括服务器端,web网页,android...

李永明
2014/05/03
19.8K
4
Android Sensor Development

Android Sensor Development 本文我们说一下Android中的传感器,这对于我们有时候做一些特殊的应用的时候还是需要的,这里我用小米手机下载了一个安兔兔,我们来看下大致的传感器 安兔兔上面...

qq_26787115
2017/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部