Подключение барометрического датчика давления MS5611 к Arduino
Хотите узнать, на какую высоту поднялся ваш радиоуправляемый самолёт, какова высота горного перевала, через который вы проезжаете, или как высоко вы и ваши друзья забрались во время последнего похода? Недорогой датчик атмосферного давления/высотомер MS5611 может удовлетворить ваши потребности.
Обзор оборудования
В основе модуля лежит очень маленький, молниеносно быстрый, точный, маломощный датчик атмосферного давления с низким уровнем шума от компании MEAS Switzerland — MS5611.
MS5611 может измерять атмосферное давление от 10 мбар до 1200 мбар с абсолютной точностью ±1,5 мбар в диапазоне давлений от 450 до 1100 мбар. За пределами этого диапазона гарантированная точность составляет ±2,5 мбар.
Этот датчик атмосферного давления оптимизирован для высотомеров и вариометров с разрешением по высоте 0,012 мбар, что соответствует примерно 10 см (4″) высоты.
MS5611 имеет встроенный датчик температуры, который может использоваться для компенсации изменений окружающей среды и калибровки измерений. Это достаточно точный датчик температуры, измеряющий «температуру кристалла» в диапазоне от -40˚C до +85˚C с точностью ±0,8˚C.
Требования к питанию
Модуль поставляется с прецизионным стабилизатором напряжения 3,3 В MIC5205 и преобразователем уровня напряжения, поэтому вы можете использовать его с вашим любимым 3,3 В или 5 В микроконтроллером без каких-либо опасений.
MS5611 потребляет менее 1,4 мА во время измерений и менее 0,15 мкА в режиме ожидания. Это низкое энергопотребление позволяет использовать датчик в устройствах с батарейным питанием, таких как мобильные телефоны, носимые устройства или смарт-часы.
Цифровые интерфейсы
MS5611 обменивается данными по интерфейсу I2C или SPI. Вывод PS (выбор протокола) определяет, какой интерфейс активен.
Подключение вывода PS к LOW выбирает интерфейс SPI, подключение PS к HIGH выбирает интерфейс I2C. Подтягивающий резистор 1 кОм на модуле подтягивает этот вывод к HIGH, поэтому интерфейс I2C выбран по умолчанию.
Датчик использует интерфейс I2C для связи с Arduino. Он поддерживает два отдельных адреса I2C: 0x77 (Hex) и 0x76 (Hex). Это позволяет использовать два модуля MS5611 на одной шине или избежать конфликтов адресов с другим устройством на шине.
Вывод CSB определяет адрес I2C модуля. Этот вывод имеет встроенный стягивающий резистор 2,2 кОм. Поэтому, когда вывод CSB не подключён, адрес I2C по умолчанию — 0x77 (Hex), а когда вы подключаете его к VCC, линия подтягивается к HIGH, и адрес I2C становится 0x76 (Hex).
Датчик также способен обмениваться данными по SPI! Чтобы включить интерфейс SPI, подключите вывод PS (выбор протокола) к земле.
Технические характеристики
Вот полные технические характеристики:
Для получения дополнительной информации обратитесь к техническому описанию ниже.
Распиновка модуля MS5611
Давайте рассмотрим распиновку.
Выводы питания:
VCC — это вывод питания. Вы можете подключить его к выходу 5 В вашего Arduino.
GND — общий вывод заземления для питания и логики.
Выводы логики SPI:
SCL — это вывод тактирования SPI, входной сигнал для микросхемы.
SDA — это вывод последовательных данных (MOSI), для передачи данных от вашего микроконтроллера к MS5611.
CSB — это вывод выбора кристалла. Если вы хотите подключить несколько MS5611 к одному микроконтроллеру, используйте общие выводы SDA, SDO и SCL, назначив каждому модулю уникальный вывод CSB.
SDO — это вывод выходных данных (MISO), для передачи данных от MS5611 к вашему микроконтроллеру.
PS — это вывод выбора протокола. Подтяните его к LOW, чтобы включить связь по SPI.
Выводы логики I2C:
SCL — это также вывод тактирования I2C, подключите к линии тактирования I2C вашего микроконтроллера.
SDA — это также вывод данных I2C, подключите к линии данных I2C вашего микроконтроллера.
Вывод CSB определяет адрес I2C модуля. Когда вывод CSB не подключён, адрес I2C по умолчанию — 0x77 (Hex), а когда вы подключаете его к VCC, линия подтягивается к HIGH, и адрес I2C становится 0x76 (Hex).
PS — это вывод выбора протокола. Оставьте его неподключённым, чтобы включить связь по I2C.
Схема подключения модуля MS5611 к Arduino
Теперь, когда мы знаем всё о модуле, можно приступить к его подключению к Arduino!
Начните с подключения вывода VCC к источнику питания — подойдёт напряжение от 3 В до 5 В. Используйте то же напряжение, на котором работает логика вашего микроконтроллера. Для большинства плат Arduino это 5 В. Для устройств с логикой 3,3 В используйте 3,3 В. Теперь подключите GND к общей земле.
Подключите вывод SCL к выводу тактирования I2C, а вывод SDA — к выводу данных I2C на вашем Arduino. Обратите внимание, что у каждой платы Arduino разные выводы I2C, которые следует подключать соответственно. На платах Arduino с компоновкой R3 выводы SDA (линия данных) и SCL (линия тактирования) расположены на штыревых разъёмах рядом с выводом AREF. Они также известны как A5 (SCL) и A4 (SDA).
На следующей иллюстрации показана схема подключения.
После подключения модуля к Arduino пора писать код!
Установка библиотеки
Чтобы начать считывать данные с датчика, вам нужно установить библиотеку MS5611. Она доступна в менеджере библиотек Arduino.
Для установки библиотеки перейдите в Sketch > Include Library > Manage Libraries… Дождитесь, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.
Отфильтруйте поиск, набрав „ms5611“, и установите библиотеку.
ВНИМАНИЕ — ЭКСПЕРИМЕНТАЛЬНО:
Роб Тиллаарт также написал MS5611_SPI (экспериментальную SPI-версию библиотеки) для связи с MS5611 через интерфейс SPI. Но, к сожалению, он обнаружил, что выбор SPI в качестве протокола вызывает внутренний нагрев, что приводит к некорректным показаниям температуры. Поэтому в нашем руководстве мы рассмотрим только интерфейс I2C.
Код Arduino — считывание давления и температуры
Ниже приведён базовый скетч Arduino. Загрузите его на ваш Arduino. Вы должны увидеть давление и температуру в мониторе последовательного порта.
#include "MS5611.h"
MS5611 MS5611(0x77);
void setup() {
Serial.begin(115200);
while(!Serial);
if (!MS5611.begin()) {
Serial.println("MS5611 not found, check wiring!");
while (1);
}
}
void loop() {
MS5611.read();
Serial.print("Temperature: ");
Serial.print(MS5611.getTemperature(), 2);
Serial.print("\tPressure: ");
Serial.print(MS5611.getPressure(), 2);
Serial.println();
delay(1000);
}
Обратите внимание, что для работы со скетчем необходимо установить скорость монитора последовательного порта 115200 бод.
Вы увидите множество данных с отображением значений давления и температуры. Попробуйте перемещать датчик и обратите внимание, как меняются данные.
Объяснение кода:
Код довольно прост. В начале подключается библиотека MS5611.h и создаётся объект в глобальной области видимости MS5611 MS5611(0x77). Обратите внимание, что объект создаётся с адресом I2C в качестве параметра.
#include <Wire.h>
MS5611 MS5611(0x77);
В функции setup мы инициализируем последовательную связь с ПК и вызываем функцию begin().
Функция MS5611.begin() инициализирует интерфейс I2C и проверяет корректность идентификатора микросхемы. Затем она выполняет программный сброс микросхемы и ожидает калибровки датчика после пробуждения.
void setup() {
Serial.begin(115200);
while(!Serial);
if (!MS5611.begin()) {
Serial.println("MS5611 not found, check wiring!");
while (1);
}
}
В цикле loop мы вызываем функцию MS5611.read() для выполнения считывания. После этого мы можем обращаться к методам объекта (MS5611) через оператор точки.
MS5611.getTemperature() возвращает показания температуры.
MS5611.getPressure() возвращает показания атмосферного давления.
void loop() {
MS5611.read();
Serial.print("Temperature: ");
Serial.print(MS5611.getTemperature(), 2);
Serial.print("\tPressure: ");
Serial.print(MS5611.getPressure(), 2);
Serial.println();
delay(1000);
}