Курсовая МП Пристрої Т.Д.И. РК-31


МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Харківський національний автомобільно-дорожній університетКафедра інформаційних технологій та мехатронікиКурсова робота з дисципліни«Мікропроцесорні пристрої»
На тему: «Застосування апаратно-обчислювальної платформи «Arduino» щодо програмування автомобільних комп’ютерних систем»
Варіант №9 (Підключення цифрового компаса HMC5883L до Arduino UNO і цифровий компас HMC5883L)
Студент 3 курсу групи РК-31
Трохимець Даніїл Ігорович
напрямком підготовки 6.050201 “ Системна інженерія ”
спеціальність « Комп’ютерні системи управління рухомимиоб’єктами (на автомобільному транспорту) »
Керівник професор кафедриІнформаційних технологій та мехатронікидоктор технічних наук_________________________ В.О. АлексієвНаціональна шкала __________________
Кількість балів______________________
Оцінка: ECTS_______________________
Харків 2013
Содержание
Вступление……………………..
Раздел 1. Arduino UNO - цифровой компас HMC5883L ….
1.1 Подключение……………………..
1.2 Код работы с датчиком……………………….
Раздел 2. Работа с магнитометром HMC5883L ……………………
2.1 Обозначение выводов………………………………
2.2 Схема подключения ………………………………………….
Раздел 3. Работа по шине I2C ……………………
3.1 Configuration Register A (CRA)………………………………
3.2 Configuration Register B (CRB)………………………………………….
3.3 Mode Register (MR) …………………………………………………………...
Раздел 4. Интерфейс на транзисторе…………………………………………….
4.1.Согласование уровней шины I2C…………………………………………….
4.2.Схема с интерфейсом I2C………………………………………………………
Вывод……………………………………………………………………………..
Список используемой литературы………………………………………………..
Вступление
Если у нас нет GPS Приемника, а мы хотим, как то ориентироваться в пространстве, то можно использовать цифровой компас, который реагирует на магнитную составляющую нашей планеты и можно определить положение соответствующих полюсов. Понятно все относительно, поскольку этот прибор будет так же чувствителен к любым магнитным возмущениям, которые находятся вблизи, если говорить на такую схему в автомобиле, не известно будит ли оно работать вообще. Так как очень много компонентов, которые представляют собой магнитное поле, те же динамики.
Используется в различных летательных аппаратах, квадрокоптерах, в сотовых телефонах, смартфонах. Для игрушек определения горизонта, определения, где юг, где запад, где восток. Для GPS координаты определяются в точке, но мы не знаем куда смотрим, то есть без движения мы не узнаем где мы находимся и как передвигаемся. Компас сразу подскажет, куда наш смартфон направлен.
Чем интересен датчик HMC5883L?У него выход цифровой, шина I2C. Шина I2C и 2С - это Шина придуманная корпорацией Philips, это двухпроводная шина, последовательная передача данных, не очень скоростная шина данных. Изначально была изобретена Philips для взаимодействия микросхем внутри телевизионного приемника, но очень понравилась разработчикам и сейчас это фактический файл, в котором как в любом микроконтроллере есть соответствующая аппаратная реализация шины I2C.Соответственно датчик полностью с цифровым выходом и на выходе мы получаем коды, которыми можно запрограммировать датчик и получить соответствующие значения.
Если говорить о датчиках ускорений, то они не очень дорогие. То есть технология, сначала была дорогой, но за счет того, что электроника очень быстро развивается фактически соответствующие сенсоры, датчики стали очень популярны и доступны для различных электронных систем.
Так же и здесь пример программы, поскольку датчик цифровой. Здесь не все так просто когда применяют датчики. Сначала нужно инициализировать датчик, указать чувствительность с какой частотой он будет работать, какие-то установить переменные и затем далее вызывается функция готовой под-программы для того, чтобы получить значения направления как расположен соответственно датчик относительно сторон света.
1.Arduino UNO - цифровой компас HMC5883L
Рис.1. Микросхема HMC5883L
Микросхема HMC5883L представляет собой 3-х осевой цифровой компас, представлена на (Рис.1), работающий по шине I2C. В качестве сенсоров используется три магниторезистивных датчика. Разработчик: компания Honeywell. Напряжение питания составляет 2.2-3.6В. Чувствительность датчика составляет 5 миллигаусс.
Датчик может использоваться в мобильных телефонах, планшетах, навигационном оборудовании и прочей потребительской электронике, но для радиолюбителей он может быть интересен тем, что цифровой компас может очень пригодится при конструировании роботов и радиоуправляемых моделей. В данном уроке мы рассмотрим подключение HMC5883L к Arduino. Т.к. датчик работает по шине I2C, то схема подключения предельно проста, разработанная с помощью программы Fritzing. Подключение цифрового компаса HMC5883L к Arduino UNO, представлено на (Рис.2):

Рис.2. Схема разработанная с помощью программы FritzingПодключение цифрового компаса HMC5883L к Arduino UNO.
Т.к. сам чип компаса очень маленький 3x3 мм (16-ти выводной LPCC корпус), то некоторые фирмы выпускают платы с удобными выводами для подключения и распаянными подтягивающими резисторами.
1.1 Подключение
Вывод SDA чипа подключаем к выводу SDA платы Arduino (обычно Analog IN 4), а вывод SCL чипа соответственно к выводу SCL платы Arduino (обычно Analog IN 5). На Arduino Mega это 20 и 21 пины. И не забываем питание 3.3В и общий GND
1.2. Код работы с датчиком:
#include "Wire.h"
#include "HMC5883L.h"
 
HMC5883L compass;
 
void setup(){
Serial.begin(9600);
Wire.begin();
compass = HMC5883L();  // создаем экземпляр HMC5883L библиотеки
setupHMC5883L();       // инициализация HMC5883L
}
void loop(){
float heading = getHeading();
Serial.println(heading);
delay(250);
}
void setupHMC5883L(){
// инициализация HMC5883L, и проверка наличия ошибок
int error;
error = compass.SetScale(0.88); // чувствительность датчика из диапазона: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1
if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее
error = compass.SetMeasurementMode(Measurement_Continuous); // установка режима измерений как Continuous (продолжительный)
if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее
}
float getHeading(){// считываем данные с HMC5883L и рассчитываем  направление
MagnetometerScaled scaled = compass.ReadScaledAxis(); // получаем масштабированные элементы с датчика
float heading = atan2(scaled.YAxis, scaled.XAxis);    // высчитываем направление
// корректируем значения с учетом знаков
if(heading < 0) heading += 2*PI;
if(heading > 2*PI) heading -= 2*PI;
return heading * RAD_TO_DEG; // переводим радианы в градусы
}
Чувствительность датчика задается функцией SetScale() и может быть выбрана только из следующих значений: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1.
После загрузки скетча в контроллер Arduino и запуске утилиты мониторинга порта, следует увидеть поступающие данные с датчика, представленные на (Рис.3):

Рис.3 Поступающие данные с датчика
Вращая датчик вокруг своей оси, будет изменяться градус поворота. 0° - это будет север, а 180° - юг. Следует помнить, что датчик очень чувствителен к любым намагниченным предметам, а также к сотовым телефонам и другим подобным устройствам излучающих магнитные поля. Также датчик необходимо располагать строго в горизонтальной плоскости, стоит его наклонить и тогда данные будут неверные. При применении цифровых компасов в робототехнике это необходимо учитывать и обычно, такие цифровые компасы применяют в паре с цифровым акселерометром, для компенсации наклона.
2.Работа с магнитометром HMC5883L
Описание работы одного очень интересного датчика - магнитометра HMC5883L. Как видно из названия этот датчик измеряет магнитное поле, причем делает это в трех осях. Это дает возможность получать трехмерную картину направленности магнитного поля и его величину. А если проще, то с помощью этого датчика можно собрать свой цифровой компас. HMC5883L достаточно распространенный и недорогой датчик, для общения с микроконтроллером используется стандартный I2C интерфейс. Чип выпускается в крошечном 16-и выводном корпусе LPCC размерами 3х3 мм, представленный на (Рис.4). 


Рис.4.Магнитометр HMC5883L
 2.1. Обозначение выводов:
SCL - вход тактирования шины I2C (линия синхронизации)
VDD - вход для подключения питания (кормится эта козявка напряжением в диапазоне 2,16-3,6 вольт)
не используется
S1 - дополнительное питание для портов ввода/вывода. Подключается напрямую к выводу VDDIO
не используется
не используется
не исползуетсяSETP - первый вход для подключения керамического конденсатора на 0,22uF
GND - земля
С1 - еще один вход для подключения конденсатора. Электролитичиского или танталового на 4,7uF (другой конец конденсатора подключается к земле)
GND - земля
SETC - второй вход для подключения керамического конденсатора на 0,22uF
VDDIO - вход для подключения напряжения которое будет на портах ввода/вывода
не используется
Выход прерывания, когда данные готовы на этом выводе появляется логическая 1
SDA – линия передачи данных интерфейса I2C
  В общем, обвязка у сенсора минимальная, всего два конденсатора. Не считая двух pullup резисторов, необходимых для шины I2C. В простейшем случае, когда порты ввода/вывода запитаны напряжением питания схемы и не используется вывод прерывания, схема подключения будет выглядеть так: Представлена на (Рис.5). 
2.2. Схема подключения

Рис.5. Схема HMC5883L,когда порты ввода/вывода запитаны напряжением питания схемы и не используется вывод прерывания
3. Работа по шине I2C
  Как и любое устройство, работающее по интерфейсу I2C, датчик имеет свой собственный уникальный адрес для работы. HMC5883L присвоен адрес 0х1E. С восьмым битом записи/чтения адрес будет 0х3D для чтения и 0х3C для записи.
Карта регистров датчика представлена в таблице ниже (Рис.6):

Рис.6
 Как видно, для настройки датчика доступны регистры (это те, куда можно что-то записать) находящиеся на адресах 00 (configuration register A), 01 (configuration register B) и 02 (mode register).  
3.1. Configuration Register A (CRA)
Рис.7. Регистр конфигурации А
Первый из доступных, для настройки датчика, регистров. Каждый бит имеет свое имя, для того чтобы было видно с каким еще битом в регистре он связан (например, биты CRA6 и CRA5 имеют общее имя MA1 и MA0 соответственно, так как отвечают за один и тот же параметр) CRA7 - зарезервированный бит и пока не используетсяCRA6|CRA5 - устанавливают число замеров (семплов) перед выдачей результата измерения. Эти биты могут принимать значения: 00 = 1(Default);  01 = 2;  10 = 4;  11 = 8Пример: чтобы установить 4 семпла записываем в CRA6 единицу, a в CRA5 ноль.CRA4|CRA3|CRA2 - устанавливают с какой скоростью будут записываться данные в регистры считывания данных (Data Output Registers).000 - 0,75 Гц001 - 1,5 Гц010 - 3 Гц011 - 7,5 Гц100 - 15 Гц (дефолтное значение)101 - 30 Гц110 - 75 Гц111 - зарезервировано Пример: для того чтобы увеличить скорость записи данных до 75 Гц записываем в CRA4 единицу, в CRA3 единицу, в CRA2 ноль.CRA1|CRA0 - настраивают тип измерения. Тут какие-то технические заморочки с импедансом в  магниторезистивной нагрузке датчика в каждой из осей. Оставили значение регистров по умолчанию (00 - нормальный режим измерения) .   Пример: настроим полностью регистр А, установим количество семплов равным 8 , скорость записи данных 3 Гц, нормальный тип измерения. Для этого мы должны отправить в регистр 8 бит данных, в двоичном представлении это будет: &b01101000.
3.2. Configuration Register B (CRB)
Рис.8. Регистр конфигурации В
  В регистре B настраивается чувствительность датчика к магнитному полю. За эти установки отвечают биты CRB7|CRB6|CRB5. Остальные 5 бит не используются, но для корректной работы они должны быть забиты нулями. 
 Зависимость чувствительности (Lsb/Gauss) датчика от установленных битов CRB7|CRB6|CRB5
000 -1370001 -1090 (дефолтное значение)010 - 820011 - 660100 - 440101 - 390110 - 330111 - 230Пример: установим максимальную чувствительность датчика, для этого отправим в регистр B бинарное значение &b000000003.3. Mode Register (MR)

Рис.9 Режим регистрации
В последнем оставшемся регистре, настраиваются такие параметры как скорость работы на шине I2C и режим работы датчика. Высокоскоростной режим работы I2C (3400 кГц) устанавливается записью в бит MR7 единицы. MD1|MD0 устанавливают режим работы датчика: 00 – режим непрерывного измерения. 01 - режим единичного измерения (в этом режиме датчик работает по умолчанию). После измерения и записи результата в регистр вывода данных датчик уходит в режим ожидания (Idle) 10 - погружает датчиков режим ожидания. Потребление в этом режиме падает до 2 мкА 11 - также погружает датчик в режим ожидания.
Пример: установим высокоскоростное соединение датчика с микроконтроллером на скорости 3400кГц и запустим режим непрерывного измерения. Для этого запишем в регистр бинарное значение &b10000000.  Измеренные по трем осям данные забираются из соответствующих регистров, для каждой из осей данные состоят из двух байт - старшего и младшего. Для получения результата их необходимо сложить, но это уже очевидные вещи поэтому приступим непосредственно к коду и железу.Для того чтобы самостоятельно не паять можно купить вот такую готовую печатную плату, представлена на (Рис.10):

Рис.10.Печатная плата
  Стоимость 5$ и помимо минимально необходимой обвязки содержит стабилизатор питания и схему преобразователя уровней. Поэтому эту плату можно подключать к 5-и вольтовой схеме без опасности спалить сенсор.  Подключается плата с датчиком напрямую к микроконтроллеру, подтягивающие резисторы ставить не нужно, они уже имеются на плате (Рис.11):

Рис.11. Подключенная плата с датчиком напрямую к микроконтроллеру

Давайте взглянем на первую часть кода:
#include <Wire.h> //I2C Arduino Library
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
void setup(){
  //Initialize Serial and I2C communications
  Serial.begin(9600);
  Wire.begin();
  
  //Put the HMC5883 IC into the correct operating mode
  Wire.beginTransmission(address); //open communication with HMC5883
  Wire.send(0x02); //select mode register
  Wire.send(0x00); //continuous measurement mode
  Wire.endTransmission();
}
Код, который находится внутри Setup () функция запускается один раз в начале. Она инициализирует последовательное соединение со скоростью 9600 бод. Мы используем последовательное соединение для передачи данных, для каждой оси передавая обратно на компьютер. I2C также инициализируется. Затем мы делаем операцию «write» в HMC5883L. Цель этой операции 'записи' является для регулировки значения в регистре конфигурации от HMC5883L, задаем непрерывный режим работы. Это позволяет нам сделать непрерывное чтение данных оси. По умолчанию чип находится в одном режиме чтения, после первого прочтения, он будет идти в режиме ожидания для экономии энергии. После того, как в режиме ожидания, мы записываем в него, чтобы включить его, прежде чем мы сможем читать из него снова.
Двигаемся дальше, вот где мы фактически запрашиваем и получаем данные:
void loop(){
  
  int x,y,z; //triple axis data
  //Tell the HMC5883L where to begin reading data
  Wire.beginTransmission(address);
  Wire.send(0x03); //select register 3, X MSB register
  Wire.endTransmission();
  
 
 //Read data from each axis, 2 registers per axis
  Wire.requestFrom(address, 6);
  if(6<=Wire.available()){
    x = Wire.receive()<<8; //X msb    x |= Wire.receive(); //X lsb    z = Wire.receive()<<8; //Z msb    z |= Wire.receive(); //Z lsb    y = Wire.receive()<<8; //Y msb    y |= Wire.receive(); //Y lsb  }
  
  //Print out values of each axis
  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" y: ");
  Serial.print(y);
  Serial.print(" z: ");
  Serial.println(z);
  
  delay(250);
}
Функция loop() будет работать снова и снова до тех пор, пока есть мощность. Через промежуток времени, мы делаем быструю запись, чтобы передать функции, где мы хотим начать читать данные для осей. Регистр 3 выбран и, получается, что наиболее значимый байт оси Х. Мы задаем чтение 6 байт один за другим. Чип авто-инкрементов это номер регистра, который мы считываем, поэтому мы не должны выбирать каждый регистр вручную, прежде чем мы будем считывать из него. Ось данных х, у, z отправлены обратно последовательно к компьютеру. Мы можем увидеть эти значения с помощью 'Serial Monitor' среды разработки Arduino, как показано ниже (Рис.12).
Рис.12.Значения осей х, у, z
4.Интерфейс на транзисторе
Данная схема используется для согласования уровней 5В выхода с 3.3В входом. Схема является односторонней (Рис.13).
Рис.13.Схема согласования уровней 5В выхода с 3.3В входом
Преобразование уровня производится с помощью NPN транзистора. Сигнал инвертируется, в устройствах на микроконтроллерах это легко учесть простым инвертированием управляющего сигнала. Возможно также применение n-канального полевого транзистора (Рис.14):
Рис.14.Схема согласования уровней 5В выхода с 3.3В входом с применением n-канального полевого транзистора
Резистор R2 необходим для надежного запирания транзистора при плавающем уровне на затворе, например, при старте системы. В данной схеме необходимо использовать транзисторы с малым пороговым напряжением затвора. Идеальным будет использование так называемых "цифровых" транзисторов. Обратите внимание, что для сохранения времени нарастания сигнала необходимо уменьшить номинал подтягивающего резистора R5 до 4.7 кОм. Недостатком является увеличенная стоимость и сложность. Более разумно использовать MOSFET транзистор в другом включении.
4.1.Согласование уровней шины I2C.
Рис.15.Представлена схема согласования уровней шины I2C
4.2.Схема с интерфейсом I2C.

Рис.16. Представлена схема с интерфейсом шины I2C
Вывод:
В данной курсовой работе разобрались, что такое: цифровой компас HMC5883L, плата Arduino UNO, и как они работают. Узнали, как правильно подключать HMC5883L и получать определенные значения, с помощью написания кода. Узнали, что такое шина I2C и как с ней работать. Выяснили, какие есть недостатки и положительные преимущества. Разобрались, как работать с программой Fritzing, использовали для построения нашей схемы подключения цифрового компаса HMC5883L к Arduino UNO. Так же рассмотрели согласования уровней 5В выхода с 3.3В входом.
Список используемой литературы:
1.Алексієв В.О. Лекційні матеріали.
2. http://cxem.net/arduino/arduino72.php
3. http://logic-bratsk.ru/radio/interface/i2c/using_i2c.rus/i2c_r.htm
4. http://avrproject.ru/publ/rabota_s_magnitometrom_hmc5883l/2-1-0-150
5. http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5883L_3-Axis_Digital_Compass_IC.pdf6.http://www.dfrobot.com/image/data/DFR0209/6DOF%20Shield%20V1.1%20sch.pdf
7. http://we.easyelectronics.ru/Shematech/soglasovanie-logicheskih-urovney-5v-i-33v-ustroystv.html

Приложенные файлы

  • docx 25043721
    Размер файла: 561 kB Загрузок: 0

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