Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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

На сегодняшний день мировая промышленность электронной техники обладает широчайшим спектром и разнообразием различных датчиков. Сегодня предлагаю рассмотреть такой датчик как HMC5883L. Он представляет собой трех осевой магнитометр (оси 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 строки символов по шестнадцать штук в каждой из них. ЖК дисплей подключается к микроконтроллеру по четырех битной системе. Переменный резистор 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 и получаем значение смещения). Дело в том, что точки на координатах при вращении датчика вокруг оси должны в идеале образовывать ровный круг с центром в точке схождения всех осей, то есть нуле.

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

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

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
IC1 МК AVR 8-бит
ATmega8
1 Поиск в магазине ОтронВ блокнот
IC2 Датчик магнитометрHMC5883L1 Поиск в магазине ОтронВ блокнот
IC3 ИС I2C интерфейса
PCA9517
1 Поиск в магазине ОтронВ блокнот
VR1 Линейный регулятор
L7805AB
1 Поиск в магазине ОтронВ блокнот
VR2 Линейный регуляторCX6206P332MR1 Поиск в магазине ОтронВ блокнот
VD1-VD4 Выпрямительный диод
1N4007
4 Поиск в магазине ОтронВ блокнот
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 На базе HD44780Поиск в магазине ОтронВ блокнот
S1, S2 Тактовая кнопкаTC-A1092 Поиск в магазине ОтронВ блокнот
Tr1 ТрансформаторBV EI 382 11891 220В - 9В ACПоиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 2
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (19) | Я собрал (0) | Подписаться

0
Алишер #
А азимут на дисплее выводит?
Ответить
0

[Автор]
Gauss #
Азимут - это горизонтальный угол, измеренный по ходу часовой стрелки от северного направления магнитного меридиана до направления на предмет.
Определите где предмет, определите его местоположение относительно севера (угол относительно севера) и условно его принять за ноль - вот и азимут.
На дисплее обнуления или сдвига угла не отображает относительно каких-то предметов
Ответить
0
snc #
Подскажите чем можно заменить PCA9517?
Ответить
0

[Автор]
Gauss #
Можно парой транзисторов или другой микросхемой согласования уровней (их много всяких)
Ответить
0
alex2 #
Уважаемый Gauss. А нельзя ли сделать компас поинтересней - вывести показания датчика на маленький шаговый двигатель, а на нем стрелку, чтобы наглядно видеть стороны света.
Ответить
0

[Автор]
Gauss #
У меня нет маленького шагового двигателя, увы
Ответить
0
bvv #
Повторил схему, прошил кодом из архива. Но нет стабильных показаний - цифры как-то хаотично меняются, не заметна зависимость показаний от поворота в горизонтальной плоскости. В чем может быть причина? Китайцы прислали именно такую плату как на фото.
Ответить
0
bvv #
Все работает. Хорошо, что был второй экземпляр платки компаса. С ним все заработало. Спасибо за исходник и схему.
Ответить
0

[Автор]
Gauss #
Вот кстати в тему второй платки - я сталкивался с таким китайским чудом, когда в 1 микросхему (акселерометр + магнитометр) поместили акселерометр тот, что по документации должен быть, а магнитометр левый из другой линейки продукции этого производителя (адрес подобрал, поэтому узнал). При этом магнитометр вроде бы даже работал неплохо, а акселерометр был кривой и показывал не верно совсем - полнейший брак. Не знаю что у них при производстве могло так произойти, бывает даже такое
Ответить
0
bvv #
Да скорее всего я сам накосячил что-то, может статикой как-нибудь. Не могу никак подсветку на индикаторе запустить. Вроде и резистор подходящий (50 Ом) и перемычки впаял как на самом индикаторе написано, но не светит. светодиод не звонится и на 3 Вольта не реагирует. Не знаю как его проверить.
Ответить
0

[Автор]
Gauss #
Контакты не перепутали? А как проверить не лучше, чем не подачей напряжения на подсветку - значит что-то не так
Ответить
0
bvv #
Все вроде правильно, Анод через резистор на +, катод на общий. Буду с резистором играться - уменьшать его номинал. Случаем с GPS модулем дело не имели? тоже китайского производства выписал. Может ссылку подскажите если видели кто опытом делится?
Ответить
0

[Автор]
Gauss #
Китайского производства сейчас почти все, с GPS нужно только правильно отпарсить данные - ничего сверхъестественного не вижу в них
Ответить
0
bvv #
Насчет всего китайского согласен. Насчет отпарсить, труднее - надо пример.
Прикрепленный файл: 18-11-16_1528.jpg
Ответить
0

[Автор]
Gauss #
Однако, сегодня китайское - не значит плохое, скорее уже ближе к хорошему, но от брака и подделок застраховаться сложно.
Примера по GPS у меня сейчас нет, но я натолкнул вас туда, куда смотреть нужно (если это что-то недорогое и популярное типа u-blox c uart интерфейсом)
Ответить
0
bvv #
Уже подобрал инфу. В общем все понятно. Осталось только сделать или купить переходник usb-com, чтобы посмотреть все в действии.
Ответить
0
ankern #
Схема тестировалась в Proteus, или другой виртуальной среде?
Ответить
0

[Автор]
Gauss #
Про моделирование писал в своей книге Роберт А. Пиз и он очень прав на вашем примере
Ответить
0
Сергей #
Подскажите, в строке
float Angle = atan2((double)yy,(double)xx)* 180 / 3.14159265 + 180;
Есть функция
atan2(yy,xx);
Не нашел в коде что за обработка данных происходит в этой функции?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
USB осциллограф DSO-2090 Набор 4WD Kit Bluetooth
вверх