简体中文
English
简体中文
日本語

Arduino 上手教程

2. 设备开发 & 案例程序

5. 扩展模块

6. 应用案例

Stamp LoRa-1262 IF Arduino 使用教程

1. 准备工作

2. 注意事项

天线连接
使用 LoRa 模组前必须连接匹配的天线。禁止在未连接天线的情况下发射,否则可能永久损坏射频电路。
FPC 线序
Stamp-C5 DIP 与 Stamp LoRa-1262 IF 通过 0.5 mm、12P FPC 连接。插入排线前请核对连接器方向和 Pin1 位置;线序错误可能造成硬件损坏。
电源
Stamp-C5 DIP 的 FPC 接口向 LoRa 模组提供 3.3V。LoRa 发射时电流会明显增加,建议使用稳定的 USB 或外部 5V 电源。
引脚兼容性
Stamp LoRa-1262 IF 通过 SPI 接口通信。下方例程使用 Stamp C5 作为主控,使用其他主控或载板时,需要根据实际接线修改程序中的引脚定义。

Stamp-C5 DIP 与 Stamp LoRa-1262 IF 的信号连接如下:

Stamp LoRa-1262 IF 引脚 Stamp-C5 GPIO
SX_ANT_SW G23
LORA_IRQ G0
SX_BUSY G24
SX_NRST G25
GND GND
SPI_MISO G26
SPI_MOSI G27
SX_NSS G11
GND GND
SPI_CLK G12

3. 案例程序

本案例使用两套 Stamp-C5 DIP 与 Stamp LoRa-1262 IF 实现 LoRa 点对点通信,发送端发送带计数的字符串,接收端通过串口输出收到的数据和信号信息。

LoRa 参数如下:

宏定义 默认值 含义
LORA_FREQ 868.0f 载波频率,单位 MHz
LORA_BW 125.0f 带宽,单位 kHz
LORA_SF 12 扩频因子
LORA_CR 5 编码率,对应 4/5
LORA_SYNC_WORD 0x34 同步字,用于识别对应的 LoRa 数据包
LORA_TX_POWER 22 发射功率,单位 dBm
LORA_PREAMBLE 20 前导码长度,单位为符号

发送端和接收端的频率、带宽、扩频因子、编码率、同步字和前导码长度应保持一致。

3.1 发送端

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
#include <SPI.h>
#include <RadioLib.h>

// Stamp-C5 DIP FPC to Stamp LoRa-1262 IF connections.
#define LORA_MOSI_PIN   GPIO_NUM_27
#define LORA_MISO_PIN   GPIO_NUM_26
#define LORA_SCK_PIN    GPIO_NUM_12
#define LORA_NSS_PIN    GPIO_NUM_11
#define LORA_BUSY_PIN   GPIO_NUM_24
#define LORA_IRQ_PIN    GPIO_NUM_0
#define LORA_RST_PIN    GPIO_NUM_25
#define LORA_ANT_SW_PIN GPIO_NUM_23

// These settings must match on the transmitter and receiver.
#define LORA_FREQ       868.0f
#define LORA_BW         125.0f
#define LORA_SF         12
#define LORA_CR         5
#define LORA_SYNC_WORD  0x34
#define LORA_TX_POWER   22
#define LORA_PREAMBLE   20

SX1262 radio = new Module(LORA_NSS_PIN, LORA_IRQ_PIN, RADIOLIB_NC, LORA_BUSY_PIN);

volatile bool transmittedFlag = false;
int transmissionState = RADIOLIB_ERR_NONE;
uint32_t packetCount = 0;

void IRAM_ATTR setFlag()
{
    transmittedFlag = true;
}

bool initRadio()
{
    // Select the transmit path for the sender.
    // SX_ANT_SW is active high on the S014-IF RF path.
    pinMode(LORA_ANT_SW_PIN, OUTPUT);
    digitalWrite(LORA_ANT_SW_PIN, HIGH);

    // Reset manually because the Module reset pin is RADIOLIB_NC.
    pinMode(LORA_RST_PIN, OUTPUT);
    digitalWrite(LORA_RST_PIN, LOW);
    delay(10);
    digitalWrite(LORA_RST_PIN, HIGH);
    delay(10);

    SPI.begin(LORA_SCK_PIN, LORA_MISO_PIN, LORA_MOSI_PIN, LORA_NSS_PIN);
    const int state = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR,
                                  LORA_SYNC_WORD, LORA_TX_POWER, LORA_PREAMBLE,
                                  3.0f, true);
    if (state != RADIOLIB_ERR_NONE) {
        Serial.printf("[SX1262] init failed, code: %d\n", state);
        return false;
    }
    radio.setPacketSentAction(setFlag);
    return true;
}

void setup()
{
    Serial.begin(115200);
    delay(1000);
    Serial.println(F("Stamp C5-DIP LoRa-1262 IF transmitter"));

    if (!initRadio()) {
        while (true) delay(1000);
    }

    Serial.println(F("[SX1262] init success"));
    transmissionState = radio.startTransmit("Transmitter Ready");
}

void loop()
{
    if (!transmittedFlag) return;
    transmittedFlag = false;

    if (transmissionState == RADIOLIB_ERR_NONE) {
        Serial.println(F("[SX1262] transmission finished"));
    } else {
        Serial.printf("[SX1262] transmit failed, code: %d\n", transmissionState);
    }

    radio.finishTransmit();
    delay(1000);

    String payload = "Stamp C5-DIP LoRa-1262 #" + String(packetCount++);
    Serial.printf("[SX1262] sending: %s\n", payload.c_str());
    transmissionState = radio.startTransmit(payload);
}

3.2 接收端

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
#include <SPI.h>
#include <RadioLib.h>

// Stamp-C5 DIP FPC to Stamp LoRa-1262 IF connections.
#define LORA_MOSI_PIN   GPIO_NUM_27
#define LORA_MISO_PIN   GPIO_NUM_26
#define LORA_SCK_PIN    GPIO_NUM_12
#define LORA_NSS_PIN    GPIO_NUM_11
#define LORA_BUSY_PIN   GPIO_NUM_24
#define LORA_IRQ_PIN    GPIO_NUM_0
#define LORA_RST_PIN    GPIO_NUM_25
#define LORA_ANT_SW_PIN GPIO_NUM_23

// These settings must match on the transmitter and receiver.
#define LORA_FREQ       868.0f
#define LORA_BW         125.0f
#define LORA_SF         12
#define LORA_CR         5
#define LORA_SYNC_WORD  0x34
#define LORA_TX_POWER   22
#define LORA_PREAMBLE   20

SX1262 radio = new Module(LORA_NSS_PIN, LORA_IRQ_PIN, RADIOLIB_NC, LORA_BUSY_PIN);

volatile bool receivedFlag = false;

void IRAM_ATTR setFlag()
{
    receivedFlag = true;
}

bool initRadio()
{
    pinMode(LORA_ANT_SW_PIN, OUTPUT);
    // Select the receive path for the receiver.
    digitalWrite(LORA_ANT_SW_PIN, LOW);

    // Reset manually because the Module reset pin is RADIOLIB_NC.
    pinMode(LORA_RST_PIN, OUTPUT);
    digitalWrite(LORA_RST_PIN, LOW);
    delay(10);
    digitalWrite(LORA_RST_PIN, HIGH);
    delay(10);

    SPI.begin(LORA_SCK_PIN, LORA_MISO_PIN, LORA_MOSI_PIN, LORA_NSS_PIN);
    const int state = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR,
                                  LORA_SYNC_WORD, LORA_TX_POWER, LORA_PREAMBLE,
                                  3.0f, true);
    if (state != RADIOLIB_ERR_NONE) {
        Serial.printf("[SX1262] init failed, code: %d\n", state);
        return false;
    }
    radio.setPacketReceivedAction(setFlag);
    return true;
}

void setup()
{
    Serial.begin(115200);
    delay(1000);
    Serial.println(F("Stamp C5-DIP LoRa-1262 IF receiver"));

    if (!initRadio()) {
        while (true) delay(1000);
    }

    Serial.println(F("[SX1262] init success"));
    const int state = radio.startReceive();
    if (state != RADIOLIB_ERR_NONE) {
        Serial.printf("[SX1262] receive start failed, code: %d\n", state);
        while (true) delay(1000);
    }
    Serial.println(F("[SX1262] listening"));
}

void loop()
{
    if (!receivedFlag) return;
    receivedFlag = false;

    String payload;
    const int state = radio.readData(payload);
    if (state == RADIOLIB_ERR_NONE) {
        Serial.println(F("[SX1262] packet received"));
        Serial.printf("[SX1262] data: %s\n", payload.c_str());
        Serial.printf("[SX1262] RSSI: %.2f dBm\n", radio.getRSSI());
        Serial.printf("[SX1262] SNR: %.2f dB\n", radio.getSNR());
        Serial.printf("[SX1262] frequency error: %.2f Hz\n", radio.getFrequencyError());
    } else if (state == RADIOLIB_ERR_CRC_MISMATCH) {
        Serial.println(F("[SX1262] CRC error"));
    } else {
        Serial.printf("[SX1262] receive failed, code: %d\n", state);
    }

    radio.finishReceive();
    radio.startReceive();
}

4. 编译上传

  • 选中设备端口,粘贴上述案例程序,点击 Arduino IDE 左上角编译上传按钮,等待程序完成编译并上传至设备。

5. LoRa 收发测试

发送端会每秒发送一次包含计数的字符串,接收端会打印接收到的字符串,并显示 RSSI 等信息。

  • 发送端串口返回信息示例:
Stamp C5-DIP LoRa-1262 IF transmitter
[SX1262] init success
[SX1262] transmission finished
[SX1262] sending: Stamp C5-DIP LoRa-1262 #0
  • 接收端串口返回信息示例:
Stamp C5-DIP LoRa-1262 IF receiver
[SX1262] init success
[SX1262] listening
[SX1262] packet received
[SX1262] data: Stamp C5-DIP LoRa-1262 #0
[SX1262] RSSI: -42.00 dBm
[SX1262] SNR: 9.25 dB
Page Tools
PDF
On This Page