Застосування апаратно-обчислювальної платформи «Arduino» щодо програмування автомобільних комп’ютерних систем, страница 3

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

http://avrproject.ru/compass/magnetometer-digital-triple-axis-hmc5883l.jpg

Рис.4.Магнитометр HMC5883L

 2.1. Обозначение выводов:

1.  SCL - вход тактирования шины I2C (линия синхронизации)

2.  VDD - вход для подключения питания (кормится эта козявка напряжением в диапазоне 2,16-3,6 вольт)

3.  не используется

4.  S1 - дополнительное питание для портов ввода/вывода. Подключается напрямую к выводу VDDIO

5.  не используется

6.  не используется

7.  не исползуется

8.  SETP - первый вход для подключения керамического конденсатора на 0,22uF

9.  GND - земля

10.  С1 - еще один вход для подключения конденсатора. Электролитичиского или танталового на 4,7uF (другой конец конденсатора подключается к земле)

11.  GND - земля

12.  SETC - второй вход для подключения керамического конденсатора на 0,22uF

13.  VDDIO - вход для подключения напряжения которое будет на портах ввода/вывода

14.  не используется

15.  Выход прерывания, когда данные готовы на этом выводе появляется логическая 1

16.  SDA – линия передачи данных интерфейса I2C

    В общем, обвязка у сенсора минимальная, всего два конденсатора. Не считая двух pullup резисторов, необходимых для шины I2C. В простейшем случае, когда порты ввода/вывода запитаны напряжением питания схемы и не используется вывод прерывания, схема подключения будет выглядеть так: Представлена на (Рис.5). 

2.2. Схема подключения

http://avrproject.ru/compass/hmc_i2c.png

Рис.5.Схема HMC5883L,когда порты ввода/вывода запитаны напряжением питания схемы и не используется вывод прерывания

3. Работа по шине I2C

     Как и любое устройство, работающее по интерфейсу I2C, датчик имеет свой собственный уникальный адрес для работы. HMC5883L присвоен адрес 0х1E. С восьмым битом записи/чтения адрес будет 0х3D для чтения и 0х3C для записи.

Карта регистров датчика представлена в таблице ниже (Рис.6):

http://avrproject.ru/compass/register_map.png

Рис.6

       Как видно, для настройки датчика доступны регистры (это те, куда можно что-то записать) находящиеся на адресах 00 (configuration register A), 01 (configuration register B) и 02 (mode register).  

3.1. Configuration Register A (CRA) http://avrproject.ru/compass/registerA.png

Рис.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) http://avrproject.ru/compass/registerB.png

Рис.8. Регистр конфигурации В

     В регистре B настраивается чувствительность датчика к магнитному полю. За эти установки отвечают биты CRB7|CRB6|CRB5. Остальные 5 бит не используются, но для корректной работы они должны быть забиты нулями. 

 Зависимость чувствительности (Lsb/Gauss) датчика от установленных битов CRB7|CRB6|CRB5

000 -1370 001 -1090 (дефолтное значение) 010 - 820 011 - 660 100 - 440 101 - 390 110 - 330 111 - 230 Пример: установим максимальную чувствительность датчика, для этого отправим в регистр B бинарное значение &b00000000 3.3. Mode Register (MR)

http://avrproject.ru/compass/mode_register.png

Рис.9 Режим регистрации

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

Пример: установим высокоскоростное соединение датчика с микроконтроллером на скорости 3400кГц и запустим режим непрерывного измерения. Для этого запишем в регистр бинарное значение &b10000000.   Измеренные по трем осям данные забираются из соответствующих регистров, для каждой из осей данные состоят из двух байт - старшего и младшего. Для получения результата их необходимо сложить, но это уже очевидные вещи поэтому приступим непосредственно к коду и железу. Для того чтобы самостоятельно не паять можно купить вот такую готовую   печатную плату, представлена на (Рис.10):

http://avrproject.ru/compass/HMC5883L.jpg

Рис.10.Печатная плата

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

http://avrproject.ru/compass/cuykb.png

Рис.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).5V_to_3.3V_TransistorBipolar

Рис.13.Схема согласования уровней 5В выхода с 3.3В входом

Преобразование уровня производится с помощью NPN транзистора. Сигнал инвертируется, в устройствах на микроконтроллерах это легко учесть простым инвертированием управляющего сигнала. Возможно также применение n-канального полевого транзистора (Рис.14):5V_to_3.3V_TransistorMOSFET

Рис.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.pdf

6.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