LoRa-1262 模块

LoRa1262Module 提供 Module13.2 LoRa-1262 无线电通信功能。该无线电模块使用模块的 M-Bus SPI 总线,并通过 I2C 上的 M5IOE1 控制器实现复位、天线开关和电源控制。

支持以下产品:

LoRa-1262 模块

构造函数接受已初始化的 machine.I2C 总线。省略 i2c 时,模块使用 module.mbus.i2c1。M5IOE1 地址必须在 0x71 到 0x74 范围内。

备注

发射前请连接合适的天线。支持的 RF 频率范围为 850000–930000 kHz。

UiFlow2 应用示例

发送端

在 UiFlow2 中打开 cores3_lora1262_tx_example.m5f2 项目。该示例每秒发送一条消息,并显示消息和发送时间戳。

UiFlow2 代码块:

tx_example.png

接收端

在 UiFlow2 中打开 cores3_lora1262_rx_example.m5f2 项目。该示例启动连续接收,并显示解码后的负载、RSSI、SNR 和接收时间戳。

UiFlow2 代码块:

rx_example.png

MicroPython 应用示例

发送端

该示例使用默认的 M-Bus I2C 总线初始化 LoRa1262Module,每秒发送一条消息,并显示发送时间戳。

 1import os, sys, io
 2import M5
 3from M5 import *
 4from module import LoRa1262Module
 5import time
 6
 7
 8title0 = None
 9label_t = None
10label_tx = None
11label_ts = None
12label_time = None
13lora1262_0 = None
14
15
16count = None
17message = None
18
19
20def setup():
21    global title0, label_t, label_tx, label_ts, label_time, lora1262_0, count, message
22
23    M5.begin()
24    Widgets.setRotation(1)
25    Widgets.fillScreen(0x222222)
26    title0 = Widgets.Title("LoRa1262 Module Tx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.Montserrat18)
27    label_t = Widgets.Label("Send:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
28    label_tx = Widgets.Label("hello", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
29    label_ts = Widgets.Label(
30        "timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18
31    )
32    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
33
34    count = 0
35    lora1262_0 = LoRa1262Module(pin_cs=0, pin_busy=2, pin_irq=14, address=0x74)
36
37
38def loop():
39    global title0, label_t, label_tx, label_ts, label_time, lora1262_0, count, message
40    M5.update()
41    message = str("Module LoRa1262 ") + str(count)
42    lora1262_0.send(message, None)
43    label_tx.setText(str(message))
44    label_time.setText(str(time.ticks_ms()))
45    count = count + 1
46    time.sleep(1)
47
48
49if __name__ == "__main__":
50    try:
51        setup()
52        while True:
53            loop()
54    except (Exception, KeyboardInterrupt) as e:
55        try:
56            from utility import print_error_msg
57
58            print_error_msg(e)
59        except ImportError:
60            print("please update to latest firmware")

接收端

该示例注册接收回调,启动连续接收,并显示解码后的负载、RSSI 和 SNR。

  1import os, sys, io
  2import M5
  3from M5 import *
  4from module import LoRa1262Module
  5import time
  6
  7
  8title0 = None
  9label_r = None
 10label_rx = None
 11label_rssi = None
 12label_rssi_v = None
 13label_snr = None
 14label_snr_v = None
 15label_t = None
 16label_time = None
 17lora1262_0 = None
 18
 19
 20lora1262_data = None
 21rssi = None
 22snr = None
 23
 24
 25def lora1262_0_receive_event(received_data):
 26    global \
 27        title0, \
 28        label_r, \
 29        label_rx, \
 30        label_rssi, \
 31        label_rssi_v, \
 32        label_snr, \
 33        label_snr_v, \
 34        label_t, \
 35        label_time, \
 36        lora1262_0, \
 37        lora1262_data, \
 38        rssi, \
 39        snr
 40    lora1262_data = received_data
 41    label_rx.setText(str(lora1262_data.decode()))
 42    rssi = lora1262_data.rssi
 43    snr = (lora1262_data.snr) / 4
 44    label_rssi_v.setText(str(rssi))
 45    label_snr_v.setText(str(snr))
 46    label_time.setText(str(time.ticks_ms()))
 47
 48
 49def setup():
 50    global \
 51        title0, \
 52        label_r, \
 53        label_rx, \
 54        label_rssi, \
 55        label_rssi_v, \
 56        label_snr, \
 57        label_snr_v, \
 58        label_t, \
 59        label_time, \
 60        lora1262_0, \
 61        lora1262_data, \
 62        rssi, \
 63        snr
 64
 65    M5.begin()
 66    Widgets.setRotation(1)
 67    Widgets.fillScreen(0x222222)
 68    title0 = Widgets.Title("LoRa1262 Module Rx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.Montserrat18)
 69    label_r = Widgets.Label("Recv:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 70    label_rx = Widgets.Label(" ", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 71    label_rssi = Widgets.Label("RSSI:", 5, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 72    label_rssi_v = Widgets.Label(" ", 65, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 73    label_snr = Widgets.Label("SNR:", 5, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 74    label_snr_v = Widgets.Label(" ", 65, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 75    label_t = Widgets.Label(
 76        "timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18
 77    )
 78    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.Montserrat18)
 79
 80    lora1262_0 = LoRa1262Module(pin_cs=0, pin_busy=2, pin_irq=14, address=0x74)
 81    lora1262_0.set_rx_callback(lora1262_0_receive_event)
 82    lora1262_0.start_recv()
 83
 84
 85def loop():
 86    global \
 87        title0, \
 88        label_r, \
 89        label_rx, \
 90        label_rssi, \
 91        label_rssi_v, \
 92        label_snr, \
 93        label_snr_v, \
 94        label_t, \
 95        label_time, \
 96        lora1262_0, \
 97        lora1262_data, \
 98        rssi, \
 99        snr
100    M5.update()
101
102
103if __name__ == "__main__":
104    try:
105        setup()
106        while True:
107            loop()
108    except (Exception, KeyboardInterrupt) as e:
109        try:
110            from utility import print_error_msg
111
112            print_error_msg(e)
113        except ImportError:
114            print("please update to latest firmware")

API参考

class module.lora1262.LoRa1262Module(i2c=None, pin_cs=1, pin_irq=10, pin_busy=2, address=113, freq_khz=868000, bw='250', sf=8, coding_rate=8, preamble_len=12, syncword=18, output_power=10)

基类:LoRa868V12Module

创建 Module13.2 LoRa-1262 对象。

模块使用 M-Bus SPI 总线和调用方提供的 I2C 总线。M5IOE1 控制器通过 G2 控制 SX1262 复位,通过 G3 控制天线开关,并通过 G5 控制 LoRa 电源。

参数:
  • i2c (machine.I2C) – 用于访问 M5IOE1 的已初始化 I2C 总线。

  • pin_cs (int) – SX1262 片选 MCU 引脚。

  • pin_irq (int) – SX1262 DIO1 MCU 引脚。

  • pin_busy (int) – SX1262 BUSY MCU 引脚。

  • address (int) – M5IOE1 I2C 地址,范围为 0x71 到 0x74。

  • freq_khz (int) – RF 频率,单位为 kHz,范围为 850000 到 930000。

  • bw (str) – LoRa 带宽,单位为 kHz。

  • sf (int) – 扩频因子,范围为 6 到 12。

  • coding_rate (int) – 编码率分母,范围为 5 到 8。

  • preamble_len (int) – 前导码长度,范围为 5 到 255 个符号。

  • syncword (int) – 同步字,范围为 1 到 255。

  • output_power (int) – 输出功率,单位为 dBm,范围为 -9 到 22。

UiFlow2 代码块:

init.png

MicroPython 代码块:

import M5
from module import LoRa1262Module, mbus

M5.begin()
lora1262 = LoRa1262Module(mbus.i2c1, address=0x71)
set_freq(freq_khz=868000)

设置 RF 频率。

参数:

freq_khz (int) – RF 频率,单位为 kHz,范围为 850000 到 930000。

返回类型:

None

UiFlow2 代码块:

set_freq.png

MicroPython 代码块:

lora1262_0.set_freq(868000)
set_sf(sf)

设置 LoRa 扩频因子。

参数:

sf (int) – 扩频因子,范围为 6 到 12。

返回类型:

None

UiFlow2 代码块:

set_sf.png

MicroPython 代码块:

lora1262_0.set_sf(8)
set_bw(bw)

设置 LoRa 带宽。

参数:

bw (str) – 带宽,单位为 kHz。支持的值包括 "7.8"、"10.4"、"15.6"、"20.8"、"31.25"、"41.7"、"62.5"、"125"、"250" 和 "500"。

返回类型:

None

UiFlow2 代码块:

set_bw.png

MicroPython 代码块:

lora1262_0.set_bw("250")
set_coding_rate(coding_rate)

设置前向纠错编码率。

参数:

coding_rate (int) – 编码率分母,范围为 5 到 8。

返回类型:

None

UiFlow2 代码块:

set_coding_rate.png

MicroPython 代码块:

lora1262_0.set_coding_rate(8)
set_syncword(syncword)

设置 LoRa 同步字。

参数:

syncword (int) – 同步字,范围为 1 到 255。

返回类型:

None

UiFlow2 代码块:

set_syncword.png

MicroPython 代码块:

lora1262_0.set_syncword(0x12)
set_preamble_len(preamble_len)

设置 LoRa 前导码长度。

参数:

preamble_len (int) – 前导码长度,范围为 5 到 255 个符号。

返回类型:

None

UiFlow2 代码块:

set_preamble_len.png

MicroPython 代码块:

lora1262_0.set_preamble_len(12)
set_output_power(output_power)

设置 LoRa 输出功率。

参数:

output_power (int) – 输出功率,单位为 dBm,范围为 -9 到 22。

返回类型:

None

UiFlow2 代码块:

set_output_power.png

MicroPython 代码块:

lora1262_0.set_output_power(10)
send(packet, tx_at_ms=None)

发送 LoRa 数据包。

参数:
  • packet (str | list | tuple | int | bytearray) – 要发送的数据。

  • tx_at_ms (int) – 可选的发送时间戳,单位为毫秒。

  • packet

返回:

发送时间戳,单位为毫秒。

返回类型:

int

UiFlow2 代码块:

send.png

send_return.png

send_with_time_return.png

MicroPython 代码块:

timestamp = lora1262_0.send("Hello LoRa1262")
recv(timeout_ms=None, rx_length=255, rx_packet=None)

接收一个 LoRa 数据包。

参数:
  • timeout_ms (int) – 可选的接收超时时间,单位为毫秒。

  • rx_length (int) – 接收的最大字节数。默认为 0xFF。

  • rx_packet (RxPacket) – 可选的、用于复用的数据包对象。

返回:

接收到的数据包;接收超时时返回 None。

返回类型:

RxPacket | None

UiFlow2 代码块:

recv.png

recv_data_param.png

MicroPython 代码块:

packet = lora1262_0.recv()
start_recv()

启动 LoRa 连续接收。

UiFlow2 代码块:

start_recv.png

MicroPython 代码块:

lora1262_0.start_recv()
返回类型:

None

set_tx_callback(callback)

注册发送完成回调。

参数:

callback (callable) – 数据包发送完成后调用的无参数函数。

返回类型:

None

UiFlow2 代码块:

send_event.png

MicroPython 代码块:

def on_transmit():
    print("transmitted")

lora1262_0.set_tx_callback(on_transmit)
set_rx_callback(callback)

注册接收数据包回调。

参数:

callback (callable) – 接收到有效数据包后调用的函数,该函数接收一个 RxPacket。

返回类型:

None

UiFlow2 代码块:

receive_event.png

MicroPython 代码块:

def on_receive(packet):
    print(packet.decode(), packet.rssi, packet.snr / 4)

lora1262_0.set_rx_callback(on_receive)
standby()

使 SX1262 进入待机模式。

UiFlow2 代码块:

standby.png

MicroPython 代码块:

lora1262_0.standby()
返回类型:

None

sleep()

使 SX1262 进入睡眠模式。

UiFlow2 代码块:

sleep.png

MicroPython 代码块:

lora1262_0.sleep()
返回类型:

None

irq_triggered()

返回 SX1262 IRQ 是否已触发。

返回:

自上次开始发送或接收操作后触发过中断时返回 True。

返回类型:

bool

UiFlow2 代码块:

irq_triggered.png

MicroPython 代码块:

interrupted = lora1262_0.irq_triggered()
deinit()

使无线电进入睡眠状态并禁用模块电源控制。

MicroPython 代码块:

lora1262_0.deinit()
返回类型:

None