huyukuo 发表于 2013-11-2 17:33:01

HMC5883L 读不出,请大家帮忙看看。

我用的是MPU6050+HMC5883L+BMP085一体传感,板子是mega 2560。
其中MPU6050和BMP085使用例子成功读数。
但HMC5883L就是读不出,网上能搜索到的例子都试过了,所有的都不行。
本来以为坏了,刷上MWC2.0,结果发现传感器是好的。郁闷了。。请大家帮帮忙。

第一种是出来都是零


第二种是读数没有变化。


是这个板子。

Damn_intuition 发表于 2013-11-2 23:29:14

数据太少。你这样不好分析啊
起码把模块电路。代码发一下

天天向上/tp 发表于 2013-11-3 04:58:58

试试这个例子http://www.geek-workshop.com/thread-105-1-1.html

huyukuo 发表于 2013-11-3 09:31:01

天天向上/tp 发表于 2013-11-3 04:58 static/image/common/back.gif
试试这个例子http://www.geek-workshop.com/thread-105-1-1.html

这个例子试了,结果就是第二张截图那样。

ent173 发表于 2013-11-4 09:43:59

把MPU6050配置成Bypass模式,就相当于把辅助I2C总线直接连到了主I2C总线上,利用I2C协议按地址去操作就可以了。

//配置MPU6000bypass模式
accelgyro.setI2CMasterModeEnabled(0);
accelgyro.setI2CBypassEnabled(1);

huyukuo 发表于 2013-11-4 12:59:06

ent173 发表于 2013-11-4 09:43 static/image/common/back.gif
把MPU6050配置成Bypass模式,就相当于把辅助I2C总线直接连到了主I2C总线上,利用I2C协议按地址去操作就可以 ...

谢谢答复,MPU6050和BMP085都读出来了。
现在就HMC5883没读出来。这个也有Bypass模式吗?

ent173 发表于 2013-11-4 17:57:12

huyukuo 发表于 2013-11-4 12:59 static/image/common/back.gif
谢谢答复,MPU6050和BMP085都读出来了。
现在就HMC5883没读出来。这个也有Bypass模式吗?

http://www.geek-workshop.com/thread-1793-1-1.html
看下这个帖子

ent173 发表于 2013-11-4 18:00:36

huyukuo 发表于 2013-11-4 12:59 static/image/common/back.gif
谢谢答复,MPU6050和BMP085都读出来了。
现在就HMC5883没读出来。这个也有Bypass模式吗?

看下面的代码#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
#include "HMC5883L.h"
#include "BMP085.h"

MPU6050 accelgyro;
HMC5883L mag;
BMP085 barometer;

int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t mx, my, mz;
float temperature;
float pressure;
float altitude;
int32_t lastMicros;

#define LED_PIN 13
bool blinkState = false;

void setup() {
Wire.begin();
Serial.begin(38400);
Serial.println("Initializing MPU6050 devices...");
accelgyro.initialize();

Serial.println("Testing MPU6050 connections...");
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
delay(1000);
accelgyro.setIntI2CMasterEnabled(0);
accelgyro.setI2CBypassEnabled(1);
if((!accelgyro.getI2CMasterModeEnabled()) && accelgyro.getI2CBypassEnabled())
    Serial.println("Set MPU6050 Bypass Mode success!");
Serial.println("Initializing HMC5883L devices...");

mag.initialize();
Serial.println("Testing HMC5883L connections...");
Serial.println(mag.testConnection() ? "HMC5883L connection successful" : "HMC5883L connection failed");
delay(1000);

// initialize device
Serial.println("Initializing BMP085 ...");
barometer.initialize();

// verify connection
Serial.println("Testing device connections...");
Serial.println(barometer.testConnection() ? "BMP085 connection successful" : "BMP085 connection failed");
delay(1000);
pinMode(LED_PIN, OUTPUT);
}

void loop() {
getMPU6050Arguments();
getHMC5883LArguments();
getBMP085Arguments();
delay(500);
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);

}

void getMPU6050Arguments(){
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// display tab-separated accel/gyro x/y/z values
Serial.print("a/g:\t");
Serial.print(ax);
Serial.print("\t");
Serial.print(ay);
Serial.print("\t");
Serial.print(az);
Serial.print("\t");
Serial.print(gx);
Serial.print("\t");
Serial.print(gy);
Serial.print("\t");
Serial.println(gz);
}

void getHMC5883LArguments(){
mag.getHeading(&mx, &my, &mz);

// display tab-separated gyro x/y/z values
Serial.print("mag:\t");
Serial.print(mx);
Serial.print("\t");
Serial.print(my);
Serial.print("\t");
Serial.print(mz);
Serial.print("\t");

// To calculate heading in degrees. 0 degree indicates North
float heading = atan2(my, mx);
if(heading < 0)
    heading += 2 * M_PI;
Serial.print("heading:\t");
Serial.println(heading * 180/M_PI);
}

void getBMP085Arguments(){
// request temperature
barometer.setControl(BMP085_MODE_TEMPERATURE);

// wait appropriate time for conversion (4.5ms delay)
lastMicros = micros();
while (micros() - lastMicros < barometer.getMeasureDelayMicroseconds());

// read calibrated temperature value in degrees Celsius
temperature = barometer.getTemperatureC();

// request pressure (3x oversampling mode, high detail, 23.5ms delay)
barometer.setControl(BMP085_MODE_PRESSURE_3);
while (micros() - lastMicros < barometer.getMeasureDelayMicroseconds());

// read calibrated pressure value in Pascals (Pa)
pressure = barometer.getPressure();

// calculate absolute altitude in meters based on known pressure
// (may pass a second "sea level pressure" parameter here,
// otherwise uses the standard value of 101325 Pa)
altitude = barometer.getAltitude(pressure);

// display measured values if appropriate
Serial.print("T/P/A\t");
Serial.print(temperature);
Serial.print("\t");
Serial.print(pressure);
Serial.print("\t");
Serial.print(altitude);
Serial.println("");
}

Damn_intuition 发表于 2013-11-4 23:21:17

i2c读不出来 检查可以这样来做。

芯片工作电压是否符合要求,上拉电阻是否有(有的板子有有的板子没有),地址是否正确。

问题也要描述清楚,到底问题出在哪一步,初始化有没有成功。

huyukuo 发表于 2013-11-5 18:19:25

ent173 发表于 2013-11-4 18:00 static/image/common/back.gif
看下面的代码

十分感谢大神!!使用bypass,都能读出来了。
但是不能理解,为什么要搞个bypass模式,难道不是bypass模式的时候,MPU6050还对HMC5883L过来的数据做处理吗?
页: [1]
查看完整版本: HMC5883L 读不出,请大家帮忙看看。