「Arduino Nesso N1」を使用して、LoRa無線通信で送受信する方法をサンプルプログラムを使用して詳しく紹介します。
テスト方法としては、送信側がデータを送り、受信側が受け取ったデータをそのまま返す「エコーバック方式」で、通信が正しく行われたか、通信品質(RSSI:受信信号強度)はどうだったかまで確認できます。
「Nesso N1」の基本的な使い方や機能、端子配列等については、以下のリンクで詳しく紹介しています。

「M5StickC Plus2」でLoRa無線ユニット「LoRaE220-JP」を使用した、LoRa無線通信の使い方についても以下のリンク先で詳しく紹介しています。

1.LoRa無線通信について
・LoRaとは
・無線通信モジュールSX1262について
2.日本の電波法への適合確認
・特定小電力無線とは
・技適(技術基準適合証明)の確認
・使用できる周波数範囲、空中線電力の確認
・キャリアセンスと送信時間制限
・電波法を考慮したSX1262の推奨設定値一覧
3.開発環境の準備
・Arduino IDEのインストール
・ボードマネージャ、ライブラリのインストールと初期設定
・シリアルモニタ出力設定
4.動作紹介
5.サンプルプログラム
6.サンプルプログラムの詳細
7.まとめ
1.LoRa無線通信について
LoRa無線通信を理解するために、まずはその仕組みや使用するトランシーバIC「SX1262」、そして日本で利用する際に関係する電波法について詳しく紹介します。
・LoRaとは
「LoRa」とは、「semtech社」が開発した変調方式(電波の飛ばし方)です。
長距離無線(Long Range Radio)を実現することから「Long Range」を略して「LoRa」と呼ばれています。
「LoRa」はWi-Fiのような高速通信はできませんが、遠くまで電波が届くのに省電力であることが特徴です。
通信距離は、壁の無い見通しの良い条件では「数km〜数十km」の通信が可能で、「数m〜数十m」のWi-FiやBluetoothより、はるかに遠くへの無線通信が可能で、ノイズにも強く障害物の影響も受けにくい変調方式です。
しかし、通信速度は「数百bps〜数kbps程度」と遅いため、動画や音声の通信には不向きです。
その代わり消費電力は少ないので、電池で駆動するデバイスで小さなデータを送信する用途には最適で以下のような用途で使用されます。
・無線通信モジュールSX1262について
「SX1262」は、Semtech社の「LoRa トランシーバIC」で、LoRa・FSKなど複数の変調方式に対応しています。
低消費電力でありながら最大+22dBmの送信出力を持ち、LoRaWANやP2P(独自LoRa)通信など幅広い用途で利用されています。
SX1262の通信仕様一覧表
「SX1262」の通信仕様とLoRaWAN、P2P(独自LoRa)それぞれの用途で使用した場合の主な設定をまとめると以下表のようになります。
| 項目 | SX1262の仕様 | LoRaWANの設定 | P2Pの設定 |
|---|---|---|---|
| 対応周波数帯 | 150〜960 MHz | AS923(日本):923.2, 923.4 MHz | 920.6MHz~928MHz (中心周波数、200kHz間隔で設定) |
| 変調方式 | LoRa / (G)FSK / LR-FHSS | LoRa(固定) | LoRa または (G)FSK |
| 帯域幅(BW) | 7.8〜500 kHz | 125 kHz(必須) | 125 kHz 推奨(200kHzチャネル内) |
| 拡散係数(SF) | SF5〜SF12 | SF7〜SF12(ネットワークが決定) | SF7〜SF9 (SF10以上はデータ量から 送信時間を慎重に検討必要) |
| 符号化率(CR) | 4/5〜4/8 | 4/5(LoRaWAN標準) | 4/5〜4/6(自由) |
| 最大送信出力 | +22 dBm(IC性能) | +13 dBm(日本の上限) | +13 dBm(日本の上限) |
| プリアンブル長 | 任意設定 | 8(固定) | 8〜12 推奨(自由) |
| 同期ワード | 任意設定 | 0x34(固定) | 任意(0x12がよく使われる) |
| 受信感度 | 約 -137 dBm(SF12, BW125kHz) | 共通(固定) | 共通(固定) |
| 電源方式 | DC-DC:省電力、バッテリー駆動用 LDO:低ノイズ、安定受信 | どちらでも可 | どちらでも可 モジュールによる |
| TCXO制御電圧 | 1.6〜3.0V | モジュール依存 | モジュール依存 |
| インターフェース | SPI | MCU経由で制御 | MCU経由で制御 |
| 通信方式 | 半二重(送信と受信は同時不可) | LoRaWANプロトコル | 自由設計 |
2.日本の電波法への適合確認
日本国内で LoRa などの無線通信を利用するには、「電波法」に適合していることが必須です。
無線機器は自由に使えるわけではなく、使用できる「周波数」や「送信出力」、「送信時間」など、守るべきルールが細かく定められています。
ここでは、「特定小電力無線」の基本的な考え方をはじめ、「技適マーク」の確認方法、利用可能な「周波数帯」、「送信時」の注意点など、LoRa を日本で安心・安全に使うために知っておきたいポイントについて詳しく紹介します。
電波法に適合した無線通信を行うためには、送信時間や送信間隔、周波数の使い方など、多くの細かなルールを守る必要があります。
特に「920MHz帯の特定小電力無線」は、通信方式(キャリアセンスの有無、周波数ホッピング、LDCなど)によって制限条件が大きく異なり、関係する告示や技術基準も分散しているため、全体像を把握するのは簡単ではありません。
そこで本記事では、私なりの理解にはなりますが、主な通信方式ごとに送信時間や待ち時間の制約を整理し、以下のように一覧表としてまとめました。制度理解の参考資料としてご覧ください。
| 方式 | 中心周波数範囲 (200kHz間隔) ※帯域幅200kHz以内 | キャリアセンス (しきい値-80dBm) | 空中線電力 (送信出力) | 送信時間 1回の最大 | 休止時間 | 1時間あたりの送信時間合計 | 用途 |
|---|---|---|---|---|---|---|---|
| 通常 1〜20チャネル同時使用可 | 920.6~928.0MHz | 必要 128μs以上 5ms未満 | 20mW (13dBm) 以下 | 0.4s以内 | 2ms以上 | 360秒(6分) | 頻繁な 短文向き |
| 必要 5ms以上 | 4.0s以内 | 50ms以上 | ー | 長文・高頻度 向き | |||
| 周波数ホッピング(FH)方式 0.4秒以内に周波数を切り替える (送信時間0.4秒以内で同一周波数への送信間隔は4秒以上) | 920.6~925.0MHz | 不要 | 0.4s以内 | 4秒以上 (同一波) | 合計720秒 (同一波36秒) | 複数chを 賢く使う | |
| LDC(Low Duty Cycle)方式 1時間あたりの送信時間の割合が1%(36秒/時)以下 | 920.6~923.4MHz | 不要 | ー | ー | 36秒(1%) | たまに 送るだけ |
詳細は以下リンク先の総務省のサイトや無線設備規則、電波法施行規則等でご確認の上、用途に応じて正しく運用してください。
・無線設備規則:第四十九条の十四(特定小電力無線局の無線設備)
・電波法施行規則第六条第四項第二号の規定に基づく特定小電力無線局の用途、電波の型式及び周波数並びに空中線電力(平成元年郵政省告示第四十二号)
以下からは、上の表を作成するにあたって確認した内容をまとめておきます。
特定小電力無線とは
「特定小電力無線」とは、電波法で定められた「免許不要」で使える無線通信のことです。
しかし、「免許不要」=「自由に使っていい」ではないので注意が必要です。
技適(技術基準適合証明)の確認
「LoRa無線通信」を「免許不要」で使うには、まず大前提として技適に対応したデバイスを使用する必要があります。
日本国内で使う無線機器には、技適マーク(技術基準適合証明)が必要です。
これは、機器が日本の電波法に適合していることを示す証明で、 技適マークのない機器を違法に使うと「電波法違反」になります。
対応デバイスには必ず「技適証明番号」が書かれており(本体に限らず、梱包箱の場合もある)、以下のサイトで番号から適合内容を確認することができます。
「特定無線設備」のうち、電波法に基づく技術基準に適合していることを示す表示(技適マーク)が付されていることにより、無線局の免許が不要となる設備の一覧は以下リンク先の表で確認できます。
「Nesso N1」は「特定小電力無線局」の「テレメーター、テレコントロール、データ伝送用」に該当します。
使用できる周波数範囲、空中線電力の確認
日本でLoRaなどの無線通信を「免許不要」で使う場合、「使用できる周波数と空中線電力(送信出力)」が決まっています。
「使用できる周波数と空中線電力」については以下総務省のサイトで確認できます。
サイト内の「表 6 テレメータ用・テレコントロール用及びデータ伝送用無線局の技術基準等」で「特定小電力無線局」の「使用できる周波数と空中線電力」が以下表のようにまとめられています
| 周波数 | 空中線電力 | 技術基準 | 特定無線設備の規格 |
| 中出力型(キャリアセンス要):920.5MHz~928.1MHz | 20mW以下 | 設備規則第49条の14第7号(同号ニただし書きに該当するものを除く。) | 証明規則第2条第1項第8号 |
| 中出力型(FH): 920.5MHz~925.1MHz | 設備規則第49条の14第7号(同号ニただし書き(1)に該当するものに限る。) | ||
| 中出力型(LDC): 920.5MHz~923.5MHz | 設備規則第49条の14第7号(同号ニただし書き(2)に該当するものに限る。) |
この表を見ると「空中線電力」は「20mW以下」であることがわかります。
無線で使用できる周波数や送信条件は、無線の用途や方式によって異なります。そのため、実際に機器を設計・運用する際には、該当する技術基準を必ず確認する必要があります。
ここで紹介している内容は、「無線設備規則 第49条の14 第7号」に基づいており、詳細な規定については以下のリンク先を参照してください。
使用できる周波数については電波法で細かく分類されているため、判断が難しいですが以下のリンク先の「施行規則第六条第四項第二号」の「3 九一五・九MHz以上九二八・一MHz以下の周波数の電波を使用する無線設備」の表で確認できます。
このページ内では特定小電力無線局の電波の型式、周波数及び空中線電力が用途の区分ごとに表にまとめられています。
該当する表を探すのはなかなか大変です・・・特に数字が読みにくいですが、以下が「Nesso N1」に該当すると思いますので抜粋して紹介します。
一 テレメーター用、テレコントロール用及びデータ伝送用
3 九一五・九MHz以上九二八・一MHz以下の周波数の電波を使用する無線設備
| 周波数 | 空中線電力(送信出力) |
| 中心周波数が九二〇・五MHzに一〇〇kHzのn倍を加えた周波数以上九二八・一MHzから一〇〇kHzのn倍を減じた周波数以下の周波数であって、九二〇・五MHzに一〇〇kHzのn倍を加えた周波数に二〇〇kHzの整数倍を加えたもの(キャリアセンスを行わないものにあっては、無線設備規則第四十九条の十四第七号ニただし書に掲げる条件に適合するものに限る。)(注2) | 〇・〇二ワット以下。ただし、無線設備が一の筐体に収められており、かつ、容易に開けられない構造であって、等価等方輻射電力が一六デシベル以下となるものにあっては、〇・二五ワット以下であること。 |
注2 nは、一の無線チャネルとして同時に使用する単位チャネル(中心周波数が九二〇・六MHz以上九二八MHz以下の周波数のうち九二〇・六MHzに二〇〇kHzの整数倍を加えたものであって、帯域幅が二〇〇kHzのチャネルをいう。)の数であり、一以上二〇以下の整数とする。
空中線電力「1mW」の表と一緒に書かれてますがこれは「微弱無線局」の内容のため、上表の「0.02W = 20mW以下」が該当すると思います。
次に周波数について読み解いてみます。まずは数字を読みやすくします。
928.1MHzから100kHzのn倍を減じた周波数以下の周波数であって
920.5MHzに100kHzのn倍を加えた周波数に200kHzの整数倍を加えたもの
つまり、実際に使用する周波数の上限値と下限値は以下のようになります。
下限値:920.5MHz + 0.1MHz = 920.6MHz
上限値:928.1MHz – 0.1MHz = 928.0MHz
使用できる周波数は920.6MHz〜928.0MHzの範囲で200kHz(0.2MHz)ごとに分割した以下38チャネルの値を中心周波数として選択して使用することになります。
※同時使用は連続した周波数を使用し、キャリアセンスが必須で20チャネルまで使用可
921.0、921.2、921.4、921.6、921.8、922.0、922.2、922.4、922.6、922.8
923.0、923.2、923.4、923.6、923.8、924.0、924.2、924.4、924.6、924.8
925.0、925.2、925.4、925.6、925.8、926.6、926.8、926.6、926.8、926.6
927.0、927.2、927.4、927.6、927.8、928.0(MHz)
さらに、注2のnについて読み解いてみます。これは複数チャネルで同時通信する場合に使用可能なチャネルについて書かれています。
例えば10個のチャネルを同時に使用する場合、n = 10となり、使用できる周波数範囲は以下になります。
920.5 + 0.1× 10 〜 928.1 ー 0.1× 10
=921.5 〜 927.1(MHz)
これを、200kHz幅で分割すると以下29チャネルになり、この中から連続した10個のチャネルが使用できるということになります。
923.1、923.3、923.5、923.7、923.9、924.1、924.3、924.5、924.7、924.9
925.1、925.3、925.5、925.7、925.9、926.1、926.3、926.5、926.7、926.9
927.1(MHz)
キャリアセンスと送信時間
「キャリアセンス」とは、無線を送信する前に、周囲の電波状況を確認して、他の無線局が通信中でないか確認してから送信を開始する仕組みで、他の無線局との電波の衝突(混信)を防ぐために実施されます。
送信前に「RSSI(受信信号強度)が-80dBmより小さいかどうか」を測定することで、他の無線局が通信中でないことが確認できます。
キャリアセンスを実施した場合と、しない場合の送信時間については以下のようになります。
1時間あたりの送信時間の合計が360秒(6分)以下(10%以下)。
・キャリアセンスなし:
周波数を0.4秒以内に切り替える(周波数ホッピング(FH)方式)か、
1時間あたりの送信時間の合計を36秒以下(1%以下、LDC方式で)にする。
これについては、以下リンク先の「無線設備規則」の中に書かれており、「総務省の電波ポータル」の中でまとめられています。
電波法を考慮したSX1262の推奨設定値一覧
「LoRa無線通信」を日本国内で使用する際に考慮すべき電波法に関する項目と、「SX1262」を使用する時の推奨設定値を一覧表にまとめて紹介します。運用時の参考にしてください。
| 項目 | 詳細 | 推奨設定値(日本の電波法準拠) |
|---|---|---|
| 周波数 (Frequency) | 通信に使う中心周波数。 日本では920MHz帯(下限920.5MHz~上限923.5MHz)が利用可能。 帯域幅を考慮して設定する。 | 920.6MHz~928MHz ※周波数範囲を超えないよう帯域幅を考慮して設定(200kHz間隔[±100kHz]) ※923.2MHz、923.4MHzで1チャネルのみの使用が安全 |
| 帯域幅 (Bandwidth) | 信号の広がり幅:125/250/500kHz 広いほど高速通信できるが、消費電力と別チャネルとの干渉リスクが増す。 | 125 kHz (チャネル幅200kHzを超えてはいけない) |
| 拡散係数 (Spreading Factor, SF) | 拡散変調の強さ。大きいほど遠くまで届くが、通信速度は遅くなる。 | SF7〜SF9(SF8以下が安全) SF10以上(送信データによっては送信時間が電波法の制限を超える可能性あり) |
| 符号化率分母 (Coding Rate, CR) | 誤り訂正の強さ。CR:4/5〜4/8。大きいほど信頼性は上がるが、速度は低下。 | CR:4/5 または 4/6(バランス重視) ※設定は分母の数値で指定 |
| 同期ワード (Sync Word) | 通信相手を識別するための識別子。LoRaWANとP2Pで異なる値を使う。 | LoRaWAN:0x34 P2P:0x12(LoRaWANと区別するための慣習的な値で自由に設定可。同じ値同士でのみ通信可能でグループ分けにも使える) |
| 出力電力 (TX Power) | 送信時の電力。日本の特定小電力では20mW(+13dBm)が上限。 | +13 dBm |
| プリアンブル長 (Preamble Length) | 受信側が信号を検出して同期を取るための LoRa シンボル数。 長いと受信の安定性が向上するが、送信時間増、消費電力増。 | LoRaWAN:8 P2P:8〜12程度 |
| TCXO基準電圧 | TCXO(温度補償型水晶発振器)を使う場合の電源電圧設定。 | 1.6〜3.0V (使用するデバイスに合わせて設定) |
| useRegulatorLDO | SX1262の内部電源レギュレータの選択。DC-DC/LDO(低ドロップアウト) | バッテリー駆動:DC-DC推奨 安定性重視:LDO |
3.開発環境の準備
「Nesso N1」で「LoRa無線通信」を使用するために必要な開発環境とライブラリ等のインストール、初期設定について詳しく紹介します。
・Arduino IDEのインストール
「Arduino IDE」のインストール方法は、以下のリンクで詳しく紹介しています。

・ボードマネージャ、ライブラリのインストールと初期設定
「Arduino IDE」のインストールが完了して起動したら、下画像のように左メニューアイコンから[ボードマネージャ]を選択し、検索窓に「ESP32」と入力すると「esp32 by Espressif」が表示されるため、これをインストールします。

次に以下表のライブラリをインストールします。
| ライブラリ名 | 用途 | バージョン | 検索名 |
|---|---|---|---|
| M5Unified | M5Stack共通ライブラリ | 0.2.13 | m5unif |
| M5GFX | 液晶画面制御用 | 0.2.19 | m5g |
| RadioLib | LoRa無線通信用 | 7.5.0 | radiolib |
ライブラリのインストールは、下画像のように左メニューアイコンから[ライブラリマネージャ]を選択して検索窓にインストールしたいライブラリ「m5unified(m5unifまででも良い)」のように入力すると「M5Unified by M5Stack」が表示されるため、必要なライブラリを[インストール]ボタンをクリックします。

[インストール]をクリックすると下画像のようなウインドウが表示されることがあります。

「M5Unified」の場合は動作に関連する「M5GFX」ライブラリがインストールできるため
[全てをインストール]ボタンをクリックします。
同様に「RadioLib」ライブラリも検索してインストールしましょう。
次に「NESSO N1」とパソコンをUSBケーブルでパソコンと接続します。
接続したら、下写真のようにメニューバーの[ツール]→[ボード:”ESP32 Familly Device”]→[esp32]→[Arduino Nesso N1(最下部)]をクリックしてください。

パソコン側で「NESSO N1」の接続が認識されると、下画像のように画面上部に「Arduino Nesso N1」と表示されます。

・シリアルモニタ出力設定
最後に初期設定として、「Arduino IDE」のシリアルモニタ機能で「Nesso N1」からのシリアル出力を表示するための設定を行います。
下画像のように[ツール]→[USB CDC On Boot:”Disabled”]→[Enabled]を選択します。

4.動作紹介
ここで紹介している「サンプルプログラム」を使用した動作について詳しく紹介します。
「サンプルプログラムは」送信側と受信側で同じ(デバイスに合わせて)ものを書き込みます。
「LoRa無線通信」で送受信の動作確認を行うには2台のデバイスが必要です。
「Nesso N1」が2台あるといいのですが、高価なデバイスなので私は1台しか持ってません^^;
このため受信側には「M5Stack社」製の「UNIT-C6L」を使用しました。

実際に動作確認している様子は上写真のようになります。

「Nesso N1」の電源を入れると、「LoRa無線通信」の初期設定が開始され、完了すると上写真のような表示になります。

初期設定完了後に本体正面ボタンを押すと「Hello! #1(番号はボタンを押した回数)」が送信(>Send)されます。
受信側にデータが届くと、送信したデータがそのまま送り返されてくるので受信(<Receive)して表示されます。

データを受信した時には上写真のようにデータが受信(<Receive)されると、データが受信されたことを伝えるために、受信したデータをそのまま送信(>Send)します。

ボタンを押すたびに送信データの数値が「#1,2,3・・・」のように増えていきます。
5.サンプルプログラム
サンプルプログラムは以下になります。
コピペで貼り付けて実行してください。コピーは下の黒塗り部右上のアイコンクリックでもできます。
#include <M5Unified.h>
#include <RadioLib.h>
// LoRa通信 SX1262ピン設定(CS, IRQ, NRST, BUSY)
SX1262 radio = new Module(23, 15, RADIOLIB_NC, 19); // Nesso N1のピン設定
// SX1262 radio = new Module(23, 7, RADIOLIB_NC, 19); // Unit-C6Lのピン設定
#define MAIN_FONT &fonts::Font4 // フォント指定 ※C6LはFont0推奨
// グローバル変数
volatile bool receiveFlag = false; // 受信フラグ
bool isTransmitting = false; // 送信中フラグ
int count = 0; // 送信パケットカウンタ
String sendMessage; // 送信メッセージ格納用
String receiveMessage; // 受信メッセージ格納用
// 受信割り込みコールバック ************************************
void setReceiveFlag() {
if (!isTransmitting) { // 送信中でなければ
receiveFlag = true; // 受信フラグをセット
}
}
// ログ出力:画面とシリアルへ同時出力 ***************************
void logPrint(const String& msg) {
Serial.println(msg); // シリアル出力
M5.Display.println(msg); // 画面出力
}
// LoRa送信処理 **********************************************
void sendLoRaMessage(String& message) {
isTransmitting = true; // 送信中フラグをセット
radio.clearPacketReceivedAction(); // 受信割り込無効化(送信中のゴースト受信割り込み対策)
radio.standby(); // 受信を停止
delay(10); // 受信停止待ち
logPrint("\n>Send:\n" + message); // 送信メッセージ出力
int state = radio.transmit(message); // 同期送信(完了まで待つ)
if (state == RADIOLIB_ERR_NONE) { // 送信成功なら
logPrint("Success!"); // 成功表示
} else {
logPrint("Failed, code: " + String(state)); // エラーコード表示
}
radio.finishTransmit(); // 送信完了処理
delay(15); // 送信完了待ち
radio.setPacketReceivedAction(setReceiveFlag); // 受信割り込み再設定
radio.startReceive(); // 受信再開
isTransmitting = false; // 送信中フラグをクリア
}
// LoRa(SX1262) 初期化 ****************************************
void initSX1262() {
auto& ioe = M5.getIOExpander(0); // I/OエキスパンダーE0のオブジェクトを取得
// リセット処理
ioe.digitalWrite(7, false); // SX_NRSTをLOWにしてSX1262をリセット
delay(100); // リセット待ち
ioe.digitalWrite(7, true); // SX_NRSTをHIGHに戻す
delay(100); // 安定待ち
// RF回路有効化
ioe.digitalWrite(6, true); // SX_ANT_SWをHIGHにしてアンテナスイッチを有効化
ioe.digitalWrite(5, true); // SX_LNA_ENをHIGHにしてLNA(低雑音増幅器)を有効化
// SX1262 通信設定(周波数 MHz、帯域幅 kHz、拡散係数、符号化率分母、同期ワード、出力電力 dBm、プリアンブル長、TCXO基準電圧、useRegulatorLDO)
int state = radio.begin(923.2, 125.0, 9, 5, 0x12, 13, 8, 3.0, true);
if (state != RADIOLIB_ERR_NONE) { // 初期化失敗なら
logPrint("LoRa Init \nFailed: " + String(state)); // エラーコード表示
while (true) delay(100); // 無限ループ
}
logPrint("LoRa Init \nSuccess!"); // 初期化成功表示
radio.setPacketReceivedAction(setReceiveFlag); // 受信完了時のコールバック関数を設定
radio.startReceive(); // 受信開始
}
// 液晶画面初期化 **********************************************
void initDisplay() {
M5.Display.setTextSize(1); // 文字サイズ(整数倍率)
M5.Display.setFont(MAIN_FONT); // フォント指定
M5.Display.setBaseColor(TFT_BLACK); // 画面クリア時の背景色指定
M5.Display.setTextScroll(true); // 文字スクロール有効化
M5.Display.clear(); // 画面クリア
M5.Display.setCursor(0, 0); // 表示座標設定(x, y)
M5.Display.println("[SX1262]"); // 画面出力
}
// 初期設定 --------------------------------
void setup() {
M5.begin(); // M5Unified初期化
Serial.begin(115200); // シリアル出力初期化
delay(1000); // 1秒待機
initDisplay(); // 液晶画面初期化
initSX1262(); // LoRa(SX1262) 初期化
}
// メインループ ----------------------------
void loop() {
M5.update(); // M5ボタン状態更新
// 送信処理(ボタンA ON)
if (M5.BtnA.wasPressed() && !isTransmitting) { // 送信中フラグが立っていない状態でボタンAが押されたら
count++; // 送信パケットカウンタ+1
sendMessage = "Hello! #" + String(count); // 送信データ作成
sendLoRaMessage(sendMessage); // LoRaデータ送信処理関数
}
// 受信処理
if (receiveFlag) {
radio.clearPacketReceivedAction(); // 受信割り込み無効化
radio.standby(); // 受信を停止
delay(10); // 受信停止待ち
int state = radio.readData(receiveMessage); // 受信データ読み込み
if (state == RADIOLIB_ERR_NONE && receiveMessage.length() > 0) { // 受信成功かつデータが存在するなら結果表示
logPrint("\n<Receive:\n" + receiveMessage); // 受信メッセージ出力
Serial.printf("RSSI: %.0f dBm\n", radio.getRSSI()); // 受信信号強度指標(RSSI)取得・表示
M5.Display.printf("RSSI: \n %.0f dBm\n", radio.getRSSI()); // 画面表示
Serial.printf("SNR: %.2f dB\n", radio.getSNR()); // 信号雑音比(SNR)取得・表示
Serial.printf("FreqErr: %.2f Hz\n", radio.getFrequencyError()); // 周波数誤差取得・表示
// エコーバック(自分の送信内容と違う場合のみ ※ループ対策)
if (receiveMessage != sendMessage) { // 受信メッセージが送信メッセージと異なるなら
sendLoRaMessage(receiveMessage); // LoRaデータ送信処理関数
}
} else if (state == RADIOLIB_ERR_CRC_MISMATCH) { // CRCエラーなら
logPrint("CRC Error"); // CRCエラー表示
} else {
logPrint("Receive Failed: " + String(state)); // エラーコード表示
}
radio.setPacketReceivedAction(setReceiveFlag); // 受信割り込み再設定
radio.startReceive(); // 受信再開
receiveFlag = false; // 受信フラグクリア
}
delay(50);
}6.サンプルプログラムの詳細
サンプルプログラムは「Nesso N1」と「UNIT-C6L」で共通で使用できるようにしています。
「UNIT-C6L」を使用する場合はサンプルプログラムの「5〜8行目」を以下のようにして書き込んでください。
// LoRa通信 SX1262ピン設定(CS, IRQ, NRST, BUSY)
// SX1262 radio = new Module(23, 15, RADIOLIB_NC, 19); // Nesso N1のピン設定
SX1262 radio = new Module(23, 7, RADIOLIB_NC, 19); // Unit-C6Lのピン設定
#define MAIN_FONT &fonts::Font0 // フォント指定 ※C6LはFont0推奨「LoRa無線通信」の通信設定はサンプルプログラムの「67行目」で以下のように設定しています。
// SX1262 通信設定(周波数 MHz、帯域幅 kHz、拡散係数、符号化率分母、同期ワード、出力電力 dBm、プリアンブル長、TCXO基準電圧、useRegulatorLDO)
int state = radio.begin(923.2, 125.0, 9, 5, 0x12, 13, 8, 3.0, true);・周波数:923.2Hz(日本の電波法920MHz帯で使用できる値、チャネル1を使用)
・帯域幅:125kHz(日本の電波法の200kHz以下対応のため)
・拡散係数:SF9(送受信速度は遅くても良いため長距離通信を想定して大きく)
・符号化率:CR=4/5(分母の数値を設定、5は速度重視)
・同期ワード:0x12(P2P通信の定番設定)
・出力電力:+13dBm(日本の電波法で設定できる最大値)
・プリアンブル長:8(速度重視、省電力設定)
・TCXO基準電圧:3.0V(Nesso N1デバイスの設定)
・useRegulatorLDO:true(有効、内部電源レギュレータの選択)
受信動作については「SX1262」の「IRQ:DIO1」端子を使用した割り込み処理を使用しています。
サンプルプログラムの「75行目」で以下のように、受信完了時の割り込み処理としてコールバック関数「setReceiveFlag」を設定しています。
radio.setPacketReceivedAction(setReceiveFlag); // 受信完了時のコールバック関数を設定サンプルプログラムの「17〜22行目」でコールバック関数「setReceiveFlag」を実行して受信フラグを立てます。メインループでこのフラグを確認することで受信処理を実行するようにしています。
// 受信割り込みコールバック ************************************
void setReceiveFlag() {
if (!isTransmitting) { // 送信中でなければ
receiveFlag = true; // 受信フラグをセット
}
}
radio.setPacketReceivedAction(setReceiveFlag); // 受信完了時のコールバック関数を設定注意点として、送受信処理の前には以下のように受信割り込みと受信処理を無効にしておく必要があります。
radio.clearPacketReceivedAction(); // 受信割り込無効化(送信中のゴースト受信割り込み対策)
radio.standby(); // 受信を停止
delay(10); // 受信停止待ち
.
.
送信または受信処理
.
.
radio.setPacketReceivedAction(setReceiveFlag); // 受信割り込み再設定
radio.startReceive(); // 受信再開キャリアセンスを実施するなら
今回はシンプルな送受信処理のみの確認のため、キャリアセンスは実装していませんが、実際に行う場合は送信前に周囲の電波状況を電波強度(RSSI値)から確認します。
「RadioLib」では「radio.getRSSI()」を使うことで、現在の電波強度(RSSI値)を取得できます。
このRSSI値が 「−80dBm より小さい場合」は、その周波数が空いていると判断し、送信を開始し、「−80dBm 以上」の場合は、他の無線機が使用している可能性があるため、送信を待つ、または再試行するといった処理を追加します。
// 現在の周囲の電波強度を取得
float rssi = radio.getRSSI();7.まとめ
「Arduino Nesso N1」を使用して、LoRa無線通信で送受信する方法をサンプルプログラムを使用して詳しく紹介しました。
「Nesso N1」に搭載されている「SX1262」 は高感度かつ省電力で扱いやすい「LoRa トランシーバIC」ですが、日本の「電波法」についてよく確認して正しく使用する必要があります。
周波数チャネル、帯域幅、送信出力などのパラメータを正しく設定し、+13dBm 制限や 200kHz チャネル間隔、技適適合デバイスの使用といった日本の電波法に沿って運用することが重要になります。
LoRa無線通信制御用ライブラリ「RadioLib」を使えば「SX1262」の設定や送受信処理を簡単に扱えますが、受信割り込み(DIO1)の扱いには注意が必要です。
特に送受信処理時に受信割り込みを無効化しないと、自局送信を誤って受信したと判定する「ゴースト受信」が発生するため、処理前に必ず受信割り込みと受信処理を無効にしておくことが安定動作のポイントです。
今回の動作確認は「LoRaWAN」とは異なり、「LoRa の物理層(P2P通信)」ですが、独自プロトコルの開発や実験用途には十分な機能と柔軟性があります。
電波法に沿った適切なパラメータ設定と、送信時間は短く、送信間隔は十分に開けて、送信と受信を片方ずつ交互に行うことを前提とした通信方式であることを理解することで、安全かつ安定した 「LoRa無線通信」を実現することができます。
































コメント