• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;
Может кому-то пригодится.
 
Сверху Снизу