Электронный компас на LSM303DLH
Попала в мои цепкие рученки одна интересная деталька. Трехосевой цифровой акселерометр, совмещенный с цифровым магнитометром, чувствительностью до 1.5 Гаусса. К слову, сила магнитного поля Земли около 0.4 Гаусса. Почти треть диапазона, так что из этой фиговины может получится вполне годный электронный компас. К слову, цена вопроса всего 350р за микросхему. Вполне по божески, учитывая набортный фарш и чувствительность этой микросхемы.
Микросхема LSM303DLH Особо любопытно выглядит пузико — натуральная печатная плата. С дорожками и переходными дырками. Сразу расхотелось делать под ней дорожки. А то какая-нибудь заусеница на дорожке проковыряет лак на пузе и коротнет не туда.
Что еще не понравилось — контактные площадки не видно с торцов. Позиционировать и проверять точность запайки сложно. В этом плане QFN корпуса удобней.
Размером корпус 5х5 мм. Как тетрадная клеточка. Ужас :) Схемотехника Вот тут начинается веселуха. Складывается ощущение, что товарищи в ST решили не изобретать новую топологию кристалла, а банально запихали под один корпус акселерометр и магнитометр. Так что у них даже линии I 2 C интерфейса разные. Разная адресация и разное питание интерфейсов.
Питание микросхемы (на схеме VDD) 3.3 вольта. Но тут есть одна заковыка. Акселерометр может работать полностью от 3.3 вольт, а магнитометру требуется 1.8 вольт. Причем есть подозрение, что где то там ошибка даташита. Либо питание IO акселерометра не может быть 3.3 вольта, либо у магнитометра питание IO может быть выше 1.8 вольт. В общем очень все странно. Проверять я не рискнул, тем более по всем AN показана схемотехника, где интерфейсное питание и акселя и магнитометра 1.8 вольт. В общем, я решил перестраховаться и запитать их от 1.8 вольт. Ради этого я вкорячил в схему LM317, самое мелкое, что смог найти в наличии. LM317 это линейный стабилизатор с управляемым напряжением. Отношение R1 и R2 определяют выходное напряжение. У меня R1= 510 Ом. А R2=200 Ом, что дает примерно 1.74 вольта.
Также потребовался конвертер уровня I 2 C шины между 1.8 и 3.3 вольт. Иначе подача 3.3 вольт, на SDA/SCL линий может угробить микросхемку. Специальную микросхему конвертера искать мне было впадлу, поэтому я сколхозил его из первых попавшихся полевичков.
По быстрому развел небольшой модуль:
Печатка Корпус просто прелесть! LGA28, мать его. Когда я впервые взял в руки эту «тетрадную клеточку» да с семью выводами с каждой стороны… В общем я конкретно так фаломорфировал. КАК.
Потом вспомнил, что я джедай 80го уровня по ЛУТ технологии, а принтер еще не окончательно скатился в УГ и что то еще даже печатает. Так что откатал и вытравил без особых проблем.
Тонер идеально лег, глянцевый слой ушел отовсюду сам, без малейших усилий.
После вытравил все в своем убитом и грязном растворе хлорного железа. Тем не менее получилось неплохо.
Смыл тонер и можно паять. Лудил обычным припоем.
Заодно опробовал новую пачку фотобумаги Lomond. Результат оказался даже лучше чем на прошлой пачке. Вот такая вот обложка. Рекомендую, отличный ЛУТ результат!
Монтаж Запаялось, кстати, на удивление легко. Поставил примерно на место, дунул феном и готово. Даже сам не ожидал, что будет все так просто. Остальная комплектуха напаивается тривиально.
Видео урок по пайки LGA на коленке я обязательно сделаю, но попозже.
Интрефейс Сразу скажу, что до акселерометра у меня руки еще не дошли. Да и не интересен он мне был особо. В первую очередь меня интересовал магнитометр. С акселем я разберусь позже
Работать с ним очень просто. Обращаемся с ним как с обычной EEPROM. Адрес устройства на i2c шине = 0x3C, адрес ячейки однобайтный.
У магнитометра есть лишь несколько регистров конфигурации. Подробно биты посмотрите в даташите. Я лишь кратко опишу.
- CRA_REG_M — выбор частоты замера и смещения. Я просто выставил 30Гц.
- CRB_REG_M — выбор коэффициента усиления магнитометра. Я оставил по дефолту, на максимуме.
- MR_REG_M — режим работы. Спящий, одиночный замер, циклический замер.
- OUT_X_H_M — Ось Х старший байт
- OUT_X_L_M — Ось Х младший байт
- OUT_Y_H_M — Ось Y старший байт
- OUT_Y_L_M — Ось Y младший байт
- OUT_Z_H_M — Ось Z старший байт
- OUT_Z_L_M — Ось Z младший байт
- SR_REG_M — Статусный регистр. Позволяет включить внутренний стабилизатор напряжения, а также показывает заблокированые ли выходные регистры.
- IRx_REG_M — Байты идентификации. Вроде серийного номера.
Вначале инициализация. Модуль надо включить. И настроить частоту обновления
CRA_REG_M = 0х14 -- выставялем частоту обновления в 30Гц MR_REG_M = 0x00 -- переключаем в активный режим, непрерывное преобразование.
Дальше надо лишь читать периодически 6 выходных регистров
- OUT_X_H_M
- OUT_X_L_M
- OUT_Y_H_M
- OUT_Y_L_M
- OUT_Z_H_M
- OUT_Z_L_M
Причем если мы начали считывать с любого выходного регистра, то остальные регистры блокируются на запись до тех пор, пока мы не считаем все выходные регистры. Так что считывать надо сразу все шесть. Значения в регистрах знаковые, от -2048 до +2048.
Код Использовалась библиотека TWI которую я уже описывал ранее.
Тут только прикладной код, под RTOS. Весь код в архиве. Как у меня построено, каждое действие расписано на две функции. Начало и конец. Между ними управление отдается диспетчеру.
Опыт Я только начал экспериментировать и многое делал вручную. Модуль питается от 3.3 вольт, поэтому внимательней. Если кто экспериментирует на Pinboard, то переставьте фишку питания на 3.3 вольта. Если при этом возникнут проблемы с работой бутлоадера, то заюзайте встроенный FTBB программатор. Батники для него в архиве проекта.
Затем приклеил датчик к дну перевернутого стакана и поворачивая его на 45 градусов, снял выходную характеристику по осям Х и Y. Потом загнал все в Exel.
Кот Сосис контроллировал процесс.
Если учесть, что Х и У нормальны друг другу, а магнитометр замеряет проекцию магнитного поля Земли (направленную на север), то результатом должны быть две синусоиды, сдвинутые на 90 градусов. Что и получилось.
Результаты плавают на 10 градусов гдет, но мне интересней было посмотреть на сдвиг фаз, поэтому я не стал их все вбивать, загнал данные одного оборота и просто накопипастил для наглядности, чтобы сделать несколько периодов. Несмотря на одинаковые коэффициенты усиления Y имеет несколько большее смещение. Видимо влияние топологии печатной платы, а может и дорожка какая подмагничивает. Хотя там нет ничего мощного. Так что надо под каждый конкретный вариант калибровать.
Теперь только останется загнать все один масштаб. А дальше все просто
Вот и мы знаем куда нам ехать и куда глядит наш робот! Причем это абсолютные координаты, относительно севера.
Да это просто праздник какой то! Но это в простейшем случае. Стоит только наклонить платоформу, как все наши построения летят к чертовой матери, т.к. мы больше уже не знаем чему равны проекции на самом деле. И вот тут на помощь нам приходит акселерометр! Который точно подскажет нам ориентацию платформы относительно земли. А также в дело пойдет ось Z магнитометра.
После чего начинается векторный матан. На основании показаний акселерометра начинаем делать коррекцию с учетом наклонов. Чую тут будет дофига тригонометрии и матриц. С матрицами МК справится на раз, а тригонометрию можно сделать таблично. Так что все решаемо. Может даже займусь на досуге и воплощу все это в виде модуля, четко показывающего угол на север, как бы его не повернули.
- Даташит на LSM303DLH
- Проект прошивки для AVR Studio на Mega16 (Pinboard)
- Проект печатной платы в Eagle CAD
На новогодние праздники попробую заняться математикой и откалибровать хотя бы на плоскости. Чтобы четко получался угол. А там уж и замерим насколько он точно может определять градусы азимута.
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
174 thoughts on “Электронный компас на LSM303DLH”
два вопроса: 1. Насколько эта штука чувствительна к бытовой технике и другим предметам (просто интересно) 2. Насколько точно, после колибровки в чистом поле, и включении его в другой точке (комнате, доме, материке) можно понять где север? или же каждый раз надо крутиться на 360 чтобы получить новые синусоиды?
Чёт мне кажется, что точность будет очень небольшой. И никакие калибровки в чистом поле не помогут. А если учесть еще всякие магнитные склонения и т.д….
А обычный компас у тебя дома тоже скачет как полоумный? Конечно от магнита он сбесится. Но уже в 20-30см от ниодимого магнита он его перестает чувствовать вообще.
1. Магнит от винта перестает замечать уже за 20-30см. 2. Вертеться вообще не надо. Разве что для калибровки. Но это делается один раз.
У меня в комнате магнитное склонение гуляет на 90 градусов — комп, колонки, редкоземельные магниты по полке разбросаны, прочие радости.
У нормальных людей тоже всё плохо.
В открытом поле обычно всё вполне стабильно, если девайс не перемещается на сотни километров, то можно даже тупо захардкодить склонение, а не пользоваться тяжеленными картами.
Насколько я понимаю с помощью акселерометра невозможно определить положение тела относительно Земли.
Одного — нет, а с помощью трёх — можно. Более того, это чуть ли не единственный способ определения ориентации. В сочетании с измерителями угловых скоростей даёт автономную систему позиционирования.
>>В сочетании с измерителями угловых скоростей даёт автономную систему позиционирования. в сочетании практически да, но как ты определишь своё положение в начальный момент времени?
там как раз для этого акселерометр есть
Акселерометр выдает ускорения по осям. 1) как ты определишь положение при включении?? 2) вращая тело с постоянной скоростью по осям что покажет тебе акселерометр?
1. Всегда есть ускорение свободного падения. Зная его проекцию по осям мы гарантировано узнает ориентацию девайса в пространстве.
Имея компас мы сможем на основании данных акселерометра определить какие оси у нас куда направлены и какую часть земного поля они ловят.
Все. Имеем азимут.
2. Ускорение свободного падения. Т.е. 9.8
Так ведь ускорение свободного падения это не сила) Пока тело никуда не падает нет никакого ускорения.
З.Ы. я не пытапюсь убедить в обратном, просто не могу в этом разобраться…
Вес это сила которая всегда с тобой. Так что акселерометр ВСЕГДА показывает ускорение на осях обращенных вниз или вверх.
Исключение одно — когда акселерометр начинает падать и оказывается в невесомости.
Принцип работы акселерометра знаешь? ТАм стоит болванка которая болтается в зависимости от ускорения. Ну и сила тяжести на нее действует тоже.
Ясно. Спасибо. Значит он измеряет не ускорения, а силы действующие по осям.