-
-
Save sabas1080/3d0f8e416e4e5883c9755e1c90ba53d9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from microbit import spi, sleep, pin16 | |
import array | |
import gc | |
class LoRa(object): | |
""" | |
Radio - LoRa. Single channel. | |
""" | |
def __init__(self, Frequency=434.450, Mode=1): | |
self.sending = False | |
self.Frequency = Frequency | |
self.currentMode = 0x81 | |
self.Power = 0x88 | |
pin16.write_digital(1) # Deselect CS | |
spi.init() | |
self.__writeRegister(0x41, 0x00) # REG_DIO_MAPPING_2 | |
self.SetLoRaFrequency(Frequency) | |
self.SetStandardLoRaParameters(Mode) | |
def __readRegister(self, register): | |
data = bytearray([register & 0x7F, 0]) | |
pin16.write_digital(0) | |
spi.write_readinto(data, data) | |
pin16.write_digital(1) | |
return data[1] | |
def __writeRegister(self, register, value): | |
pin16.write_digital(0) | |
spi.write(bytearray([register | 0x80, value])) | |
pin16.write_digital(1) | |
def __setMode(self, newMode): | |
if newMode != self.currentMode: | |
if newMode == 0x83: # RF98_MODE_TX | |
# TURN LNA OFF FOR TRANSMIT | |
self.__writeRegister(0x0C, 0x00) # REG_LNA, LNA_OFF_GAIN | |
# Set 10mW | |
self.__writeRegister(0x09, self.Power) # REG_PA_CONFIG | |
elif newMode == 0x85: # RF98_MODE_RX_CONTINUOUS | |
# PA Off | |
self.__writeRegister(0x09, 0x00) # REG_PA_CONFIG, PA_OFF_BOOST | |
# Max LNA Gain | |
self.__writeRegister(0x0C, 0x23) # REG_LNA, LNA_MAX_GAIN | |
self.__writeRegister(0x01, newMode) # REG_OPMODE | |
self.currentMode = newMode | |
if newMode != 0x80: # RF98_MODE_SLEEP | |
#while not self.DIO5.is_active: | |
# pass | |
# time.sleep(0.1) | |
pass | |
def SetLoRaFrequency(self, Frequency): | |
self.__setMode(0x81) # RF98_MODE_STANDBY | |
self.__setMode(0x80) # RF98_MODE_SLEEP | |
self.__writeRegister(0x01, 0x80) # REG_OPMODE | |
self.__setMode(0x81) # RF98_MODE_STANDBY | |
FrequencyValue = int((Frequency * 7110656) / 434) | |
self.__writeRegister(0x06, (FrequencyValue >> 16) & 0xFF) | |
self.__writeRegister(0x07, (FrequencyValue >> 8) & 0xFF) | |
self.__writeRegister(0x08, FrequencyValue & 0xFF) | |
def SetLoRaParameters(self, ImplicitOrExplicit, ErrorCoding, Bandwidth, SpreadingFactor, LowDataRateOptimize): | |
self.__writeRegister(0x1D, ImplicitOrExplicit | ErrorCoding | Bandwidth) | |
self.__writeRegister(0x1E, SpreadingFactor | 0x04) | |
self.__writeRegister(0x26, 0x04 | (0x08 if LowDataRateOptimize else 0)) | |
self.__writeRegister(0x31, (self.__readRegister(0x31) & 0xF8) | (0x05 if (SpreadingFactor == 0x60) else 0x03)) | |
self.__writeRegister(0x37, 0x0C if (SpreadingFactor == 0x60) else 0x0A) | |
self.PayloadLength = 255 if ImplicitOrExplicit else 0 | |
self.__writeRegister(0x22, self.PayloadLength) | |
self.__writeRegister(0x1A, self.PayloadLength) | |
def SetStandardLoRaParameters(self, Mode): | |
if Mode == 0: | |
self.SetLoRaParameters(0x00, 0x08, 0x30, 0xB0, True) | |
elif Mode == 1: | |
self.SetLoRaParameters(0x01, 0x02, 0x30, 0x60, False) | |
elif Mode == 2: | |
self.SetLoRaParameters(0x00, 0x08, 0x60, 0x80, False) | |
def send_packet(self, packet): | |
self.sending = True | |
self.__setMode(0x81) # RF98_MODE_STANDBY) | |
# map DIO0 to TxDone | |
self.__writeRegister(0x40, 0x40) # REG_DIO_MAPPING_1 | |
self.__writeRegister(0x0E, 0x00) # REG_FIFO_TX_BASE_AD | |
self.__writeRegister(0x0D, 0x00) # REG_FIFO_ADDR_PTR | |
# data = bytearray([0x80] + packet + [0] | |
pin16.write_digital(0) | |
# spi.write(data) | |
spi.write(bytearray([0x80])) | |
spi.write(packet) | |
spi.write(bytearray([0])) | |
pin16.write_digital(1) | |
self.__writeRegister(0x22, self.PayloadLength if self.PayloadLength else len(packet)) # REG_PAYLOAD_LENGTH | |
self.__setMode(0x83) # RF98_MODE_TX | |
def send_text(self, sentence): | |
self.send_packet(bytearray(sentence)) | |
sleep(1000) | |
print("LoRa Test Program") | |
sleep(1000) | |
print("Create LoRa object") | |
MaxFree = 0 | |
MyLoRa = LoRa() | |
while True: | |
MaxFree = max(MaxFree, gc.mem_free()) | |
print(gc.mem_free(), MaxFree) | |
print("Send message") | |
MyLoRa.send_text("$$Hello World!\n") | |
print("Sent") | |
sleep(2000) | |
print() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment