Cripple Raven RF receiver?

Go To Last Post
4 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

I'm trying to set up a Raven multihop network with a 802.15.4 sniffer in the middle to capture all the traffic. I want each Raven to receive from only two others but the sniffer should receive from all the Ravens.

Decreasing the raven transmit power makes the network smaller but by definition in a circle (I assume the best topology) the farthest raven is only twice the distance from the sniffer. Can anyone suggest a method to cripple the raven receiver to make it far less sensitive than the sniffer?

I was thinking some kind of directional coupler in the RF driver, a wire leading to the sniffer, or horn pointed at the sniffer. I could also use the raven ATMega1284p to activate or disable some circuit before transmission.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

One option is to replace the transceiver RF230 by a RF231. It has the register PDT (preamble detection threshold), with this register you can reduce the sensitivity.

Plan B is pure software: in the network nodes read the ED register at the end of the received frame and throw away low energy frames ... disadvantage: you can not use the AUTO_ACK feature with this method.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Oooh, I like plan B. Thanks for getting me out of my thinking box.

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Plan B worked well indeed. Setting tx power to the minimum of -17.2dBm (15 in SR_TX_PWR) allows the sniffer to see them up to 10 meters. Coupled with the low tx power, ignoring rx packets below an rssi of 10 (==30 in energy detect register) gives about 15cm maximum single-hop distance between mesh elements. Here's the bypass code in the rx interrupt routine:

#define RF230_MIN_RX_POWER 10 

#ifdef RF230_MIN_RX_POWER
/* Discard packets weaker than the minimum if defined */
#if RF230_CONF_AUTOACK
    if (hal_subregister_read(SR_ED_LEVEL) >= 3*RF230_MIN_RX_POWER) {
#else
    if (hal_subregister_read(SR_RSSI) >= RF230_MIN_RX_POWER) { 
#endif
#endif
    hal_frame_read(&rxframe, NULL);
    /* Tell the foreground process that a frame has been received */
    rf230_interrupt(); 
#ifdef RF230_MIN_RX_POWER
    }
#endif