Skip to content

Instantly share code, notes, and snippets.

@GOROman
Created September 2, 2026 04:22
Show Gist options
  • Select an option

  • Save GOROman/9dfa90b4b1bf22efa9fcac8e25ef2312 to your computer and use it in GitHub Desktop.

Select an option

Save GOROman/9dfa90b4b1bf22efa9fcac8e25ef2312 to your computer and use it in GitHub Desktop.
LoRa と SX1262 入門 - 初心者向け技術解説 (M5Paper Mono 実装より)

LoRa と SX1262 入門 — M5Paper Mono で LoRa 通信をやってみた話

M5Paper Mono (SX1262 搭載) を使って LoRa 通信を実装したときに整理した知識をまとめます。 「LoRa って何?」「SF とか BW って何を決めてるの?」「日本で電波を出していいの?」 というあたりを、初心者向けに章立てで解説します。


第1章: LoRa って何?

LoRa (Long Range) は、Semtech 社が開発した無線通信の変調方式です。 Wi-Fi や Bluetooth と同じ「無線で電波に情報を乗せる技術」の一種ですが、 狙っているところが全然違います。

Wi-Fi Bluetooth LoRa
得意なこと 大容量データ 近距離の周辺機器接続 長距離・低消費電力
通信距離 〜100m 〜10m 数km〜数十km
通信速度 数百Mbps 数Mbps 数百bps〜数十kbps
消費電力 大きい 中くらい とても小さい

つまり LoRa は「速度を犠牲にして、距離と省電力を極端に追求した」通信方式です。 数バイト〜数百バイトのセンサーデータや短いメッセージを、電池で何年も動かしながら 数km先まで飛ばす、といった用途に向いています。動画は送れません。

なぜ遠くまで届くのか? 種明かしは変調方式にあります(第3章で説明します)。 電波の周波数が低い(920MHz帯や868MHz帯)ため障害物を回り込みやすく、 さらに「チャープスペクトラム拡散」という技術でノイズに埋もれた微弱な信号でも 復調できるようになっています。


第2章: SX1262 というチップ

**SX1262 は Semtech 社が作っている LoRa 無線チップ(トランシーバ IC)**です。 「LoRa を喋れる無線モデム」だと思ってください。マイコン (ESP32 など) から SPI 通信で命令すると、LoRa 変調した電波を送受信してくれます。

  • 対応周波数: 150〜960MHz(設定で 868MHz 帯や 920MHz 帯など、地域ごとのバンドに合わせられる)
  • 送信出力: 最大 +22dBm (約158mW)
  • 受信感度: -148dBm 前後(とても微弱な電波まで拾える)
  • 前身は SX1276/SX1278 (旧世代)。SX1262 は低消費電力・低コスト版

M5Paper Mono では、この SX1262 モジュールが本体内部の SPI バスに繋がっていて、 マイコン (ESP32-S3) が以下のピンで制御しています。

NSS (チップセレクト) / DIO1 (割り込み) / BUSY (処理中フラグ) / SCK・MOSI・MISO (SPI)

Arduino では RadioLib というライブラリがこのチップの制御を全部やってくれるので、 自分でレジスタを叩く必要はありません。

SX1262 radio = new Module(NSS, DIO1, RST, BUSY);
radio.begin(868.0, 500.0, 7, 5, 0x34, 22, 10, 3.0, true);
//           ↑周波数  ↑帯域幅 ↑SF ↑CR ↑同期語 ↑出力 ↑プリアンブル ↑TCXO電圧

第3章: LoRa 変調の仕組み — なぜ遠くまで届くのか

LoRa は CSS (Chirp Spread Spectrum / チャープスペクトラム拡散) という変調方式を使います。

「チャープ」とは、周波数が時間とともにスーッと変化する信号のこと(鳥の鳴き声の サイレンのような音をイメージしてください)。1つの音(周波数)ではなく 「上昇していく音の形そのもの」を情報として使うので、多少ノイズが乗っても 波形のパターンごと拾えば復調できます。これがノイズに強い理由です。

通信を設定するときに必ず出てくる3つのパラメータがあります。

SF (Spreading Factor / 拡散率)

1つのシンボル(電波の単位)に何ビットの情報を乗せるかを決めます。 SF7〜SF12 の範囲で設定でき、数字が大きいほど:

  • ✅ 電波が遠くまで届く(受信感度が上がる)
  • ❌ 通信速度が遅くなる
  • ❌ 電波を出している時間が長くなる(法律の制限に関わる、後述)

BW (Bandwidth / 帯域幅)

電波としてどれだけの周波数の幅を使うかです。単位は kHz。 7.8kHz〜500kHz くらいの範囲で選べます。

  • 帯域幅が 広い(500kHz) → 速い・届く距離は短め
  • 帯域幅が 狭い(125kHz など) → 遅い・より遠くまで届く

CR (Coding Rate / 誤り訂正率)

送るデータに冗長な誤り訂正符号をどれだけ足すかです。 4/5, 4/6, 4/7, 4/8 の4択で、分母が大きいほど:

  • ✅ 電波が多少壊れても復元できる(頑丈)
  • ❌ 実効速度が落ちる(同じデータでも送る量が増えるので)

このプロジェクトでの設定値

今回 M5Paper Mono と Cardputer ADV の間では次の値を使いました。

周波数: 868.0 MHz
帯域幅 (BW): 500 kHz
拡散率 (SF): 7
符号化率 (CR): 4/5
同期語 (Sync Word): 0x34

SF7・BW500 は「速度優先・省電力優先」の組み合わせです。近距離での やり取りを高頻度・低遅延で行いたい用途に向いています。逆に、 数km先まで届かせたいなら SF12・BW125 のような「低速・長距離」設定にします。 送信側と受信側は、この3つ (SF・BW・CR) と周波数・同期語を完全に一致させないと通信できません。 1つでもズレていると「電波は届いているのにデータとして復調できない」状態になります。

同期語 (Sync Word) とは

Wi-Fi の SSID のようなもので、「同じネットワークの仲間か」を電波レベルで 判別するための合言葉です。0x34 はプライベート用途の慣習的な値、 0x12 は公衆網 (LoRaWAN) 用の予約値になっています。


第4章: プロトコル層 — 「生 LoRa」と LoRaWAN の違い

LoRa という単語には実は2つのレイヤーがあります。混同されがちなので整理します。

アプリケーション層  ← 自分のメッセージ ("hey" とか JSON とか)
─────────────────────
LoRaWAN            ← ゲートウェイ経由でクラウドまで届ける「ネットワーク規格」
─────────────────────
LoRa (物理層)       ← SX1262 が担当する「電波の変調方式そのもの」
  • LoRa (物理層): 今回使ったのはこちら。SX1262 同士が直接、1対1(または1対多)で パケットをやり取りするだけの、いわば「トランシーバー」的な使い方です。 ネットワークもサーバーも要りません。
  • LoRaWAN: LoRa の上に MAC 層・暗号化・ゲートウェイ・ネットワークサーバーまで 積み上げた本格的な IoT ネットワーク規格です。The Things Network などの 公衆網に繋いでクラウドまでデータを送る場合はこちらを使います。

今回のプロジェクトはLoRaWANを使わず「生 LoRa」でパケットを直接投げ合っています。 radio.transmit("hey") のように送りたいバイト列をそのまま渡すと、 SX1262 が自動でプリアンブル(同期用の助走部分)・ヘッダー・CRC を付けて送信し、 受信側は radio.readData() で中身を取り出せます。手軽な反面、 暗号化や再送制御・アドレッシングは自分で実装しない限りありません。


第5章: 電波が届く距離を決めるもの — RSSI と SNR

実装したコードでは受信のたびに RSSI と SNR という2つの数値をログに出しています。

[LoRa] rx #1: "hey" RSSI -51.0 SNR 12.2

RSSI (Received Signal Strength Indicator)

受信した電波の強さです。単位は dBm(マイナスが大きいほど弱い)。 目安として:

RSSI 目安
-30〜-60dBm かなり近い・強い
-70〜-100dBm 実用範囲
-110〜-130dBm ギリギリ復調できるかどうか

SNR (Signal to Noise Ratio)

信号がノイズに対してどれだけ強いかの比率(dB)。LoRa は仕組み上、 SNR がマイナス(ノイズより弱い信号)でも復調できるという変わった特性があります。 これが「電波が弱くても届く」LoRa の強みの正体です。SF を上げるほど、 このマイナス方向への耐性が強くなります(SF12 なら -20dB近くまで耐えられます)。

この2つの数値がわかると「電波環境として余裕があるか」「もっと SF を下げて 高速化できないか」の判断材料になります。


第6章: 電波法の話 — 日本で LoRa を使うときに知っておくこと

ここが初心者が一番つまずくポイントです。LoRa は「電波を出す」機器なので、 日本国内では電波法の規制対象です。好きな周波数・出力で送信していいわけでは ありません。

6.1 技適 (技術基準適合証明)

日本国内で無線機を使うには、原則として 総務省の技術基準に適合した機器 (=「技適マーク」がついた機器)である必要があります。 M5Stack のような国内代理店経由の製品は基本的に技適を取得済みですが、 個人輸入や海外版のモジュールをそのまま使う場合は技適が無いことがあり、 その場合は日本国内で電波を出すこと自体が違法になります。

購入した機器に技適マークの表示(本体の刻印や設定画面での表示)があるか、 必ず確認してください。

6.2 周波数帯 — 868MHz は EU 向け、日本は 920MHz 帯

このプロジェクトの解説では説明の都合上 868MHz を例に出しましたが、 868MHz 帯は欧州 (EU) の割り当てで、日本国内での使用は想定されていません。 日本で LoRa を使う場合は、920MHz 帯(920.5〜923.5MHz 付近) の 「特定小電力無線局」の枠組みに準拠する必要があります。

実機で日本国内運用する際は、必ずファームウェアの周波数設定を 920MHz 帯に変更し、購入した LoRa モジュール自体もこの帯域・出力で 技適を取得しているものを使ってください。

6.3 特定小電力無線局のルール

920MHz 帯の LoRa モジュールは多くの場合「特定小電力無線局」に分類されます。 これは免許は不要ですが(技適さえ取っていれば申請なしで使える代わりに)、 運用上いくつかのルールが定められています(サブバンドや用途により細部は異なるので、 実際の製品の技適情報・総務省の告示で最新の数値を必ず確認してください)。

  • 送信出力の上限: サブバンドによって上限が定められています(帯域によって 数十mW〜250mW程度など幅があります)
  • キャリアセンス (Listen Before Talk): 送信前に「今その周波数が 誰にも使われていないか」を一定時間聞いて、空いていることを確認してから 送信を始めるルールです。混信を避けるための仕組みで、対応チップ (SX1262など) はこれをハードウェア的にサポートしています
  • 送信時間制限 (Duty Cycle): 一定時間内に送信できる時間の上限が 決められています。SF を上げるほど1回の送信にかかる時間(オンエア時間)が 伸びるため、高い SF ほどこの制限に引っかかりやすくなる点に注意が必要です

つまり「技適の付いた 920MHz 帯モジュールを、そのモジュールの技適が 前提とする範囲内(出力・変調方式)で使う」限りは、免許不要で自由に LoRa 通信を楽しめます。逆に、出力を勝手に上げたり、技適のない モジュールを使ったり、常時ダラダラ送信し続けたりすると法律違反になり得ます。

6.4 まとめると

✅ 日本国内で安全に LoRa を使うには
   1. 技適マーク付きの機器を使う
   2. 920MHz 帯 (920.5〜923.5MHz付近) で運用する
   3. その機器の技適が前提とする出力・パラメータの範囲内で使う
   4. 用途にもよるが、送信頻度・時間を野放図にしない

❌ 避けるべきこと
   1. 技適の無いモジュールで電波を出す
   2. 868MHz など海外バンドのまま日本国内で送信する
   3. 出力を勝手に引き上げる

不安な場合は、購入した LoRa モジュールの製品ページに書かれている 技適番号・対応周波数・最大出力を確認し、その範囲を超えないようにするのが 一番確実です。


第7章: 実装のまとめ — 今回作ったもの

M5Paper Mono (E-Ink 電子ペーパー端末) で以下を実装しました。

  1. LoRa 受信: SX1262 の割り込み (DIO1) でパケット到着を検知し、 readData() で内容・RSSI・SNR を取得
  2. LoRa 送信: タッチで、いま画面に表示中のメッセージをそのまま送り返す
  3. 省電力: 常時受信ではなく startReceiveDutyCycleAuto() で 間欠受信にし、待機中は ESP32 をライトスリープさせて DIO1 割り込みで 起床する構成

コード全体はこちらで公開しています: https://github.com/GOROman/learning-paper-mono


このガイドは M5Paper Mono の LoRa 実装作業の過程でまとめたものです。 電波法まわりの数値(出力上限・送信時間制限など)は制度変更の可能性があるため、 実際に電波を出す前に必ず最新の総務省告示・購入した機器の技適情報を確認してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment