• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос ESP8266 + HMC5883L + Arduino IDE

zurikus

New member
Добрый вечер!
Есть ли у кого-то опыт работы с датчиком HMC5883L ? Поискал по форуму и ничего не обнаружил на эту тему.
Для своих проектов я использую NODE MCU esp12e, загружаю код через Arduino IDE, для датчика HMC5883L использую библиотеку по ссылке http://www.meccanismocomplesso.org/wp-content/uploads/2014/12/HMC5883L.zip. Эта библиотека расчитана для работы датчика на платформе Arduino. На Arduino UNO тестировал, работает без каких либо видимых проблем, а вот на ESP код работает не совсем коректно:
1) На Arduino выход '235.00 | -129.32 | -321.54' а на ESP '25.00 | 65129.32 | 65321.54'.
Т.е. вместо минуса ESP показывает 65, ну а с первым значением какая-то проблема.

Код:

[HASHTAG]#include[/HASHTAG] <HMC5883L.h>
[HASHTAG]#include[/HASHTAG] <Wire.h>

HMC5883L magnetometer;
MagnetometerScaled scaledVals;

void setup() {
Serial.begin(115200);
delay(20);

Wire.begin(0, 2);
Wire.setClock(400000);

Serial.println("Initializing HMC5883L");
magnetometer = HMC5883L();
magnetometer.SetScale(1.3);
magnetometer.SetMeasurementMode(Measurement_Continuous);

}

void loop() {
scaledVals = magnetometer.ReadScaledAxis();
printScaled(scaledVals);
delay(200);
}

void printScaled(MagnetometerScaled scaled)
{
Serial.print(scaled.XAxis);
Serial.print(" | ");
Serial.print(scaled.YAxis);
Serial.print(" | ");
Serial.print(scaled.ZAxis);
Serial.print("\n");
Serial.flush();
}

Я новичек в этом всем деле, поэтому много чего не понимаю и не знаю, заранее прошу прощение, если что-то написал не коректно...
 
Последнее редактирование:

zurikus

New member
Спасибо за ваш ответ и рекомендации при компиляции скетча выкинуло 2 ошибки:

1) HMC5883:25: error: Wire.send() has been renamed Wire.write().
HMC5883:25: error: Wire.receive() has been renamed Wire.read().

2) Ругнулся на строку :

[HASHTAG]#define[/HASHTAG] address 0x1E //0011110b, I2C 7bit address of HMC5883

expected ',' or '...' before numeric constant

Поэтому я немного подкорректировал код на:

/*
An Arduino code example for interfacing with the HMC5883

by: Jordan McConnell
SparkFun Electronics
created on: 6/30/11
license: OSHW 1.0, OSHW - Definition of Free Cultural Works

Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

[HASHTAG]#include[/HASHTAG] <Wire.h> //I2C Arduino Library

[HASHTAG]#define[/HASHTAG] HMC5883L_ADDRESS 0x1E
[HASHTAG]#define[/HASHTAG] HMC5883L_DEFAULT_ADDRESS 0x1E

void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(HMC5883L_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(HMC5883L_ADDRESS);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();

//Read data from each axis, 2 registers per axis
Wire.requestFrom(HMC5883L_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);
}


Скомпилировал, загрузил, а в результате те же 65 вместо минуса:

x: 70 y: 65358 z: 467
x: 71 y: 65351 z: 464
x: 68 y: 65356 z: 467
 
Последнее редактирование:

zurikus

New member
У меня в наличии есть два датчика. Оба показывают 65 вместо минуса...
Т.е. проблема некорректной работы железа исключена.
 

soznik

New member
Собрал датчик перемещения на ESP8266-01 & HMC5883 проверено всё работает
Остался вопрос как передать данные о срабатывании на вторуюESP/
Скетч писал на основе примера из библиотеки HMC5883.
 

Вложения

zurikus

New member
Спасибо за ваш ответ и рекомендации при компиляции скетча выкинуло 2 ошибки:

1) HMC5883:25: error: Wire.send() has been renamed Wire.write().
HMC5883:25: error: Wire.receive() has been renamed Wire.read().

2) Ругнулся на строку :

[HASHTAG]#define[/HASHTAG] address 0x1E //0011110b, I2C 7bit address of HMC5883

expected ',' or '...' before numeric constant

Поэтому я немного подкорректировал код на:

/*
An Arduino code example for interfacing with the HMC5883

by: Jordan McConnell
SparkFun Electronics
created on: 6/30/11
license: OSHW 1.0, OSHW - Definition of Free Cultural Works

Analog input 4 I2C SDA
Analog input 5 I2C SCL
*/

[HASHTAG]#include[/HASHTAG] <Wire.h> //I2C Arduino Library

[HASHTAG]#define[/HASHTAG] HMC5883L_ADDRESS 0x1E
[HASHTAG]#define[/HASHTAG] HMC5883L_DEFAULT_ADDRESS 0x1E

void setup(){
//Initialize Serial and I2C communications
Serial.begin(9600);
Wire.begin();
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(HMC5883L_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(HMC5883L_ADDRESS);
Wire.write(0x03); //select register 3, X MSB register
Wire.endTransmission();

//Read data from each axis, 2 registers per axis
Wire.requestFrom(HMC5883L_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);
}


Скомпилировал, загрузил, а в результате те же 65 вместо минуса:

x: 70 y: 65358 z: 467
x: 71 y: 65351 z: 464
x: 68 y: 65356 z: 467

Заработал на ESP с исправлением от steelgoose на Github:
Can't read HMC5883l data correctly using I2C · Issue [HASHTAG]#470[/HASHTAG] · esp8266/Arduino · GitHub

Код:
//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
  }

// Quick Fix
  if (x > 32767)
    x = x - 65536;
  if (y > 32767)
    y = y - 65536;
  if (z > 32767)
    z = z - 65536;
Может кому-то пригодится.
 
Сверху Снизу