В этом тексте я написал о своем опыте работы с UWB. Этот текст поможет понять с какой стороны подходить к UWB трансиверам.
Предисловие
Ultra-Wideband UWB это маломощная (<1mW) беспроводная радио технология передачи данных со скоростью до ...6 Mbit/s на расстояния до 200м. Эта технология также позволяет измерять расстояние между трансиверами с точностью до +-10см. UWB работает на частотах 3.1Ghz 10.6Ghz. В технологии UWB очень широкая ширина канала 500MHz...1,3GHz. Это больше чем у LoRa в минимум в 1000 раз.
UWB использует так называемое pulse radio. Трансивер посылаются пульсы (вейвлеты) порядка 1 миллиарда раз в секунду. UWB передает данные в специальные временные интервалы.
Модуляция называется pulse-position или time modulation. В качестве аналогии можно сравнить с летучими мышами.
Практическая часть
Существует модуль DWM1000 от компании Decawave (Qorvo). Это беспроводной полудуплексный трансивер, работающий на частотах 3.5 GHz to 6.5 GHz, с управляемой мощностью излучения. Он способен передавать данные с битовой скоростью до 6,8Mbit/s
Это блок схема модуля
Попробую разобраться на что способен этот чип.
Что надо из спецификаций?
# |
Doc name |
pages |
что там? |
Версия |
1 |
Product Overview |
33 |
Характеристики модуля, блок схема SoC, распиновка |
|
2 |
PRODUCT INFORMATION: DWM1000 |
2 |
Флайер на модуль DWM1000 |
|
5 |
DW1000 USER MANUAL |
249 |
Детализация регистров |
|
11 |
SOURCES OF ERROR IN DW1000 BASED TWO-WAY RANGING (TWR) SCHEMES |
22 |
APS011 APPLICATION NOTE |
1.1 |
9 |
DEBUGGING DW1000 BASED PRODUCTS AND SYSTEMS |
23 |
APS022 APPLICATION NOTE |
1.3 |
10 |
DW1000 DEVICE DRIVER APPLICATION PROGRAMMING INTERFACE (API) GUIDE |
101 |
USING API FUNCTIONS TO CONFIGURE AND PROGRAM THE DW1000 UWB TRANSCEIVER |
2.7 |
7 |
APS013 APPLICATION NOTE |
15 |
The implementation of two-way ranging with the DW1000 |
2.3 |
8 |
ANTENNA DELAY CALIBRATION OF DW1000-BASED PRODUCTS AND SYSTEMS |
15 |
APS014 APPLICATION NOTE |
1.2 |
3 |
PRODUCT BRIEF: DW1000 |
2 |
Флайер на чип DW1000. Название пинов. |
|
4 |
Product Overview |
53 |
Распиновка DW1000 |
|
6 |
DW1000 Errata |
12 |
Список 5ти выявленных ошибок в дизайне чипа |
в первом приближении внутри DW1000 можно обнаружить PLL, модуль приема, модуль передатчика, цифровую логику, SPI slave и преобразователь питания.
Более подробная схема чипа DW1000 такая. Тут уже заметно OTP, помехоустойчивое кодирование, управление мощностью, выявление прихода пакета, внутренний таймер. Чип весьма и весьма проработанный.
Вот соответствие модуля его пинам.
А это детализация распиновки модуля DWM1000. Шаг между пинами 1,4мм.
Внутри DWM1000 заложен ASIC с названием DW1000. Вот список его пинов.
https://docs.google.com/spreadsheets/d/1ei8rA8kbT_--4zf_2shUHI-hzM8QjJMSJs_8kKTTMak/edit#gid=0
Явного соответствия 48ми пинов чипа DW1000 на 24 пина модуля DWM1000 нет. Как известно из комбинаторики упорядоченно выбрать провода 24 из 48 проводов без повторений можно 2.000797e+37 способами. Визуально тоже не ясно, так как чип скрыт под саркофагом.
Чтобы подключить модуль DWM1000 пришлось изготовить PCB плату-переходник
Схема подключения.
Схема подключения показана тут.
Физически пришлось собрать вот такой прототип
Управление модулем DWM1000 по интерфейсу SPI
Компания разработчик QORVO предоставляет свой драйвер для чипа DW1000. Драйвер можно скачать вот тут https://www.qorvo.com/products/p/DW1000#documents. Достаточно скачать архив dw1000_api_rev2p14.zip распаковать его. В папке dw1000_api_rev2p14_stsw\Src будет лежать С-код драйвера и примеры.
В оригинальном драйвере 101 функция. Их перечень можно посмотреть тут. Есть и документация на драйвер в доке DW1000 DEVICE DRIVER APPLICATION PROGRAMMING INTERFACE (API) GUIDE. Там указана какая функция за что отвечает.
Чип полностью управляется по интерфейсу SPI. Частота тактирования до 20 MHz. Данные передаются старшим битом вперед. DWM1000 выступает ведомым устройством. Параметры SPI соединения задаются выбором напряжения на пинах GPIO5, GPIO6. По умолчанию они подтянуты к земле. Физически SPI это полный дуплекс. Однако с устройством обмен тем не менее полудуплексный. DWM1000 воспринимает данные, когда на проводе CS 0V. Каждый отрицательный фронт котируется как начало нового кадра. Поэтому просто припаять CS на землю нельзя. Так модуль просто не поймет, где начинается пакет. Аппаратный CS тоже не подойдет. Придется делать программный ChipSelect.
При чтении модуль DWM1000 отправляет данные младшим байтом вперед. Поэтому они четко ложатся на структуры в Little endian процессорах. Вот значения регистров DW1000 после корректной инициализации оригинальным драйвером.
+-----+--------------+------+--------+----+----------+
| num | name | file | offset |len | val |
+-----+--------------+------+--------+----+----------+
| 0 | DEV_ID | 0x00 | 0x0000 | 4 | 3001CADE | 1101_1110_1100_1010_0000_0001_0011_0000
| 1 | EUI | 0x01 | 0x0000 | 8 | 00000000FFFFFFFF | ????
| 2 | PANADR | 0x03 | 0x0000 | 4 | FFFFFFFF | 1111_1111_1111_1111_1111_1111_1111_1111
| 3 | SYS_CFG | 0x04 | 0x0000 | 4 | 00124000 | 0000_0000_0100_0000_0001_0010_0000_0000
| 4 | SYS_TIME | 0x06 | 0x0000 | 5 | 00D6C2CE00 | ????
| 5 | TX_FCTRL | 0x08 | 0x0000 | 5 | 09800A0000 | ????
| 6 | DX_TIME | 0x0a | 0x0000 | 5 | 0000000000 | ????
| 7 | RX_FWTO | 0x0c | 0x0000 | 2 | 0000 | 0000_0000_0000_0000
| 8 | SYS_CTRL | 0x0d | 0x0000 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 9 | SYS_MASK | 0x0e | 0x0000 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 10 | SYS_STATUS | 0x0f | 0x0000 | 5 | 0200800000 | ????
| 11 | RX_FINFO | 0x10 | 0x0000 | 4 | 0980AA10 | 0001_0000_1010_1010_1000_0000_0000_1001
| 12 | RX_FQUAL | 0x12 | 0x0000 | 8 | 5C001A451031CF2D | ????
| 13 | RX_TTCKI | 0x13 | 0x0000 | 4 | 0000FC01 | 0000_0001_1111_1100_0000_0000_0000_0000
| 14 | RX_TTCKO | 0x14 | 0x0000 | 5 | EDFF07391F | ????
| 15 | RX_TIME | 0x15 | 0x0000 | 14 | 004566DB052CBB3541008066DB05 | ????
| 16 | TX_TIME | 0x17 | 0x0000 | 10 | 34A6D7B4590066D7B459 | ????
| 17 | TX_ANTD | 0x18 | 0x0000 | 2 | 3440 | 0100_0000_0011_0100
| 18 | SYS_STATE | 0x19 | 0x0000 | 4 | 00050540 | 0100_0000_0000_0101_0000_0101_0000_0000
| 19 | ACK_RESP_T | 0x1a | 0x0000 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 20 | RX_SNIFF | 0x1d | 0x0000 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 21 | TX_POWER | 0x1e | 0x0000 | 4 | 2202080E | 0000_1110_0000_1000_0000_0010_0010_0010
| 22 | CHAN_CTRL | 0x1f | 0x0000 | 4 | 22007A4A | 0100_1010_0111_1010_0000_0000_0010_0010
| 23 | AGC_CTRL1 | 0x23 | 0x0002 | 2 | 01DE | 1101_1110_0000_0001
| 24 | AGC_TUNE1 | 0x23 | 0x0004 | 2 | 9B88 | 1000_1000_1001_1011
| 25 | AGC_TUNE2 | 0x23 | 0x000c | 4 | 07A90225 | 0010_0101_0000_0010_1010_1001_0000_0111
| 26 | AGC_TUNE3 | 0x23 | 0x0012 | 2 | 3500 | 0000_0000_0011_0101
| 27 | AGC_STAT1 | 0x23 | 0x001e | 3 | 000000 | 0000_0000_0000_0000_0000_0000
| 28 | EC_CTRL | 0x24 | 0x0000 | 4 | 0400ADDE | 1101_1110_1010_1101_0000_0000_0000_0100
| 29 | EC_RXTC | 0x24 | 0x0004 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 30 | EC_GOLP | 0x24 | 0x0008 | 4 | 00DEADDE | 1101_1110_1010_1101_1101_1110_0000_0000
| 31 | GPIO_MODE | 0x26 | 0x0000 | 4 | 000000DE | 1101_1110_0000_0000_0000_0000_0000_0000
| 32 | GPIO_DIR | 0x26 | 0x0008 | 4 | FF01ADDE | 1101_1110_1010_1101_0000_0001_1111_1111
| 33 | GPIO_DOUT | 0x26 | 0x000c | 4 | 000000DE | 1101_1110_0000_0000_0000_0000_0000_0000
| 34 | GPIO_IRQE | 0x26 | 0x0010 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 35 | GPIO_ISEN | 0x26 | 0x0014 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 36 | GPIO_IMODE | 0x26 | 0x0018 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 37 | GPIO_IBES | 0x26 | 0x001c | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 38 | GPIO_ICLR | 0x26 | 0x0020 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 39 | GPIO_IDBE | 0x26 | 0x0024 | 4 | 0000ADDE | 1101_1110_1010_1101_0000_0000_0000_0000
| 40 | GPIO_RAW | 0x26 | 0x0028 | 4 | 000000DE | 1101_1110_0000_0000_0000_0000_0000_0000
| 41 | DRX_TUNE0b | 0x27 | 0x0002 | 2 | 1600 | 0000_0000_0001_0110
| 42 | DRX_TUNE1a | 0x27 | 0x0004 | 2 | 8D00 | 0000_0000_1000_1101
| 43 | DRX_TUNE1b | 0x27 | 0x0006 | 2 | 6400 | 0000_0000_0110_0100
| 44 | DRX_TUNE2 | 0x27 | 0x0008 | 4 | 5E013B35 | 0011_0101_0011_1011_0000_0001_0101_1110
| 45 | DRX_SFDTOC | 0x27 | 0x0020 | 2 | 4110 | 0001_0000_0100_0001
| 46 | DRX_PRETOC | 0x27 | 0x0024 | 2 | 0000 | 0000_0000_0000_0000
| 47 | DRX_TUNE4H | 0x27 | 0x0026 | 2 | 2800 | 0000_0000_0010_1000
| 48 | DRX_CAR_INT | 0x27 | 0x0028 | 3 | 000000 | 0000_0000_0000_0000_0000_0000
| 49 | RXPACC_NOSAT | 0x27 | 0x002c | 2 | 0000 | 0000_0000_0000_0000
| 50 | RF_CONF | 0x28 | 0x0000 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 51 | RF_RXCTRLH | 0x28 | 0x000b | 1 | D8 | 1101_1000
| 52 | RF_TXCTRL | 0x28 | 0x000c | 3 | A05C04 | 0000_0100_0101_1100_1010_0000
| 53 | RF_STATUS | 0x28 | 0x002c | 4 | 09DEADDE | 1101_1110_1010_1101_1101_1110_0000_1001
| 54 | LDOTUNE | 0x28 | 0x0030 | 5 | 8888888808 | ????
| 55 | TC_SARC | 0x2a | 0x0000 | 2 | 0000 | 0000_0000_0000_0000
| 56 | TC_SARL | 0x2a | 0x0003 | 3 | 000000 | 0000_0000_0000_0000_0000_0000
| 57 | TC_SARW | 0x2a | 0x0006 | 2 | 0000 | 0000_0000_0000_0000
| 58 | TC_PG_CTRL | 0x2a | 0x0008 | 1 | BC | 1011_1100
| 59 | TC_PG_STATUS | 0x2a | 0x0009 | 2 | F90B | 0000_1011_1111_1001
| 60 | TC_PGDELAY | 0x2a | 0x000b | 1 | C5 | 1100_0101
| 61 | TC_PGTEST | 0x2a | 0x000c | 1 | 00 | 0000_0000
| 62 | FS_PLLCFG | 0x2b | 0x0007 | 4 | 08054008 | 0000_1000_0100_0000_0000_0101_0000_1000
| 63 | FS_PLLTUNE | 0x2b | 0x000b | 1 | 26 | 0010_0110
| 64 | FS_XTALT | 0x2b | 0x000e | 1 | 72 | 0111_0010
| 65 | AON_WCFG | 0x2c | 0x0000 | 2 | 2000 | 0000_0000_0010_0000
| 66 | AON_CTRL | 0x2c | 0x0002 | 1 | 00 | 0000_0000
| 67 | AON_RDAT | 0x2c | 0x0003 | 1 | 00 | 0000_0000
| 68 | AON_ADDR | 0x2c | 0x0004 | 1 | 00 | 0000_0000
| 69 | AON_CFG0 | 0x2c | 0x0006 | 4 | EE1FFF50 | 0101_0000_1111_1111_0001_1111_1110_1110
| 70 | AON_CFG1 | 0x2c | 0x000a | 2 | 0000 | 0000_0000_0000_0000
| 71 | OTP_WDAT | 0x2d | 0x0000 | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 72 | OTP_ADDR | 0x2d | 0x0004 | 2 | 1E00 | 0000_0000_0001_1110
| 73 | OTP_CTRL | 0x2d | 0x0006 | 2 | 0000 | 0000_0000_0000_0000
| 74 | OTP_STAT | 0x2d | 0x0008 | 2 | 0000 | 0000_0000_0000_0000
| 75 | OTP_RDAT | 0x2d | 0x000a | 4 | 12010000 | 0000_0000_0000_0000_0000_0001_0001_0010
| 76 | OTP_SRDAT | 0x2d | 0x000e | 4 | 00000000 | 0000_0000_0000_0000_0000_0000_0000_0000
| 77 | OTP_SF | 0x2d | 0x0012 | 1 | 00 | 0000_0000
| 78 | LDE_THRESH | 0x2e | 0x0000 | 2 | 0000 | 0000_0000_0000_0000
| 79 | LDE_CFG1 | 0x2e | 0x0806 | 1 | 00 | 0000_0000
| 80 | LDE_PPINDX | 0x2e | 0x1000 | 2 | 0000 | 0000_0000_0000_0000
| 81 | LDE_PPAMPL | 0x2e | 0x1002 | 2 | 0000 | 0000_0000_0000_0000
| 82 | LDE_RXANTD | 0x2e | 0x1804 | 2 | 0000 | 0000_0000_0000_0000
| 83 | LDE_CFG2 | 0x2e | 0x1806 | 2 | 0000 | 0000_0000_0000_0000
| 84 | LDE_REPC | 0x2e | 0x2804 | 2 | 0000 | 0000_0000_0000_0000
| 85 | EVC_CTRL | 0x2f | 0x0000 | 4 | 00DEADDE | 1101_1110_1010_1101_1101_1110_0000_0000
| 86 | EVC_PHE | 0x2f | 0x0004 | 2 | 0000 | 0000_0000_0000_0000
| 87 | EVC_RSE | 0x2f | 0x0006 | 2 | 0000 | 0000_0000_0000_0000
| 88 | EVC_FCG | 0x2f | 0x0008 | 2 | 0000 | 0000_0000_0000_0000
| 89 | EVC_FCE | 0x2f | 0x000a | 2 | 0000 | 0000_0000_0000_0000
| 90 | EVC_FFR | 0x2f | 0x000c | 2 | 0000 | 0000_0000_0000_0000
| 91 | EVC_OVR | 0x2f | 0x000e | 2 | 0000 | 0000_0000_0000_0000
| 92 | EVC_STO | 0x2f | 0x0010 | 2 | 0000 | 0000_0000_0000_0000
| 93 | EVC_PTO | 0x2f | 0x0012 | 2 | 0000 | 0000_0000_0000_0000
| 94 | EVC_FWTO | 0x2f | 0x0014 | 2 | 0000 | 0000_0000_0000_0000
| 95 | EVC_TXFS | 0x2f | 0x0016 | 2 | 0000 | 0000_0000_0000_0000
| 96 | EVC_HPW | 0x2f | 0x0018 | 2 | 0000 | 0000_0000_0000_0000
| 97 | EVC_TPW | 0x2f | 0x001a | 2 | 0000 | 0000_0000_0000_0000
| 98 | DIAG_TMC | 0x2f | 0x0024 | 2 | 0000 | 0000_0000_0000_0000
| 99 | PMSC_CTRL0 | 0x36 | 0x0000 | 4 | 000230F0 | 1111_0000_0011_0000_0000_0010_0000_0000
| 100 | PMSC_CTRL1 | 0x36 | 0x0004 | 4 | 38070281 | 1000_0001_0000_0010_0000_0111_0011_1000
| 101 | PMSC_SNOZT | 0x36 | 0x000c | 1 | 40 | 0100_0000
| 102 | PMSC_TXFSEQ | 0x36 | 0x0026 | 2 | 740B | 0000_1011_0111_0100
| 103 | PMSC_LEDC | 0x36 | 0x0028 | 4 | 200000DE | 1101_1110_0000_0000_0000_0000_0010_0000
+-----+--------------+------+--------+----+----------+
трансивер может быть в следующих соcтояниях
№ |
State |
Description |
1 |
OFF |
чип без питания |
10 |
WAKEUP |
Кварц включен. LDO включен. |
2 |
PowerUp |
-- |
8 |
DEEPSLEEP |
SPI передача невозможна |
3 |
INIT |
Кварц работает. SPI может работать только на 3MHz |
4 |
IDLE |
PLL включен. SPI может работать на полной скорости 20MHz |
6 |
TX |
Трансивер передает пакет. После перейдет в IDLE. |
7 |
RX PREAMBLE SNIFF |
Трансивер периодически переключается между IDLE и RX |
5 |
RX |
Трансивер ищет преамбулу |
8 |
SLEEP |
SPI передача невозможна. Потребление меньше 1uA. LDO выключены. |
9 |
SNOOZE |
-- |
Собственные SPI регистры чипа DW1000
Регистровые файлы адресуются 6 битами. Это значит, что можно адресовать 64 регистровых файлов. В сумме у него 110 регистров
https://docs.google.com/spreadsheets/d/1-cDqzBLOIxD7zWVG7oPmD_uq-V_fILkTvu4ADGFD_5E/edit#gid=0
Какие настройки следует назначить в чипе DWM1000?
Параметр |
Units |
тип параметра |
TxPower |
dBm |
главный |
Preamble Length |
Symbols |
производный |
Канал приема |
num |
производный |
preamble code |
? |
производный |
канал |
главный |
|
Канал передачи |
num |
производный |
bandwidth |
Hz |
производный |
centre frequency |
Hz |
производный |
BitRate |
Bit/s |
главный |
Transmit Pulse Repetition Frequency |
Hz |
главный |
Номер канала полностью определяет центральную частоту, ширину канала и preamble code. Номер канала передатчика и номер канала приемника всегда должны совпадать в каждом отдельном трансивере.
Вот дерево зависимости параметров
Какие параметры влияют на дальность радиосвязи?
Битовая скорость и длина преамбулы влияют на дальность. Более длинная преамбула обеспечивает улучшенную дальность действия. При высокой битовой скорости передачи данных рабочий диапазон короткий. При низкой битовой скорости можно передавать данные на большие расстояния.
Формат радио пакета
Радио пакет состоит из преамбулы, разделителя начала кадра, заголовка, полезной нагрузки
В модуле DW1000 имеется аппаратный 40-битный таймер. Он может считать от 0 до 2^40=1 099 511 627 776. Этот таймер тактируется частотой 64 GHz. Это значит, что он переполняется каждые 17.17 с. Этот таймер увеличивается на 1 каждые 15.625ps. Свет за это время успевает пройти 0.004м или 4мм.
Между полями SFD и PHR чип вставляет метку времени. Эту метку времени можно прочитать из регистра 0x15.
Передача данных
Прием данных
Так как UWB это технология для мобильной техники, то отлаживаться приходилось подключаясь к смартфону по Serial Over USB при помощи культового Android приложения Serial USB Terminal.
Вот так выглядел комплект для отладки
Калибровка чипа DW1000
Если вычитывать значения TimeStamp(ов) из регистров сразу после инициализации то значения будут не валидные. Вы получите 120...160 метров между трансиверами, когда как расcтония всего полтора метра. Это обусловлено плаванием параметров при изготовлении кремниевых пластин.
Калибровочные параметры записываются в OTP память. Микроконтроллер может вычитывать данные из OTP и прописывать их в регистры DW1000.
Для калибровки задержки антенны надо взять два DW1000, установить их на известное расстояние и измерить дальность. Задержка антенны настраивается до тех пор пока реальная дальность и прочитанная дальность не начнут совпадать. Затем значение задержки антенны следует прописать в OTP память. Есть задержка при отправке и задержка при приеме.
Запаздывание отправки это время между внутренней цифровой отметкой времени и временем реальной отправки в антенну.
Запаздывание приема используется для компенсации времени между приемом сигнала RMARKER в антенне и внутренней временной отметке в цифровой цепи.
Во многих исполнениях PCB запаздывания приема и отправки равны.
Тестирование дальности радио Link(а)
В помещении я разносил два DW1000 трансивера на 24 шага (16,5м) и UWB пакеты стабильно приходили в обе стороны. Дальше мешала геометрия помещения. На улице мне удавалось принимать ping на расстояние 76 метров.
Тестирование измерения дальности по технологии SS-TWR/DS-TWR
Тестирование технологии измерения дальности без калибровки показывают, что при расстоянии между трансиверами всего 0,89м измерения показывают величины порядка 154,6 метров. Причем разброс был 0,9 метров.
Идеи проектов на UWB трансиверах
UWB chat. Обмен мгновенными текстовыми сообщениями.
Обновление прошивки по радио
Передача файлов по радио
InDoor навигация
Удаленное управление электронными приборами в помещении
Словарь
Для работы с DWM1000 надо разбираться в следующих акронимах
Акроним |
Расшифровка |
AON |
Always-On |
POR |
Power On Reset |
API |
Application Programming Interface |
ETSI |
European Telecommunications Standards Institute |
N.B. (NB) |
Nota bene (note well ) |
PAC |
preamble acquisition chunk |
SFD |
start of frame delimiter |
DW |
DecaWave |
XTI |
internal 19.2 MHz clock (is the raw 38.4 MHz XTAL oscillator input ÷ 2) |
PRF |
pulse repetition frequency |
BPM |
bi-phase modulation |
ISO |
International Organization for Standardization |
BPSK |
binary phase shift keying |
MSB |
most significant bit |
FCS |
Frame Checking Sequence |
TWR |
Two Way Ranging |
LO |
local oscillator |
IEEE |
Institute of Electrical and Electronic Engineers |
PLL |
Phase Locked Loop |
CS |
chip select. |
CMOS |
Complementary metal–oxide–semiconductor |
QFN |
quad-flat no-leads |
LSB |
Least Significant Bit |
LDE |
leading edge (or the process to find and adjust the RX message timestamp) |
LED |
light-emitting diode |
PHR |
PHY header |
PHY |
physical layer |
SPI |
Serial Peripheral Interface |
GPIO |
General Purpose Input Output |
OTP |
One-Time Programmable |
RTLS |
real time location systems |
WSNs |
wireless sensor networks |
RST |
Reset |
TOF |
time of flight |
IC |
Integrated circuit |
FCC |
Federal Communications Commission |
TDOA |
Time Difference of Arrival |
MAC |
Media Access Control |
CRC |
cyclic redundancy check |
UWB |
Ultra Wideband |
TWR |
two way ranging |
TX |
transmit |
RF |
radio frequency |
PSD |
power spectral density |
EIRP |
Effective Isotropic Radiated Power |
PCB |
printed circuit board |
FEC |
Forward error correction |
Вывод
Сам по себе DW1000 очень сырой. Чтобы просто настроить канал надо прописать магические числа в дюжину регистров. При этом часть регистров адресуются 2мя байтами, а часть 3мя байтами. Хотя регистров всего, 110 штучек. Сами регистры рваные, разных размеров. Для записи OTP параметров надо напряжение чуть выше привычных 3,3V на VCC (3.8V). RxTimeStamp надо включать отдельно. Нужна калибровка запаздывания антенн.
Регистров много. Для чипа dw1000 нужен сравнительно сложный драйвер. Нет смысла писать для него свой драйвер. Лучше взять драйвер от вендора. Данные удалось передавать в обе стороны на расстояния до 78 метров. Определять Tx TimeStamp(ы). На первый взгляд дальность определяется с точностью +- 45см. В общем чип dw1000 сложный.
Еще модуль можно задействовать как расширитель GPIO. С SPI на 8 pin(ов).
Как по мне, дак UWB отличный интерфейс, чтобы обновлять прошивку или для дистанционного упрарления, но чтобы измерять дальность надо строить калибровочный стенд метров 10 в габаритах.
Links
https://habr.com/ru/articles/726228/
Документация про чип DW1000:
Контрольные вопросы:
1--Как определить что передатчик в самом деле передает что-то?
2--Нет радио Link(а) (например в UWB). Как выявить в чем дело? Передатчик не передает или приемник не принимает?
3--Если ширина спектра широкая, то что можно сказать про форму сигнала во временной области?
4--Если увеличить длину преамбулы, то как это скажется на дальности радио связи?
Stalker_RED
Я помню, лет 20 назад UWB вызывал вау эффект - подумывали сделать на нем беспроводной тачскрин для PC (в эпоху до айпэдов идея казалась интересной).
А сейчас не очень понятно какая ниша у UWB - по скорости wi-fi мжет и побольше, при намного большей дальности. И по цене - esp8266 за $1 стоит на порядок дешевле.
В чем он выигрывает, в энергопотреблении? Тут BLE и zigbee врываются, к которым еще и куча совместимых устройств на рынке.
И вообще, к вайфаю и блютусу можно подключиться с любого ноута или смартфона - это огромный плюс.
VelocidadAbsurda
Сравнительно недавно UWB всплыл в Apple AirTag (точное определение местоположения).
aabzel Автор
UWB трансиверы можно использовать как датчик приближения. На основе этого строят навигацию внутри помещения
https://www.exafore.com/accurate-indoor-positioning/
aabzel Автор
У UWB в исполнении DWM1000 по спеке 0,57 Watt max
aabzel Автор
UWB тоже набирает обороты
https://en.wikipedia.org/wiki/List_of_UWB-enabled_mobile_devices
aabzel Автор
C BLE очень трудно работать. BLE нужен жесточайший Real-Time. Микроконтроллеры с BLE периферией (например cc26x2 или nrf5340) обязаны работать с RTOS(ами). Накатывать поверх еще какое-то приложение очень трудно. Сразу возникают зависания, DeadLock(и), инверсия приоритетов и потеря Link(а).
UWB намного проще. Подключил по SPI и забыл. На MCU может быть вообще простая однопоточная прошивка.
Lebets_VI
С BLE как раз таки очень просто работать, ничего там не виснет и не теряется. Поверх пишутся тяжелые приложения и они работает нормально.
А вот UWB , если его использовать для обнаружения местоположения - та еще хрень, особенно когда 2 или 3 антенны.
Попробуйте NXP-шные SR040 или SR150. Там вообще крышу сносит от количества кода что бы просто получить расстояние и 2 угла.