Измерение дальности и местоположения с помощью ESP32 UWB DW3000


В этой статье мы изучим технологию сверхширокополосной связи с использованием модуля ESP32 DW3000 UWB. Сверхширокополосная связь (Ultra-wideband, UWB) — это протокол беспроводной связи малого радиуса действия, работающий посредством радиоволн и обеспечивающий надежное и точное определение дальности и зондирование (определение местоположения), создавая новое измерение пространственного контекста для беспроводных устройств.

Измерение дальности и местоположения с помощью ESP32 UWB DW3000

Микросхема приемопередатчика IC DecaWave DW3000 UWB позволяет определять местоположение объектов с точностью до 10 см. Микросхема DW3000 имеет всемирную поддержку UWB благодаря работе на канале UWB 5 (6,5 ГГц) и канале 9 (8 ГГц). DW3000 совместим с микросхемой Apple U1 , что позволяет работать с экосистемой Apple.

В этом уроке мы рассмотрим конструкцию платы, ее технические характеристики и приложения. Затем мы узнаем, как использовать плату ESP32 DW3000 для высокоточного определения дальности и локализации.

Прежде чем двигаться дальше, советуем ознакомиться с основными правилами измерения дальности с помощью модуля ESP32 DW1000 UWB.

Необходимые компоненты

  1. Плата ESP32 DW3000 (купить на AliExpress).
  2. Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
  3. Кабель Micro-USB
  4. Макетная плата.
  5. Соединительные провода/перемычки.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Что такое сверхширокополосная связь и как она работает?

UWB — это беспроводной протокол связи ближнего действия, похожий на Bluetooth или Wi-Fi. Он также использует радиоволны для связи и работает на очень высокой частоте. Как следует из его названия, он также использует широкий спектр в несколько ГГц. Один из способов представить его как радар, который может непрерывно сканировать всю комнату и точно захватить объект, как лазерный луч, чтобы обнаружить его местоположение и передать данные.

Принцип сверхширокополосной связи

Основная цель Ultra Wideband (сверхширокополосной связи) — обнаружение местоположения и определение дальности действия устройства. В то время как Wi-Fi и Bluetooth были модифицированы для обеспечения большей точности в определении местоположения других устройств и подключении к ним, UWB изначально более точен и потребляет меньше энергии.

Передатчик UWB работает, отправляя миллиарды импульсов по широкому спектру частот. Соответствующий приемник получает сигнал, который преобразует импульсы в данные, прослушивая знакомую последовательность импульсов, отправленную передатчиком. Импульсы отправляются примерно один раз в две наносекунды, что помогает UWB достичь высокой точности в реальном времени.

Принцип определения дальности с помощью сверхширокополосной связи

Понятия “anchor” («якорь») и “tag” («тег») важны для понимания измерения расстояния и местоположения с помощью UWB. Якорь — это, как правило, фиксированное устройство UWB с известным местоположением. Тег — это, как правило, мобильное устройство UWB. Якорь и тег обмениваются информацией для установления расстояния между ними. Точное местоположение тега можно определить, связавшись с несколькими якорями. Некоторые устройства могут действовать как якорь или тег.

Чип DW3000

Чип DW3000 — это микроконтроллерный чип, производимый компанией Decawave. Он используется при разработке сверхширокополосной (UWB) беспроводной технологии для услуг на основе определения местоположения и точного позиционирования внутри помещений. Чип предназначен для использования в таких приложениях, как отслеживание активов, промышленная автоматизация и робототехника. Он использует измерение времени пролета (ToF) для определения расстояния между устройствами, что позволяет выполнять точное позиционирование и отслеживание местоположения.

Чип DW3000

Модуль имеет всемирную поддержку UWB благодаря работе на канале UWB 5 (6,5 ГГц) и канале 9 (8 ГГц). DW3000 оптимизирован для работы с низким энергопотреблением от батареи и имеет гораздо меньшее энергопотребление, почти 1/3 от DW1000.

Особенности DW3000

  • Совместимость с чипом Apple U1.
  • Поддерживает UWB-каналы 5 (6,5 ГГц) и 9 (8 ГГц).
  • Полностью соответствует FiRa™ PHY, MAC и разработке сертификации.
  • Интегрированная UWB IC, UWB чип-антенна, управление питанием и кристалл упрощают интеграцию проекта.
  • Оптимизирован для работы от аккумулятора с низким энергопотреблением.
  • Позволяет экономически эффективно внедрять решения UWB.
  • Напряжение питания: от 2,5 до 3,6 В (VDD3V3), от 1,62 до 3,6 В (VDD1).

Применение DW3000

  • Высокоточные системы определения местоположения в реальном времени.
  • Беспроводные сенсорные сети с определением местоположения.
  • Отслеживание активов.
  • Автоматизация и безопасность завода/склада.
  • Медицинский персонал и местоположение пациента.
  • Безопасность розничной торговли, навигация и аналитика клиентов.
  • Подключенный дом.

Плата ESP32 DW3000 UWB (сверхширокополосная)

Модуль ESP32 UWB Ultra Wideband состоит из Decawave DW3000 и модуля ESP32 WiFi. Эта плата производится компанией Makerfabs. Плата действует как непрерывно сканирующий радар, который точно фиксируется на другом устройстве (называемом Anchor) и связывается с ним, таким образом вычисляя свое собственное местоположение. Самое лучшее в плате то, что она совместима с чипом Apple U1, что позволяет работать с системой Apple.

Плата ESP32 DW3000 UWB (вид спереди)

Верхняя сторона платы имеет встроенный модуль ESP32 WROOM/Wrover с модулем DW3000 и другими пассивными электронными компонентами. Есть две кнопки, одна для вспышки, другая для отдыха. Плата имеет порт micro-USB для загрузки прошивки и для последовательной связи.

Плата ESP32 DW3000 UWB (вид сзади)

На задней стороне платы находится чип CP2102 для связи UART. Наименование портов ввода/вывода также указано на плате. Вы можете использовать штыревые или гнездовые разъемы и паять с обеих сторон платы.

Установка библиотеки DW3000

Для использования DW3000 с ESP32 в Arduino IDE нам нужна библиотека DW3000. Библиотека DW3000 предлагает функционал для использования чипов/модулей DW3000 от Decawave с любым микроконтроллером.

Библиотека DW3000 на гитхабе

Библиотека DW3000 была разработана компанией NConcepts, но вы можете загрузить ее из следующего репозитория GitHub, поддерживаемого Makerfabs.

Библиотека поддерживает передачу сообщений и обработку временных меток (для приложений определения дальности и местоположения), а также реализует различные режимы работы, которые может предложить DW3000. Проект библиотеки призван предложить простой в использовании интерфейс для сложного и требующего больших настроек управления DW3000.

Настройка оборудования для якоря и тега

Давайте узнаем, как использовать плату ESP32 DW3000 UWB (Ultra Wideband) с Arduino IDE и измерить расстояние между платами. Для этого проекта вам понадобится пара плат. Одна из плат будет действовать как якорь, а другая как тег.

Настройка оборудования для якоря и тега

Для части Anchor (якоря) нам не нужно ничего, кроме кабеля Micro-USB. Но для части tag (тег) нам нужен 0,96″ I2C OLED дисплей и Powerbank. I2C OLED будет отображать расстояние тега (Tag) от якоря (Anchor). Powerbank или батарея будут обеспечивать питание подвижной Tag.

На теговой части подключите контакты I2C OLED-дисплея 0,96″ I2C (SDA и SCL) к контактам ESP32 GP21 и GP22. Подключите контакты VCC и GND OLED-дисплея к контактам ESP32 3,3 В и GND.

Исходный код программы для тестирования дальности

Код, который мы будем использовать для тестирования платы ESP32 DW3000, взят из примера библиотеки. Используя этот пример, мы можем провести тестирование диапазона, который фактически лежит в диапазоне 10-20 метров.

Прежде чем перейти к части тестирования, нам нужно понять что собой представляет калибровка задержки антенны. В сверхширокополосных (UWB) системах калибровка задержки антенны — это процесс измерения и компенсации внутренней задержки времени, которая возникает между передачей и приемом сигнала из-за физических свойств антенны. Эта задержка может меняться в зависимости от таких факторов, как частота сигнала, размер и форма антенны, а также расстояние между передатчиком и приемником. Калибровка задержки антенны важна для обеспечения точных измерений времени пролета (ToF) в системах UWB и для улучшения общей производительности системы. Это можно сделать, измерив импульсную характеристику канала и затем компенсировав задержку.

Для нашей части кода мы установили значения задержки антенны по умолчанию для частоты повторения импульсов 64 МГц как 16385. Вы можете изменить их в соответствии с поведением вашего UWB-модуля и точностью измерения дальности в следующих строках кода.

Чтобы измерить расстояние между платами, нам необходимо загрузить код «Anchor» на одну плату ESP32, а код «Tag» на другую плату ESP32.

Код якоря

Скопируйте следующий код и загрузите его на первую плату UWB (сверхширокополосную), которая является якорной.

Код тега

Скопируйте следующий код и загрузите его на вторую плату UWB (сверхширокополосную) под названием Tag.

Тест дальности с модулем ESP32 UWB DW3000

После загрузки кода якоря и кода тега устройства готовы к тестированию. Чтобы проверить дальность и точность, вы можете отметить расстояние на полу или на столе.

Тестирование определения дальности с модулем ESP32 UWB DW3000 (часть 1)

Я отметил расстояние в 1 метр и между ними отметил позиции 30 см, 50 см, 75 см, 100 см. Теперь устройство готово к тестированию.

Тестирование определения дальности с модулем ESP32 UWB DW3000 (часть 2)

На расстоянии 30 см он показывает расстояние 28 см.

Тестирование определения дальности с модулем ESP32 UWB DW3000 (часть 3)

На расстоянии 50 см он показывает расстояние 48 см.

Тестирование определения дальности с модулем ESP32 UWB DW3000 (часть 4)

При увеличении расстояния до 75 см он показывает расстояние 77 см.

Тестирование определения дальности с модулем ESP32 UWB DW3000 (часть 5)

Наконец, для расстояния 100 см он показывает расстояние 107 см.

Но для этого все еще требуется тест на расстояние 10 метров или больше. Поэтому я вышел на улицу, чтобы проверить расстояния. Со мной двое моих друзей, которые помогут мне протестировать этот продукт даже в такую ​​холодную снежную погоду. У одного из друзей на руке Tag, и он питает модуль ESP32 UWB с помощью внешнего аккумулятора. У другого друга есть Anchor, который питается от ноутбука.

Тестирование определения дальности на улице с модулем ESP32 UWB DW3000 (часть 1)

Когда метка находилась рядом, обнаруженное расстояние составляло почти 2 метра. При удалении от метки обнаруженное расстояние составляло почти 11,77 метра.

Тестирование определения дальности на улице с модулем ESP32 UWB DW3000 (часть 2)

При дальнейшем перемещении на большее расстояние OLED показывает расстояние 23,75 метра. Затем он перестал принимать сигналы. Таким образом, по результатам нашего теста максимальное обнаруженное расстояние составило почти 24 метра, что превышает максимальную измерительную способность в 20 метров.

Тестирование определения дальности на улице с модулем ESP32 UWB DW3000 (часть 3)

В целом, мы остались довольны работой и точностью модуля DW3000 UWB. Следовательно, мы можем сказать, что вы можете использовать этот модуль для высокоточной локализации и тестирования. Плата ESP32 DW3000 UWB также интерполирует с чипом Apple, что также требует тестирования.

Видео, демонстрирующее работу проекта

Ссылка на видео на YouTube

(Проголосуй первым!)
Загрузка...
814 просмотров

Комментарии

Измерение дальности и местоположения с помощью ESP32 UWB DW3000 — 4 комментария

  1. У меня не совсем комментарий, а вопрос.
    Сделал всё вроде по вашей инструкции, но дисплей отображает только белый шум, а монитор порта всякую белиберду типа прямоугольников, пробовал разные дисплеи результат один, есть ли у вас возможность направить куда копать?

    • Эта ситуация типична для конфликта скоростей обмена данными или проблем с питанием/подключением.
      1. Проверьте скорость обмена (Baud Rate) в мониторе порта
      «Белиберда» в виде прямоугольников или случайных символов почти всегда означает, что скорость передачи данных в мониторе порта не совпадает со скоростью, установленной в коде.
      В коде из статьи (для «Тега») обычно используется Serial.begin(115200);.
      Убедитесь, что в правом нижнем углу монитора порта Arduino IDE выставлена 115200 бод. Если там стоит другое значение (9600, 57600 и т.д.), измените его.

      2. Проверьте адрес I2C дисплея
      «Белый шум» (полностью залитый экран или хаотичные пиксели) часто означает, что ESP32 не может инициализировать дисплей, либо данные передаются по неправильному адресу.
      В коде для «Тега» используется библиотека Adafruit_SSD1306. Найдите строку, где инициализируется дисплей. Обычно там указан адрес 0x3C.
      Многие дисплеи SSD1306 имеют адрес 0x3D. Вам нужно определить правильный адрес.
      Как проверить: Загрузите в ESP32 стандартный скетч-сканер I2C (Wire -> i2c_scanner). Если он покажет адрес 0x3D, измените в коде &Wire, -1, 21, 22, 1000000, 0x3C на 0x3D (или на тот адрес, который выдаст сканер).

      3. Проверьте соответствие пинов подключения
      В статье указано:
      SDA дисплея → GPIO 21
      SCL дисплея → GPIO 22
      Убедитесь, что вы используете именно эти пины. Если вы используете другую плату ESP32 или дисплей подключен к стандартным I2C пинам (обычно 21/22, но бывает 33/32), инициализация может не проходить.
      В коде проверьте строку: display = new Adafruit_SSD1306(128, 64, &Wire, -1, 21, 22, 1000000, 0x3C); — в конце указаны пины.

      4. Проверьте питание дисплея
      Дисплей OLED чувствителен к напряжению.
      Питание дисплея должно быть подключено к пину 3.3V ESP32, а не к 5V.
      Если модуль DW3000 потребляет много тока, ESP32 может просаживать напряжение. Попробуйте отключить DW3000 на время теста дисплея (просто загрузите скетч «Тег», но без питания UWB-модуля), чтобы убедиться, что дисплей заработает корректно.

      5. Проверьте правильность кода для вашего дисплея
      Библиотека Adafruit_SSD1306 требует указания типа дисплея. Убедитесь, что в начале кода раскомментирована нужная строка:
      // Для дисплея 128x64 (как в статье):
      define SCREEN_WIDTH 128
      define SCREEN_HEIGHT 64
      И в настройках библиотеки (Adafruit_SSD1306.h) или в коде не используется режим SSD1306_128_32.

      6. Проверьте работу UWB модуля
      Если дисплей работает (выводит статичную надпись), но при запуске UWB вы видит шум — это может быть связано с тем, что библиотека DW3000 «завешивает» I2C шину или использует те же таймеры. Попробуйте загрузить в плату «Тег» простой скетч «Hello World» для дисплея, чтобы убедиться, что проблема именно в связке UWB + Display.

      Краткий алгоритм действий:
      Загрузите i2c_scanner. Если адрес не 0x3C — меняйте в коде.
      Загрузите простой скетч вывода текста на дисплей (без DW3000), чтобы убедиться, что он работает.
      В мониторе порта выставите 115200 бод.

      Если после этих шагов дисплей заработал, но в мониторе порта всё еще «каша» — значит, данные от DW3000 приходят в другом формате, но сама плата функционирует.

      • Добрый день, я использовал программный код из статьи выше, плату с модулем dw3000 как в этой статье и да, я не программист, а любитель поковыряться над проектами.
        -oled у меня с адресом 0x3C
        монитор порта выдал такие результаты
        -----
        ets Jul 29 2019 12:21:46

        rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
        configsip: 0, SPIWP:0xee
        clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
        mode:DIO, clock div:1
        load:0x3fff0030,len:4876
        ho 0 tail 12 room 4
        load:0x40078000,len:16560
        load:0x40080400,len:3500
        entry 0x400805b4
        SS TWR INIT v1.0
        IDLE FAILED
        -----
        а олед так и не показывает ;(
        хотя при использовании другой библиотеки и кодом проверки определения дисплея на этой же плате oled выдал
        Дисплей1
        адерс 0x3C
        Но прикрутить ту библиотеку (https://wiki.iarduino.ru/page/oled_trema)
        вместо Adafruit_SSD1306.h к коду выше не получилось((

        • Добрый
          По вашим логам вижу две проблемы:
          Ошибка инициализации UWB: IDLE FAILED означает, что модуль DW3000 не запустился. Это главная причина, почему OLED не показывает данные — скрипт "зависает" ещё до инициализации дисплея.
          Конфликт адреса I2C: Хотя вы пишете, что адрес 0x3C, код из статьи по умолчанию мог быть рассчитан на 0x3D.

          Нам нужно заставить работать дисплей отдельно от UWB, чтобы убедиться, что он точно живой, а потом разобраться с модулем.

          Шаг 1. Проверьте дисплей самым простым кодом
          Это исключит проблемы с пинами и адресом. Загрузите этот скетч (он использует знакомую вам библиотеку Adafruit_SSD1306, которая шла в статье):
          #include
          #include

          #define SCREEN_WIDTH 128
          #define SCREEN_HEIGHT 64
          #define OLED_RESET -1

          // ПОДСТАВЬТЕ ВАШ АДРЕС: пробуйте 0x3C или 0x3D
          Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET, 21, 22, 1000000, 0x3C);

          void setup() {
          Serial.begin(115200);
          Serial.println("Тест дисплея");

          // Инициализация
          if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // И здесь тоже укажите адрес!
          Serial.println("OLED не найден!");
          while(1);
          }

          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(SSD1306_WHITE);
          display.setCursor(0,0);
          display.println("Дисплей работает!");
          display.println("Адрес I2C:");
          display.print("0x3C"); // Если не работает, поменяйте в коде выше на 0x3D
          display.display();
          Serial.println("Текст выведен");
          }

          void loop() {}

          Загрузите код.
          Если не работает, измените во всех местах 0x3C на 0x3D (и в строке Adafruit_SSD1306 display(... и в display.begin(...).
          Если дисплей загорится — отлично, идем дальше.

          Шаг 2. Разбираемся с главной ошибкой IDLE FAILED
          В логе видно: после запуска программа доходит до SS TWR INIT v1.0 и затем падает с IDLE FAILED. Это значит, что библиотека DW3000 не может перевести чип в режим ожидания (IDLE).
          1. Питание модуля DW3000
          ESP32 через USB может не выдавать достаточно тока для UWB-модуля. Попробуйте:
          Подключить плату ESP32 к мощному USB-порту (не через хаб).
          Если есть внешний блок питания на 5В 2А, подключите его к ESP32.
          2. Неправильная распайка пинов (SPI)
          Модуль DW3000 общается с ESP32 по шине SPI. Если пины в коде не совпадают с физическим подключением, будет IDLE FAILED. В статье используются пины:
          CS (Chip Select) — GPIO 10
          IRQ (Interrupt) — GPIO 2
          RST (Reset) — GPIO 9
          SPI SCK — GPIO 18
          SPI MOSI — GPIO 23
          SPI MISO — GPIO 19
          Проверьте, что модуль DW3000 физически соединен именно с этими пинами ESP32 (или совпадает с тем, что написано в вашем коде).
          3. Конфликт пинов с дисплеем
          В коде из статьи для дисплея используются пины 21 (SDA) и 22 (SCL).
          Если вы случайно воткнули провода дисплея в пины, которые используются для DW3000 (например, 18, 19, 23), то ничего работать не будет. Проверьте физическое подключение: дисплей должен висеть только на 21 и 22 пинах.

          Шаг 3. Что делать с библиотекой iarduino_OLED
          Вы пробовали подключить библиотеку с сайта iarduino, но не смогли прикрутить её к коду UWB. Это логично, потому что код из статьи (SS TWR) написан для библиотеки Adafruit_SSD1306, и у них разный синтаксис команд.
          Мой совет: не пытайтесь менять библиотеку в основном коде. Используйте тот код, который у вас уже есть (из статьи), но сначала добейтесь, чтобы UWB прошел инициализацию (IDLE FAILED исчез).
          Если после Шага 1 дисплей заработал, а UWB все еще не стартует, проблема именно в модуле DW3000 или его подключении/питании.

          Сводный алгоритм действий:
          Загрузите тест дисплея из Шага 1. Добейтесь, чтобы он показывал текст. Запомните рабочий адрес (0x3C или 0x3D).
          Проверьте питание и пины DW3000 по списку выше.
          Вернитесь к коду из статьи. В нем найдите строку инициализации дисплея и пропишите правильный адрес, который вы определили в шаге 1.
          Загрузите код снова. Если IDLE FAILED пропал и дисплей показал расстояние — цель достигнута.

          Если IDLE FAILED остается, опишите мне:
          К каким пинам ESP32 физически подключен ваш модуль DW3000 (CS, IRQ, RST, SCK, MOSI, MISO)?
          Какое питание используется (USB от компьютера, внешний блок)?
          Это поможет диагностировать дальше. У вас все получится, это типичная ситуация для первого запуска UWB-модулей

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *