ELECTRONICS

Гироскоп и акселерометр для Arduino: MPU6050, ADXL345, MPU9250

Чтобы понять, как устройство ориентировано в пространстве, используют три разных измерителя, и путать их не стоит. Акселерометр меряет ускорение — в покое он чувствует притяжение Земли и по нему определяет, где низ. Гироскоп меряет скорость вращения. Магнитометр работает как компас и показывает на север.

По отдельности каждый врёт по-своему, поэтому в реальных задачах их совмещают: показания дополняют друг друга, а алгоритм сводит их в один устойчивый угол.

Разборы конкретных моделей

Что выбрать

MPU6050 — шесть осей

Акселерометр и гироскоп в одном корпусе, подключение по I2C, цена копеечная. Стандартный выбор для самобалансирующихся роботов, квадрокоптеров и датчиков наклона. Компаса нет, поэтому азимут он не знает.

ADXL345 — только акселерометр

Три оси ускорения, очень низкое потребление, умеет сам определять удар, свободное падение и двойное постукивание по корпусу. Берут для датчиков вибрации, счётчиков шагов и охранных систем.

MPU9250 — девять осей

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

BNO055 — с собственным процессором

Внутри девять осей и вычислитель, который сам сводит их в готовые углы. Не нужно писать фильтры и разбираться в кватернионах — датчик выдаёт крен, тангаж и курс напрямую. Стоит в десять раз дороже MPU6050.

Дрейф нуля и почему одного гироскопа мало

Гироскоп меряет не угол, а скорость вращения. Чтобы получить угол, показания приходится складывать по времени, и вместе с ними накапливается ошибка: за минуту неподвижно лежащий датчик может «повернуться» на несколько градусов. Это называется дрейфом нуля.

Акселерометр от дрейфа свободен — он всегда знает, где низ, потому что чувствует притяжение. Зато он реагирует на любую тряску и вибрацию, и при движении его показания скачут.

Решение — объединить оба. Быстрые изменения берут от гироскопа, медленную поправку — от акселерометра. Простейший вариант такого объединения называется комплементарным фильтром и умещается в одну строку кода; более точный — фильтр Калмана.