Плата датчиков

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

Соединяется плата датчиков с основной всего 4 проводами: питание и шина данных I2C (GND, VCC, SDA, SCL). Основная шина выбрана именно I2C. При выборе датчиков требуется контролировать, что отсутствуют конфликты адресов на шине (в теории возможен конфликт).

Состав датчиков на плате:

  1. Трехосевой датчик ускорения
  2. Трехосевой датчик угловой скорости
  3. Трехосевой датчик магнитного поля
  4. Барометрический датчик

В представленной таблице занесены наиболее популярные современные MEMS-датчики различных производителей. Все представленные датчики с цифровым выходом и поддержкой интерфейса I2C:

ПроизводительНаименование датчикаОписание датчикаКорпусI2C адресОриентировочная стоимость
BOSCHBMP085Барометрический датчик, заявленная точность 0.25м.LCC-80xEE500 руб.
BOSCHBMP180Барометрический датчик, заявленная точность 0.2м.
BOSCHBMA1803х осевой MEMS акселерометр250 руб.
STL3G4200D3х осевой MEMS датчик угловой скорости (гироскоп).LGA-160xD0250 руб.
STLIS3LV023х осевой MEMS акселерометр (2/6g).LGA-160x3A230 руб.
STLPS001WPБарометрический датчик, заявленная точность 0.8м.HCLGA-80xBx200 руб.
STLSM303DLHTRСдвоенный 3х осевой MEMS датчик ускорения (2/4/8g) и магнитного поля.LGA-28L0x3x250 руб.
FreescaleMMA7455LTДешевый вариант 3х осевого MEMS акселерометра.LGA-14 100 руб.
ADADXL3453х осевой MEMS акселерометр.LGA-14 300 руб.
HoneywellHMC5883L3х осевой MEMS датчик магнитного поля.LPCC-16
ADITG-32003х осевой MEMS датчик угловой скорости.
STLIS2L063х осевой MEMS датчик ускорения.
STLSM330DLCСдвоенный 3х осевой MEMS датчик ускорения и угловой скорости. 220 руб.
STLIS302DLTR3х осевой MEMS акселерометр. 75 руб.
FreescaleMPL115A2Барометрический цифровой MEMS-датчик. 200 руб.

На первой версии платы датчиков был заложен следующий набор:

  1. Трехосевой датчик ускорения: ST LIS3LV02.
  2. Трехосевой датчик угловой скорости: ST L3G4200D.
  3. Трехосевой датчик магнитного поля: ST LSM303DLHTR.
  4. Барометрический датчик: ST LPS001WP.
  5. Барометрический датчик: Bosch BMP085.

Вот так вот выглядит плата датчиков (не установлен акселерометр, в данном случае он есть в магнитном датчике) и установлен только один барометрический датчик:

На следующей версии платы набор датчиков будет расширен, предположительно добавятся:

  1. LSM330DLC,
  2. BMA180,
  3. BMP180,
  4. ADXL345,
  5. ITG-3200,
  6. HMC5883L,
  7. MPL115A2,
  8. I2C EEPROM для хранения калибровок,
  9. И, возможно, некоторые другие.

Акселерометр LIS3LV02

...

Барометр BMA085

Теоретически данный датчик может обеспечить точность определения высоты по давлению в 0.25м. Однако, в реальной ситуации данную точность получить довольно тяжело. Вся причина в сильных шумах датчика. И ладно, если бы они были в пределах 0.5м, иногда соседние показания прыгают на 1.5м (+-10Па). Было подозрение, что это из-за случайных потоков воздуха, однако, по обсуждениям выяснилось, что это не так: люди пробовали запирать датчик в герметичную банку, в итоге разброс выходных данных не изменялся.

По даташиту шум датчика в +-3Па указывается в RMS - это среднеквадратичное отклонение. На сделанных выборках с датчика решил посчитать эту величину. Итого получилось следующее: среднеквадратичное отклонение на 10 выборках с датчика получается примерно в диапазоне от 2.5 до 3.5, т.е. среднее значение этой величины как раз попадает в заявленные 3Па... Если это так, то получается, что сигнал с датчика вполне соответствует тем х-кам, что описаны в даташите.

Причем некоторые иные датчики, вроде бы лишены данного недостатка. Самый простой способ избавиться от шумов - добавить фильтрацию данных. К примеру, глубокий lowpass (с большой величиной обратной связи). Однако, в данном случае увеличивается задержка сигнала, т.е. если поднять датчик на несколько метров вверх, в отфильтрованном сигнале отобразится данный подъем только с ощутимой задержкой.

На рисунке ниже представлены реальные выборки с датчика (масштаб - 1 пиксель изображения на 1 Паскаль давления). Так же представлен пример отфильтрованных данных:

Благо такой датчик как BMA085 уже имеет все необходимые калибровки. Только данные калибровки требуется применять дополнительно. Производитель описывает в даташите необходимые для этого вычисления. Абсолютная точность определения давления заявляется в районе 3Па (т.е. показания с 2 датчиков должны различаться не больше чем на 6Па).

Гироскопический датчик L3G4200

L3G4200 - цифровой 3х осевой MEMS-гироскоп. Под MEMS-гироскопами подразумеваются датчики угловой скорости, т.е. на выходе у такого датчика имеем скорость вращения вокруг оси/осей. При этом благодаря использованию микромеханики (MEMS) датчики получаются размером с обычный современный интегральный чип. Такие датчики в настоящий момент выпускает все большее число производителей и они становятся все лучше: улучшается точность, скорость, потребление и уменьшаются шумы.

Однако, все-равно при работе с датчиком угловой скорости остаются следующие проблемы:

Так же мной замечено, что выдаваемые датчиком величины немного не соответствуют описанным в даташите при переводе в физические значения (в моем случае расхождение было на 15%), так что хорошо бы калибровать и по данной характеристике. Здесь калибровка заключается в полном обороте вокруг осей, подсчету интеграла и калибровки исходя из 360 градусов.

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

Компас LSM303

Это двойной датчик, состоящий из 3х осевого магнетометра и 3х осевого акселерометра.

В простейщем случае определить направления на магнитный полюс можно при помощи 2х осевого магнитного сенсора. Для этого просто смотрятся составляющие магнитного поля по осям и азимут вычисляется как arctan этих величин. Подобная схема используется во многих электронных компасах, а так же часах с функцией компаса. Но при этом показания очень сильно зависят от угла расположения платформы с компасом к горизонту: компас надо держать строго горизонтально, иначе будет большая погрешность измерения. Так же стоит заметить, что вектор магнитного поля направлен не горизонтально, к примеру, на широте Москвы угол данного вектора к горизонту составляет около 60 градусов, т.е. основная составляющая вектора магнитного поля находится в вертикальной оси.

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

Вряд ли я стал писать о схеме подключения, если бы не некоторая путаница в даташите. Конкретно, это привело к тому, что все схемы найденные мной с датчиком LSM303 имеют в своем составе преобразователи уровней на шине I2C на 1.8 вольта для магнитного сенсора. Вообще, если читать даташит по-тупому, не додумывая возможные ошибки, то I2C интерфейс магнитного датчика может работать от напряжения 3.3В. Об это горорит следующая таблица из даташита:

Но очень смахивает по другим признакам на ошибку в описании, да и сам производитель в AppNote предложил работать на 1.8В. Поэтому то ли все перестраховываются, толи сдирают с одной первосхемы, но везде наблюдаются преобразователи уровней.

Я же из-за лени и стойкой уверенности, что все-таки должен интерфейс I2C работать на 3.3В (одна из его особенностей - возможность согласовывать блоки, работающие на разных напряжениях), решил не использовать преобразователи. Моя схема подключения получилась очень простой:

Все нормально функционирует. Датчик не горит, не греется. На сколько эта схема правильная судить тяжело, но производитель не выпустил обновления даташита, да и новый вариант датчика по презентации точно умеет работать с 3.3В, поэтому решено оставить данную схему. На SparkFun в обсуждении так же выдвигалось мнение, что все же не надо додумывать про 1.8В, а делать тупо по даташиту.

Как калибровать датчик? Основная калибровка 2х осевого компаса заключается в установке нуля. Ноль непременно будет смещен, так как показания датчика зависят от структуры ближайших дорожек на плате, состава припоя и собственно корпуса устройства. Для установки нуля в простейшем случае можно использовать алгоритм поворота на 180 градусов. Т.е. выбирается направление, любое, главное, чтобы его можно было точно установить повторно, делается измерение показаний (Xm1, Ym1), затем датчик поворачивается ровно на 180 градусов и делаются следующие измерения (Xm2, Ym2). Исходя из них рассчитывается ноль: (X_{m0}, Y_{m0}) = ((X_{m1}+X_{m2})/2, (Ym1+Ym2)/2). Для 3х мерного случая требуется еще перевернуть устройство вверх-ногами, чтобы найти ноль для 3ей оси.

Original: http://igorkov.org/sensb,
Author: igorkov