Ropixon AT LoRa Dongle - User Manual


Ropixon AT-USB LoRa Dongle enables sending and receiving all LoRa packets! Just configure it properly using intuitive AT commands via serial line.

What is it for?


AT LoRa Dongle is suitable for:

Overview


When sending packets, no additional "wrapping" or encryption of data is used - you always send RAW (hex or ASCII) data. The same applies to reception.

Additional functions: AT LoRa dongle has 8 aux pins - you can set its logical level or activate PWM on it - just through the AT commands.

AT LoRa Dongle Hardware AT LoRa Dongle - hardware overview

For quick start:

Ready-to-use device available on Tindie.

1) Install driver for serial interface CP2102 according to your system: Download drivers

2) Connect AT dongle to USB and set desired LoRa parameter configuration (or leave defaults)

3) Send your first LoRa packet via AT commands:

4) Reception is activated automatically - output format HEX/ASCII can be selected using AT+RF_RX_FORMAT=HEX|ASCII, ?

Status LEDs

The dongle has 3 LEDs serving these functions:


LEDFunction
🔴 REDReception of new AT commands
🟢 GREENSystem LED - indicates proper operation
🔵 BLUEReception or transmission of LoRa data

Aux pins

The AT dongle has 8 aux pins that can be "manually" controlled or run PWM modulation (maximum frequency 1 kHz): AT+AUX_PULSE=<pin:1-8>,<period_ms>,<duty%:0-100>

Main Features


FeatureSpecification
RF LoRa ChipSX1262 LoRa transceiver from Semtech (Datasheet)
InterfaceUSB (Virtual COM port)
ControlAT commands via serial line
Baud rates9600, 19200, 38400, 57600, 115200, 230400 (default)
Frequency150 MHz - 960 MHz (optimized for 868 MHz band)
TX power0 to +22 dBm
Spreading FactorSF5 to SF12
Bandwidths7.81 kHz to 500 kHz
Note: RF path is optimized for 868 MHz band (EU: 863-870 MHz, USA: 915 MHz). The further from the operating band, the less power can be transmitted/received.

AUX Pins


The dongle has 8 auxiliary pins that can be manually controlled or run PWM modulation (max frequency 1 kHz):

AT+AUX_PULSE=<pin:1-8>,<period_ms>,<duty%:0-100>

Quick Start


1. Install driver according to your system: Download drivers

2. Connect AT dongle to USB and set desired LoRa parameter configuration (or leave defaults)

3. Send data via AT commands:

4. Reception is activated automatically - output format can be selected using AT+RF_RX_FORMAT=HEX or AT+RF_RX_FORMAT=ASCII

Use Cases


Serial Connection


ParameterValue
Baud rate230400 (default)
Data bits8
ParityNone
Stop bits1
Flow controlNone
Line endingCR+LF (\r\n)

Communication Test


Send AT or AT+HELP - dongle will respond with a list of all available commands.

Send AT+IDENTIFY - dongle will respond with device identification:

Ropixon AT-USB LoRa_Dongle v1.0.0 UID:xxxxxxx.......

AT Commands Reference


System Commands


CommandDescriptionExample
ATPrint helpAT
AT+HELPDisplay all available commandsAT+HELP
AT+IDENTIFYReturn unique device IDAT+IDENTIFY
AT+FACTORY_RSTReset to factory defaults and restartAT+FACTORY_RST
AT+SYS_RESTARTSystem restartAT+SYS_RESTART
AT+UART_BAUDSet/query baud rate (restarts on change)AT+UART_BAUD=230400

LoRa TX Parameters


CommandDescriptionValuesExample
AT+LR_TX_FREQTX frequency in Hz150-960 MHzAT+LR_TX_FREQ=869525000
AT+LR_TX_POWERTX power0 to +22 dBmAT+LR_TX_POWER=14
AT+LR_TX_SFSpreading Factor5-12AT+LR_TX_SF=7
AT+LR_TX_BWBandwidth0-9 (see table below)AT+LR_TX_BW=7
AT+LR_TX_CRCoding Rate45, 46, 47, 48AT+LR_TX_CR=45
AT+LR_TX_PREAMBLEPreamble lengthsymbolsAT+LR_TX_PREAMBLE=8
AT+LR_TX_SYNCWORDSync word0x0000-0xFFFFAT+LR_TX_SYNCWORD=0x3444
AT+LR_TX_CRCCRC enable/disable0=off, 1=onAT+LR_TX_CRC=1
AT+LR_TX_IQIQ inversion0=off, 1=onAT+LR_TX_IQ=0
AT+LR_TX_HEADERMODEHeader mode0=explicit, 1=implicitAT+LR_TX_HEADERMODE=0
AT+LR_TX_LDROLow Data Rate Opt.0=off, 1=on, 2=autoAT+LR_TX_LDRO=2

LoRa RX Parameters


Same parameters as TX, replace TX with RX in command names: AT+LR_RX_FREQ, AT+LR_RX_SF, AT+LR_RX_BW, etc.

Important: AT+LR_RX_PLDLEN - Payload length is required for implicit header mode.

Bandwidth Reference


ValueBandwidthValueBandwidth
07.81 kHz541.67 kHz
110.42 kHz662.5 kHz
215.63 kHz7125 kHz
320.83 kHz8250 kHz
431.25 kHz9500 kHz

Quick Setup Commands


Configure all RF parameters at once:

TX configuration:

AT+LR_TX_SET=SF:7,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2,Power:22

RX configuration:

AT+LR_RX_SET=SF:7,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2
Tip: Use Semtech LoRa Calculator (select SX1262) to understand how different modulation settings affect your data/packet.

Simple rule: High BW + low SF = faster data rate but shorter range. Low BW + high SF = longer range but slower. Use AT+RF_GET_TOA=<packet_size> to check Time on Air.

RF Transmission and Reception


CommandDescriptionExample
AT+RF_TX_HEXTransmit data in HEX formatAT+RF_TX_HEX=48656C6C6F
AT+RF_TX_TXTTransmit data as textAT+RF_TX_TXT=Hello
AT+RF_RX_TO_UARTEnable/disable RX outputAT+RF_RX_TO_UART=1
AT+RF_RX_FORMATRX data output formatAT+RF_RX_FORMAT=HEX

Received data format:

+RX:<length>,<data>,RSSI:<rssi>

Example: +RX:5,48656C6C6F,RSSI:-45 (5 bytes, data "Hello" in hex, RSSI -45 dBm)

Saved Packets and Periodic Transmission


Store one packet in NVM memory for later or periodic transmission:


CommandDescriptionExample
AT+RF_SAVE_PACKETSave packet to memoryAT+RF_SAVE_PACKET=010203
AT+RF_TX_SAVEDTransmit saved packet onceAT+RF_TX_SAVED
AT+RF_TX_SAVED_REPEATStart/stop periodic TXAT+RF_TX_SAVED_REPEAT=ON
AT+RF_TX_NVM_PERIODSet TX period in msAT+RF_TX_NVM_PERIOD=1000
AT+RF_TX_PERIOD_STATUSQuery periodic TX statusAT+RF_TX_PERIOD_STATUS?

RF Test Commands


CommandDescriptionExample
AT+RF_TX_CWContinuous wave (carrier only)AT+RF_TX_CW=1
AT+RF_GET_TOACalculate Time on Air (ms)AT+RF_GET_TOA=10
AT+RF_GET_TSYMGet symbol timeAT+RF_GET_TSYM

AUX GPIO Pins (1-8)


CommandDescriptionExample
AT+AUXSet pin stateAT+AUX=1,1 (pin 1 HIGH)
AT+AUX_PULSEStart PWMAT+AUX_PULSE=1,1000,50 (1 Hz, 50% duty)
AT+AUX_PULSE_STOPStop PWMAT+AUX_PULSE_STOP=1

Practical Examples


Example 1: Point-to-Point Communication


Transmitter:

AT+LR_TX_SET=SF:9,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,Power:22,LDRO:2
AT+RF_TX_HEX=AABBCCDD

Receiver:

AT+LR_RX_SET=SF:9,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2

Receiver output: +RX:4,AABBCCDD,RSSI:-47

Example 2: Range Test with Periodic TX


TX Dongle (sends packet every 2 seconds):

AT+LR_TX_SET=SF:12,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2,Power:22
AT+RF_SAVE_PACKET=31313232333334343535
AT+RF_TX_NVM_PERIOD=2000
AT+RF_TX_SAVED_REPEAT=ON

RX Dongle:

AT+LR_RX_SET=SF:12,BW:7,CR:45,Freq:869525000,IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2
AT+RF_RX_TO_UART=1
AT+RF_RX_FORMAT=ASCII

Output: +RX:10,1122334455,RSSI:-68

Example 3: CW Test


Transmit carrier wave at 868 MHz with 10 dBm:

AT+LR_TX_FREQ=868000000
AT+LR_TX_POWER=10
AT+RF_TX_CW=1

Stop: AT+RF_TX_CW=0

Example 4: Change Baud Rate


AT+UART_BAUD?        → 115200
AT+UART_BAUD=230400  → OK (dongle restarts)
Note: Update your terminal to the new baud rate after restart.

Important Notes


TX/RX Parameter Compatibility


For successful communication, these RF settings must match on both sides:


ParameterTX = RX
FrequencyTX_FREQ = RX_FREQ
Spreading FactorTX_SF = RX_SF
BandwidthTX_BW = RX_BW
Coding RateTX_CR = RX_CR
Sync WordTX_SYNCWORD = RX_SYNCWORD
Header ModeTX_HEADERMODE = RX_HEADERMODE
CRCTX_CRC = RX_CRC
IQ InversionTX_IQ = RX_IQ
LDROUse 2 (auto) on both sides

Range vs. Speed Optimization


SettingMaximum RangeMaximum Speed
SF125
BW0 (7.81 kHz)9 (500 kHz)
CR48 (4/8)45 (4/5)
Power22 dBm22 dBm
Result> 10 km (open space)Fastest data rate

Header Modes


ModeValueDescription
Explicit0Header contains packet length (recommended)
Implicit1No header - RX_PLDLEN must be set on receiver!

LDRO (Low Data Rate Optimization)


ValueDescription
0Off (manual)
1On (manual)
2Auto (recommended) - firmware selects based on SF/BW

Troubleshooting


Dongle Not Responding


  1. Check baud rate (try 115200 or 230400)
  2. Verify MCU-USB jumpers are connected on both RX and TX headers
  3. Check line ending (must be CR+LF)
  4. Reconnect USB cable
  5. Try AT+SYS_RESTART

RX Not Receiving Data


  1. Verify all RF parameters match between TX and RX
  2. Enable RX output: AT+RF_RX_TO_UART=1
  3. Increase TX power or reduce distance

Low RSSI / Packet Loss


  1. Increase TX power (max 22 dBm)
  2. Reduce distance
  3. Increase SF (7 → 9 → 12)
  4. Use external antenna (requires resoldering 0402 jumper from chip antenna to U.FL connector)

CRC Errors


  1. Change frequency (RF interference)
  2. Verify TX/RX parameter match
  3. Set LDRO to 2 (auto) on both sides

Technical Specifications


ComponentSpecification
MCUSTM32L071 (ARM Cortex-M0+)
RF chipSemtech SX1262
Frequency150 MHz - 960 MHz
TX power0 to +22 dBm
RX sensitivity-149.1 dBm (SF12, BW 7.81 kHz)
USBVirtual COM port (CP2102)
GPIO8x AUX pins (PWM capable)
Power supply5V from USB
Operating temp.-20°C to +70°C

Appendix: Python Automation


Example script using pyserial for automated testing:

#!/usr/bin/env python3
import serial
import time

# Configuration
PORT = "COM3"           # Windows: COM3, Linux: /dev/ttyUSB0
BAUD = 230400
FREQ = 869525000
DATA_HEX = "48656C6C6F" # "Hello"

def send_AT(ser, cmd, timeout=2.0):    """Send AT command and wait for response."""    ser.reset_input_buffer()    ser.write((cmd + "\r\n").encode())
    t0, resp = time.time(), ""    while time.time() - t0 < timeout:        if ser.in_waiting:            resp += ser.read(ser.in_waiting).decode(errors="ignore")            if "OK" in resp or "ERROR" in resp:                break        time.sleep(0.01)    return resp.strip()

# Main
ser = serial.Serial(PORT, BAUD, timeout=1)
time.sleep(0.5)

# Verify device
resp = send_AT(ser, "AT+IDENTIFY")
if "Ropixon AT-USB LoRa_Dongle" not in resp:    print(f"Unknown device: {resp}")    ser.close()    exit(1)

print(resp)

# Configure and send
send_AT(ser, f"AT+LR_TX_SET=SF:7,BW:7,CR:45,Freq:{FREQ},IQInv:0,HeaderMode:0,CRC:1,Preamble:8,LDRO:2,Power:22")

for i in range(5):    resp = send_AT(ser, f"AT+RF_TX_HEX={DATA_HEX}", timeout=3.0)    print(f"Packet {i+1}: {'OK' if 'OK' in resp else 'FAIL'}")    time.sleep(1.0)

ser.close()

I sell on Tindie