Dwm1000 with arduino problem

Hi my friends, the best safefy to you.
May you help me? I am new for DWM1000, so I really need your help who have many experiences with DWM1000.

I just designed my PCB between arduino promini with DWM1000, then I tested it using arduino library with dwm1000 in this link (GitHub - thotro/arduino-dw1000: A library that offers functionality to use Decawave's DW1000 chips/modules with Arduino.)

I used “BasicConnectivityTest” program in example folder for testing

Then I got the arduino monitor like that

With that information, some people said there is problem with hardware design. On my design I used 1k ohm for resistor pulldown on IRQ Pin.

So, Do you know what is probem with my pcb, how can I fix it?
Is there a different way to test arduino with DWM1000?

Thank you so much.

According to the datasheet (Section 1.7), the IRQ pin should be pulled up because the DWM 1000 drives the logic level to low to signal an interrupt. Remove the 1k resistor and set an internal pull-up on the Arduino pin connected to the IRQ pin. Use the INPUT_PULLUP keyword when setting the pinmode (see https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/).

Hi Snyderitis~
Thank you for your reply.
I am doing like you said, it seem to be better.
And now I got this information from DWM1000. May you tell me it work correctly or not?

Have you attempted to listen for packets with it or configure the tag in any way? What system are you using it with?

Hi snyderitis ~
Thank you~ my friends.
As my post, Until now I just tried to do like the link I posted. Most of my work, I used the library from that link. I am new for DWM, So, I just did the BasicConnectivityTest example for get ID, set Network ID, and set address. I did not try to listen for packets or configure the tag. Do you have or know any good document for DWM1000?
Thank you so much for your help.
Best safety to you.

It looks like the tag is not being configured correctly. The BasicConnectivityTest should change the network ID and address. Could you post your schematics and how you’ve connected everything? It may be that the communication bus is not connected properly.

Hi snyderitis ~
I have two Schematic, 1 is to connect to arduino pro mini. For second, I use three UWB1000s connect to arduino Due. UWB Module with Arduino Due.pdf (21.8 KB) UWB arduino pro mini.pdf (31.9 KB) .

With arduino Due, I use SPI with 3 PINs for select slave. For configuring a Tag or anchor, I think I just try to do and modify program on the above link. For example, DWM1000Ranging_TAG will configure DWM1000 as the tag.

That’s a good idea. Another avenue you may want to try is to write to a specific register and then read that same register to see if the values have stuck. Some good examples of this are found in the library: https://github.com/thotro/arduino-dw1000/blob/11f00281be859f718d936ecdc564758acd2721f4/src/DW1000.cpp#L833

Yes~ thank you for your enthusiastic support. I am new for UWB, so many thing I have to learn about it.
If I have some problems in the future, please give me some time ^^.
And I hope you will receive many supports from your life.

1 Like

Hi snyderitis ~
Until now, I removed resistor (1k) for pull-down like you said.
I tried to send data, it worked well.
But I attempted to receive data, and it could not get nothing.
I used arduino due for sending data, and arduino promini for receiving data. And I checked again external interrupt pin on arduino pro mini, it is right. So, I did not know why.
Do you know any reason for that?

Thank you for spending your time

One issue on your schematic - The DWM1000 reset pin shouldn’t ever be driven high.
It should be driven low by an open drain driver but should never be actively driven high since this could cause a conflict. The DW1000 chip itself can sometimes pull reset low.

One other common issue I’ve seen when people are putting together systems like this, if the SPI lines are too long or messy then you can get unreliable communications. That SPI bus is running fairly fast and is only using standard logic level drivers, it is all too easy to break it if you’re not careful with the connections.

I don’t think either of those are the issue your seeing right now (sorry, no experience with the arduino library so I don’t know what you should or shouldn’t be expecting to see on the output) but they are things to watch out for.

Hi AndyA~
Thank you for your information.
I will consider your advice
I am testing by using arduino pro mini+ dwm1000 for sender, and arduino due+dwm1000 for receiver. sender worked well I think, but for receiver from arduino monitor I got “Error receiving message”.
Do you think this problem is from SPI clock? because I see that DWM1000 maximum clock is 20MHZ, arduino due is 84MHZ.
Thanks for your time.

The nice thing about SPI is that you can always run it lower than the maximum. The lower limit on the rate is purely how long you want communications to the device to take.
It’s normally best to start a bit away from the maximum and get things working without pushing the limits first. Then once that’s working speed things up until it breaks and back off a little bit.
e.g. I had one design with a 2" ribbon cable connecting the CPU to the DW1000. I got that working at 1 MHz, and then kept changing the speed until I found it could run reliably at 18 MHz but it fell over at 20 MHz. So for that hardware I ended up running the SPI bus at 15 MHz.

Lowering the rate won’t fix all the possible SPI issues, some noise or reflection issues that result in glitches could still be there with a lower the rate. If you find you have intermittent or unreliable communications and suspect the SPI link then adding 20-30 ohm series resistors on each line next to the driving device (Arduino for everything other than the MISO line) combined with a lower speed will normally clear just about anything up. Or use shorter / neater connections :slight_smile:

Hi AndyA
Hello Friends.
Thank you for your time
For reset pin on DWM1000, as my schematic, in my program, reset pin never be driver high. Sometimes, it is low in output mode, and almost times, I use as Input mode (leave floating).

When I tried to test as I said before (sender and receiver). sender worked well, but receiver on arduino Due (arm chip) did not work. I read SYS_STATUS and SYS_MASK registers, then CLKPLL_LL
bit and MCPLLLL bit equal 0, never set to 1. So, IRQ interrupt could not generate an interrupt. Do you know why is that problem, how can I fix it?

I also changed speed of SPI, but receiver still did not work.

Thank you so much.
Be safe on covid 19.