UWB Ranging with the DecaWave DWM1000

Note: see the latest update in Part II (added 4/9/2016)

Recently I've been experimenting with some DecaWave DWM1000 modules, which are Ultra Wideband (UWB) transceivers based on the IEEE 802.15.4a standard.  I got curious about these modules are seeing this Kickstarter, but decided that the price they were asking, 249 Euros for 2 modules, was a bit high given that the DWM1000 module on which these units are based sell for only $25/each at Digi-Key.  Then, once I discovered this Open Source Project, I figured I could easily build my own version of the hardware.  The short video below shows my results, so far.  The demo is using two DWM1000 modules, one running the "DW1000Ranging_ANCHOR" Arduino example code on a 16 MHz Arduino Pro Mini, and the other running the "DW1000Ranging_TAG" Arduino example on the same type of hardware.  The rest of this article will describe the two PCBs I designed to interconnect the DWM1000 module with the Arduino Pro Mini.

The author of the open source project based his design on an Arduino Pro Mini running at 8MHz and 3.3 volts.  The DWM1000 runs at 3.3 volts, so this avoids the need for level shifting to connect to the 5 volt logic on 16 MHz Arduino Pro Mini.  I happened to have quite a few 5 volt Pro Minis in my parts bin so I decided to go with level shifting.  However, I first built a simple breakout board for the DWM1000 so I could experiment with it using a solderless  breadboard.  Then, once I was confident my design approach would work, I designed another board to fit beneath it and allow the breakout board to plug in on top.  Here's a photo showing the completed stack of PCBs:

The DWM1000 solders to the breakout board using a set of castellations around three edges of the PCB, so this is actually a three PCB stack.  The breakout PCB adds only a 10 uF bypass capacitor  (C1) and a 10K pull up resistor (R3) on the IRQ line and looks like this:

To stay as compact as possible, the Breakout board only brings out the necessary signal lines along with a few more for advanced applications (EXT, WAKE, GP7, SPIPHA and SPIPOL.)  It also provides optional (and currently unsupported) TX and RX LEDs (with companion current limit resistors R1 & R2), a 10K pull down resistor, R3, for the IRQ line and a bypass capacitor, C1.  The schematic looks like this:

I decided to use SN74LVC2G17DBVR dual Schmitt buffers in SOT-23-6 packages as the basis of the level shift circuitry, as they can take a supply voltage between 1.6 and 6.5 volts and can tolerate over voltage inputs.  I also added a 3.3 volt, 200 mA regulator to power the DWM1000, as it can apparently require peak currents in this range when transmitting.  Two of the LVC2G17 parts level shift the four RST, CS, MOSI and CLK signals from 5 volts down to 3.3 volts and the remaining LVC2G17 shifts the MISO and IRQ signals from 3.3 volts up to 5 volts.  The R3 pull down resistor is 10K.

Here's the layout of the level shifting adapter board.  It's designed to take a low profile, 24 pin socket that accepts round "machine" pins.  This allows the Arduino Pro Mini (also fitted with rounded machine pins) so it can squeeze under the breakout board, which plugs then into standard, Arduino-style female headers.