lora --- LoRa モデムドライバ

lora モジュールは、Arduino Portenta Vision Shield に搭載された Murata CMWX1ZZABZ LoRa モデム用のドライバを提供します。モデムのファームウェア(Arduino MKRWAN ARD-078 ファームウェアを含む)が使用する AT コマンドセットをラップする高レベルの Lora クラスを公開しており、アプリケーションが LoRaWAN ネットワークに参加してパケットを送受信できるようにします。

例:

import lora

modem = lora.Lora(band=lora.BAND_EU868, debug=True)
print("Device EUI:", modem.get_device_eui())
if modem.join_OTAA("0000000000000000", "00000000000000000000000000000000"):
    modem.send_data(b"hello", confirmed=True)

定数

アクティベーションモード

lora.MODE_ABP: int

Activation By Personalization(パーソナライゼーションによるアクティベーション)モード。

lora.MODE_OTAA: int

Over-The-Air(無線経由)アクティベーションモード。

RF 出力モード

lora.RF_MODE_RFO: int

モデムの RFO(低電力)RF 出力を使用します。

lora.RF_MODE_PABOOST: int

モデムの PA_BOOST(高電力)RF 出力を使用します。

バンド

lora.BAND_AS923: int

AS923(アジア 923 MHz)地域バンド。

lora.BAND_AU915: int

AU915(オーストラリア 915 MHz)地域バンド。

lora.BAND_EU868: int

EU868(ヨーロッパ 868 MHz)地域バンド。

lora.BAND_KR920: int

KR920(韓国 920 MHz)地域バンド。

lora.BAND_IN865: int

IN865(インド 865 MHz)地域バンド。

lora.BAND_US915: int

US915(アメリカ合衆国 915 MHz)地域バンド。

lora.BAND_US915_HYBRID: int

US915 ハイブリッド(サブバンド)地域プラン。

デバイスクラス

lora.CLASS_A: str

LoRaWAN エンドデバイス Class A。

lora.CLASS_B: str

LoRaWAN エンドデバイス Class B。

lora.CLASS_C: str

LoRaWAN エンドデバイス Class C。

例外

exception lora.LoraError

モデムまたはドライバが返すあらゆるエラーに対して発生する基底例外。

exception lora.LoraErrorTimeout

設定されたタイムアウト内にモデムが応答しない場合(受信バッファが空の場合)に発生します。

exception lora.LoraErrorParam

無効なパラメータを指定して AT コマンドを発行したときの +ERR_PARAM 応答で発生します。

exception lora.LoraErrorBusy

直前のコマンドを処理中でモデムがビジー状態のときの +ERR_BUSY 応答で発生します。

exception lora.LoraErrorOverflow

パラメータが許容される最大長を超えたときの +ERR_PARAM_OVERFLOW 応答で発生します。

exception lora.LoraErrorNoNetwork

モデムがネットワークに参加していないときの +ERR_NO_NETWORK 応答で発生します。

exception lora.LoraErrorRX

ダウンリンクの受信中にエラーが発生したときの +ERR_RX 応答で発生します。

exception lora.LoraErrorUnknown

+ERR_UNKNOWN 応答が返された場合、またはモデムが文書化されていないエラーを報告した場合に発生します。

クラス

class lora.Lora(uart: machine.UART | None = None, rst_pin: machine.Pin | None = None, boot_pin: machine.Pin | None = None, band: int = BAND_EU868, poll_ms: int = 300000, debug: bool = False)

新しいモデムドライバを構築します。コンストラクタは UART およびリセット/ブートピンを初期化(または自動生成)し、モジュールをハードウェアリセットし、オートボー同期を実行し、モジュールを再起動し、ファームウェアバージョンを照会し、要求された地域 band を設定します。

パラメータ:
  • uart -- モデムとの通信に使用する事前設定済みの machine.UART インスタンス。None の場合、ドライバは 8N2 フレーミングで UART(8, 19200) を開きます(Portenta Vision Shield のデフォルト)。

  • rst_pin -- モデムのリセットラインを駆動する machine.PinNone の場合、"PC6" がプッシュプル出力として設定されます。

  • boot_pin -- モデムのブートセレクトラインを駆動する machine.PinNone の場合、"PG7" がローにプルされたプッシュプル出力として設定されます。

  • band -- 設定する地域バンド。BAND_* 定数のいずれか。

  • poll_ms -- ダウンリンクウィンドウを開いたままにするために poll() によってトリガーされる自動空アップリンクの間隔(ミリ秒単位)。

  • debug -- True の場合、すべての UART トラフィックが print() で出力されます。

LoraErrors: dict

モデムのエラー応答文字列(例: "+ERR_BUSY")から対応する例外クラスへのマッピング。handle_error() によって内部的に使用されます。

init_modem() None

self.uartself.rst_pinself.boot_pin がまだ設定されていない場合、それらを Portenta Vision Shield のデフォルト値に遅延初期化します。コンストラクタから呼び出され、通常はユーザーコードから呼び出されません。

debug_print(data: str) None

構築時に debug が有効になっていた場合は data を出力し、そうでなければ何もしません。

is_arduino_firmware() bool

モデムが Arduino MKRWAN ARD-078 ファームウェアを実行している場合(キャッシュされた fw_version 文字列から検出)に True を返します。

configure_class(_class: str) None

LoRaWAN デバイスクラスを設定します。

パラメータ:

_class -- CLASS_ACLASS_BCLASS_C のいずれか。

configure_band(band: int) bool

地域バンドを設定し、BAND_EU868 を使用する Arduino ファームウェアでは ETSI デューティサイクルリミッタを有効にします。成功した場合は True を返します。

パラメータ:

band -- BAND_* 定数のいずれか。

set_baudrate(baudrate: int) None

モデムの UART ボーレートを変更します(AT+UART)。

パラメータ:

baudrate -- 新しいボーレート(ビット毎秒単位)。

set_autobaud(timeout: int = 10000) bool

モデムが +OK で応答するか、timeout ミリ秒が経過するまで空の AT コマンドを送信します。同期が成功した場合は True を返します。

パラメータ:

timeout -- 試行に費やす最大時間(ミリ秒単位)。

get_fw_version() str

モデムのデバイス文字列(AT+DEV?)とファームウェアバージョン(AT+VER?)を照会し、スペース区切りの単一の文字列として返します。

get_device_eui() str

モデムの 64 ビット Device EUI を 16 進文字列として返します。

factory_default() None

AT+FACNEW を介して工場出荷時のデフォルトに復元します。

restart() None

ボーレートを再同期し、モデムを再起動し、ファームウェアバージョンを再読み込みし、設定された地域バンドを再適用します。失敗した場合は LoraError を発生させます。

set_rf_power(mode: int, power: int) None

モデムの RF 出力段を設定します(AT+RFPOWER)。

パラメータ:
  • mode -- RF_MODE_RFORF_MODE_PABOOST のいずれか。

  • power -- 出力電力インデックス(ファームウェア固有の単位)。

set_port(port: int) None

後続の send_data() 呼び出しで使用する LoRaWAN アプリケーションポート(1~223)を設定します。

パラメータ:

port -- LoRaWAN FPort。

set_public_network(enable: bool) None

パブリックネットワークの同期ワードを有効または無効にします。

パラメータ:

enable -- パブリック LoRaWAN 同期ワードの場合は True、プライベートの場合は False

sleep(enable: bool) None

モデムを低電力スリープにする(True)か、起動する(False)かを設定します。

format(hexMode: bool) None

ペイロードバイトに対して UART 上で使用するデータ形式を選択します。

パラメータ:

hexMode -- ASCII 16 進ペイロード形式の場合は True、生のバイナリの場合は False

set_datarate(dr: int) None

LoRaWAN データレートインデックスを設定します(AT+DR)。

パラメータ:

dr -- 地域固有のデータレートインデックス。

get_datarate() int

現在の LoRaWAN データレートインデックスを返します。

set_adr(adr: bool) None

Adaptive Data Rate を有効または無効にします。

パラメータ:

adr -- ADR を有効にする場合は True、無効にする場合は False

get_adr() int

現在の ADR 設定を返します(有効な場合は 1、そうでない場合は 0)。

get_devaddr() str

現在の 32 ビット DevAddr を 16 進文字列として返します。

get_nwk_skey() str

現在の Network Session Key を 16 進文字列として返します。

get_appskey() str

現在の Application Session Key を 16 進文字列として返します。

get_rx2dr() int

RX2 受信ウィンドウに使用されるデータレートインデックスを返します。

set_rx2dr(dr: int) None

RX2 受信ウィンドウに使用されるデータレートインデックスを設定します。

パラメータ:

dr -- 地域固有のデータレートインデックス。

get_ex2freq() int

RX2 受信ウィンドウに使用される周波数(Hz 単位)を返します。

set_rx2freq(freq: int) None

RX2 受信ウィンドウに使用される周波数を設定します。

パラメータ:

freq -- 周波数(Hz 単位)。

set_fcu(fcu: int) None

アップリンクフレームカウンタを設定します(AT+FCU)。

パラメータ:

fcu -- 新しいアップリンクフレームカウンタ値。

get_fcu() int

現在のアップリンクフレームカウンタを返します。

set_fcd(fcd: int) None

ダウンリンクフレームカウンタを設定します(AT+FCD)。

パラメータ:

fcd -- 新しいダウンリンクフレームカウンタ値。

get_fcd() int

現在のダウンリンクフレームカウンタを返します。

change_mode(mode: int) None

アクティベーションモードを切り替えます。

パラメータ:

mode -- MODE_ABPMODE_OTAA のいずれか。

join(timeout_ms: int) bool

AT+JOIN を発行し、join-accept イベントを待ちます。モデムが timeout_ms 以内に +EVENT=1,1(参加成功)を報告した場合は True を返します。

パラメータ:

timeout_ms -- +ACK とそれに続く join イベントの両方を待つ最大時間(ミリ秒単位)。

get_join_status() bool

モデムが現在ネットワークに参加している場合は True を返します。

get_max_size() int

現在のデータレートにおける最大 LoRaWAN ペイロードサイズ(バイト単位)を返します。Arduino ファームウェアでは 64 に固定されています。

poll() None

前回の呼び出しから poll_ms ミリ秒以上経過している場合、保留中のダウンリンクをフラッシュするために空の確認付きアップリンクを送信します。アプリケーションのメインループから頻繁に呼び出すことを想定しています。

send_data(buff: bytes, confirmed: bool = True) bool

LoRaWAN アップリンクを送信します。buffget_max_size() より大きい場合は LoraError を発生させます。

パラメータ:
  • buff -- 送信するペイロードバイト。

  • confirmed -- True の場合、確認付きアップリンク(+CTX)を送信し、ネットワークサーバの +ACK を待ちます。False の場合、確認なしアップリンク(+UTX)を送信します。

戻り値:

モデムがパケットを受け入れた場合(確認付きアップリンクの場合はネットワークが確認応答した場合)は True、そうでない場合は False

receive_data(timeout: int = 1000) dict | None

ダウンリンクを待ちます。timeout ミリ秒以内に +RECV イベントが受信されなかった場合は None を返し、そうでない場合は FPort とペイロードバイトを含む辞書 {"port": str, "data": str} を返します。

パラメータ:

timeout -- 待つ最大時間(ミリ秒単位)。

receive(delimiter: str | list | None = None, max_bytes: int | None = None, timeout: int = 1000) str

低レベルの UART 読み取り。区切り文字が一致するか、max_bytes 文字が読み取られるか、timeout ミリ秒が経過するまでモデムから文字を読み取り、末尾の \r を取り除いた累積文字列を返します。

パラメータ:
  • delimiter -- バッファの末尾で一致させる単一の文字、トリミング後のバッファ全体に対して一致させる複数文字の文字列、またはそのような文字列のリストのいずれか。

  • max_bytes -- 設定すると、ちょうどこのバイト数が読み取られた時点ですぐに返します。

  • timeout -- 全体の読み取りタイムアウト(ミリ秒単位)。

available() int

現在モデムの UART 受信バッファで利用可能なバイト数を返します。

join_OTAA(appEui: str, appKey: str, devEui: str = None, timeout: int = 60000) bool

モデムを OTAA モードに切り替え、指定されたキーと EUI をプログラムし、ネットワークへの参加を試みます。参加が成功した場合は True を返します。

パラメータ:
  • appEui -- 64 ビット Application/Join EUI(16 進文字列)。

  • appKey -- 128 ビット Application Key(16 進文字列)。

  • devEui -- オプションの 64 ビット Device EUI(16 進文字列)。None の場合、工場出荷時にプログラムされた Device EUI が使用されます。

  • timeout -- 参加のタイムアウト(ミリ秒単位)。

join_ABP(nwkId: int, devAddr: str, nwkSKey: str, appSKey: str, timeout: int = 60000) bool

モデムを ABP モードに切り替え、指定されたアドレスとキーをプログラムし、参加を試みます。get_join_status() の結果を返します。

パラメータ:
  • nwkId -- ネットワーク識別子(現在はファームウェアによって無視されます)。

  • devAddr -- 32 ビット Device Address(16 進文字列)。

  • nwkSKey -- 128 ビット Network Session Key(16 進文字列)。

  • appSKey -- 128 ビット Application Session Key(16 進文字列)。

  • timeout -- 参加のタイムアウト(ミリ秒単位)。

handle_error(command: str, data: str) None

モデムの応答を検査し、それがエラーを表す場合は対応する LoraError サブクラスを発生させます。エラー以外の応答に対しては何もしません。

パラメータ:
  • command -- data を生成した AT コマンド(AT プレフィックスなし)。

  • data -- モデムが返した応答文字列。

send_command(cmd: str, *args, delimiter: str = '\\r', data: bytes = None, timeout: int = 1000, raise_error: bool = True) str

cmdargs から AT コマンドを構築し、オプションで生の data ペイロードを付加して送信し、モデムの応答を返します。? で終わるクエリコマンドの場合、値の部分(= 以降の部分文字列)のみが返されます。

パラメータ:
  • cmd -- AT コマンドサフィックス(例: "+JOIN""+DR=")。"AT" プレフィックスと末尾の \r は自動的に付加されます。

  • args -- 文字列変換後に cmd に連結される追加の引数。

  • delimiter -- receive() に転送される区切り文字。

  • data -- AT コマンドの直後に書き込まれるオプションの生バイト(バイナリアップリンクペイロードに使用)。

  • timeout -- 応答のタイムアウト(ミリ秒単位)。

  • raise_error -- True の場合、エラー応答は LoraError 例外に変換されます。False の場合、生の応答が呼び出し元に返されます。