Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/martynwheeler/u-lora
raspi-lora for micropython
https://github.com/martynwheeler/u-lora
Last synced: 3 months ago
JSON representation
raspi-lora for micropython
- Host: GitHub
- URL: https://github.com/martynwheeler/u-lora
- Owner: martynwheeler
- License: gpl-3.0
- Created: 2021-01-28T19:13:56.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2023-10-05T19:16:37.000Z (about 1 year ago)
- Last Synced: 2024-04-29T11:33:13.003Z (6 months ago)
- Language: Python
- Size: 125 KB
- Stars: 64
- Watchers: 8
- Forks: 10
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-micropython - u-lora - Raspi-lora for MicroPython. (Libraries / Communications)
README
# u-lora
This is a port of raspi-lora (https://pypi.org/project/raspi-lora/) for micropython. I have tested on raspberry pi pico, esp8266, and esp32. It allows your microcontroller to use an RFM95 radio to communicate.
## Wiring
The pinout for the RFM95 module can be found on page 10 of the documentation (https://cdn.sparkfun.com/assets/learn_tutorials/8/0/4/RFM95_96_97_98W.pdf). The pin numbers below are for the RFM95 - look at your microcontroller docs for the pins to connect to them.
Power (the RFM95 module requires 3.3V from your microcontroller):
+ connect 3.3V to pin 13
+ connect GND to pin 1, 8, or 10 on the RFM95 moduleFor SPI communication:
+ MISO to pin 2 (MISO)
+ MOSI to pin 3 (MOSI)
+ SCK to pin 4 (SCK)
+ CS to pin 5 (NSS)
Other pins:
+ Use a GPIO output to pin 6 (RESET) for resetting the RFM95
+ Use a GPIO input to pin 14 (D) to trigger that a message has been received## Configuration
**INITIALIZATION**
```
LoRa(spi_channel, interrupt, this_address, cs_pin, reset_pin=None, freq=868, tx_power=14,
modem_config=ModemConfig.Bw125Cr45Sf128, acks=False, crypto=None)
```**spi_channel** SPI channel, check SPIConfig for preconfigured names, e.g. SPIConfig.rp2_0 for RPi pico channel 0
**interrupt** GPIO pin to use for the interrupt
**this_address** The address number (0-254) your device will use when sending and receiving packets.
**cs_pin** chip select pin from microcontroller
**reset_pin** : the GPIO used to reset the RFM9x if connected
**freq** Frequency used by your LoRa radio. Defaults to 868Mhz
**tx_power** Transmission power level from 5 to 23. Keep this as low as possible. Defaults to 14
**modem_config** Modem configuration. See RadioHead docs. Default to Bw125Cr45Sf128.
**receive_all** Receive messages regardless of the destination address
**acks** If True, send an acknowledgment packet when a message is received and wait for an acknowledgment when transmitting a message. This is equivalent to using RadioHead's RHReliableDatagram
**crypto** An instance of PyCryptodome Cipher.AES (not tested) - should be able to use ucrypto### SPICONFIG
Preconfigured SPI bus pins for tested devices, just add into the class for other devices
```
class SPIConfig():
# spi pin defs for various boards (channel, sck, mosi, miso)
rp2_0 = (0, 6, 7, 4)
rp2_1 = (1, 10, 11, 8)
esp8286_1 = (1, 14, 13, 12)
esp32_1 = (1, 14, 13, 12)
esp32_2 = (2, 18, 23, 19)
```### ModemConfig
Preconfigured modem settings taken from Radiohead docs, I will try and add the ability to fine tune these in future.
```
Bw125Cr45Sf128 = (0x72, 0x74, 0x04) #< Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Default medium range
Bw500Cr45Sf128 = (0x92, 0x74, 0x04) #< Bw = 500 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on. Fast+short range
Bw31_25Cr48Sf512 = (0x48, 0x94, 0x04) #< Bw = 31.25 kHz, Cr = 4/8, Sf = 512chips/symbol, CRC on. Slow+long range
Bw125Cr48Sf4096 = (0x78, 0xc4, 0x0c) #/< Bw = 125 kHz, Cr = 4/8, Sf = 4096chips/symbol, low data rate, CRC on. Slow+long range
Bw125Cr45Sf2048 = (0x72, 0xb4, 0x04) #< Bw = 125 kHz, Cr = 4/5, Sf = 2048chips/symbol, CRC on. Slow+long range
```## Examples
There are two examples to test sending and receiving data in the examples folder### Server mode:
Copy the file server.py to your main.py and copy it across together with the library ulora.py to your microcontroller
```
from time import sleep
from ulora import LoRa, ModemConfig, SPIConfig# This is our callback function that runs when a message is received
def on_recv(payload):
print("From:", payload.header_from)
print("Received:", payload.message)
print("RSSI: {}; SNR: {}".format(payload.rssi, payload.snr))# Lora Parameters
RFM95_RST = 27
RFM95_SPIBUS = SPIConfig.rp2_0
RFM95_CS = 5
RFM95_INT = 28
RF95_FREQ = 868.0
RF95_POW = 20
CLIENT_ADDRESS = 1
SERVER_ADDRESS = 2# initialise radio
lora = LoRa(RFM95_SPIBUS, RFM95_INT, SERVER_ADDRESS, RFM95_CS,
reset_pin=RFM95_RST, freq=RF95_FREQ, tx_power=RF95_POW, acks=True)# set callback
lora.on_recv = on_recv# set to listen continuously
lora.set_mode_rx()# loop and wait for data
while True:
sleep(0.1)
```### Client mode:
Copy the file server.py to your main.py and copy it across together with the library ulora.py to your microcontroller```
from time import sleep
from ulora import LoRa, ModemConfig, SPIConfig# Lora Parameters
RFM95_RST = 27
RFM95_SPIBUS = SPIConfig.rp2_0
RFM95_CS = 5
RFM95_INT = 28
RF95_FREQ = 868.0
RF95_POW = 20
CLIENT_ADDRESS = 1
SERVER_ADDRESS = 2# initialise radio
lora = LoRa(RFM95_SPIBUS, RFM95_INT, CLIENT_ADDRESS, RFM95_CS,
reset_pin=RFM95_RST, freq=RF95_FREQ, tx_power=RF95_POW, acks=True)# loop and send data
while True:
lora.send_to_wait("This is a test message", SERVER_ADDRESS)
print("sent")
sleep(10)
```