Arduino 与指南针传感器HMC5883L

首先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);
}
时间: 2024-08-12 00:39:25

Arduino 与指南针传感器HMC5883L的相关文章

Arduino I2C + 温湿度传感器Si7021

  Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3%°C,最大值+/-0.4%°C(-10°C~85°C),出厂已校正 测量范围:温度范围0~100%RH:温度范围最大-40°C~125°C 工作电压:1.9~3.6V 低功耗:工作时150μA,待机时60nA 接口:I2C,最大速率支持400kbps 长期稳定性:湿度≤0.25%RH/yr,温度≤

Arduino调试温湿度传感器AM2321

AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国产品牌,其精度也可以与国外的主流温湿度传感IC媲美. 尺寸:11.3x7.8x4mm(长x宽x高) 封装:0.05 pitch PTH 工作电压:2.6~5V 接口:I2C,最大速率100kbps,有特殊时序要求 分辨率:温度0.1°C,相对湿度0.1%RH 精度:室温时温度误差+/-0.3°C,相对湿度误差+/-3%RH 重复性:温度+/-0.2°C,相对湿度+/-0.1%RH 美中不足:与国外同精度产品相比,AM2321的重复性和漂移

Arduino I2C + 温湿度传感器HTS221

主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频率(ODR)可设:1Hz ~ 12.5Hz 低功耗:2μ[email protected] ODR 温度精度:给出误差典型值+/-0.5°C, 15~40°C:但注明“Typical specifications are not guaranteed.”.无误差最大值信息. 湿度精度:给出误差典型值

Arduino和C51开发光敏传感器

技术:51单片机.Arduino.光敏传感器.PCF8591.AD/DA转换 概述 本文介绍了如何接收传感器的模拟信号和如何使用PCF8591 AD/DA转换模块对光敏传感器的模拟信号进行转换.讲述了51单片机和Arduino如何读取模拟信号,并通过串口实时显示出来. 详细 代码下载:http://www.demodashi.com/demo/14737.html 一.光敏传感器 光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长.光传

Arduino + SmartAirFilter 制作智能感应的 PM 空气净化器

先说 SmartAirFilters 知道 SmartAirFilters 源自微博上转发的非常火的那个帖子,和动辄七八千元的商用产品比,几百元的 SmartAirFilters(下面简称电扇) 确实不贵.一次和朋友在清华科技园里附近的咖啡馆聊天,正好遇见他们在那里做 DIY 体验工坊,作为 DIYer 爱好者,理所应当给个赞,就败了个 1.0 试一试. 空气 PM 的监控 空气过滤效果究竟怎样?作为数据控,理所应当必须看数据说话.正好在玩 Arduino Yun,就起意搞个灰尘传感器监控一下.

基于 Arduino 和 IoT 云平台搭建物联网系统

在这篇文章中,我们将介绍如何搭建一款监测土壤水分的物联网系统,用于在土壤干燥时发出警报,提醒用户.本项目使用了IoT 云平台来管理警报系统,同时存储来自传感器的数据.众所周知,物联网是当今热门话题之一,它将改变我们的未来及生活方式.如今我们可以自己动手搭建物联网系统,因为市场上已有一些原型板,这使得我们不用花费太多金钱及精力就可以着手物联网项目. 搭建 IoT 系统项目 构建这个项目,我们需要: Arduino MKR1000: 湿度传感器: IoT 云平台 Carriots 的免费账户(点击这

极客学院开源硬件视频教程 玩转Arduino

玩转Arduino 极客学院开源硬件视频教程玩转 Arduino --数据通信:串口通信玩转Arduino--周边模块:执行部件玩转Arduino-周边模块-传感器部件(1)玩转 Arduino --周边模块-传感器部件(2) 下载地址:http://www.feixueteam.net/thread-840-1-1.html

Arduino 和 RPi 在家居控制方面的各种实践

近两年内有家装的需求,考察了市面上的智能家居方案,要么不靠谱看不上眼,要么价格高得离谱.想着自己原来也搞过一段时间单片机,Linux 靠着 Google 和 StackOverflow 也能解决一些问题.于是开始尝试 Arduino 和 RPi 在家居控制方面的各种实践.总结一些想法给大家作为参考: RPi 和 Arduino 两个完全不同运算水平的平台.毕竟 RPi 使用的是一颗运行在 700MHZ 的 ARM11 CPU:而常用的 Arduino UNO 则是一颗在工业控制领域常见的 8-b

Arduino——My-Clock项目 发布时间:2018-12-31

技术:Arduino.光敏传感器.DHT11.DS1302.OLED显示屏 概述 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间,并用OLED显示屏进行实时显示. 详细 代码下载:http://www.demodashi.com/demo/14767.html 一.My-Clock简介 项目My-Clock是一个环境监测时钟,接入光敏传感器和温湿度传感器监测环境信息,加入DS1302模块用于获取时间,并用OLED显示屏进行实时显