Простой электронный компас

На сегодняшний день мировая промышленность электронной техники обладает широчайшим спектром и разнообразием различных датчиков. Сегодня предлагаю рассмотреть такой датчик как HMC5883L. Он представляет собой 3-х осевой магнитометр (оси x, y и z). Как гласит документация на данный датчик, он изготовлен по анизотропной магниторезистивной технологии (Anisotropic Magnetoresistive (AMR) technology). Также согласно документации (даташиту), датчик имеет интерфейс I2C и такие настройки как чувствительность к магнитному полю, настройка скорости записи данных в регистры, количество измерений перед записью в регистры данных, режимы ожидания, единичного и непрерывного преобразования. Помимо этих основных настроек (есть и другие не столь важные для нас, возможно, которые использовать и не придется, например идентификационные регистры), датчик имеет отдельный вывод, на который выводится сигнал по завершению преобразования и записи данных в регистр, то есть по обновлению данных — как лишь датчик закончил измерения и записал данные для считывания в регистры, на выводе DRDY (видимо, это data ready) появляется сигнал. Для удобства этот вывод можно использовать для внешних прерываний микроконтроллера или чего-то подобного. Но это не всегда нужно и в этом устройстве было решено не задействовать эту функцию. 

Вкратце разобрались что это за датчик HMC5883L. Чтобы не мучиться с пайкой мелкого корпуса микросхемы датчика, в продаже имеются модули и в зависимости от модели имеют на себе следующие составляющие — обязательно подтягивающие резисторы для линий I2C, конденсаторы по питанию и необходимые в обвязке самой микросхемы датчика и стабилизатор напряжения на 3,3 вольта, в некоторых ещё есть обвязка согласования уровней для I2C на 3,3 — 5 вольт. Данный датчик может входить в состав модулей, где он является одним из датчиков (в китайских магазинах это девяти осевые модули датчиков гироскопа, акселерометра и магнитометра, а до кучи ещё и барометр, данный шедевр обычно могут применять при разработке квадрокоптеров для стабилизации полета).

Модуль HMC5883L (по названию самого датчика магнитометра) на фото ниже:

Основной задачей при разработке схемы было разобраться с работой и особенностями датчика магнитометра HMC5883L для дальнейшего применения в каких-либо проектах, разработка прошивки для экспериментов с этим датчиком, поэтому, возможно, большой функциональности на данном этапе в устройстве не будет — просто индикация угла относительно севера — схема устройства:

По традиции схема построена на микроконтроллере Atmega8. Данный микроконтроллер можно использовать как в корпусе DIP-28, так и в СМД исполнении в корпусе TQFP-32. Резистор R3 необходим для предотвращения самопроизвольного перезапускания микроконтроллера в случае появления случайных помех на выводе PC6. Резистор R3 подтягивает плюс питания к этому выводу, надежно создавая потенциал на нем. Для индикации используется жидко кристаллический (ЖК или LCD) дисплей SC1602. Он имеет 2 строки символов по шестнадцать штук в каждой из них. ЖК дисплей подключается к микроконтроллеру по 4-х битной системе. Переменный резистор R2 необходим для регулировки контраста символов на дисплее. Вращением движка этого резистора добиваемся наиболее четких для нас показаний на экране. Подсветка ЖК дисплея организована через вывод «А» и «К» на плате дисплея. Подсветка включается через резистор, ограничивающий ток — R1. Чем больше номинал, тем более тускло будет подсвечиваться дисплей. Но пренебрегать этим резистором не стоит во избежание порчи подсветки. Датчик питается от напряжения 3,3 вольта, а микроконтроллер от 5 вольт, поэтому при передачи данных по интерфейсу I2C используется микросхема согласования уровней PCA9517. При покупке модуля с датчиком магнитометром необходимо обратить внимание на наличие уже имеющейся схемы согласования уровней, при ее наличии PCA9517 можно убрать. Заменить PCA9517 можно на любой другой аналог или каскад, выполняющий такие же функции. Резисторы R4 — R7 подтягивают плюс питания к линиям данных интерфейса I2C. Это необходимо для корректной работы протокола. Мощность всех резисторов постоянного сопротивления составляет 0,25 Вт.

Питается вся схема от простого модуля питания на силовом трансформаторе. Переменное напряжение выпрямляется четырьмя диодами VD1 — VD4 марки 1N4007, пульсации сглаживаются конденсаторами C1 и C2. Номинал конденсатора C2 можно увеличить до 1000 — 4700 мкФ. Четыре выпрямительных диода можно заменить одним диодным мостом. Трансформатор применен марки BV EI 382 1189 — преобразует 220 вольт переменного тока в 9 вольт переменного тока. Мощность трансформатора составляет 4,5 Вт, этого вполне достаточно и ещё с запасом. Такой трансформатор можно заменить любым другим силовым трансформатором, подходящим для Вас. Либо данный питающий модуль схемы заменить на импульсный источник напряжения, можно собрать схему обратноходового преобразователя либо применить иже готовый блок питания от телефона, например — все это дело вкусов и потребностей. Выпрямленное напряжение с трансформатора стабилизируется на микросхеме линейного стабилизатора L7805, ее можно заменить на отечественный аналог пяти вольтового линейного стабилизатора КР142ЕН5А, либо применить другу микросхему стабилизатора напряжения в соответствии с подключением ее в схеме (например LM317 или импульсные стабилизаторы LM2576, LM2596, MC34063 и так далее). Далее переняв тенденции китайских инженеров был опробован стабилизатор напряжения на 3,3 вольта на микросхеме xc6206p332mr. Такой стабилизатор изготавливается на заводе в корпусе SOT-23 — то есть уже миниатюрный размер, это один из плюсов. Падение напряжения на таком стабилизаторе составляет 0,25 вольта, а собственное потребление всего 1 мкА. Весьма неплохо. Но пригоден стабилизатор напряжения лишь для низковольтных схем, его максимальное входное напряжение составляет 6 вольт. Не так уж и много, а нам много и не нужно по большому счету. Такой стабилизатор напряжение китайские разработчики применяют много где в различных схемах, узнать его можно по маркировка на корпусе — 662к. Напряжение 3,3 вольта используется для питания датчика магнитометра HMC5883L в соответствии с даташитом.

По традиции схема собиралась на макетной плате:

В первой строке выводятся данные об угле относительно севера. Снизу по порядку координаты x, y, z. Знак «q» означает, что число отрицательное. Датчик выдает именно координаты осей, а по их значениям можно уже высчитать угол или градус. 

Карта регистров датчика HMC5883L имеет следующий вид и состав:

Разберем все необходимое нам для работы с ним. В первую очередь это конфигурационные регистры, в которых будут храниться необходимые настройки для работы датчика. В первом регистре задается число измерений перед записью в регистры данных, частота или скорость записи данных в регистры, предназначенные для считывания. Во втором регистре можно настроить чувствительность датчика к магнитному полю. Третий регистр (mode) настраивает скорость работы протокола I2C, а также режим работы датчика — режим непрерывного измерения, режим единичного измерения, погружает датчик в режим ожидания. Подробнее о том какой бит за что отвечает в регистре смотреть в даташите.

// инициализация, конфигурация
void Init_5883 (void) {

i2c_start_cond(); // запуск i2c
i2c_send_byte(HMC5883_W); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_send_byte(0b00010000); // Configuration Register A, 1 сэмпл, 15 Гц
i2c_send_byte(0b00100000); // Configuration Register B, +-0,88 Ga — 00000000 (по умолчанию 00100000 +-1,3 Ga)
i2c_send_byte(0b00000000); // Mode Register, режим постоянного измерения
i2c_stop_cond(); // остановка i2c

}

Далее 6 регистров предназначены для чтения данных измерений датчика. Каждой оси соответствует пара регистров — старший и младший байт, которые необходимо сложить, чтобы получить число.

// прочитать регистры данных и получить значения

void Read_5883 () {

i2c_start_cond(); // запуск i2c
i2c_send_byte(HMC5883_W); // передача адреса устройства, режим записи
i2c_send_byte(0x03); // передача адреса памяти
i2c_stop_cond(); // остановка i2c

i2c_start_cond(); // запуск i2c
i2c_send_byte(HMC5883_R); // передача адреса устройства, режим чтения
xh = i2c_get_byte(0); // читаем данные
xl = i2c_get_byte(0);
zh = i2c_get_byte(0);
zl = i2c_get_byte(0);
yh = i2c_get_byte(0);
yl = i2c_get_byte(1);
i2c_stop_cond(); // остановка i2c

}

if (xh< 0) {xh=-(xh+1); xl=-(xl+1);}
if (yh< 0) {yh=-(yh+1); yl=-(yl+1);}
if (zh< 0) {zh=-(zh+1); xl=-(zl+1);}

x = (xh << 8) + xl; // склеиваем старший и младший байты
y = (yh << 8) + yl;
z = (zh << 8) + zl;

Остальные регистры за ненадобностью использоваться не будут.

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

float Angle = atan2((double)yy,(double)xx)* 180 / 3.14159265 + 180;
/* или так
Angle = 1000*atan2(y , x); // вычисление угла в радианах
Angle = Angle*572957795; // перевод радиан в градусы (град=рад*180/3,14)
Angle = Angle/10000000000;
Angle = Angle+180; //
*/

Но мало просто читать данные из датчика и переводить значения в необходимые для нас пр помощи математики. Данные могут искажаться многими причинами — наличие электромагнитных полей от сети, наличие рядом металлов или магнитов и прочее. В программе прошивки реализована калибровка по самой распространенной погрешности, смещающий значения всех осей (или не всех иногда) — Hard iron. Такая погрешность может не присутствовать в каком-нибудь лесу и то не факт. Калибровка по такой погрешности устраняется просто — нужно вычислить смещение по осям и отнять его. В результате получим ровные значения угла (из-за такой погрешности показания угла также смещаются и соответственно при вращении истинность значений под вопросом). Для получения значения смещения необходимо взять средне арифметическое значение от минимума и максимума по осям (минимальное значение всегда отрицательное, при сложении получим, например так: -500 + 400 = -100, делим на 2 и получаем значение смещения). Дело в том, что точки на координатах при вращении датчика вокруг оси должны в идеале образовывать ровный круг с центром в точке схождения всех осей, то есть нуле.

В итоге получилось такое устройство: индикация угла относительно севера и значения координат 3-х осей на ЖК дисплее, а также калибровка показаний угла. Никаких рюшечек на дисплее не предусматривалось. Чтобы запустить калибровку, необходимо нажать на кнопку S2, и, удерживая ее, не спеша по вращать датчик на 360 градусов, можно несколько раз. Отпустить кнопку. Теперь показания будут компенсироваться по данным, полученным во время калибровки. При повторном нажатии на кнопку S2 калибровка запустится заново, затерев нулями значения минимумов и максимумов, полученных ранее. Просто сбросить калибровку можно нажатием кнопки сброса — S1.

Для программирования микроконтроллера Atmega8 необходимо знать конфигурацию фьюз битов (скриншот сделан в программе AVR Studio):

К статье прилагается прошивка для микроконтроллера Atmega8, исходный код прошивки в AVR Studio (может быть немного сумбурно, но в обилии комментариев), документация на стабилизатор напряжения xc6206 и датчик HMC5883L, а также небольшое видео, демонстрирующее работоспособность схемы (демонстрация изменения показаний при вращении датчика).


Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот

IC1
МК AVR 8-битATmega81
IC2
Датчик магнитометрHMC5883L1
IC3
ИС I2C интерфейсаPCA95171
VR1
Линейный регуляторL7805AB1
VR2
Линейный регуляторCX6206P332MR1
VD1-VD4
Выпрямительный диод1N40074
R1
Резистор22 Ом1
R2
Подстроечный резистор10 кОм1
R3-R7
Резистор10 кОм5
C1, C3, C4, C8, C9
Конденсатор100 нФ5
C2, C6, C9
Электролитический конденсатор220 мкФ3
C5
Конденсатор4.7 мкФ1
C7
Конденсатор0.22 мкФ1
HG1
LCD-дисплейSC16021
На базе HD44780S1, S2
Тактовая кнопкаTC-A1092
Tr1
ТрансформаторBV EI 382 11891
220В — 9В ACДобавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.