First step in LoRa land – microchip RN2483 test

Microchip RN2483 Lora

Microchip RN2483 Lora

After spending some time reading and writing about LoRa it was a good time to make some real test of this technology.

As actually there is no network for LoRa, as much as I know, in my town, I expected to start a simple LoRa test (point to point and not as part of a WAN). I just bought some RN2483 LoRa module from Microchip online and also get some from Avnet (thank you Guillaume)


The module is easy to solder on a prototype board and get its command over a serial port. I choose to make two modules :

  • The first one is connected to a FTDI cable and will stay at home as a basestation
  • The second one is connected to an Arduino and will be a mobile device for my test

Create the test board

The RN2483 module have a lot of pins but most of them are GPIOs and power supply. To make my board simple, I decide to not connect all the GND and it sounds to work as expected, so at the end my schema looked like this.

RN2483 Lora simple circuit

RN2483 Lora simple circuit

The FTDI cable provides 5V so you have to add an LDO regulator to get 3,3V as module power supply. I just plug RX/TX from FTDI to the module and that is all what you need. The RF antenna I use is a half wave antenna centered on 868 Mhz. Once soldered, the test board are looking like :

LoRa on FTDI

LoRa on FTDI

LoRa on Arduino

LoRa on Arduino

Make the first communication ready for LoRa

For communicating with the module, the default serial port setting is 57600 bps. Once set on your terminal, you can communicate with the module. The list of available command can be retrieved here.

There are 3 level of commands :

  • sys for system command
  • mac for LoRaWan protocol related command
  • radio for low level radio transmission

The command sys get ver returns the firmware version, it is a good way to ensure the circuit works.

sys get ver
RN2483 0.9.5 Mar 24 2015 14:15:33

Then to get a communication between the two device, based on a point to point LoRa link, you must start pausing the mac level. The mac level is managing the LoRaWAN protocol we do not want to use at that point.

So you have to run on each of the board: It returns a long pause duration when you do not specify your expected duration.

mac pause

Now we are ready for communicating, we can check the default configuration : this document from Semtech is a great help to understand these parameters.

radio get mod
radio get freq

These 2 first command indicates that the module is configured as LoRa device by default with a rx/tx frequency of 868.1Mhz

radio get sf

The spread factor parameters defines the sensitivity of the reception, with a such value (sf12 is the more sensitive) the SNR can be up to -20dB. This also impacts the duration of the transmission that becomes longer.

radio get bw

The used bandwidth determine time on air and sensitivity. With 125KHz the sensitivity is better but time on air is longer. Chip is capable from 125KHz to 500KHz. The time on air is doubled from 125KHz to 250KHz.

With a 125kHz bandwidth and a spread factor of 12, the time on air duration is about 1 second

radio get cr

The CR (Coding rate) parameter determines an error correction mechanism by adding some information to the message. 4/5 is the best correction mechanism especially when the signal is low.

radio get prlen

The prlen gives the preamble length in symbol.

radio get pwr

Power level gives the power in dB of the transmitter ; values are from -3db to 15dB

With these setting, you can get the all the information about sensitivity and bitrate from the LoRaCalculator. With the default configuration we have the following configuration:

  • bitrate : 292 bps
  • time on air for 12 byte : 991ms
  • link budget : 138dB
  • power consumption : 23mA/h

Now we can change the power to 14dB to get more power and better link budget (this will consume 44mA/h and get 151dB as link budget)

radio set pwr 14
radio get pwr

Any change to the radio level can’t be saved, so you have to reconfigure it on every reboot.

Let’s send the first message over LoRa

Now we can send a message over the air. The first thing to do is to configure one of the device for reception : the parameter 0 indicates that reception is blocking until getting a message.

mac pause
radio rx 0

On the second device we can now sent a message :

mac pause
radio set pwr 14
radio tx 123456789012

On the receiver we get :

radio rx 0
radio_rx  123456789012

Now let’s make a keyapp testing device

The next step will be to test LoRa performance in real environment (even if my RF design is not really nice regarding my soldering stuff !! By the way, let’s make something. The system will be based on a transmitter always sending a message every 30 seconds and a receiver making a led blinking every time the message is received. (Ok this is not respectful of the duty cycle … so let’s say 100 seconds instead of 30)

# LoRa loop send a message in loop over LoRa medium at default frequency
# module is connected to /dev/ttyUSB0 device

startRet() {
   (if read -t 3 ret < $dev; then echo $ret ; return 0 ; else return 1 ; fi) &
checkRet() {
   wait $wf
   return $?

stty -F ${dev} 57600 cs8 -cstopb -parenb -echo

startRet ; echo "sys get ver" > $dev
if checkRet ; then
  startRet ; echo "mac pause" > $dev
  if checkRet ; then
     startRet; echo "radio set pwr 14" > $dev
     if checkRet ; then
        while true ; do
           echo emiting $i
           startRet ; echo "radio tx 123456789AB" > $dev
           sleep 100
           i=$(( $i + 1 ))
     else echo "error setting power"
  else echo "error setting mac in pause"

else echo "cant establish communication"

Now, on receiver, we simply want to wait for a message, check if the message is the expected one, then blink a led a couple of time to indicate a message has been received. This is based on Arduino.

String str;
void setup() {
  while (!Serial1);


  // reset the module

  str = Serial1.readStringUntil('\n');
  Serial1.println("radio set wdt 105000");
  str = Serial1.readStringUntil('\n');  
  Serial1.println("mac pause");
  str = Serial1.readStringUntil('\n');  
void loop() {
  // switch recieve mode
  Serial1.println("radio rx 0");
  str = Serial1.readStringUntil('\n');
  if ( str.indexOf("ok") == 0 ) {
    int ok=0;
    while ( ok == 0 ) {
       str = Serial1.readStringUntil('\n');
       if ( str.length() > 1 ) {
          if ( str.indexOf("radio_rx") >= 0 ) {
            if ( str.indexOf("0123456789AB") >= 0 ) {
              int j;
              for ( j = 0 ; j < 10 ; j++) {
            ok = 1;

Some little modification compared to initial schema :

Pin2 is connected to RN2483 reset PIN and Pin3 is connected to a LED for showing result : blinking 10 times when the message is received.

The command radio set wdt 105000 set a reception timeout to 105s to ensure being in the expected transmission windows.

Make the test, get the map

With this solution done, I did some tests driving in my city. The result is not a really good benchmark for many reason, the first one is that the emitter was on my roof but not on top of it, so part of my roof was hiding the western part of the city what can can easily see on the graph below. The blue point from where the arrow are starting is the emitter position.

LoRa coverage zone

LoRa coverage zone

The emitter was in the city downtown and the 1,3Km is really going on a city environment with a lot of building. The longest distance have about 2km of city and 2km of country side. The part on the top left of the map is a mountain that is limiting the coverage in this area.

On the map, the red part are location where I did a test and get nothing. The blue one the location where I did the test and it was working well, the uncolored parts are where I did no tests.

By the way, I’m very impressed by these results as my emitter is really not optimized for transmission : standard internal antenna, connected as you can see on the photo… The transmitter was limited to 14dB on the 15dB available to keep an acceptable power consumption.

Next step will be to put an emitter on top of our mountains to make a better test !

71 thoughts on “First step in LoRa land – microchip RN2483 test

  1. Hi Sir,
    I am using Microchip Lorawan Kit 800.
    I am able to see the MOTE RN2483 temperature and Light sensor reading at MoTE display.
    How can I fetch the temp. and light sensor data from MOTE RN2483 from an PC.
    How can I keep send the light and temp. sensor data at particular time interval.

    Thanks ,

  2. Hi Paul,
    I bought microchip Lora development kit 800 for exploration of LoRa technology.
    One RN2483 MOTE (which have USB connect with PC), Gateway (Have USB and Etehrnet to PC) and Server.
    I checked all LORA MOTE values like
    sys get ver, radio and mac commands using their java gui tool.
    But I need to get temp. sensor value (GPIO13 PIN in RN2483) at regular time interval.
    How to enable rn2483 mote to send sensor reading at particular time interval to PC via serial USB connection.
    Any code example or suggestion on this.

    Thank you,

  3. Great posting .. I was so inspired I purchased two RN2903 ( 915 Mhz ) modules
    and breakout boards. My units have newer firmware

    sys get ver
    RN2903 0.9.8 Feb 14 2017 20:17:03

    I tried your test program but don’t seem to get real range. I set one module to
    transmit and one to receive. The work fine, but when I move the receiving unit
    more than about 100 meters away , it no longer receives anything.

    I’m using the same code you have here. I have a simple whip antenna on each
    board cut to 78 mm for 1/4 wave 915 Mhz.

    Not sure why I can’t get any range greater than 100 meters or so. I am using
    the same commands as you had here… and it works fine up to about 100m
    Perhaps something has changed in the firmware to limit peer-to-peer usage ?

      • I sounds like your saying two RN2903 devices configured with
        1/4 wave dipole only getting a max range of 100 meters in normal ?
        This is less range than what I’m getting with two 2.4Ghz WIFI
        cards. I believe I’ve found the issue.

        On the off chance there was something wrong with one or both of the cards, I measured the impedance of the connections to the breakout boards. On one of the RN2903, the impedance between the Pin 23 (RF) and gnd was about 40 ohms, on the other it is zero ohms.

        I’m believe the radio with zero ohm ( direct short of its RF pin to ground) is the problem. I’ve since checked this against a new chip and it is suspect.

  4. Hi Paul, many thanks for sharing your test !

    I have briefly read about RN2483 and LORA, and get the idea to communicate/interface with it through serial interface (COM/USB) ports. Now, im wondering if there is a possibility to interface with SPI/UART to the RN2483 ? If so… do i serially send the required ASCII letters to do so ?

    I mean, i have an MRF24J40MA WAN going on at home, and interface with it through USB via Python GUI/HMI (via PIC16/MCP2200).

    But… i really would like to be able to interface with RN2483 through my Python GUI/HMI, is this possible at all ? Please give some hint on this (even though im sure it must be possible to tx/rx through SPI… but where are the commands ?!)

  5. Great detail, I had a question about your connection, did you limit the connection of the RX and TX to 3.3V, or did you use the Arduino virtual UART directly in 5V?

    • If I remember well I directly used Arduino 5v. I do not recommend to do this : the best way is to use a level shifter.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.