Arduino + SI4432 + RF22 Library -> Unable to get 20dbm power, garbled msg, range

Hello,

I've this basic project with couple simple components:

-Arduino UNO v3
-SI4432 module with spring antenna (link to module)
-Bosch BME280
-Ublox Neo-7M GPS (link to module)

Goal: to transmit GPS+Sensor data at regular intervals (1hz) to RX station.

Current status: I've setup everything and it works fine with basic setup with low TX power of 1 or 2dBm (RH_RF22_TXPOW_2DBM). I can succesfully send ~100 byte string data to another Arduino module

Setup:
FC=434 Mhz
Mod: GFSK_Rb2_4Fd36

Problems:

1) Can't seem to send data with 20dbm. When main loop starts it only sends 2-3 messages then stops (as seen in the serial output). Tried numerous other data rates and modulation types. (transmit.png)

2) How do I ensure proper reception of message? Sometimes, as distance increases between transmitter and receiver (also as I change power output on the transmitter), the message becomes garbled and parts of the message appear as junk on the serial output of the other Arduino. Is this serial port, transmission (improper message forming) or RF distortion (packet loss) issue? I'm testing modules side-by-side ~1m away from each other. I'd rather prefer the whole string lost to garbled msg. (receive.png)

Here's how I form the message:

String data;
data += String(fix.dateTime.year);
data += ",";
data += String(fix.dateTime.month);
data += ",";
data += String(fix.dateTime.date);
data += ",";
data += String(fix.dateTime.hours);
data += ",";
data += String(fix.dateTime.minutes);
data += ",";
data += String(fix.dateTime.seconds);
data += ",";
data += String(fix.latitude(),6);
data += ",";
data += String(fix.longitude(),6);
data += ",";
data += String(fix.altitude());
data += ",";
data += String(fix.heading());
data += ",";
data += String(fix.speed_kph());
data += ",";
data += String(fix.heading());
data += ",";
data += String(fix.satellites);
data += ",";
data += String(bme.readTemperature());
data += ",";
data += String(bme.readPressure() / 100.0F);
data += ",";
data += String(bme.readAltitude(SEALEVELPRESSURE_HPA));
data += ",";
data += String(bme.readHumidity());
data += ",";
data += String(Tn);

//send data
char sdata[100];
data.toCharArray(sdata, 100);  // Converted String to char.
rf22.send((uint8_t *)sdata, sizeof(sdata)); //typecast to uint8_t


//receive data
 if (rf22.available())
  {
    uint8_t buf[RH_RF22_MAX_MESSAGE_LEN]; //RH_RF22_MAX_MESSAGE_LEN=100
    uint8_t len = sizeof(buf);
    if (rf22.recv(buf, &len))
    {
      Serial.print((char*)buf);
      Serial.print(",");
      Serial.println(-120+rf22.rssiRead()/2); //RSSI

3) I want to increase reception distance to ~50km LOS (possibly more)
-Will have quarter wave antenna at the TX (20dbm, if i can make it)
-At the RX side, will use Yagi antenna (>10dBi), LNA (~30dB) and si4432 module connected with SMA.

Simple link budget analysis says even 100km is possible, but is it really with the setup above?

Thanks a lot!

It could be a host of problems. First do not power the RF from the Arduino. The Arduino is NOT a power supply. The fact that you have problems when you up the power almost guarantees this as the problem assuming everything else is connected properly and the code is good. Why not start by defining the problem with specifications including a flow chart and schematic. Define what is the expected outcome. Purchase the Arduino cookbook and read it, this will give you some basics. also use the online tutorials and videos available, there are many good ones on this web site. At this point you will be able to define the problem and may have already solved it.

Thanks a lot! I used to power RF module directly from Arduino but I found out it'd be good to power it separately so I'm using a dedicated 3.3V power supply for RF only. I know I've asked 3 different questions, but I guess going step by step is the way to go.

So the first problem is the ability to set power to 20dBm and send messages at this power level. The code seems to hang when set at 20dBm, although it's working with lower power levels. So i thought it might be a library related issue. Any pointers as to how to move forward?

Thanks

foakgul:
3) I want to increase reception distance to ~50km LOS (possibly more)
-Will have quarter wave antenna at the TX (20dbm, if i can make it)
-At the RX side, will use Yagi antenna (>10dBi), LNA (~30dB) and si4432 module connected with SMA.

Simple link budget analysis says even 100km is possible, but is it really with the setup above?

Simple link budget analysis is flawed likely.

On simple 1/4 wave antennas the LOS range of the Si4432 is real world around 40km (@ 1000bps @20dBm) . You cannot directly use the datasheet sensitivity figure, but need to assume that signals will need to be around 5dBm to 10dBm above noise level as seen by the receiver, which is typically -105dBm. So signals will fail at around -97dBm in practical tests.

An LNA will typically add around 12dB of realised gain to an Si4432, even when using an obscenly expensive LNA (£400).

Cannot see why, since the invention of LoRa you would want to use a Si4432 ?

The LoRa devices are around the same price and have a circa 20dB+ link advantage, so no real need for an LNA, and they only add 5dB or so of gain anyway since LoRa is already operating well below noise level.

foakgul:
So the first problem is the ability to set power to 20dBm and send messages at this power level. The code seems to hang when set at 20dBm, although it's working with lower power levels. So i thought it might be a library related issue. Any pointers as to how to move forward?

Could well be the Si4432 so called 'smart reset' feature, smart it unfortunatly is not and silicon labs did not include it in newer devices.

Glitches on the power supply lines, which get worse at higher power levels, can cause the Si4432 to internally reset so all internal config is lost and needs to be re-done. Ocaisionally as an added benefit the device will lock up completly and only a hard reset via the SI4432 RESET pin will recover it.

srnet:
Simple link budget analysis is flawed likely.

On simple 1/4 wave antennas the LOS range of the Si4432 is real world around 40km (@ 1000bps @20dBm) . You cannot directly use the datasheet sensitivity figure, but need to assume that signals will need to be around 5dBm to 10dBm above noise level as seen by the receiver, which is typically -105dBm. So signals will fail at around -97dBm in practical tests.

An LNA will typically add around 12dB of realised gain to an Si4432, even when using an obscenly expensive LNA (£400).

Cannot see why, since the invention of LoRa you would want to use a Si4432 ?

The LoRa devices are around the same price and have a circa 20dB+ link advantage, so no real need for an LNA, and they only add 5dB or so of gain anyway since LoRa is already operating well below noise level.

I'd still be thrilled if 40km is possible! Thanks for the info. The reason for not using LoRa is the frequency dependence. Operating frequency can be changed with SI4432, and there's a specific band that I'd like to transmit at the end of the day, which is 400-406MHz (SI4432 can do this).

I can't find a LoRa chipset that can operate in this band. If there's, I'll gladly switch.

srnet:
Could well be the Si4432 so called 'smart reset' feature, smart it unfortunatly is not and silicon labs did not include it in newer devices.

Glitches on the power supply lines, which get worse at higher power levels, can cause the Si4432 to internally reset so all internal config is lost and needs to be re-done. Ocaisionally as an added benefit the device will lock up completly and only a hard reset via the SI4432 RESET pin will recover it.

That's interesting! Didn't quite know about it. My 3.3V power is a separate, stable, source 3.3v source link that can provide up to 700ma. So not quite sure if smart reset is still triggered.

foakgul:
I'd still be thrilled if 40km is possible! Thanks for the info. The reason for not using LoRa is the frequency dependence. Operating frequency can be changed with SI4432, and there's a specific band that I'd like to transmit at the end of the day, which is 400-406MHz (SI4432 can do this).
I can't find a LoRa chipset that can operate in this band. If there's, I'll gladly switch.

You cant find a LoRa device that operates at 400Mhz ??????

From the headline on the LoRa SX1276 datasheet, a useful read;

"SX1276/77/78/79 - 137 MHz to 1020 MHz Low Power Long Range Transceiver"

Its true that the assembled LoRa modules, as standard, are tuned to circa 433Mhz, but thats likely the same situation as for the Si4432 modules.

LoRa devices also have an FSK mode, just like the Si4432.

foakgul:
I'd still be thrilled if 40km is possible!

The record for the Si4432, I dont know the exact distance, is 1200km, that needed a LNA and 10dBi yagi.

srnet:
You cant find a LoRa device that operates at 400Mhz ??????

From the headline on the LoRa SX1276 datasheet, a useful read;

"SX1276/77/78/79 - 137 MHz to 1020 MHz Low Power Long Range Transceiver"

Its true that the assembled LoRa modules, as standard, are tuned to circa 433Mhz, but thats likely the same situation as for the Si4432 modules.

LoRa devices also have an FSK mode, just like the Si4432.

Most SI4432 modules are also tuned for 433 but it can radiate between 240-930. That was the main reason why I started with SI4432. Wish there was a LoRa module that did the same...

srnet:
The record for the Si4432, I dont know the exact distance, is 1200km, that needed a LNA and 10dBi yagi.

1200km?? That'd be one for the Guinness. I've seen videos that can do >100km (TI CC1120), and LoRa (>700km) but for 1200km (curvature of Earth will definitely not allow LOS, sorry flatearthers!), troposcatter would be the main transmission mechanism i believe. Even then very high end antenna/receivers would need to come into play.

Anyhow, I'm still trying to up my power to 20dBm and trying to solve the garbled msg problem before I need to tackle distance i think.

foakgul:
1200km?? That'd be one for the Guinness.

Even then very high end antenna/receivers would need to come into play.

Indeed it is, but that is the record, for basic handheld equipment, as far as I am aware.

The absolute limit that I know of with the basic Si4432 (RFM22) as receiver is circa 2,200km, but that was using a quad 21 element (I think) phased yagi array + LNA a very high gain setup indeed.

srnet:
Indeed it is, but that is the record, for basic handheld equipment, as far as I am aware.

The absolute limit that I know of with the basic Si4432 (RFM22) as receiver is circa 2,200km, but that was using a quad 21 element (I think) phased yagi array + LNA a very high gain setup indeed.

Thanks a lot for the info srnet. I'm working on transmitting the messages in a more robust way, so I've changed the format to send 3 separate messages each fitting within a buffer less than 64 bytes (FIFO size for RF22). I'm now converting strings to char arrays, and filling the uint8_t buffers with these char arrays before send operation.

This is the forming of the first message for instance.

#define firstsize 20
string data1;
uint8_t datafirst[firstsize];
data1.toCharArray(datafirst, firstsize);

Also I'm able to reach 14dBm without the code freezing. 17dBm is not stable (maybe I'll switch my power source again). 20dBm is still not working.

Will see how the range is with this setup and go from there. (will add LNA and Yagi later in the game)

foakgul:
Also I'm able to reach 14dBm without the code freezing. 17dBm is not stable (maybe I'll switch my power source again). 20dBm is still not working.

Does sound like the 'Smart Reset' issue.

On the $50SAT project (http://www.50dollarsat.info/) I spent a great deal of time working around this particular issue with the device, it was essential for the project that we had very reliable operation of the Si4432\RFM22B at the full 20dBm. We could not change the code\hardware once the satellite was in orbit.

Careful design of the PCB helped a lot, as did constant checks to see if the Si4432 had crashed, together with independant circuits that would power down and restart the whole board in the event of a program crash.

For a new project, I would choose not to use the Si4432 because of the 'Smart Reset' issue. Modern devices such as the LoRa ones are much more stable in operation and a far more reliable alternative. You can use them for FSK (as used by Si4432) as well as LoRa.

srnet:
Does sound like the 'Smart Reset' issue.

On the $50SAT project (http://www.50dollarsat.info/) I spent a great deal of time working around this particular issue with the device, it was essential for the project that we had very reliable operation of the Si4432\RFM22B at the full 20dBm. We could not change the code\hardware once the satellite was in orbit.

Careful design of the PCB helped a lot, as did constant checks to see if the Si4432 had crashed, together with independant circuits that would power down and restart the whole board in the event of a program crash.

For a new project, I would choose not to use the Si4432 because of the 'Smart Reset' issue. Modern devices such as the LoRa ones are much more stable in operation and a far more reliable alternative. You can use them for FSK (as used by Si4432) as well as LoRa.

I was checking your $50SAT project page and there's wealth of information there! It's great!You really went thru challenges of communicating over 1000km using a SI4432. I need to dig a little deeper into this material.

I'll need to check restart option (need to play around with instantaneous 20dbm output, maybe send couple of messages, reboot the card and try again.)

Btw, I did a simple <1km test with simple 1/4 wave antenna and messages are coming thru fine at 8dBm tx power. I also used RTL-SDR to check if there were any nearby transmissions.

Next step is to test max range (LOS) with current setup (tx (1/4 wave) and rx (helical)) by driving around.

Later I'm planning to use Yagi+LNA to see how far we can go.

Thanks!

I did some research and I think the main reason for not being able to get max 20dbm output power is the lack of proper ground plane on my transmitter. As srnet indicated, smart reset might come into play if the antenna does not have proper ground plane (ant mismatch).

I'm also going to add a capacitor across RF module VCC to alleviate sudden voltage problems should they arise.

foakgul:
I did some research and I think the main reason for not being able to get max 20dbm output power is the lack of proper ground plane on my transmitter.

That problem can indeed occur if your using a simple vertical. You need a proper ground plane to give a good antenna match otherwise you can get the smart reset issue.

The alternative is to use a dipole vertically, no ground plane needed then.

Other 20dBm radio modules, such as the LoRa ones, do no exhibit the same issues, when using less than perfect antennas, that seem to afflict the Si4432.

Update on RF tranmission:

We were able to achieve 23km transmission (over a whole city with somewhat tall buildings in between) with a magnet whip antenna+LNA before the receiver, and 20dbm at the TX side. It's hard to find LOS distances where I am. Reception of data packets were not perfect but they seemed to get much better when we held up the antennas away from the ground as much as we could. Receiver was reading a decent ~70dbm (~20dB SNR checked with RTL).

I was using GFSK (@1.2kbps). Would FSK do much better over GFSK or vice versa?

Thanks