省電力で広範囲をカバーするLoRaWANの基本から実践的なネットワーク構築、活用事例までを解説します。
LoRaWANとは? 🤔
LoRaWAN (Long Range Wide Area Network) は、少ない電力で遠くまでデータを飛ばせる無線通信技術(LPWA: Low Power Wide Area)の一つです。特にIoT(モノのインターネット)デバイスでの利用に適しており、センサーデータを集めたり、簡単な制御信号を送ったりするのに使われます。
LoRaWANは、Semtech社などが中心となって設立された非営利団体「LoRa Alliance」によって仕様が策定されており、オープンな規格として世界中で導入が進んでいます。日本国内では、免許不要の920MHz帯(ISMバンド)を利用できるため、比較的容易に独自のネットワークを構築することも可能です。
LoRaとLoRaWANの違い
よく混同されがちですが、「LoRa」と「LoRaWAN」は異なります。
- LoRa: Semtech社が開発した無線変調技術そのもの(物理層)を指します。長距離・低消費電力を実現するコア技術です。
- LoRaWAN: LoRa変調技術を利用した通信プロトコル(ネットワーク規格)です。デバイスの認証、データ暗号化、ネットワーク管理など、通信システム全体を定義します。
つまり、LoRaという技術を使って、LoRaWANというルールで通信を行うイメージです。
LoRaWANネットワークの仕組み 🏗️
LoRaWANネットワークは、主に以下の要素で構成されます。
- エンドデバイス (End Device): センサーやアクチュエーターなど、実際にデータを収集したり、制御を行ったりするモノ。LoRa無線モジュールを搭載しています。
- ゲートウェイ (Gateway): エンドデバイスからのLoRa無線信号を受信し、インターネットなどのIPネットワークに中継する基地局のような役割。複数のデバイスのデータを受け付けます。
- ネットワークサーバー (Network Server): ゲートウェイから送られてきたデータの管理、デバイス認証、重複データの削除、データレートの最適化(ADR)、アプリケーションサーバーへのデータ転送などを行います。ネットワークの中核部分です。
- アプリケーションサーバー (Application Server): ネットワークサーバーから転送されたデータを処理し、可視化したり、他のシステムと連携させたりするサーバー。ユーザーが実際に利用するアプリケーション部分です。
エンドデバイス ↔ (LoRa無線) ↔ ゲートウェイ ↔ (IPネットワーク) ↔ ネットワークサーバー ↔ (IPネットワーク) ↔ アプリケーションサーバー という流れでデータがやり取りされます。
デバイスクラス
LoRaWANデバイスには、通信のタイミングや消費電力に応じて3つのクラスがあります。
クラス | 特徴 | 主な用途 | 消費電力 |
---|---|---|---|
Class A | 最も省電力。デバイスからの送信(アップリンク)後にのみ、短い受信ウィンドウ(ダウンリンク)が開く。 | 定期的なセンサーデータ送信など、低頻度通信 | 最小 |
Class B | Class Aに加え、定期的に同期された受信ウィンドウが開く。遅延が多少許容されるダウンリンクが可能。 | 定期的な制御信号の受信など | 中 |
Class C | 常に受信ウィンドウが開いている(送信中を除く)。低遅延でのダウンリンクが可能。 | 常時電源供給が可能なデバイスでのリアルタイム制御など | 最大 |
多くのバッテリー駆動デバイスでは、省電力性に優れたClass Aが利用されます。
アクティベーション(デバイス登録)
デバイスをLoRaWANネットワークに参加させるためには、「アクティベーション」と呼ばれるプロセスが必要です。これには主に2つの方式があります。
- OTAA (Over-The-Air Activation): デバイスがネットワークに参加する際に、動的にセッションキー(通信を暗号化するための鍵)を生成・交換する方式。セキュリティが高く、推奨される方式です。事前にデバイスに `DevEUI`, `AppEUI (JoinEUI)`, `AppKey` を設定しておく必要があります。
- ABP (Activation By Personalization): 事前にデバイスに固定のセッションキー (`AppSKey`, `NwkSKey`) とデバイスアドレス (`DevAddr`) を設定しておく方式。Join手順が不要なため初回通信は速いですが、キー管理が煩雑になりがちです。
実践!LoRaWANネットワーク構築 🛠️
LoRaWANを実際に利用するには、いくつかの方法があります。
1. 公共LoRaWANサービスの利用
通信事業者が提供するLoRaWANネットワークサービスを利用する方法です。広域なエリアカバーが期待でき、自前でゲートウェイを多数設置する必要がない場合に適しています。国内でも複数の事業者がサービスを提供しています。
また、「The Things Network (TTN)」のようなコミュニティベースのグローバルなLoRaWANネットワークを利用することも可能です。TTNは無料で利用できる範囲もありますが、商用利用や信頼性が求められる場合は、有料プランやプライベートネットワークの構築を検討する必要があります。
2. プライベートLoRaWANネットワークの構築
自社でゲートウェイ、ネットワークサーバー、アプリケーションサーバーを用意して、独自のLoRaWANネットワークを構築する方法です。通信内容を完全にコントロールしたい場合や、特定のエリアを集中的にカバーしたい場合に有効です。
構築ステップの概要:
-
ハードウェアの選定:
- エンドデバイス: 測定したいデータに応じたセンサー(温度、湿度、GPS、開閉、水位など)とLoRaWANモジュールが搭載されたデバイスを選びます。ArduinoやRaspberry Pi、ESP32などにLoRaモジュールを接続して自作することも可能です。バッテリー寿命や筐体の防水性なども考慮しましょう。
- ゲートウェイ: カバーしたいエリアの広さや設置環境(屋内/屋外)、必要な同時接続デバイス数などを考慮して選びます。日本国内で利用する場合は、技術基準適合証明(技適)を取得済みで、日本の周波数プラン(AS923-1など)に対応しているものを選びます。電源(PoE、ACアダプタ、ソーラーなど)やバックホール回線(有線LAN、Wi-Fi、セルラー)の接続方法も確認が必要です。
-
ネットワークサーバーの選択・構築:
- クラウドサービス利用: AWS IoT Core for LoRaWAN、The Things Stack (Cloud)、 Loriot などのクラウドベースのネットワークサーバーを利用する方法。サーバー管理の手間が省けます。
- オンプレミス/自前クラウド構築: ChirpStack などのオープンソースのネットワークサーバーソフトウェアを自社のサーバーやクラウド環境にインストールして利用する方法。より柔軟なカスタマイズが可能ですが、構築・運用の知識が必要です。
-
ゲートウェイのセットアップとネットワークサーバーへの登録:
- ゲートウェイを設置し、電源とインターネット回線(バックホール)を接続します。
- ゲートウェイの管理画面にアクセスし、ネットワークサーバーのアドレスなどを設定します。多くの場合、Webブラウザ経由で設定できます。
- ネットワークサーバー側で、ゲートウェイのEUI(固有ID)などを登録し、ゲートウェイを認証します。
-
エンドデバイスの準備とネットワークサーバーへの登録:
- OTAA方式の場合、デバイスに `DevEUI`, `AppEUI (JoinEUI)`, `AppKey` を設定します。ABP方式の場合は `DevAddr`, `AppSKey`, `NwkSKey` を設定します。
- ネットワークサーバー側で、デバイスの情報を登録します(Device Profile、Application、Deviceの作成など)。
-
アプリケーションサーバーの構築・連携:
- ネットワークサーバーから送られてくるデータを処理し、データベースに保存したり、ダッシュボードで可視化したりするアプリケーションを開発します。
- SORACOM Beam/Funnel/Harvest、AWS IoT Core、Azure IoT Hub、Google Cloud IoT Platformなどのクラウドサービスや、Node-RED、Grafanaなどのツールを活用することも有効です。
-
通信テストと調整:
- デバイスからデータを送信し、ゲートウェイ、ネットワークサーバー、アプリケーションサーバーまで正常にデータが届くか確認します。
- 電波強度やデータレート(Spreading Factor)、送信間隔などを調整し、安定した通信と省電力性を両立させます。Adaptive Data Rate (ADR) の活用も検討しましょう。
簡単なコード例(Arduino + LoRaWANライブラリ MCCI LoRaWAN LMIC library を想定)
これは概念的な例であり、実際のコードは使用するハードウェアやライブラリによって異なります。
// ライブラリのインクルード
#include <lmic.h>
#include <hal/hal.h>
#include <SPI.h>
// OTAA認証のためのキー設定 (The Things Networkなどから取得)
// これらの値はリトルエンディアン形式で記述する必要がある場合が多い
static const u1_t PROGMEM APPEUI[8]= { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8);}
static const u1_t PROGMEM DEVEUI[8]= { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX }; // デバイス固有のEUI
void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8);}
static const u1_t PROGMEM APPKEY[16] = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX }; // アプリケーションキー
void os_getDevKey (u1_t* buf) { memcpy_P(buf, APPKEY, 16);}
static osjob_t sendjob;
const unsigned TX_INTERVAL = 60; // 送信間隔(秒)
// LMICのピン設定(使用するボードに合わせて変更)
const lmic_pinmap lmic_pins = {
.nss = 10,
.rxtx = LMIC_UNUSED_PIN,
.rst = 9,
.dio = {2, 6, 7}, // {DIO0, DIO1, DIO2}
};
void onEvent (ev_t ev) {
Serial.print(os_getTime());
Serial.print(": ");
switch(ev) {
case EV_SCAN_TIMEOUT:
Serial.println(F("EV_SCAN_TIMEOUT"));
break;
// ... (中略) ...
case EV_JOINING:
Serial.println(F("EV_JOINING"));
break;
case EV_JOINED:
Serial.println(F("EV_JOINED"));
// Disable link check validation (automatically enabled
// during join, but not supported by TTN at this time).
LMIC_setLinkCheckMode(0);
// 次の送信をスケジュール
os_setCallback(&sendjob, do_send);
break;
case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen) {
Serial.print(F("Received "));
Serial.print(LMIC.dataLen);
Serial.println(F(" bytes of payload"));
}
// 次の送信をスケジュール
os_setTimedCallback(&sendjob, os_getTime()+sec2osticks(TX_INTERVAL), do_send);
break;
// ... (他のイベント処理) ...
default:
Serial.print(F("Unknown event: "));
Serial.println((unsigned) ev);
break;
}
}
void do_send(osjob_t* j){
// Check if there is not a current TX/RX job running
if (LMIC.opmode & OP_TXRXPEND) {
Serial.println(F("OP_TXRXPEND, not sending"));
} else {
// 送信するデータ(例: "Hello")
static uint8_t mydata[] = "Hello";
// Prepare upstream data transmission at the next possible time.
LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0); // ポート1に送信, 確認応答なし(0)
Serial.println(F("Packet queued"));
}
// Next TX is scheduled after TX_COMPLETE event.
}
void setup() {
Serial.begin(115200);
while (!Serial); // Wait for serial port to connect. Needed for native USB port only
Serial.println(F("Starting"));
// LMIC init
os_init();
// Reset the MAC state. Session and pending data transfers will be discarded.
LMIC_reset();
// TTN uses SF9 for its RX2 window.
LMIC.dn2Dr = DR_SF9;
// Set data rate and transmit power for TX (constrained by MAX_EIRP,
// see lmic.c)
LMIC_setDrTxpow(DR_SF7,14);
// Start job (sending automatically starts OTAA too)
do_send(&sendjob);
}
void loop() {
os_runloop_once();
}
※上記コードは動作を保証するものではありません。実際の開発では、使用するハードウェア、ライブラリのバージョン、接続するネットワークサーバーの仕様に合わせて適切に修正・検証してください。
LoRaWANの活用事例 💡
LoRaWANはその特徴から、様々な分野で活用されています。
- スマートシティ:
- 駐車場の空き状況監視 (2022年以降 各地で導入事例あり)
- ゴミ箱の満杯検知と収集ルート最適化
- 街灯の遠隔制御・監視
- 環境モニタリング(大気質、騒音)
- スマート農業:
- 圃場の土壌水分・温度・照度モニタリング
- ビニールハウスの環境制御
- 家畜の個体管理・行動追跡 (放牧牛の追跡事例など)
- 養殖場の水質管理 (pH、溶存酸素、水温監視など)
- 防災・インフラ監視:
- 河川や用水路の水位監視 (2018年頃から八王子市などで実証実験)
- 土砂崩れ検知(傾斜センサー付きの杭など)(2018年頃 M2Bコミュニケーションズの事例)
- 橋梁やトンネルなどの構造物ヘルスモニタリング
- 水道・ガスメーターの自動検針 (2023年 台湾でのガス漏れ検知導入事例、NTT西日本によるスマートガスメーター展開事例)
- 線路周辺設備の監視(信号機、架線温度、落石検知など)(2023年 日本での大規模展開事例)
- スマートビルディング・工場:
- ビル内の温度・湿度・CO2濃度監視 (2023年 Aeon Delightの事例)
- 設備の稼働状況監視・予知保全
- エネルギー使用量の監視・最適化
- 作業員の安全管理(転倒検知、ヒートストローク予防など)(2023年 日本での建設作業員向け事例)
- 物流・資産追跡:
- 輸送中の貨物の位置情報・温湿度管理(コールドチェーン)
- パレットやコンテナなどの資産追跡
特に日本では、2018年頃から防災分野でのニーズが高く、河川水位監視や土砂崩れ検知などで実証実験や導入が進んでいます。また、近年ではスマートメーターやスマート農業、工場での活用も増えています。
2017年には長野県大町市の山中で、LoRaWAN中継器を複数利用して通信距離を延伸する実験も行われました。これは携帯電話が圏外となるような場所でもIoTを活用できる可能性を示しています。
まとめ 🚀
LoRaWANは、低消費電力・長距離通信という特徴を活かし、様々なIoTアプリケーションを実現する強力な技術です。公共サービスを利用する方法と、自前でネットワークを構築する方法があり、目的に応じて選択できます。
ネットワーク構築には、デバイス、ゲートウェイ、サーバーの選定と設定、そして電波法などの規制遵守が必要です。しかし、そのハードルを越えれば、これまで難しかった場所やモノからのデータ収集が可能になり、新たな価値創造につながるでしょう。
ぜひ、LoRaWANを活用して、あなたのIoTプロジェクトを始めてみませんか? 😊
コメント