M5Paper Mono (SX1262 搭載) を使って LoRa 通信を実装したときに整理した知識をまとめます。 「LoRa って何?」「SF とか BW って何を決めてるの?」「日本で電波を出していいの?」 というあたりを、初心者向けに章立てで解説します。
LoRa (Long Range) は、Semtech 社が開発した無線通信の変調方式です。 Wi-Fi や Bluetooth と同じ「無線で電波に情報を乗せる技術」の一種ですが、 狙っているところが全然違います。
| Wi-Fi | Bluetooth | LoRa | |
|---|---|---|---|
| 得意なこと | 大容量データ | 近距離の周辺機器接続 | 長距離・低消費電力 |
| 通信距離 | 〜100m | 〜10m | 数km〜数十km |
| 通信速度 | 数百Mbps | 数Mbps | 数百bps〜数十kbps |
| 消費電力 | 大きい | 中くらい | とても小さい |
つまり LoRa は「速度を犠牲にして、距離と省電力を極端に追求した」通信方式です。 数バイト〜数百バイトのセンサーデータや短いメッセージを、電池で何年も動かしながら 数km先まで飛ばす、といった用途に向いています。動画は送れません。
なぜ遠くまで届くのか? 種明かしは変調方式にあります(第3章で説明します)。 電波の周波数が低い(920MHz帯や868MHz帯)ため障害物を回り込みやすく、 さらに「チャープスペクトラム拡散」という技術でノイズに埋もれた微弱な信号でも 復調できるようになっています。
**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電圧LoRa は CSS (Chirp Spread Spectrum / チャープスペクトラム拡散) という変調方式を使います。
「チャープ」とは、周波数が時間とともにスーッと変化する信号のこと(鳥の鳴き声の サイレンのような音をイメージしてください)。1つの音(周波数)ではなく 「上昇していく音の形そのもの」を情報として使うので、多少ノイズが乗っても 波形のパターンごと拾えば復調できます。これがノイズに強い理由です。
通信を設定するときに必ず出てくる3つのパラメータがあります。
1つのシンボル(電波の単位)に何ビットの情報を乗せるかを決めます。 SF7〜SF12 の範囲で設定でき、数字が大きいほど:
- ✅ 電波が遠くまで届く(受信感度が上がる)
- ❌ 通信速度が遅くなる
- ❌ 電波を出している時間が長くなる(法律の制限に関わる、後述)
電波としてどれだけの周波数の幅を使うかです。単位は kHz。 7.8kHz〜500kHz くらいの範囲で選べます。
- 帯域幅が 広い(500kHz) → 速い・届く距離は短め
- 帯域幅が 狭い(125kHz など) → 遅い・より遠くまで届く
送るデータに冗長な誤り訂正符号をどれだけ足すかです。
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つでもズレていると「電波は届いているのにデータとして復調できない」状態になります。
Wi-Fi の SSID のようなもので、「同じネットワークの仲間か」を電波レベルで
判別するための合言葉です。0x34 はプライベート用途の慣習的な値、
0x12 は公衆網 (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() で中身を取り出せます。手軽な反面、
暗号化や再送制御・アドレッシングは自分で実装しない限りありません。
実装したコードでは受信のたびに RSSI と SNR という2つの数値をログに出しています。
[LoRa] rx #1: "hey" RSSI -51.0 SNR 12.2
受信した電波の強さです。単位は dBm(マイナスが大きいほど弱い)。 目安として:
| RSSI | 目安 |
|---|---|
| -30〜-60dBm | かなり近い・強い |
| -70〜-100dBm | 実用範囲 |
| -110〜-130dBm | ギリギリ復調できるかどうか |
信号がノイズに対してどれだけ強いかの比率(dB)。LoRa は仕組み上、 SNR がマイナス(ノイズより弱い信号)でも復調できるという変わった特性があります。 これが「電波が弱くても届く」LoRa の強みの正体です。SF を上げるほど、 このマイナス方向への耐性が強くなります(SF12 なら -20dB近くまで耐えられます)。
この2つの数値がわかると「電波環境として余裕があるか」「もっと SF を下げて 高速化できないか」の判断材料になります。
ここが初心者が一番つまずくポイントです。LoRa は「電波を出す」機器なので、 日本国内では電波法の規制対象です。好きな周波数・出力で送信していいわけでは ありません。
日本国内で無線機を使うには、原則として 総務省の技術基準に適合した機器 (=「技適マーク」がついた機器)である必要があります。 M5Stack のような国内代理店経由の製品は基本的に技適を取得済みですが、 個人輸入や海外版のモジュールをそのまま使う場合は技適が無いことがあり、 その場合は日本国内で電波を出すこと自体が違法になります。
購入した機器に技適マークの表示(本体の刻印や設定画面での表示)があるか、 必ず確認してください。
このプロジェクトの解説では説明の都合上 868MHz を例に出しましたが、 868MHz 帯は欧州 (EU) の割り当てで、日本国内での使用は想定されていません。 日本で LoRa を使う場合は、920MHz 帯(920.5〜923.5MHz 付近) の 「特定小電力無線局」の枠組みに準拠する必要があります。
実機で日本国内運用する際は、必ずファームウェアの周波数設定を 920MHz 帯に変更し、購入した LoRa モジュール自体もこの帯域・出力で 技適を取得しているものを使ってください。
920MHz 帯の LoRa モジュールは多くの場合「特定小電力無線局」に分類されます。 これは免許は不要ですが(技適さえ取っていれば申請なしで使える代わりに)、 運用上いくつかのルールが定められています(サブバンドや用途により細部は異なるので、 実際の製品の技適情報・総務省の告示で最新の数値を必ず確認してください)。
- 送信出力の上限: サブバンドによって上限が定められています(帯域によって 数十mW〜250mW程度など幅があります)
- キャリアセンス (Listen Before Talk): 送信前に「今その周波数が 誰にも使われていないか」を一定時間聞いて、空いていることを確認してから 送信を始めるルールです。混信を避けるための仕組みで、対応チップ (SX1262など) はこれをハードウェア的にサポートしています
- 送信時間制限 (Duty Cycle): 一定時間内に送信できる時間の上限が 決められています。SF を上げるほど1回の送信にかかる時間(オンエア時間)が 伸びるため、高い SF ほどこの制限に引っかかりやすくなる点に注意が必要です
つまり「技適の付いた 920MHz 帯モジュールを、そのモジュールの技適が 前提とする範囲内(出力・変調方式)で使う」限りは、免許不要で自由に LoRa 通信を楽しめます。逆に、出力を勝手に上げたり、技適のない モジュールを使ったり、常時ダラダラ送信し続けたりすると法律違反になり得ます。
✅ 日本国内で安全に LoRa を使うには
1. 技適マーク付きの機器を使う
2. 920MHz 帯 (920.5〜923.5MHz付近) で運用する
3. その機器の技適が前提とする出力・パラメータの範囲内で使う
4. 用途にもよるが、送信頻度・時間を野放図にしない
❌ 避けるべきこと
1. 技適の無いモジュールで電波を出す
2. 868MHz など海外バンドのまま日本国内で送信する
3. 出力を勝手に引き上げる
不安な場合は、購入した LoRa モジュールの製品ページに書かれている 技適番号・対応周波数・最大出力を確認し、その範囲を超えないようにするのが 一番確実です。
M5Paper Mono (E-Ink 電子ペーパー端末) で以下を実装しました。
- LoRa 受信: SX1262 の割り込み (DIO1) でパケット到着を検知し、
readData()で内容・RSSI・SNR を取得 - LoRa 送信: タッチで、いま画面に表示中のメッセージをそのまま送り返す
- 省電力: 常時受信ではなく
startReceiveDutyCycleAuto()で 間欠受信にし、待機中は ESP32 をライトスリープさせて DIO1 割り込みで 起床する構成
コード全体はこちらで公開しています: https://github.com/GOROman/learning-paper-mono
このガイドは M5Paper Mono の LoRa 実装作業の過程でまとめたものです。 電波法まわりの数値(出力上限・送信時間制限など)は制度変更の可能性があるため、 実際に電波を出す前に必ず最新の総務省告示・購入した機器の技適情報を確認してください。