Адресация магнитометра 5883L по I2C

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем vladmed, 25 мар 2017.

  1. vladmed

    vladmed Нуб

    Добрый день!

    Имеется магнитометр 5883L, на основе которого ребенок хочет сделать компас. Ребенок слишком рано увлекся электроникой и мне приходится помогать ему разбираться, хотя электроника и программирование - совсем не мои области, я биолог. Датчик нужно подключить к контроллеру из конструктора Fischertechnik по шине I2C. Язык программирования используется графический, в программном элементе указывается адрес устройства на шине, адрес регистра и значение, примерно как на картинке. Datasheet я изучил, но увы, в силу отсутствия базовых знаний просто не могу понять как правильно обращаться к датчику. Библиотеки Ardiuno изучал, но еще больше каши в голове.
    Если можно, подскажите последовательность команд в формате HEX для переключения в режим Continuous measurment, а также адреса по которым считываются данные.

    Снимок.PNG
     
  2. serg_admin

    serg_admin Гик

    https://cdn-shop.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf
    Страница 18

    1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement)
    2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)
    3. Write Mode (02) – send 0x3C 0x02 0x00 (Continuous-measurement mode)
    4. Wait 6 ms or monitor status register or DRDY hardware interrupt pin
    5. Loop
    Send 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)
    Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.
    Send 0x3C 0x03 (point to first data register 03)
    Wait about 67 ms (if 15 Hz rate) or monitor status register or DRDY hardware interrupt pin
    End_loop
    Below is an example of a (power-on) initialization process for “single-measurement mode”:
    1. Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default or any other rate, normal measurement)
    2. Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)
    3. For each measurement query:
    Write Mode (02) – send 0x3C 0x02 0x01 (Single-measurement mode)
    Wait 6 ms or monitor status register or DRDY hardware interrupt pin
    Send 0x3D 0x06 (Read all 6 bytes. If gain is changed then this data set is using previous gain)
    Convert three 16-bit 2’s compliment hex values to decimal values and assign to X, Z, Y, respectively.
     
  3. vladmed

    vladmed Нуб

    Спасибо, это я читал. В целом я уже практически разобрался, проблема была в том, что в datasheet в примерах указаны 8-bit адреса 0x3C и 0x3D, я моя оболочка использует 7-bit 0x1e.
    Остается непонятным чтение данных, я так понял, что для получения значения по X нужно совместить 1-й и 2-й байт? С 2’s compliment я еще не сталкивался, подскажите, пожалуйста, как с ними работать?
     
  4. serg_admin

    serg_admin Гик

    На С++ выглядит так
    Код (C++):
    acc_x = Wire.read()*256 + Wire.read();
    Или

    Код (C++):
    acc_x = Wire.read()<<8|Wire.read();
     
  5. vladmed

    vladmed Нуб

    Можно уточню? В первой строке полученное значение (х1 условно) умножаем на 256 и прибавляет второе (х2). Полученное значение в каком формате будет?
    Во второй, вот это
    побитовый сдвиг влево?
    Мне просто надо понять, как перевести это на графический язык моей оболочки.
     
  6. serg_admin

    serg_admin Гик

    <<8 - это сдвиг на 8 битов.

    | - логическое сложение, побитовое ИЛИ
     
  7. serg_admin

    serg_admin Гик

     
  8. vladmed

    vladmed Нуб

    Спасибо, буду разбираться
     
  9. f.cpu

    f.cpu Нуб

    У Вас как решился вопрос с датчиком HMC5883 ?
     
  10. vladmed

    vladmed Нуб

    все работает, разобрался, что именно вас интересует?
     
    Последнее редактирование: 7 окт 2017
  11. f.cpu

    f.cpu Нуб

    У меня все читается, но ось Z имеет только шумы, это при максимальном усилении значение меняется от -4 до +4. Думаю проблема с микрухой hmc5883
     
  12. vladmed

    vladmed Нуб

    Ну с этим я не помогу, у меня были проблемы другого порядка. Насколько помню, по оси Z значения соответствовали ожидаемым.
     
  13. f.cpu

    f.cpu Нуб

    Спасибо, Я заказал еще один модуль у другого продавца, посмотрю что тот модуль "скажет" )