Arduino入門

2. デバイス&サンプル

5. 拡張モジュール&サンプル

アクセサリー

6. アプリケーション

Stamp LoRa-1262 IF Arduino チュートリアル

1. 準備

  • 環境設定:Arduino IDE 入門ガイドを参照して IDE をインストールし、使用する開発ボードに対応するボードパッケージと必要なドライバライブラリをインストールしてください。

  • 使用するドライバライブラリ:

  • 使用するハードウェア:

2. 注意事項

アンテナの接続
LoRa モジュールを使用する前に、必ず適合するアンテナを接続してください。アンテナを接続せずに送信すると、RF 回路が永久的に損傷するおそれがあります。
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 を 2 セット使用し、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