「センサーデータを数キロ先まで飛ばしたい」「Wi-FiもBluetoothも届かない屋外でIoTをやりたい」——そんな悩みにドンピシャなのが LoRa(ローラ) です。見通し距離で数キロメートル、しかも消費電力は極小。畑・山林・河川・駐車場など、インフラのない屋外IoTにうってつけなんです 📡

ただし、ここでひとつ超重要な落とし穴があります。ネット上のLoRa記事でよく使われている SX1278(RA-02)というモジュールは、日本では基本的に使えません。チップの対応周波数が137〜525MHzで、日本で免許不要に使える920MHz帯の電波を出せないからです。433MHzで動かせば電波法違反になってしまいます 😱

そこでこの記事では、日本国内で工事設計認証(技適)を取得済みの920MHz帯LoRaモジュール「E220-900T22S(JP)」 を使って、Arduino UNO 2台で送信機→受信機の長距離通信を作る方法を、法規制の話から配線・コード・農業IoT応用まで丸ごと解説します!

LoRaとは?Wi-Fi・Bluetoothとどう違う?

LoRa IoT outdoor sensor
LoRa IoT outdoor sensor / Photo by Bmonster Lab via Pexels

まず、ざっくり位置づけを整理しておきましょう。

  • Wi-Fi:〜100m/消費電力:高/速度:速い/用途:動画・大容量データ
  • Bluetooth:〜50m/消費電力:低〜中/速度:中/用途:スマホ連携
  • LoRa:〜数km/消費電力:極低/速度:遅い/用途:屋外センサー・農業IoT

LoRaは通信速度こそ遅い(今回の設定で実効1.7kbps程度)ですが、温湿度・土壌水分・CO2濃度など、数十バイトのセンサーデータを定期送信するだけなら十分すぎるスペックです。

日本で免許不要に使えるLoRaは「920MHz帯」だけ

ここが一番大事なポイントです。日本では電波の周波数ごとに用途が法律で決められていて、LoRaを免許なしで使えるのは920MHz帯(正確には920.6〜928.0MHz) です。この帯域は ARIB STD-T108「920MHz帯テレメータ用、テレコントロール用及びデータ伝送用無線設備」という規格で運用されていて、空中線電力20mW以下の「特定小電力無線局」であれば免許も無線局の登録も不要で使えます。

一方、海外製LoRaモジュールでよく見かける 433MHz帯(430MHz帯)は、日本ではアマチュア無線などに割り当てられた帯域 です。アマチュア無線技士の免許と無線局免許がない状態で電波を出すと電波法違反になります。「海外のチュートリアル通りに作ったら違法だった」というのは、LoRa界隈で本当によくある事故なんです 💦

技適マーク(工事設計認証)は絶対条件

もうひとつ必須なのが 技適(技術基準適合証明/工事設計認証)です。日本国内で電波を出す無線機は、原則としてこの認証を受けたものでなければいけません。認証済みモジュールを使えば、私たち作る側が改めて認証を取る必要はありません。

ただし、認証が有効なのは次の条件を守ったときだけです。ここは必ず押さえてください。

  • ✅ モジュール本体を改造・分解しない(内部ソフトの書き換えや回路の改変はNG)
  • ✅ メーカーが認証時に登録した指定アンテナを使う。認証は「モジュール+アンテナ」の組み合わせで取られているので、勝手に高利得アンテナに替えると認証が無効になります
  • ✅ データシートに書かれた定格電圧・使用方法の範囲内で使う
  • ✅ 技適は日本国内でのみ有効。そのまま海外で電波を出すことはできません

なお、920MHz帯の特定小電力無線局では EIRP(等価等方放射電力)が16dBmを超えてはいけないと定められています。モジュールの送信出力13dBm+アンテナ利得3dBi=16dBm がちょうど上限。だから「アンテナ利得3dBi以下」という制限が出てくるわけですね。

また、920MHz帯では 送信前のキャリアセンス(電波が空いているか確認する動作)が法令で義務づけられています。今回使うモジュールはこの動作が内部で強制的に実行される設計になっているので、私たちがコードで意識する必要はありません(環境ノイズが−80dBmを下回る状態が5ms続いたら送信開始、という動作です)。

必要なもの(部品表)

※価格は2026年9月時点のものです。最新の価格・在庫は各販売ページでご確認ください。

今回は CLEALINK TECHNOLOGY(クレアリンクテクノロジー)製 E220-900T22S(JP) R2 を使います。中国CDEBYTE社のE220シリーズをベースに、日本の電波法に合わせて920MHz帯専用に設計・認証取得された日本版モジュールです(工事設計認証番号:001-P01730、ARIB STD-T108準拠、最大出力13dBm=20mW)。

モジュール単体は基板直付け用のDFNパッケージではんだ付けが必要なので、初心者の方には ピンヘッダとSMAアンテナ端子が最初から付いた評価ボード「E220-900T22S(JP)-EV2」 が断然おすすめです。

  • 🔹 E220-900T22S(JP)-EV2 評価ボード × 2枚(送信機・受信機用)/各1,980円(税込)
    入手先:スイッチサイエンス https://www.switch-science.com/products/10792
    メーカー製品ページ:https://dragon-torch.tech/rf-modules/lora/e220-900t22s-jp-ev2/
  • 🔹 LoRa用アンテナ TX915-JKS-20(SMA-Pオス・利得3dBi)× 2本/各715円(税込)
    入手先:スイッチサイエンス https://www.switch-science.com/products/8676
  • 🔹 Arduino UNO × 2台
  • 🔹 双方向ロジックレベル変換モジュール(3.3V↔5V、4ch以上) × 2個 ← 必須です(理由は後述)
  • 🔹 ブレッドボード × 2、ジャンパワイヤ適量
  • 🔹(応用編)DHT11 温湿度センサー × 1個

💡 メーカー直販では、評価ボード2枚+アンテナがセットになった「評価セット」が5,280円(税込) で用意されています。2台そろえるならこちらの方がお得です(メーカー製品ページ参照)。

⚠️ アンテナは利得3dBi以下の適合品を使ってください。 技適の認証は「モジュール+アンテナ」の組み合わせで取られているため、高利得アンテナに交換すると認証の条件から外れます。評価セットに同梱されるTX915-JKS-20は利得3dBiで条件を満たします。別のアンテナを使う場合は、メーカーに適合可否を確認してから購入するのが確実です。

📌 参考:はんだ付けができる方は、モジュール単体「E220-900T22S(JP) R2」1,540円(税込、https://www.switch-science.com/products/10453)にIPEX-SMA変換ケーブルを組み合わせる構成も可能です。

配線(Arduino UNOとの接続)

⚠️ レベル変換は必須です

E220-900T22S(JP)の信号ピン(RXD・M0・M1・AUX)は3.3V TTLレベルです。データシートには「各ピンの信号レベルは、給電電圧と3.3Vを超えないようにしてください」と明記されています。

Arduino UNOは5Vロジックなので、UNOの出力ピンをモジュールに直結すると5Vがかかってモジュールを壊します。必ず双方向ロジックレベル変換モジュールを挟んでください。

  • レベル変換モジュールの HV → Arduinoの 5Vピン
  • レベル変換モジュールの LV → Arduinoの 3.3Vピン
  • GNDは Arduino・レベル変換・モジュールで全て共通に

なお、3.3VロジックのArduino(MKRシリーズ、Due、Zeroなど)を使う場合はレベル変換不要で直結できます。Arduino UNO R4も5Vロジックなので、R4を使う場合もレベル変換が必要です。

電源について

評価ボード E220-900T22S(JP)-EV2 のVCCは3.1〜5.5Vに対応しているので、Arduino UNOの5Vピンから直接給電できます。送信時の消費電流は43mA程度なので、UNOの5V出力で十分まかなえます。VCCに5Vを入れてもモジュール内部のLDOで3.3Vが作られ、信号ピンは3.3Vのままです。

ピン対応表

評価ボード E220-900T22S(JP)-EV2 のピンヘッダは、端から順に 1:M0 / 2:M1 / 3:RXD / 4:TXD / 5:AUX / 6:VCC / 7:GND の並びです(メーカー公開のピン配置図より)。

  • VCC(6番) → Arduino 5V(直結OK)
  • GND(7番) → Arduino GND
  • RXD(3番) → レベル変換を経由 → Arduino D3(SoftwareSerialのTX)
  • TXD(4番) → レベル変換を経由 → Arduino D2(SoftwareSerialのRX)
  • M0(1番) → レベル変換を経由 → Arduino D8
  • M1(2番) → レベル変換を経由 → Arduino D9
  • AUX(5番) → レベル変換を経由 → Arduino D7(モジュールの動作状態を読む入力)

UARTはクロス接続(Arduinoの送信→モジュールのRXD、モジュールのTXD→Arduinoの受信)です。ここを直結(TX→TXD)にしてしまうミスが一番多いので注意してくださいね 😉

📡 アンテナは必ず取り付けてから電源を入れましょう。 アンテナなしで送信すると電力が反射してモジュールを傷めます。

ライブラリ/設定(ATコマンドではなくレジスタ書き込みです)

E220-900T22S(JP)は専用ライブラリを使わなくても動かせます。ArduinoのUART(今回はSoftwareSerial)でバイト列をやりとりするだけです。

ここで注意したいのが、このモジュールはATコマンド方式ではないということ。設定は「レジスタ書き込みコマンド」というバイト列で行います。

4つの動作モード(M0/M1ピンで切り替え)

  • mode 0(通常送受信):M1=Low, M0=Low /ふだんの送受信はこれ
  • mode 1(WOR送信):M1=Low, M0=High
  • mode 2(WOR受信):M1=High, M0=Low
  • mode 3(Config/DeepSleep):M1=High, M0=High /設定を書き込むときはこれ

⚠️ mode 3(設定モード)のUARTは9600bps・8N1固定です。レジスタでボーレートを変えても、設定モードだけは常に9600bpsになります。今回は通常動作も9600bpsに設定するので、最初から最後まで9600bpsでOKです。

設定コマンドの書式

レジスタの読み書きコマンドは次の形式です。

  • 書き込み:0xC0 + 開始レジスタ番号 + 書き込みバイト数 + 値… → 応答は 0xC1 で始まる同内容
  • 読み出し:0xC1 + 開始レジスタ番号 + 読み出し数 → 応答は 0xC1 + … + レジスタ値

設定値は不揮発メモリに保存されるので、電源を切っても消えません(毎回書き込む必要はありませんが、今回のコードでは確実性のため起動時に毎回書き込みます)。

今回書き込む設定

データシートの推奨例をベースに、次の設定を0x00〜0x07番地へ一括で書き込みます。

  • 自デバイスアドレス:送信機=0x0001/受信機=0x0002
  • UARTボーレート:9600bps
  • 変調:SF9・BW125kHz(到達距離が最も伸びる設定)
  • 最大ペイロード長:200バイト
  • 環境ノイズRSSI取得:有効
  • 送信出力:13dBm(20mW=法定上限)
  • 待ち受けチャンネル:CH0(BW125kHzのときCH0=920.6MHz。200kHz間隔でCH0〜37=928.0MHzまで選べます)
  • 受信データ末尾へのRSSIバイト付加:有効
  • 送信方法:通常(Fixed)送信モード=宛先を指定して送る方式
  • 暗号キー:0

この設定だと、送信するバイト列は 「宛先アドレス上位・宛先アドレス下位・宛先チャンネル・ペイロード…」 という並びになります。受信側には 「ペイロード…・RSSIバイト」 が出てきます(RSSIの dBm換算は「RSSIバイト − 256」)。

コード①:送信側

#include <SoftwareSerial.h>

// ---- ピン設定(配線と一致させること)----
const int PIN_LORA_RX = 2;   // Arduinoの受信 ← モジュールTXD
const int PIN_LORA_TX = 3;   // Arduinoの送信 → モジュールRXD
const int PIN_M0  = 8;
const int PIN_M1  = 9;
const int PIN_AUX = 7;

SoftwareSerial lora(PIN_LORA_RX, PIN_LORA_TX);

// ---- 宛先(受信機)の指定 ----
const uint8_t DEST_ADDH = 0x00;   // 宛先アドレス上位
const uint8_t DEST_ADDL = 0x02;   // 宛先アドレス下位(受信機 = 0x0002)
const uint8_t DEST_CH   = 0x00;   // 宛先の待ち受けCH(CH0 = 920.6MHz / BW125kHz)

// ---- レジスタ0x00〜0x07への一括書き込みコマンド ----
// 0xC0 = 書き込み, 0x00 = 開始番地, 0x08 = 8バイト書き込み
const uint8_t CONFIG_CMD[] = {
  0xC0, 0x00, 0x08,
  0x00, 0x01,   // 0x00,0x01 : 自デバイスアドレス = 0x0001(送信機)
  0x70,         // 0x02 : UART 9600bps / SF9・BW125kHz
  0x21,         // 0x03 : ペイロード200byte / 環境ノイズRSSI有効 / 送信出力13dBm
  0x00,         // 0x04 : 待ち受けチャンネル = CH0
  0xC0,         // 0x05 : RSSIバイト出力あり / 通常(Fixed)送信モード / WORサイクル500ms
  0x00, 0x00    // 0x06,0x07 : 暗号キー = 0x0000
};

// AUXがHigh(アイドル)になるまで待つ
void waitAux() {
  unsigned long start = millis();
  while (digitalRead(PIN_AUX) == LOW && millis() - start < 1000) {
    ; // モジュールの処理待ち
  }
  delay(2);   // AUXがHighになってから2ms待つとモード切替が安全(データシート5.3)
}

// 動作モードを切り替える
void setMode(int m0, int m1) {
  waitAux();
  digitalWrite(PIN_M0, m0);
  digitalWrite(PIN_M1, m1);
  delay(10);
  waitAux();
}

void setup() {
  Serial.begin(9600);
  pinMode(PIN_M0, OUTPUT);
  pinMode(PIN_M1, OUTPUT);
  pinMode(PIN_AUX, INPUT);

  delay(100);          // 電源投入後のセルフチェック待ち(データシート5.2)
  lora.begin(9600);    // 設定モードは9600bps・8N1固定

  // --- 設定モード(mode 3)へ ---
  setMode(HIGH, HIGH);
  lora.write(CONFIG_CMD, sizeof(CONFIG_CMD));
  delay(200);

  // 応答(0xC1 で始まるバイト列)を表示して設定内容を確認
  Serial.print("設定応答: ");
  while (lora.available()) {
    uint8_t b = lora.read();
    if (b < 0x10) Serial.print("0");
    Serial.print(b, HEX);
    Serial.print(" ");
  }
  Serial.println();

  // --- 通常送受信モード(mode 0)へ ---
  setMode(LOW, LOW);
  Serial.println("LoRa送信機 起動完了!");
}

void loop() {
  String payload = "T:25.3,H:62.1";   // 送りたいデータ(まずは固定文字列でテスト)

  waitAux();
  // 通常(Fixed)送信モードなので、先頭に「宛先アドレス2byte + 宛先CH 1byte」を付ける
  lora.write(DEST_ADDH);
  lora.write(DEST_ADDL);
  lora.write(DEST_CH);
  lora.print(payload);

  Serial.print("送信: ");
  Serial.println(payload);

  delay(10000);   // 10秒ごとに送信
}

ポイントはこの3つです。

  • M0/M1でモードを切り替える:設定を書くときはHigh/High、送受信するときはLow/Low
  • 宛先3バイトを先頭に付ける:通常(Fixed)送信モードでは必須。これを忘れると、ペイロードの先頭3バイトが宛先として解釈されてしまい、意図した相手に届きません
  • AUXピンで待つ:モジュールが処理中(AUX=Low)のあいだにモードを切り替えても反映されません

コード②:受信側

#include <SoftwareSerial.h>

const int PIN_LORA_RX = 2;
const int PIN_LORA_TX = 3;
const int PIN_M0  = 8;
const int PIN_M1  = 9;
const int PIN_AUX = 7;

SoftwareSerial lora(PIN_LORA_RX, PIN_LORA_TX);

// 受信機の設定:自デバイスアドレス = 0x0002、待ち受けCH0
// ※ 0x02レジスタ(SF/BW)とチャンネルは送信側と必ず同じにすること
const uint8_t CONFIG_CMD[] = {
  0xC0, 0x00, 0x08,
  0x00, 0x02,   // 自デバイスアドレス = 0x0002(受信機)
  0x70,         // UART 9600bps / SF9・BW125kHz
  0x21,         // ペイロード200byte / 環境ノイズRSSI有効 / 13dBm
  0x00,         // 待ち受けチャンネル = CH0
  0xC0,         // RSSIバイト出力あり / 通常(Fixed)送信モード / WOR 500ms
  0x00, 0x00    // 暗号キー = 0x0000
};

uint8_t buf[64];
uint8_t idx = 0;
unsigned long lastByteAt = 0;

void waitAux() {
  unsigned long start = millis();
  while (digitalRead(PIN_AUX) == LOW && millis() - start < 1000) {
    ;
  }
  delay(2);
}

void setMode(int m0, int m1) {
  waitAux();
  digitalWrite(PIN_M0, m0);
  digitalWrite(PIN_M1, m1);
  delay(10);
  waitAux();
}

void setup() {
  Serial.begin(9600);
  pinMode(PIN_M0, OUTPUT);
  pinMode(PIN_M1, OUTPUT);
  pinMode(PIN_AUX, INPUT);

  delay(100);
  lora.begin(9600);

  setMode(HIGH, HIGH);                        // 設定モード
  lora.write(CONFIG_CMD, sizeof(CONFIG_CMD));
  delay(200);
  while (lora.available()) lora.read();       // 応答を読み捨て

  setMode(LOW, LOW);                          // 通常送受信モード
  Serial.println("LoRa受信機 待機中...");
}

void loop() {
  // 届いたバイトをバッファにためる
  while (lora.available()) {
    if (idx < sizeof(buf) - 1) {
      buf[idx++] = lora.read();
    } else {
      lora.read();   // あふれ分は捨てる
    }
    lastByteAt = millis();
  }

  // 20ms以上バイトが来なければ1パケット受信完了とみなす
  if (idx > 0 && millis() - lastByteAt > 20) {
    // 設定でRSSIバイト出力を有効にしているので、最後の1バイトはRSSI
    int rssi = (int)buf[idx - 1] - 256;   // dBm = RSSIバイト - 256
    buf[idx - 1] = '\0';                  // RSSIバイトを切り落として文字列化

    Serial.print("受信データ: ");
    Serial.println((char*)buf);
    Serial.print("RSSI(信号強度): ");
    Serial.print(rssi);
    Serial.println(" dBm");

    idx = 0;
  }
}

受信側のポイントはこちらです。

  • 末尾の1バイトはRSSI:設定で「RSSIバイト出力あり」にしているので、ペイロードの後ろにRSSIが1バイト付いてきます。これを切り落とさないと文字列が壊れて見えます
  • RSSIのdBm換算は「バイト値 − 256」:たとえば 0xA0(160)なら 160 − 256 = −96dBm
  • パケットの切れ目は「一定時間バイトが来ないこと」で判定:今回は20ms無音で1パケットとしています

動作確認の手順

  1. それぞれのモジュールにアンテナを取り付ける(アンテナなしで電源を入れない)
  2. 配線を再確認する。特に レベル変換を通しているか、TX/RXがクロスになっているか
  3. 送信側・受信側それぞれのスケッチを書き込む
  4. 2台のArduinoをPCに接続し、Arduino IDEのシリアルモニタを2つ開く(ボーレートは9600)
  5. 送信側のシリアルモニタで、起動時に「設定応答: C1 00 08 00 01 70 21 00 C0 00 00」のような、0xC1で始まり書き込んだ値がそのまま返ってくる応答を確認する(ここが返ってこなければ配線かモード切替の問題です)
  6. 受信側のシリアルモニタに10秒ごとにデータが出ることを確認する

うまくいくと、受信側にはこんな出力が出ます。

LoRa受信機 待機中...
受信データ: T:25.3,H:62.1
RSSI(信号強度): -42 dBm
受信データ: T:25.3,H:62.1
RSSI(信号強度): -43 dBm

まずは机の上で2台を並べて通信できることを確認してから、少しずつ距離を離していくのがおすすめです。RSSIが−120dBm台に近づいてくると受信限界が近いサインです(このモジュールのSF9・BW125kHz時の受信感度は約−129.5dBm)。

農業IoTへの応用例:畑の温湿度を遠隔モニタリング

LoRaの真価が発揮されるのが、屋外・遠距離のシナリオです。農業IoTでの構成イメージはこんな感じ。

  • 🌱 センサーノード(畑側):Arduino + E220-900T22S(JP) + DHT11(温湿度)+ 土壌水分センサー + 太陽光パネル
  • 📡 ゲートウェイ(農小屋・母屋側):Arduino + E220-900T22S(JP) + Ethernet/Wi-Fiシールド(クラウドへ転送)
  • ☁️ クラウド・スマホ:データを蓄積・グラフ表示・アラート通知

送信側のコードを少しだけ変えて、DHT11の実測値を載せてみましょう。

#include <SoftwareSerial.h>
#include <DHT.h>   // DHT sensor library(Arduino IDEのライブラリマネージャからインストール)

const int PIN_LORA_RX = 2;
const int PIN_LORA_TX = 3;
const int PIN_M0  = 8;
const int PIN_M1  = 9;
const int PIN_AUX = 7;
#define DHTPIN  5
#define DHTTYPE DHT11

SoftwareSerial lora(PIN_LORA_RX, PIN_LORA_TX);
DHT dht(DHTPIN, DHTTYPE);

const uint8_t DEST_ADDH = 0x00;
const uint8_t DEST_ADDL = 0x02;
const uint8_t DEST_CH   = 0x00;

const uint8_t CONFIG_CMD[] = {
  0xC0, 0x00, 0x08,
  0x00, 0x01,   // 自デバイスアドレス = 0x0001
  0x70, 0x21, 0x00, 0xC0, 0x00, 0x00
};

void waitAux() {
  unsigned long start = millis();
  while (digitalRead(PIN_AUX) == LOW && millis() - start < 1000) { ; }
  delay(2);
}

void setMode(int m0, int m1) {
  waitAux();
  digitalWrite(PIN_M0, m0);
  digitalWrite(PIN_M1, m1);
  delay(10);
  waitAux();
}

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(PIN_M0, OUTPUT);
  pinMode(PIN_M1, OUTPUT);
  pinMode(PIN_AUX, INPUT);

  delay(100);
  lora.begin(9600);

  setMode(HIGH, HIGH);
  lora.write(CONFIG_CMD, sizeof(CONFIG_CMD));
  delay(200);
  while (lora.available()) lora.read();

  setMode(LOW, LOW);
  Serial.println("農業IoTセンサーノード 起動");
}

void loop() {
  float temp = dht.readTemperature();   // 気温(℃)
  float humi = dht.readHumidity();      // 湿度(%)

  if (isnan(temp) || isnan(humi)) {
    Serial.println("DHT11読み取りエラー");
    delay(3000);
    return;
  }

  String payload = "T:" + String(temp, 1) + ",H:" + String(humi, 1);

  waitAux();
  lora.write(DEST_ADDH);
  lora.write(DEST_ADDL);
  lora.write(DEST_CH);
  lora.print(payload);

  Serial.print("送信: ");
  Serial.println(payload);

  delay(60000);   // 1分ごとに送信(電池節約)
}

このコードのポイントは送信間隔を長めに取ること。電池駆動のセンサーノードでは、送信間隔を1分〜5分に伸ばすと大幅な省電力化が見込めます。E220-900T22S(JP)はDeepSleep時の消費電流が約2.5μAと極小なので、Arduino側のスリープと組み合わせれば乾電池数本で数ヶ月の運用も現実的です。

さらに省電力を突き詰めるなら、WOR(Wake on Radio)モードという機能もあります。受信側がふだんは眠っていて、電波が来たときだけ起きる仕組みで、受信待機時の消費電流を60〜330μA程度に抑えられます。慣れてきたら挑戦してみてください。

LoRa通信のトラブルシューティング

  • ✅ レベル変換を入れているか? 5V直結はモジュール故障の原因No.1です
  • ✅ UARTはクロス接続になっているか?(Arduino送信→モジュールRXD、モジュールTXD→Arduino受信)
  • ✅ 設定応答(0xC1…)が返ってくるか? 返ってこないなら、M0/M1が両方Highになっていない/UART配線ミス/ボーレートが9600でない、のいずれかがほぼ確実です
  • ✅ 送信側と受信側で変調設定(0x02レジスタのSF・BW)が一致しているか? ここが違うと絶対に届きません
  • ✅ 宛先アドレス・宛先チャンネルは受信機の設定と一致しているか?(受信機の自デバイスアドレスと待ち受けCHに合わせる)
  • ✅ ペイロードの先頭に宛先3バイトを付けているか? 通常(Fixed)送信モードでは必須です
  • ✅ 受信文字列の末尾が化けていないか? RSSIバイトを切り落とし忘れている可能性大です
  • ✅ アンテナは付いているか? また、金属に密着させたり地面すれすれに置いたりしていないか(見通しとアンテナ高が距離を大きく左右します)
  • ✅ 連続送信しすぎていないか? 920MHz帯は電波法で送信休止時間が定められており、モジュールが自動で送信を待機させます。短い間隔で送り続けると詰まることがあります

まとめ

今回は、日本で合法に使える920MHz帯・技適取得済みのLoRaモジュール E220-900T22S(JP) を使って、Arduinoで長距離無線通信を作る方法を解説しました。

  • 日本でLoRaを免許不要に使えるのは920MHz帯だけ。433MHz帯のモジュール(SX1278/RA-02など)はそのままでは使えません
  • 必ず技適(工事設計認証)取得済みモジュール+登録済み指定アンテナの組み合わせで使うこと
  • E220-900T22S(JP)はUARTでバイト列をやりとりするだけ。専用ライブラリなしでも動かせます
  • 設定はATコマンドではなくレジスタ書き込み(0xC0コマンド)。M0/M1で設定モードに入ってから書き込みます
  • Arduino UNOは5Vロジックなのでレベル変換が必須

電波は目に見えないぶん、ルールを知らないまま触ると気づかず法律違反になってしまいます。逆に言えば、正しいモジュールを選びさえすれば、免許も資格もなしに数キロ先までデータを飛ばせるのがLoRaの面白いところです。ぜひ安全に、合法に、楽しんでみてくださいね 🎉

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。