В данной статье мы рассмотрим как подключить трехосевой цифровой магнитометр HMC5883L к плате Raspberry Pi и использовать его возможности с помощью Python. HMC5883L выделяется как оптимальный выбор для приложений цифрового компаса благодаря своим трехмерным функциям магнитометра, которые позволяют выполнять точные измерения напряженности и ориентации магнитного поля. Это делает его бесценным инструментом для точного определения магнитного севера Земли.
После интеграции магнитометра HMC5883L с Raspberry Pi мы сможем получать показания компаса и определять магнитное поле по осям X, Y и Z в микротеслах (мкТл). На основе этих данных определение направления в градусах становится простым вычислением. Мы проведем вас через каждый шаг процесса, гарантируя, что вы сможете без проблем выполнить эти задачи с помощью Python на вашем Raspberry Pi.
Ранее на нашем сайте мы рассматривали подключение магнитометра HMC5883L к плате Arduino.
Необходимые компоненты
- Плата Raspberry Pi 4 Model B (или другая) (купить на AliExpress).
- Магнитометр (Magnetometer sensor) HMC5883L (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
3-осевой компас/магнитометр HMC5883L
HMC5883L — это цифровой компас, разработанный Honeywell. Это многочиповый модуль поверхностного монтажа, специально разработанный для обнаружения слабых магнитных полей. Он особенно эффективен в предоставлении данных о направлении, что делает его обычным выбором для систем навигации и позиционирования.
Конструкция HMC5883L основана на анизотропной магниторезистивной (AMR) технологии, которая облегчает точное измерение магнитных полей. Она включает в себя трехосевые датчики с полевой емкостью от ±1,3 до ±8,1 Гаусс. Это означает его способность измерять магнитные поля по трем различным осям (X, Y и Z), что позволяет ему определять направление магнитного поля Земли в трехмерном контексте.
HMC5883L оснащен многочисленными собственными функциями, которые упрощают его включение в различные системы. Среди них — интегрированный АЦП (аналого-цифровой преобразователь), предлагающий 12-битный вывод данных, и последовательный интерфейс шины I2C. Этот интерфейс используется для связи с устройством, позволяя ему передавать данные на микроконтроллер или другой процессорный блок.
Модуль магнитометра HMC5883L состоит из интегральной схемы (ИС) магнитометра HMC5883L, ИС регулятора напряжения, резисторов и конденсаторов, все это объединено в интегральную схему. Он использует ИС регулятора напряжения XC6206P332MR (662K).
Более подробную информацию о данном модуле можно посмотреть в техническом описании HMC5883L.
Технические характеристики HMC5883L
- Рабочее напряжение: от 3 В до 6 В постоянного тока.
- Рабочий ток: 100-130 мкА.
- Интерфейс I2C.
- Точность курса: 1-2 градуса.
- Интегрированный 12-битный АЦП.
- Максимальная скорость передачи данных 160 Гц.
- Диапазон от -8 до +8 Гаусс
- Скорость вывода данных: 0,75, 1,5, 3, 7,5, 15 Гц
Распиновка HMC5883L
Модуль HMC5883L имеет пять контактов, как показано на рисунке ниже.
Назначение его контактов следующее:
- VCC: Это контакт питания. Требуется постоянное напряжение, обычно 3 В - 6 В.
- GND: Это заземляющий контакт (земля).
- SCL: Это линия синхронизации для интерфейса I2C.
- SDA: Это линия данных для интерфейса I2C.
- DRDY: Это вывод Data Ready, который переходит в низкий уровень, когда доступны новые данные. Он необязателен и не всегда используется в базовых приложениях.
Отображение регистров и связь по интерфейсу I2C
Адрес регистра | Имя регистра | Тип доступа |
00 | Регистр конфигурации A | Чтение/Запись |
01 | Регистр конфигурации B | Чтение/Запись |
02 | Регистр выбора режима | Чтение/Запись |
03 | Выходные данные X регистра MSB | Чтение |
04 | Выходные данные X регистра LSB | Чтение |
05 | Выходные данные Y регистра MSB | Чтение |
06 | Выходные данные Y регистра LSB | Чтение |
07 | Выходные данные Z регистра MSB | Чтение |
08 | Выходные данные Z регистра LSB | Чтение |
09 | Регистр состояния | Чтение |
10 | Регистр идентификации А | Чтение |
11 | Регистр идентификации B | Чтение |
12 | Регистр идентификации C | Чтение |
Магнитометр HMC5883L использует различные внутренние регистры для настройки и получения данных:
- Регистр конфигурации A (0x00): настраивает работу устройства, включая скорость выходных данных и конфигурацию измерений.
- Регистр конфигурации B (0x01): устанавливает усиление и чувствительность устройства.
- Регистр режима (0x02): выбирает режим работы, например непрерывное измерение, одиночное измерение или режим ожидания.
- Регистры выходных данных X (0x03 и 0x04): хранят показания датчика оси X.
- Регистры выходных данных Y (0x05 и 0x06): хранят показания датчика оси Y.
- Регистры выходных данных Z (0x07 и 0x08): хранят показания датчика оси Z.
- Регистр состояния (0x09): содержит флаги состояния вывода данных.
- Регистры идентификации (0x0A, 0x0B, 0x0C): используются для идентификации устройства.
HMC5883L использует протокол связи I2C, функционируя как подчиненное устройство (Slave). Его назначенный адрес устройства I2C — 0x1E. Соответствующие адреса для его операций чтения и записи следующие:
- Для операций записи (SLA+W) адрес — 0x3C.
- Для операций чтения (SLA+R) адрес — 0x3D.
Схема проекта
Схема подключения магнитометра HMC5883L к плате Raspberry Pi представлена на следующем рисунке.
Подключите контакты VCC и GND магнитометра HMC5883L к контактам 3,3 В и GND Raspberry Pi. Аналогично подключите контакты SDA и SCL магнитометра к контактам SDA (GPIO2) и SCL (GPIO3) Raspberry Pi соответственно.
Настройка Raspberry Pi
Прежде чем перейти непосредственно к программированию на Python, нам необходимо настроить плату Raspberry Pi.
1. Включите I2C на Raspberry Pi:
- Откройте терминал и введите
sudo raspi-config
. - Перейдите к
Interfacing Options
>I2C
и включите его. - Перезагрузите Raspberry Pi.
2. Установите необходимые пакеты Python:
1 2 |
sudo apt-get update sudo apt-get install i2c-tools python3-smbus |
3. Обнаружение устройства :
После подключения HMC5883L вы можете обнаружить его с помощью следующей команды:
1 |
i2cdetect -y 1 |
Если все подключено правильно, в списке должен появиться адрес, который является адресом по умолчанию для HMC5883L.
Код Python для взаимодействия HMC5883L с Raspberry Pi
Вот код Python для сопряжения магнитометра HC5883L с платой Raspberry Pi 4. Скопируйте следующий код и вставьте его в Thonny IDE. Затем сохраните его под любым именем.
Этот простой скрипт Python будет считывать данные с HMC5883L.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import smbus import time import math # HMC5883L register addresses ADDRESS = 0x1E CONFIG_A = 0x00 CONFIG_B = 0x01 MODE = 0x02 X_MSB = 0x03 Z_MSB = 0x05 Y_MSB = 0x07 bus = smbus.SMBus(1) def setup(): bus.write_byte_data(ADDRESS, CONFIG_A, 0x70) # Set to 8 samples @ 15Hz bus.write_byte_data(ADDRESS, CONFIG_B, 0x20) # 1.3 gain LSb / Gauss 1090 (default) bus.write_byte_data(ADDRESS, MODE, 0x00) # Continuous measurement mode def read_raw_data(addr): # Read raw 16-bit value high = bus.read_byte_data(ADDRESS, addr) low = bus.read_byte_data(ADDRESS, addr+1) # Combine them to get a 16-bit value value = (high << 8) + low if value > 32768: # Adjust for 2's complement value = value - 65536 return value def compute_heading(x, y): # Calculate heading in radians heading_rad = math.atan2(y, x) # Adjust for declination angle (e.g. 0.22 for ~13 degrees) declination_angle = 0.22 heading_rad += declination_angle # Correct for when signs are reversed. if heading_rad < 0: heading_rad += 2 * math.pi # Check for wrap due to addition of declination. if heading_rad > 2 * math.pi: heading_rad -= 2 * math.pi # Convert radians to degrees for readability. heading_deg = heading_rad * (180.0 / math.pi) return heading_deg def main(): setup() while True: x = read_raw_data(X_MSB) y = read_raw_data(Y_MSB) z = read_raw_data(Z_MSB) heading = compute_heading(x, y) print(f"X: {x} uT, Y: {y} uT, Z: {z} uT, Heading: {heading:.2f}°") time.sleep(0.5) if __name__ == "__main__": main() |
Этот скрипт инициализирует HMC5883L в режиме непрерывного измерения, а затем непрерывно считывает и печатает значения магнитометра X, Y и Z. Данные могут потребовать калибровки или корректировки в зависимости от вашего приложения и окружающих магнитных полей.
Для расчета направления (или ориентации в градусах) с использованием показаний магнитометра обычно используют функцию арктангенса. Направление можно определить по показаниям магнитометра по осям X и Y.
Тестирование работы проекта
Вы можете запустить приведенный выше скрипт Python и оболочка Thonny Shell начнет отображать показания магнитометра в микротеслах и углы направления в градусах.
Чтобы наблюдать изменение значений магнитного поля, поднесите к датчику любой магнитный материал или магнит. Вы увидите резкое изменение показаний магнитного поля. Угол направления можно изменять просто вращая датчик.
Помните, что вычисленное направление будет относительно магнитного севера Земли, а не истинного севера. Это различие важно, если вы ориентируетесь на основе направления.
Разница между магнитным севером и истинным севером называется магнитным склонением, и она меняется в зависимости от вашего географического положения. Возможно, вам придется скорректировать направление на магнитное склонение в зависимости от того, где вы находитесь.
31 просмотров