Hello Everyone,
I have been trawling the forums for the solutions to my problems and this seems like the place to be!
So a quick overview of my system; I am developing an improved version of an existing system (The RF settings of which cannot be changed). The system uses FSK with a deviation of 165kHz and a bitrate of 26.5kbps. The devices are part of a mesh network that aims to get one device's messages a central device which can communicate with the outside world via GSM. All of the devices are battery powered and so power consumption is very important , however given how often transmission actually occurs I care less about power during transmission.
I have been experimenting a lot over the last few months with various RFM69 setups on our custom PCBs ( See the Thread here:
https://lowpowerlab.com/forum/rf-range-antennas-rfm69-library/range-issues-with-rfm69xxw-on-custom-pcb) Since then we have designed a SX1231H tranceiver directly on our board which means no more module and less money! Yay
I have been experimenting a lot with listen mode and rx mode. Regardless of the listen mode configuration I see a significant drops in range. I am using the low power version and I see around 120m when purely in RX mode, however when going into Listen I struggle to get above 70m. I have tried every possible combination of longer RX times, AGC on and off, antenna impedances and ACG algorithms. I just can't get it to be a higher range. Note that all of those tests have been with a RSSIANDSYNC condition, meaning my RX time has had to be rather large which obviously isn't great for power consumption. After a good read of this thread today I am set on using RSSIONLY rather and setting timeout2 (Something I didn't do when I experimented with this before). I have started experimenting with this today in my building (Not the field that the above ranges were determined on). It doesn't seem much better range wise.
My listen config is:
rfm_reg(WRITE REG_LISTEN1,RF_LISTEN1_RESOL_RX_64|RF_LISTEN1_RESOL_IDLE_262000|RF_LISTEN1_CRITERIA_RSSI|RF_LISTEN1_END_00);
rfm_reg(WRITE REG_LISTEN2,10); //IDLE ~2s
rfm_reg(WRITE REG_LISTEN3,10); //RX 0.64ms
rfm_reg(WRITE REG_RXTIMEOUT2, 20); // Timeout ~12ms
Ignore my syntax, I am using Felix's H file on my pic microcontroller with SPI functions I wrote. By my logic that should be okay given my setup? I have been testing with a RSSI threshold of 255 because I want to ensure that the device was attempting to receive the opportunity for now. The other issue I have with this radio is the lack of a relative RSSI threshold, I have no idea what a good absolute threshold is given that I don't control the environment the devices will be in. I also have no idea what the current sensitivity is given the bitrate and deviation, can anyone point me in the right direction?
And then I have one last curve ball, the device is a fire detector and a crucial part of the operation is regular temperature sampling meaning I cannot disturb that process. So the way I deal with that right now is to use the FIFONOTEMPTY flag rather than the PACKETREADY flag as it is not cleared provided by listen end is set to stay in full RX (Which obviously sucks for power). I have started playing the CLC (Configurable Logic Cell) in my PIC microcontroller which may allow me to latch a momentary IRQ pulse, meaning I can use the PACKETREADY flag rather. Am I correct in saying that I can then change my listen end to return to listen? provided that I am sure I will process the packet before the next RX wake up?
I'm sorry for the information over load I am just struggling to get this to work. Plus I hope that some if not all of these are helpful to others.
I am very happy to share my code too if anyone things they may need it?