HopeRF RF95 (and similar LoRa modules) python library
Based in RadioHead library code: http://www.airspayce.com/mikem/arduino/RadioHead/
Just import rf95 module in your python project
When creating the RF95 object, you need to pass the CS channel (On Raspberry Pi you have spidev 0 and 1 devices) and the external interrupt pin (Broadcom GPIO).
Then you can set channel, TX Power, and predefined modes of operation:
- Bw125Cr45Sf128 : Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Default medium range.
- Bw500Cr45Sf128 : Bw = 500 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Fast+short range.
- Bw31_25Cr48Sf512 : Bw = 31.25 kHz, Cr = 4/8, Sf = 512chips/symbol, CRC on. Slow+long range.
- Bw125Cr48Sf4096 : Bw = 125 kHz, Cr = 4/8, Sf = 4096chips/symbol, CRC on. Slow+long range.
You can also set custom modes using the rf95.set_modem_config_custom()and the following constants:
set_modem_config_custom(bandwidth, coding_rate, imp_header, spreading_factor, crc, continuous_tx, timeout, agc_auto) Bandwidth: rf95.BW_7K8HZ rf95.BW_10K4HZ rf95.BW_15K6HZ rf95.BW_20K8HZ rf95.BW_31K25HZ rf95.BW_41K7HZ rf95.BW_62K5HZ rf95.BW_125KHZ rf95.BW_250KHZ rf95.BW_500KHZ Coding Rate: rf95.CODING_RATE_4_5 rf95.CODING_RATE_4_6 rf95.CODING_RATE_4_7 rf95.CODING_RATE_4_8 Implicit header: rf95.IMPLICIT_HEADER_MODE_ON rf95.IMPLICIT_HEADER_MODE_OFF Spreading factor: rf95.SPREADING_FACTOR_64CPS rf95.SPREADING_FACTOR_128CPS rf95.SPREADING_FACTOR_256CPS rf95.SPREADING_FACTOR_512CPS rf95.SPREADING_FACTOR_1024CPS rf95.SPREADING_FACTOR_2048CPS rf95.SPREADING_FACTOR_4096CPS TX Continuous mode rf95.TX_CONTINUOUS_MODE_ON rf95.TX_CONTINUOUS_MODE_OFF CRC: rf95.RX_PAYLOAD_CRC_ON rf95.RX_PAYLOAD_CRC_OFF Timeout: rf95.SYM_TIMEOUT_MSB AGC Auto: rf95.AGC_AUTO_ON rf95.AGC_AUTO_OFF import rf95 # Create rf95 object with CS0 and external interrupt on pin 25 lora = rf95.RF95(0, 25) if not lora.init(): # returns True if found print("RF95 not found") quit(1) else: print("RF95 LoRa mode ok") # set frequency, power and mode lora.set_frequency(868.5) lora.set_tx_power(5) lora.set_modem_config(Bw31_25Cr48Sf512) # Send some data lora.send([0x00, 0x01, 0x02, 0x03]) lora.wait_packet_sent() # Send a string lora.send(lora.str_to_data("$TELEMETRY TEST")) lora.wait_packet_sent() # Wait until data is available while not lora.available(): pass # Receive data = lora.recv() print (data) for i in data: print(chr(i), end="") print() lora.set_mode_idle()