События‎ > ‎

Подключение IMU 10DOF L3G4200D+ADXL345+HMC5883L+BMP085

Отправлено 20 нояб. 2012 г., 11:25 пользователем Олег Евсегнеев
L3G4200D+ADXL345+HMC5883L+BMP085
Не так давно я писал, что в конечном варианте квадрокоптера, будет установлен инклинометр на основе китайского 10-DOF устройства. И вот, наконец-то нашлось время, чтобы испытать этот интересный прибор на одном из моих mbed контроллеров. 

10-DOF означает, что данный IMU позволяет отслеживать 10 параметров, определяющих его положение в пространстве. Список этих параметров включает:
  • проекция ускорения на три оси x,y,z (акселерометр ADXL345);
  • скорость вращения вокруг трех осей x,y,z (гироскоп L3G4200D);
  • проекции магнитного поля на три оси x,y,z (компас HMC5883L);
  • атмосферное давление (барометр BMP085).
Здесь следует пояснить, что показания барометра можно легко преобразовать в высоту над уровнем моря, что также является одной из пространственных координат. Также, чип барометра имеет встроенный термодатчик, показания которого также могут быть сняты микроконтроллером.

Все расположенные на плате датчики соединены I2C шиной. Благодаря этому, устройство достаточно легко подключается ко всем распространенным платформам, включая Arduino, mbed и TI LaunchPad. Кроме того, такой вариант подключения высвобождает аналоговые входы микроконтроллера, количество которых ограничено.

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

Плата IMU имеет 11 выводов:
  • M_DRDY - сигнал готовности измерений компаса HMC5883L;
  • G_INT1,2 - программируемые прерывания гироскопа L3G4200D;
  • A_INT1,2 - программируемые прерывания акселерометра ADXL345;
  • P_EOC - завершение измерения температуры или давления в BMP085;
  • P_XCLR - сброс всех регистров BMP085;
  • SCL, SDA - I2C шина; 
  • VCC - питание +5В, +3.3В;
  • GND - земля.
Для работы устройства требуется подключить только цепь питания и каналы шины I2C. Как обычно, эксперимент по оживлению устройства происходил при помощи mbed. Схема подключения изображена ниже.

Схема подключения IMU 10DOF + mbed

Как видно на схеме, I2C линии "подтянуты" к напряжению питания сопротивлением 2.2КОм (рекомендуется 2.2 - 10КОм). Есть подозрение, что на плате IMU уже стоят соответствующие резисторы, обязательно проверю это предположение в следующий раз. Что касается питания, то я подключил IMU к +3.3В, хотя согласно даташиту можно использовать и +5В.

Программа

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

Единственные проблемы возникли при подключении гироскопа. Здесь следует помнить, что адреса I2C устройств на mbed сдвинуты на один бит влево относительно аналогичных адресов для Arduino. Например, если Arduino использует для общения с гироскопом L3G4200D адреса 0x68 или 0x69, то при работе с mbed следует использовать 0xD1 или 0xD2, соответственно. В коде библиотеки для данного гироскопа был установлен адрес 0xD2, и попробовать 0xD1 я догадался только после сканирования всей шины.

Код программы достаточно примитивен и почти полностью заимствован у одного из резидентов портала mbed.org.

Тестовая программа для IMU 10DOF на mbed

#include "mbed.h"
#include "HMC5883L.h"
#include "ADXL345.h"
#include "L3G4200D.h"
#include "BMP085.h"
 
DigitalOut myled(LED1);
 
HMC5883L cmp(p9, p10);      // sda, scl
ADXL345 acc(p9, p10);       // sda, scl
L3G4200D gyr(p9, p10);      // sda, scl
BMP085 alt(p9, p10);        // sda, scl
Serial pc(USBTX, USBRX);    // tx, rx
 
int main() {
    pc.baud(19200);
    int16_t data[3];
    
    cmp.init();
    wait(0.1);
 
    // These are here to test whether any of the initialization fails. It will print the failure
    if (acc.setPowerControl(0x00)){
         pc.printf("acc: didn't intitialize power control\n"); 
         return 0;  }
    wait(.001);
    
    //Resolution setup, +/-2g.
    if(acc.setDataFormatControl( ADXL345_FULL_RES || ADXL345_2G )){
        pc.printf("didn't set data format\n");
        return 0;  }
    wait(.001);
     
    //3.2kHz data rate.
    if(acc.setDataRate( ADXL345_3200HZ )){
        pc.printf("didn't set data rate\n");
        return 0;    }
    wait(.001);
     
    //Measurement mode.
    if(acc.setPowerControl( MeasurementMode )){
        pc.printf("didn't set the power control to measurement\n"); 
        return 0;   } 
 
    alt.init();
 
    while (1) {
        cmp.getXYZ(data);
        pc.printf("C %+4i %+4i %+4i ",data[0],data[1],data[2]);
        wait(0.1);
 
        acc.getXYZ(data);
        pc.printf(" A %+5i %+5i %+5i",data[0],data[1],data[2]);
        wait(0.1);
        
        gyr.getXYZ(data);
        pc.printf(" G %+5i %+5i %+5i",data[0],data[1],data[2]);
        wait(0.05);
        
        pc.printf(" T %d", alt.get_temperature());
        pc.printf(" P %d", alt.get_pressure());
        pc.printf(" A %.2f\r\n", alt.get_altitude_m());        
        
        myled = !myled;
    }
}

Результаты

Ниже представлен скриношот выходных данных тестируемого IMU в приложении TeraTerm. Как можно заметить, в моей квартире температура воздуха составляет почти 28 градусов Цельсия. У меня нет другого градусника, но учитывая постоянное нытье гостей, я склонен верить этим показаниям.

Атмосферное давление - около 98 260 Паскалей, что соответствует 737 мм ртутного столба. Согласно данным об атмосферном давлении по городу, полученная величина примерно соответствует действительности. 

Теперь что касается высоты над уровнем моря, которая рассчитывается исходя из показаний термометра и барометра по известным формулам (формулы есть в гугле и в даташите датчика). Официально, город Екатеринбург расположен в 240 метрах над уровнем моря. Учитывая холмистый рельеф города и тот факт, что измерения проводились на 16-м этаже, полученная величина в 258 метров выглядит вполне правдоподобно.

Тест IMU 10DOF L3G4200D+ADXL345+HMC5883L+BMP085

Выводы

Я вполне доволен этим, относительно дешевым китайским IMU ($21 на ebay). Справедливости ради следует отметить, что китайского в нем только сама плата и обвязка. Сами же датчики являются продуктом весьма солидных компаний, таких как Bosch, Pololu, Analog Devices и Honeywell. Плата изготовлена качественно, все чипы расположены строго параллельно друг другу, что очень важно в подобных составных устройствах, которые используются для точного позиционирования в пространстве.

В ближайшем будущем, именно этот IMU заменит аналоговые гироскоп и акселерометр, которые сейчас установлены на моем квадрокоптере.
Comments