Подключение HMC5883L

artclonic
Offline
Зарегистрирован: 13.01.2015

Здравствуите пытаюсь подключить HMC5883L... в модуле GY-273 , в модуле MPU-9250  к ардуино уно.

по вот этому материалу

http://soltau.ru/index.php/arduino/item/453-kak-podklyuchit-tsifrovoj-kompas-hmc5883l-k-arduino

Узнал адреса при помощи этого кода,

#include <Wire.h>

byte error, address;
int nDevices;  //Кол-во найденных устройств

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}

void loop() {
  Serial.println("Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ )  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error == 4)    {
      Serial.print("Unknow error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);  // Ждем 5 сек. до следующего сканирования
}

 

GY-273

Scanning...

I2C device found at address 0x0D !

done

 

 

MPU-9250

Scanning...

I2C device found at address 0x68 !

done

В первом случае выдает  GY-273

X=0

Y=0

Z=0

Во втором MPU-9250

X = -10840

Y = 25901

Z = 11274

Что делать дальше? Прошу помощи, кто настраивал данны компас...

 

artclonic
Offline
Зарегистрирован: 13.01.2015

В этом коде адреса менял, соответствующие... вот в этои строке #define addr 0x68 // I2C 7-битный адрес датчика HMC5883

#include <Wire.h> // подключаем I2C библиотеку
#define addr 0x68 // I2C 7-битный адрес датчика HMC5883

void setup() {
    Serial.begin(9600); // инициализация последовательного порта 
    Wire.begin(); // инициализация I2C
  
    // Задаём режим работы датчика HMC5883:
    Wire.beginTransmission(addr);
    Wire.write(0x00); // выбираем регистр управления CRA (00)
    Wire.write(0x70); // записываем в него 0x70 [усреднение по 8 точкам, 15 Гц, нормальные измерения]
    Wire.write(0xA0); // записываем в регистр CRB (01) 0xA0 [чувствительность = 5]
    Wire.write(0x00); // записываем в регистр Mode (02) 0x00 [бесконечный режим измерения]
    Wire.endTransmission();
}

void loop() { 
  
  Wire.beginTransmission(addr);
  Wire.write(0x03); // переходим к регистру 0x03
  Wire.endTransmission();
  
  Wire.requestFrom(addr, 6); // запрашиваем 6 байтов
  while( Wire.available() )  
  { 
    int h = Wire.read(); // старший байт значения по оси X
    int l = Wire.read(); // младший байт значения по оси X
    int x = word(h, l);  // объединяем в двухбайтовое число

    int y = Wire.read(); // старший байт значения по оси Y
    y = y << 8; // сдвигаем влево на 8 битов
    y = y | Wire.read(); // объединяем с младшим байтом по OR

    int z = Wire.read() << 8; // читаем байт и сдвигаем влево на 8 битов
    z |= Wire.read(); // сокращённый синтаксис операции OR

    Serial.print("X = ");  
    Serial.println(x, DEC); 
    Serial.print("Y = ");  
    Serial.println(y, DEC); 
    Serial.print("Z = ");  
    Serial.println(z, DEC); 
    Serial.println();    
  }
    delay(100);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

artclonic пишет:

Что делать дальше? 

Вы забыли написать что Вы хотите сделать. А без этого как ответить "что делать"?

— Куда мне отсюда идти?
— А куда ты хочешь попасть?
— А мне все равно, только бы попасть куда-нибудь.
— Тогда все равно куда идти. Куда-нибудь ты обязательно попадешь.

(Льюис Кэрролл)

 

artclonic
Offline
Зарегистрирован: 13.01.2015

Хочется увидеть значения потрем осям...

artclonic
Offline
Зарегистрирован: 13.01.2015

Говорят с регистрамия не правильно дружу... Не могу разобраться...

sadman41
Offline
Зарегистрирован: 19.10.2016

Смотрю в https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf (страница 18) и вижу алгоритмическую нестыковку с вашим скретчем в области способа установки регистров, определяющих режим, а так же отсутствие ожидания окончания конверсии.

artclonic
Offline
Зарегистрирован: 13.01.2015

Вот код считывания с регитров (я так понимаю)

Какие адреса мне надо прописать? Подскажите пожалуста

#include <Wire.h> // подключаем I2C библиотеку
#define addr 0x0D // I2C 7-битный адрес датчика HMC5883

void setup() {
    Serial.begin(9600); // инициализация последовательного порта
    Wire.begin(); // инициализация I2C
 
    // Задаём режим работы датчика HMC5883:
    Wire.beginTransmission(addr);
    Wire.write(0x00); // выбираем регистр управления CRA (00)
    Wire.write(0x70); // записываем в него 0x70 [усреднение по 8 точкам, 15 Гц, нормальные измерения]
    Wire.write(0xA0); // записываем в регистр CRB (01) 0xA0 [чувствительность = 5]
    Wire.write(0x00); // записываем в регистр Mode (02) 0x00 [бесконечный режим измерения]
    Wire.endTransmission();
}

void loop() {
 
  Wire.beginTransmission(addr);
  Wire.write(0x03); // переходим к регистру 0x03
  Wire.endTransmission();
 
  Wire.requestFrom(addr, 6); // запрашиваем 6 байтов
  while( Wire.available() ) 
  {
    int h = Wire.read(); // старший байт значения по оси X
    int l = Wire.read(); // младший байт значения по оси X
    int x = word(h, l);  // объединяем в двухбайтовое число

    int y = Wire.read(); // старший байт значения по оси Y
    y = y << 8; // сдвигаем влево на 8 битов
    y = y | Wire.read(); // объединяем с младшим байтом по OR

    int z = Wire.read() << 8; // читаем байт и сдвигаем влево на 8 битов
    z |= Wire.read(); // сокращённый синтаксис операции OR

    Serial.print("X = "); 
    Serial.println(x, DEC);
    Serial.print("Y = "); 
    Serial.println(y, DEC);
    Serial.print("Z = "); 
    Serial.println(z, DEC);
    Serial.println();   
  }
    delay(100);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы внимательно прочитали мой комментарий, в даташит посмотрели? Увидели, как там записываются кофигурационные байты?

artclonic
Offline
Зарегистрирован: 13.01.2015

А что такое конигурационные баиты?

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы не обижайтесь, но с таким уровнем подготовки вам рано напрямую работать с чипом. Поищите соответствующие библиотеки.

artclonic
Offline
Зарегистрирован: 13.01.2015

Все верно какие там обиды. И критика в мо адрес совершенно оправдана, я сам понимаю, что не смыслю.. Вообще я смышленныи (но могу впитывать через практику больше, чем в теории (как говорится методом проб и ошибок).

Я и не претендовал на процесс прямого общения с чипом, просто кикие билиотеки не подключал, они не работают...НЕт измерении по осям. Тут подумал, может быть в библиотеках (соответственно примерах с ними) не правильно прописан адрес устроства, тут мне на аналогичном оруме дали код, которы определяет адрес, этот код определил адрес не тако как в даташите....

Подскажите, где взять работающую библиотеку под мо чип. Вторую ночь не сплю уже... Уже дело принципа, что б данны чип начал мерить..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Принцип работы и измерений

Пример с MPU6050

Надеюсь, поможет.

Вообще, на этом сайте толковые примеры.

artclonic
Offline
Зарегистрирован: 13.01.2015

А вот и нет ни чего там  по HMC5883L, только калибровка , а как подключать и библиотеки нет...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, значит, Вам не поможет. Я старался.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

artclonic, а это, часом, не модуль, где помимо компаса присутствуют акселерометр и барометр?

В Китае была партия таких модулей с неисправным компасом.

Покупал у двух разных продавцов с интервалом несколько месяцев. Первый сразу не проверил, а когда дошли руки - оказалось, не работает. Заказал второй такой же (как говорил, у другого продавца) - результат аналогичный. Продавец вернул деньги (правда, предварительно потребовав в подтверждение видео). Но больше вопросов не задавал - вероятно, его испугал мой английский.

sadman41
Offline
Зарегистрирован: 19.10.2016
JS
Offline
Зарегистрирован: 31.12.2017