DWM1000 cannot exceed -84dBm even at 2 cm | without using a PCB

Hi all, I am Utku Serin from Izmir,Turkey.

I am using the DW1000 library by Thomas Trojer in the Arduino IDE.
There is a LILYGO t-display ESP32 module as an anchor with one of the DWM1000, and there is a seeeduino XIAO as a tag with other DWM1000 module. I have done the necessary SPI connections and uploaded the example codes that come with the library(“DW1000Ranging_ANCHOR.ino”, “DW1000Ranging_TAG.ino”) to the microcontrollers separately. I can read IDs correctly. As you can see from the serial print messages range is wrong, I can fix it by using delay adjustment, but also the RX power is too low. No matter the distance between the anchor and the tag, RX power does not change. It is -84dBm at 2 cm. I think this is the main problem.

*device address: 82:17:5B:D5:A9:9A:E2:9C*
*### ANCHOR ###*
*blink; 1 device added ! ->  short:D325*
*from: D325         Range: -95.30 m        RX power: -84.33 dBm*
*from: D325         Range: -106.99 m       RX power: -84.31 dBm*
*from: D325         Range: -27.71 m        RX power: -84.14 dBm*
*from: D325         Range: 29.40 m         RX power: -84.57 dBm*
*from: D325         Range: 83.07 m         RX power: -84.47 dBm*
*from: D325         Range: -1.40 m         RX power: -84.27 dBm*
*from: D325         Range: 39.61 m         RX power: -84.56 dBm*
*from: D325         Range: -9.68 m         RX power: -84.33 dBm*
*from: D325         Range: 55.18 m         RX power: -84.42 dBm*

I did not design a PCB for the UWB module and microcontroller. I am using a breadboard, but I directly soldered the power pins via cable. UWB modules are directly powered by 3.3V from their microcontrollers. I also used a 100uF capacitor. Breadboard just for SPI communications. When that didn’t work, I used wire soldering for all the pins on the ESP32 side. The result is the same.

How can I increase power? According to my research, it should be around -45 dBm at close range. I believe I’ve allocated the necessary space for the antenna.
I’m open to all your suggestions. Is it a software problem or a hardware problem?

// connection pins for anchor ( LILYGO t-display )
#define PIN_SCK 32
#define PIN_MOSI 33
#define PIN_MISO 36
#define PIN_SS 25
#define PIN_RST 26
#define PIN_IRQ 27
// connection pins for tag(seeeduino XIAO)
const uint8_t PIN_RST = 3; // reset pin
const uint8_t PIN_IRQ = 2; // irq pin
const uint8_t PIN_SS = 7; // spi select pin

The Rx power number from the unit is an estimate and is unreliable at best.
The only time I’ve looked at Rx power numbers is to compare the first path power with the total power as an indication of whether the signal is line of sight or not (it sort of works but isn’t relaible).

Don’t worry about the power, you can develop a full system without ever looking at that number. All that matters is what your maximum usable range is, as long as you get the range you need it doesn’t matter what the power is reported as.

Also at 2cm you are in the antennas near field, things will act very differently that close than at longer ranges. You should test with a minimum of 10 cm, ideally more like 30 cm to avoid near filed effects.

That is of more concern is the 190m+ variations in range you are getting. Antenna calibration will give you an offset but that is a consistent error it wouldn’t explain that much variation in range.

TL:DR version - ignore the power for now, get the range working correctly.

1 Like

No matter what I did, I couldn’t send or receive packets reliably with this combination. Even when I received packets, the timestamps were off, so I kept getting unrealistic values ​​like 150km, and the packets often didn’t arrive. I tried changing the SPI clock values ​​and pin connections, but they never recognized each other.

I had used seeeduino XIAO as the tag. The problem was solved when I replaced it with esp32. With the first example code, I can get distance information on the breadboard with a margin of error of ±4cm, and the RX power is at -56dBm levels.