プロジェクト

LoRaWANのリンクバジェットとカバレッジマップの計算ツール

Semtech、LoRa Alliance、ITU-R、3GPPの資料をもとに、EU868のLoRaWANアップリンクについて拡散率ごとの受信感度・送信時間・デューティサイクル制限・到達距離を計算し、NumPyで1台のゲートウェイ周辺のカバレッジを地図化します。

中級更新 2026年11月15日
実行環境ノートPCのCPU(macOS、Linux、Windows)、PythonとNumPy、5秒未満
所要時間約3時間
使用ライブラリpython, numpy

作るもの

本プロジェクトでは、LoRaWANの展開計画に使う計算ツールを、NumPyのファイル1つで作ります。拡散率(SF)ごとに、受信感度、12バイトのアップリンクの送信時間、1%のデューティサイクルで許される1時間あたりのアップリンク数、最大経路損失、2種類の伝搬モデルでの到達距離を求めます。続いて、1台のゲートウェイを中心に10 km × 10 kmのグリッドを敷き、ランダムなシャドウイングを含む経路損失モデルを適用して、各地点で必要なSFを報告します。

すべての入力値について、出典または前提を以下に示します。筆者らの実行では、12バイトのアップリンクの送信時間はSF7で61.7 ms、SF12で1482.8 msでした。1%のデューティサイクルでは、それぞれ1時間あたり583回と24回のアップリンクが許されます。都市部の経路損失モデルでは、到達距離の中央値はSF7の1.96 kmからSF12の4.22 kmまでです。ゲートウェイを中心とする半径5 kmの円の69.2%が、いずれかのSFでカバーされます。

計算の考え方は、デシベルとリンクバジェットと雑音・SNR・通信路容量のレッスンで説明しています。式はデシベルとリンクバジェットの早見表と伝搬の公式にまとめてあります。

必要なもの

  • Python 3.10以降とNumPy。筆者らはPython 3.12とNumPy 2.5.4で実行しました。標準ライブラリのmathとstatisticsも使います。
  • 無線機も地図も不要です。地形と建物は、地理情報ではなく統計モデルで表します。
  • 所要時間は約3時間。

出典と前提

入力 値 出典または理由
地域 EU863-870、アップリンクは868.1 MHz LoRa Alliance RP002-1.0.4(Regional Parameters、2022年)のデフォルトチャネル
データレート DR0〜DR5 = 125 kHzでのSF12〜SF7 RP002-1.0.4、EU863-870のデータレート表
端末の等価等方輻射電力(EIRP) +16 dBm RP002-1.0.4のEU863-870におけるデフォルト最大EIRP
デューティサイクル 1% RP002-1.0.4はデフォルトチャネルについて1%未満と規定
LoRaの設定 プリアンブル8シンボル、明示ヘッダ、CRC有効、符号化率4/5 RP002-1.0.4のアップリンク用LoRa物理層設定
低データレート最適化 125 kHzのSF11とSF12で有効 RP002-1.0.4、およびSX1261/2データシートの16.38 msのシンボル時間の規則
フレームのオーバーヘッド 13バイト(MHDR 1、FHDR 7、FPort 1、MIC 4) LoRa Alliance TS001-1.0.4のフレーム形式、FOptsなし
受信感度、125 kHzのSF7とSF12 −124 dBmと−137 dBm SX1261/2データシートRev 2.2(2024年12月)、表3-8、Rx boosted gain、64バイトのパケットでパケット誤り率1%
受信感度、SF8〜SF11 データシートの2値の間をSFについて線形補間 前提。下記の雑音フロアと照合
SFごとの復調器SNR SF7の−7.5 dBからSF12の−20 dBまで、2.5 dB刻み SX1261/2データシートRev 2.2、表6-1(代表値)
ゲートウェイの受信機 SX1262と同等の性能 前提。ゲートウェイのコンセントレータには独自のデータシートがある
ゲートウェイのアンテナと給電線 6 dBi、損失2 dB 前提
設計マージン 3 dB 前提。小規模フェージングと実装損失の分
自由空間モデル 32.4 + 20 log f(MHz) + 20 log d(km) ITU-R P.525-5、式(6)
経験的モデル UMa NLOS、ゲートウェイ高25 m、端末高1.5 m、10 m〜5 km 3GPP TR 38.901 V19.5.0(Release 19)、表7.4.1-1、0.5 GHz以上で有効
シャドウフェージング 対数正規、標準偏差6 dB、50 mのセルごとに独立 TR 38.901のUMa NLOSのσ、相関距離50 m
到達距離の場所率 90% 前提。マージン = 1.28 × 6 dB = 7.7 dB

SX1262は、SemtechのサブGHz帯LoRa・FSKトランシーバです。SX1261/2データシートによれば、150 MHzから960 MHzまでを連続してカバーし、7.8 kHzから500 kHzまでのLoRa帯域幅に対応し、最大+22 dBmで送信します。半二重のトランシーバなので、どの時点でも送信か受信のどちらか一方しか行いません。データシートにADCの分解能は記載されていません。筆者らが読んだのはデータシートの改訂2.2(2024年12月)です。Semtechの製品ページには、2025年4月7日付のデータシートが掲載されています。そのファイルはダウンロードできなかったので、受信感度の表はそちらと照合してください。詳しくはハードウェア表を参照してください。

設計

RP002 + TS001SF、BW、プリアンブル、13 B送信時間Semtechの式デューティサイクル 1%毎時アップリンク数SX1262 受信感度SF7・SF12の基準値EIRP・利得・損失+16 dBm, 6 dBi, 2 dB最大経路損失SFごと、3 dBを差引き経路損失モデルP.525・38.901 UMaSFごとの到達距離中央値・90%カバレッジグリッド50 mセル+シャドウイングSFごとの最大経路損失
計算ツールの構成。地域パラメータとフレーム形式によって、ペイロード、送信時間、デューティサイクルの予算が決まる。データシートの受信感度、EIRP、アンテナ利得、マージンによって、拡散率ごとの最大経路損失が決まる。2つの経路損失モデルがそれを到達距離に変換し、ランダムなシャドウイングを加えたUMaモデルがカバレッジグリッドを生成する。

送信時間

拡散率SF、帯域幅BWのLoRaシンボルの長さは2^SF / BWです。LoRaWANのアップリンクは、8シンボルのプリアンブル、同期ワードとフレーム開始を表す4.25シンボル、ヘッダを運ぶ8シンボル、その後のペイロードシンボルで構成されます。ペイロードのシンボル数はceil((8 PL + 16 CRC − 4 SF + 8 + 20 H) / (4 (SF − 2 DE))) × (CR + 4)です。ここでPLはPHYペイロードのバイト数、CRCはCRC有効時に1、Hは明示ヘッダのとき1、DEは低データレート最適化が有効なとき1、CRは符号化率4/5のとき1です。筆者らが読んだデータシートの改訂版は、この式についてSX126xドライバを参照しています。コードはSF7〜SF12について、Semtechのsx126x_driverの整数演算に従っています。RP002-1.0.4のLoRaパケット構造の表にも、同じ8 + 4.25 + 8シンボルの構成が載っています。

PHYペイロードは、12バイトのアプリケーションデータに13バイトのLoRaWANフレーミングを加えたものです。内訳は、1バイトのMACヘッダ、オプションなしの7バイトのフレームヘッダ、1バイトのポート、4バイトのメッセージ完全性コードです。

デューティサイクル

1%では、端末は任意の1時間に36 s送信できます。計算ツールは36 sを送信時間で割り、端数を切り捨てます。RP002-1.0.4は欧州の詳細な規則についてETSI EN 300 220-2を参照しています。また、ネットワーク事業者がさらに厳しい制限を課す場合もあります。これらの数値は上限として扱ってください。

受信感度

SX1261/2データシートは、LoRaの受信感度を各帯域幅についてSF7とSF12でしか示していません。計算ツールは、125 kHzでの−124 dBmと−137 dBmの間を、SFについて直線で結びます。確認のため、雑音フロアからの推定値−174 dBm/Hz + 10 log10(125 kHz) + NF + SNRminも計算します。ここでは、データシートのSFごとの代表的な復調器SNRと、仮定した6 dBの雑音指数を使います。両者はすべてのSFで0.5 dB以内で一致し、補間の妥当性を裏付けています。6 dBの雑音指数はこの確認のためだけのもので、データシートの値ではありません。

リンクバジェット

最大経路損失は、EIRP + ゲートウェイのアンテナ利得 − 給電線損失 − 受信感度 − 設計マージンです。EIRP +16 dBm、6 dBi、2 dB、3 dBでは、SF7で141.0 dB、SF12で154.0 dBになります。SFが1段上がるごとに2.6 dB増えます。用語集のEIRP、受信感度、リンクマージンの項目も参照してください。

経路損失モデル

ITU-R P.525-5による自由空間損失は最良の場合です。見通しが確保され、地面がないことを仮定しているので、地上レベルでは到達距離を桁違いに過大評価します。ここではそれを示すために使います。

経験的モデルは、3GPP TR 38.901の表7.4.1-1にある都市マクロ(UMa)見通し外(NLOS)モデルです。NLOSの損失は、UMaの見通し内(LOS)損失と13.54 + 39.08 log10(d3D) + 20 log10(fc) − 0.6 (hUT − 1.5)の大きい方です(fcの単位はGHz、d3Dの単位はm)。LOS部分では、ブレークポイント距離4 h’BS h’UT fc / cを、実効環境高1 mで用います。これは、端末が13 m未満のときに報告書が規定している値です。TR 38.901によれば、この表は0.5 GHz以上に適用されるので、868 MHzは範囲内です。距離の適用範囲は10 mから5 kmです。セルラーのマクロサイト向けに作られたモデルで、町中の25 mのマストに設置したゲートウェイと同じ幾何配置です。地形は考慮していません。

カバレッジグリッド

グリッドは50 m間隔の201 × 201点で、中心にゲートウェイを置きます。モデルの適用範囲内にあって集計対象となるのは、ゲートウェイから10 m〜5 kmにある31,416点だけです。各点には、UMa NLOSの中央値損失に、標準偏差6 dBのシャドウイングのサンプルを加えます。TR 38.901はUMa NLOSのシャドウイング相関距離を50 mとしており、これはグリッド間隔と等しい値です。そこで簡略化のため、セルごとに独立なサンプルを引きます。その後、各点の損失が最大経路損失以下となるSFのうち、最も速いものをその点に割り当てます。

コード

これをlorawan_coverage.pyとして保存してください。パラメータ、送信時間、2つの経路損失モデル、リンクバジェット、グリッド、ペイロードの制限が、1つのブロックにまとまっています。

# lorawan_coverage.py: EU868 LoRaWAN uplink link budget, time on air, duty cycle and a coverage grid.
import math
from statistics import NormalDist

import numpy as np

# Region and radio (sources and assumptions are listed on the page)
FREQ_MHZ = 868.1                 # EU868 default channel
BW_HZ = 125e3                    # DR0 to DR5 use 125 kHz
SFS = [7, 8, 9, 10, 11, 12]      # DR5 ... DR0
EIRP_DBM = 16.0                  # RP002-1.0.4 default max EIRP for EU863-870
DUTY_CYCLE = 0.01                # default channels: less than 1 %
APP_PAYLOAD = 12                 # application bytes per uplink
LORAWAN_OVERHEAD = 13            # MHDR 1 + FHDR 7 + FPort 1 + MIC 4, no FOpts
PREAMBLE_SYMB = 8                # LoRaWAN uplink preamble
CR = 1                           # coding rate 4/5
SENS_DATASHEET = {7: -124.0, 12: -137.0}       # SX1262 at 125 kHz, Rx boosted gain (dBm)
SNR_MIN_DB = {7: -7.5, 8: -10.0, 9: -12.5, 10: -15.0, 11: -17.5, 12: -20.0}
NF_DB = 6.0                      # assumed noise figure for the cross-check only

# Link and site assumptions
GW_ANT_GAIN_DBI = 6.0            # gateway antenna
GW_CABLE_LOSS_DB = 2.0           # feeder and connectors
DESIGN_MARGIN_DB = 3.0           # small-scale fading and implementation allowance
H_BS, H_UT = 25.0, 1.5           # 38.901 UMa defaults: gateway on a mast, device at street level
SIGMA_SF_DB = 6.0                # 38.901 UMa NLOS shadow fading standard deviation
LOCATION_PROB = 0.90             # edge-of-cell location probability for the range table
GRID_STEP_M, GRID_HALF_M = 50.0, 5000.0
rng = np.random.default_rng(868)


def time_on_air_s(payload_bytes: int, sf: int, bw_hz: float = BW_HZ, preamble: int = PREAMBLE_SYMB,
                  cr: int = CR, crc: bool = True, explicit_header: bool = True) -> float:
    """LoRa time on air for SF7 to SF12, following Semtech's SX126x driver."""
    ldro = (2 ** sf) / bw_hz >= 16.38e-3            # on for SF11 and SF12 at 125 kHz
    num = 8 * payload_bytes + 16 * crc - 4 * sf + 8 + 20 * explicit_header
    den = 4 * (sf - 2 * ldro)
    n_payload = math.ceil(max(num, 0) / den) * (cr + 4)
    n_symbols = preamble + 4.25 + 8 + n_payload
    return n_symbols * (2 ** sf) / bw_hz


def fspl_db(d_m: np.ndarray) -> np.ndarray:
    """ITU-R P.525-5 equation (6): 32.4 + 20 log f(MHz) + 20 log d(km)."""
    return 32.4 + 20 * np.log10(FREQ_MHZ) + 20 * np.log10(d_m / 1e3)


def uma_nlos_db(d2d_m: np.ndarray) -> np.ndarray:
    """3GPP TR 38.901 Table 7.4.1-1, UMa NLOS = max(UMa LOS, PL'UMa-NLOS). fc in GHz, d in m."""
    fc = FREQ_MHZ / 1e3
    d3d = np.sqrt(d2d_m ** 2 + (H_BS - H_UT) ** 2)
    d_bp = 4 * (H_BS - 1.0) * (H_UT - 1.0) * fc * 1e9 / 3e8      # hE = 1 m because hUT is below 13 m
    pl1 = 28.0 + 22 * np.log10(d3d) + 20 * np.log10(fc)
    pl2 = 28.0 + 40 * np.log10(d3d) + 20 * np.log10(fc) - 9 * np.log10(d_bp ** 2 + (H_BS - H_UT) ** 2)
    pl_los = np.where(d2d_m <= d_bp, pl1, pl2)
    pl_nlos = 13.54 + 39.08 * np.log10(d3d) + 20 * np.log10(fc) - 0.6 * (H_UT - 1.5)
    return np.maximum(pl_los, pl_nlos)


def range_for(model, max_loss_db: float) -> float:
    """Largest distance (m) at which the model loss stays below max_loss_db, by bisection."""
    lo, hi = 10.0, 1e7
    for _ in range(200):
        mid = math.sqrt(lo * hi)
        lo, hi = (mid, hi) if model(np.array([mid]))[0] <= max_loss_db else (lo, mid)
    return lo


# 1. Receiver sensitivity per SF: datasheet anchors, linear in SF between them, plus a noise-floor check.
sens = {sf: SENS_DATASHEET[7] + (sf - 7) * (SENS_DATASHEET[12] - SENS_DATASHEET[7]) / 5 for sf in SFS}
print("SF  DR  sensitivity (dBm)  check -174+10log(BW)+NF+SNRmin  ToA (ms)  uplinks/hour at 1 %")
phy = APP_PAYLOAD + LORAWAN_OVERHEAD
toa = {sf: time_on_air_s(phy, sf) for sf in SFS}
for sf in SFS:
    check = -174 + 10 * math.log10(BW_HZ) + NF_DB + SNR_MIN_DB[sf]
    per_hour = math.floor(3600 * DUTY_CYCLE / toa[sf])
    print(f"{sf:>2}  {12 - sf:>2}  {sens[sf]:>17.1f}  {check:>31.1f}  {toa[sf] * 1e3:>8.1f}  {per_hour:>19}")
print(f"PHYPayload {phy} bytes, preamble {PREAMBLE_SYMB} symbols, CR 4/5, CRC on, explicit header")

# 2. Link budget and range per SF.
z = NormalDist().inv_cdf(LOCATION_PROB)
shadow_margin = z * SIGMA_SF_DB
print(f"\nEIRP {EIRP_DBM} dBm, gateway gain {GW_ANT_GAIN_DBI} dBi, cable {GW_CABLE_LOSS_DB} dB, "
      f"design margin {DESIGN_MARGIN_DB} dB, shadowing margin {shadow_margin:.1f} dB ({LOCATION_PROB:.0%})")
print("SF  max path loss (dB)  range free space (km)  range UMa NLOS median (km)  at 90 % (km)")
mapl = {}
for sf in SFS:
    mapl[sf] = EIRP_DBM + GW_ANT_GAIN_DBI - GW_CABLE_LOSS_DB - sens[sf] - DESIGN_MARGIN_DB
    r_fs = range_for(fspl_db, mapl[sf]) / 1e3
    r_med = range_for(uma_nlos_db, mapl[sf]) / 1e3
    r_90 = range_for(uma_nlos_db, mapl[sf] - shadow_margin) / 1e3
    print(f"{sf:>2}  {mapl[sf]:>18.1f}  {r_fs:>21.0f}  {r_med:>26.2f}  {r_90:>12.2f}")

# 3. Path loss against distance for the chart.
print("\nd (km)  FSPL (dB)  UMa NLOS (dB)")
for d_km in [0.1, 0.2, 0.3, 0.5, 0.7, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0]:
    d = np.array([d_km * 1e3])
    print(f"{d_km:>6}  {fspl_db(d)[0]:>9.1f}  {uma_nlos_db(d)[0]:>13.1f}")

# 4. Coverage grid: 10 km x 10 km, gateway at the centre, UMa NLOS plus log-normal shadowing.
axis = np.arange(-GRID_HALF_M, GRID_HALF_M + GRID_STEP_M, GRID_STEP_M)
x, y = np.meshgrid(axis, axis)
d2d = np.hypot(x, y)
inside = (d2d >= 10.0) & (d2d <= 5000.0)                       # UMa NLOS validity: 10 m to 5 km
loss = uma_nlos_db(np.maximum(d2d, 10.0)) + rng.normal(0.0, SIGMA_SF_DB, d2d.shape)
best_sf = np.full(d2d.shape, 0)
for sf in reversed(SFS):                                       # overwrite with the fastest SF that closes
    best_sf[(loss <= mapl[sf]) & inside] = sf
n_in = int(inside.sum())
print(f"\ncoverage grid: {len(axis)} x {len(axis)} points at {GRID_STEP_M:.0f} m, {n_in} inside the 5 km disc")
print("SF  share of area, fastest SF that closes (%)  cumulative (%)  by ring 0-1, 1-2, 2-3, 3-4, 4-5 km (%)")
cum = 0.0
rings = [(0, 1000), (1000, 2000), (2000, 3000), (3000, 4000), (4000, 5000)]
for sf in SFS:
    share = 100 * np.sum(best_sf[inside] == sf) / n_in
    cum += share
    ring_cov = []
    for r0, r1 in rings:
        sel = inside & (d2d > r0) & (d2d <= r1)
        ring_cov.append(100 * np.sum((best_sf[sel] > 0) & (best_sf[sel] <= sf)) / sel.sum())
    print(f"{sf:>2}  {share:>41.1f}  {cum:>14.1f}  " + ", ".join(f"{c:.0f}" for c in ring_cov))
print(f"not covered at any SF: {100 - cum:.1f} % of the disc")

# 5. Payload limits: the longest EU868 uplink, and the US915 400 ms dwell time at DR0 (SF10, 125 kHz).
t51 = time_on_air_s(51 + LORAWAN_OVERHEAD, 12)
print(f"\nEU868 DR0, 51-byte application payload: {t51 * 1e3:.1f} ms, {math.floor(36 / t51)} uplinks/hour at 1 %")
for n_app in (11, 12):
    t = time_on_air_s(n_app + LORAWAN_OVERHEAD, 10)
    print(f"US915 DR0 (SF10), {n_app}-byte application payload: {t * 1e3:.1f} ms, "
          f"{'within' if t <= 0.4 else 'over'} the 400 ms dwell time")

range_forは対数スケール上の二分法で距離を求めるので、どちらのモデルにも使えます。

実行

python -m pip install numpy
python lorawan_coverage.py

テスト

シャドウイングのシードを868に固定した、筆者らの実行結果を示します。

SF  DR  sensitivity (dBm)  check -174+10log(BW)+NF+SNRmin  ToA (ms)  uplinks/hour at 1 %
 7   5             -124.0                           -124.5      61.7                  583
 8   4             -126.6                           -127.0     113.2                  318
 9   3             -129.2                           -129.5     205.8                  174
10   2             -131.8                           -132.0     411.6                   87
11   1             -134.4                           -134.5     823.3                   43
12   0             -137.0                           -137.0    1482.8                   24
PHYPayload 25 bytes, preamble 8 symbols, CR 4/5, CRC on, explicit header

EIRP 16.0 dBm, gateway gain 6.0 dBi, cable 2.0 dB, design margin 3.0 dB, shadowing margin 7.7 dB (90%)
SF  max path loss (dB)  range free space (km)  range UMa NLOS median (km)  at 90 % (km)
 7               141.0                    310                        1.96          1.25
 8               143.6                    418                        2.29          1.45
 9               146.2                    564                        2.67          1.70
10               148.8                    761                        3.11          1.98
11               151.4                   1027                        3.62          2.30
12               154.0                   1385                        4.22          2.68

d (km)  FSPL (dB)  UMa NLOS (dB)
   0.1       71.2           90.9
   0.2       77.2          102.4
   0.3       80.7          109.2
   0.5       85.2          117.8
   0.7       88.1          123.5
   1.0       91.2          129.6
   1.5       94.7          136.4
   2.0       97.2          141.3
   3.0      100.7          148.2
   4.0      103.2          153.1
   5.0      105.2          156.9

coverage grid: 201 x 201 points at 50 m, 31416 inside the 5 km disc
SF  share of area, fastest SF that closes (%)  cumulative (%)  by ring 0-1, 1-2, 2-3, 3-4, 4-5 km (%)
 7                                       19.7            19.7  100, 73, 25, 6, 1
 8                                        6.8            26.5  100, 83, 40, 12, 3
 9                                        8.6            35.1  100, 91, 57, 22, 7
10                                       10.4            45.5  100, 96, 72, 37, 15
11                                       11.7            57.2  100, 99, 84, 53, 27
12                                       11.9            69.2  100, 100, 92, 70, 43
not covered at any SF: 30.8 % of the disc

EU868 DR0, 51-byte application payload: 2793.5 ms, 12 uplinks/hour at 1 %
US915 DR0 (SF10), 11-byte application payload: 370.7 ms, within the 400 ms dwell time
US915 DR0 (SF10), 12-byte application payload: 411.6 ms, over the 400 ms dwell time
801001201400.11自由空間、ITU-R P.525UMa NLOS中央値、TR 38.901SF7の最大経路損失、141.0 dBSF12の最大経路損失、154.0 dB経路損失(dB)距離(km)
868.1 MHzにおける距離に対する経路損失。自由空間(ITU-R P.525-5)と、ゲートウェイ高25 m・端末高1.5 mの3GPP TR 38.901 UMa NLOS中央値を、上に出力した表から示す。リンクバジェットから求めたSF7とSF12の最大経路損失も併せて示す。UMaの曲線はSF7の線と約2 km、SF12の線と約4.2 kmで交わる。自由空間の曲線は5 km以内でどちらの線にも達しない。
0204060SF7SF8SF9SF10SF11SF12カバー面積(%)拡散率
ゲートウェイ周辺の半径5 kmの円のうち、各拡散率またはそれより速いSFでカバーされる割合。上に出力したカバレッジグリッド(標準偏差6 dBの対数正規シャドウイングを加えたUMa NLOS)による。SF7だけで面積の19.7%をカバーし、より遅いSFをすべて加えると69.2%になる。
05001,000SF7SF8SF9SF10SF11SF12送信時間(ms)拡散率
125 kHzにおける、12バイトのアプリケーションペイロード(PHYペイロード25バイト)を持つLoRaWANアップリンクの送信時間。上に出力した表による。SFが1段上がるごとに時間はほぼ2倍になり、SF11とSF12では低データレート最適化を使う。

結果の読み方:

  • 送信時間とデューティサイクル。 SF7からSF12にすると、リンクバジェットが13 dB増える代わりに、送信時間が24倍になります(61.7 ms対1482.8 ms)。その送信時間の分は、バッテリも消費します。EU868のDR0での最大アップリンク(アプリケーション51バイト)の送信時間は2793.5 msで、1時間あたり12回のアップリンクしか許されません。
  • 到達距離。 自由空間ではSF7で310 kmになります。この値は地上レベルでは意味がありません。地上での計画に自由空間を使ってはならない理由がここにあります。UMaの到達距離の中央値は、SF7で1.96 km、SF12で4.22 kmです。セル端の90%の地点でカバーするには、これらが1.25 kmと2.68 kmに縮みます。
  • グリッド。 1 km以内では、すべての点でSF7のリンクが成立します。4 km〜5 kmの範囲では、SF12でもリンクが成立する点は43%だけです。全体では円の30.8%がカバーされません。この条件で半径5 km全体をカバーするには、より良いサイト、より高いアンテナ、または2台目のゲートウェイが必要です。
  • US915。 DR0(SF10、125 kHz)では、11バイトのペイロードの送信時間は370.7 msで、400 msの滞留時間(dwell time)以内です。12バイトのペイロードは411.6 msで収まりません。そのためRP002-1.0.4は、US902-928のDR0のアプリケーションペイロードを11バイトに制限しています。

出力が異なる場合は、まず周波数の単位を確認してください。P.525は周波数をMHz、距離をkmで受け取ります。一方、TR 38.901は周波数をGHz、距離をmで受け取ります。混同すると、損失が数十dBずれます。

実機で試す

この節では無線機が必要です。端末としてSX1262の開発キットまたはモジュールを、さらにネットワークサーバに接続したLoRaWANゲートウェイを用意してください。

  • 測定してからフィッティングする。 テスト端末を載せてゲートウェイの周囲を車で走り、各アップリンクのRSSIとSNRをGPS位置とともに記録します。距離の対数に対して経路損失をフィッティングし、UMaの曲線と比較します。測定したばらつきで、6 dBのシャドウイングの前提を置き換えます。
  • ゲートウェイを確認する。 アップリンクを受信するのはSX1262ではなく、ゲートウェイのコンセントレータです。受信感度の前提をそのデータシートの値に置き換え、実際のアンテナ利得と給電線損失を加えてください。
  • 屋内の端末。 地下室や戸棚の中のメーターには、建物侵入損失が加わります。TR 38.901の7.4.3節には、屋外から屋内への侵入損失モデルがあります。屋内カバレッジを約束する前に、そのいずれかを加えてください。
  • 規制。 地域のEIRPとデューティサイクルの制限を守ってください。RP002-1.0.4は地域ごとにそれらをまとめていますが、地域規制の正式な情報源となることは意図していないと明記しています。展開する国の規則を確認してください。

試してみること

  1. US915に切り替える。 アップリンクのデータレートを125 kHzのSF7〜SF10に、周波数を902.3 MHzに設定し、デューティサイクル制限をRP002-1.0.4のUS902-928の規則に置き換えます。次に、400 msの滞留時間のチェックをすべてのSFに加え、各SFでどのペイロードサイズが残るかを確認します。RP002-1.0.4には、US902-928の電力制限も載っています。
  2. 農村部のサイト。 UMaモデルを、マスト高35 mのTR 38.901ルーラルマクロ(RMa)NLOSモデルに置き換えます。このモデルはNLOSで5 kmまで有効です。
  3. 相関のあるシャドウイング。 グリッド上に白色ガウス雑音を生成し、相関距離が50 mになるように2次元フィルタで平滑化します。その後、標準偏差6 dBに再スケーリングします。
  4. 大きなペイロード。 APP_PAYLOAD = 51に設定します。再送を含めて1時間ごとに報告する場合について、各SFの送信時間を1%の予算と照合します。
  5. 2台目のゲートウェイ。 2台目のゲートウェイを4 km東に置き、両方への損失を計算して、各点で良い方を採用します。カバレッジの改善量を報告してください。

まとめ

  • LoRaWANのリンクバジェットには4つの文書が必要です。地域パラメータ(電力、デューティサイクル、データレート)、MACフレーム形式(オーバーヘッド)、無線機のデータシート(受信感度)、伝搬モデルです。それぞれの版を明記してください。
  • SFが1段上がるごとに、リンクバジェットは約2.6 dB増え、送信時間は2倍になります。今回は、SF12はSF7より13 dB多い予算を持ち、24倍の送信時間を使いました。
  • EU868の1%のデューティサイクルでは、12バイトのペイロードで、1時間あたりSF7で583回、SF12で24回のアップリンクが許されました。
  • 自由空間損失は、地上レベルの到達距離を2桁過大評価します。TR 38.901のUMa NLOSモデルでは、到達距離の中央値はSF7で1.96 km、SF12で4.22 kmでした。
  • シャドウイングにより、到達距離は確率の問題になります。90%の場所率のマージンでSF12の到達距離は2.68 kmに縮み、半径5 kmの円の30.8%がカバーされずに残りました。

背景知識: LPWANとIoTとリンクバジェットと雑音のトピックハブ、および用語集の経路損失の項目。