- 必要な材料
- RaspberryPiとLoRaの接続
- ArduinoとLoRaの接続
- RaspberryPi用のpyLoRa
- LoRaモジュール用のRaspberryPiの構成
- LoRa用のRaspberryPiのプログラミング
- LoRaがRaspberryPiと通信するためのArduinoコード
- RaspberryPiとArduino間のLoRa通信のテスト
LoRaは、IoT、コネクテッドカー、M2M、インダストリー4.0などの登場でますます人気が高まっています。非常に少ない電力で長距離と通信できるため、設計者はバッテリー駆動のThingとデータを送受信するために使用することが望ましいです。LoRaの基本とArduinoでLoRaを使用する方法についてはすでに説明しました。このテクノロジーは元々、LoRaノードがLoRaゲートウェイと通信することを目的としていますが、LoRaノードが別のLoRaノードと通信して長距離で情報を交換する必要があるシナリオは数多くあります。したがって、このチュートリアルでは、RaspberrypiでLoRaモジュールSX1278を使用する方法を学習し ます。Arduinoのようなマイクロコントローラーに接続された別のSX1278と通信します。この方法は、ArduinoがセンサーからデータをフェッチしてLoRaを介して長距離にわたってPiに送信するサーバーとして機能し、クライアントとして機能するPiがこれらの情報を受信してアップロードできるため、多くの場所で役立ちます。それはインターネットにアクセスできるのでできます。面白そうですね。それでは、始めましょう。
必要な材料
- SX1278 433MHz LoRaモジュール–2つの番号
- 433MHz LoRaアンテナ– 2Nos
- ArduinoUNO-または他のバージョン
- ラズベリーパイ3
Raspberry Piはすでにオペレーティングシステムでフラッシュされており、インターネットに接続できると想定されています。そうでない場合は、先に進む前に「RaspberryPi入門」チュートリアルに従ってください。ここでは、RasbianJessieがインストールしたRaspberryPi3を使用してい ます。
警告:常に433MHzアンテナを備えたSX1278LoRaモジュールを使用してください。そうしないと、モジュールが損傷する可能性があります。
RaspberryPiとLoRaの接続
ソフトウェアパッケージに入る前に、ハードウェアを準備しましょう。 SX1278は、 16ピンである LORAモジュール3.3VロジックにSPIを使用して通信します。Raspberry piも3.3Vロジックレベルで動作し、SPIポートと3.3Vレギュレーターを内蔵しています。したがって、LoRaモジュールをRaspberryPiに直接接続できます。接続表を以下に示します。ラズベリーパイ | Lora –SX1278モジュール |
3.3V | 3.3V |
接地 | 接地 |
GPIO 10 | MOSI |
GPIO 9 | 味噌 |
GPIO 11 | SCK |
GPIO 8 | Nss /有効にする |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | ディオ2 |
GPIO 27 | ディオ3 |
GPIO 22 | RST |
以下の回路図を参考にすることもできます。回路図を使用して作成されたことに留意されたいRFM9xモジュールと非常に類似しているSX1278モジュールを、したがって外観は下の画像で異なる場合があります。
接続は非常に簡単です。直面する可能性がある唯一の問題は、SX1278がブレッドボードと互換性がないことです。したがって、接続を行うには接続ワイヤを直接使用するか、以下に示すように2つの小さなブレッドボードを使用する必要があります。また、Piが十分な電流を供給できない可能性があるため、別の3.3V電源レールでLoRaモジュールに電力を供給することを提案する人はほとんどいません。ただし、低電力モジュールであるLoraはPiの3.3Vレールで動作するはずです。同じものをテストしたところ、問題なく動作していることがわかりました。しかし、それでも塩のピンチでそれを取ります。LoRaとRaspberrypiの接続設定は、次のようになります。
ArduinoとLoRaの接続
Arduinoモジュールの接続は、前のチュートリアルで使用したものと同じです。唯一の違いは、Sandeep Mistryのライブラリを使用する代わりに、このプロジェクトの後半で説明するレディオヘッドに基づくRsprealライブラリを使用することです。回路は以下のとおりです。
ここでも、Arduino Unoの3.3Vピンを使用するか、別の3.3Vレギュレーターを使用できます。このプロジェクトでは、オンボードの電圧レギュレーターを使用しました。簡単に接続できるように、ピン接続表を以下に示します。
LoRaSX1278モジュール | ArduinoUNOボード |
3.3V | 3.3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
味噌 | D12 |
MOSI | D11 |
RST | D9 |
モジュールがブレッドボードに収まらないため、接続ワイヤーを直接使用して接続しました。接続が確立されると、ArduinoLoRaのセットアップは次のようになります
RaspberryPi用のpyLoRa
LoRaで使用できるPythonパッケージはたくさんあります。また、一般的にRaspberry Piは、複数のLoRaノードからデータを取得するためのLoRaWANとして使用されます。ただし、このプロジェクトでは、2つのRaspberry Piモジュール間、またはRaspberryPiとArduino間でピアツーピア通信を行うことを目的としています。そこで、pyLoRaパッケージを使用することにしました。これには、ArduinoおよびRaspberryPi環境で使用できるrpsrealLoRaArduinoおよびrpsrealLoRa Raspberrypiモジュールがあります。とりあえず、RaspberryPi環境に焦点を当てましょう。
LoRaモジュール用のRaspberryPiの構成
前に述べたように、LoRaモジュールはSPI通信で動作するため、PiでSPIを有効にしてから、 pylora パッケージをインストールする 必要があり ます。Piのターミナルウィンドウを開いた後、以下の手順に従って同じことを行います。繰り返しになりますが、私はパテを使用してPiに接続していますが、便利な方法を使用できます。
ステップ1:次のコマンドを使用 して構成ウィンドウに入ります。以下のウィンドウを取得するには
sudo raspi-config
ステップ2: 次の画像に示すように、インターフェイスオプションに移動し、SPIを有効にします。LCDとPIはSPIプロトコルを介して通信するため、SPIインターフェイスを有効にする必要があります。
手順3:変更を保存して、ターミナルウィンドウに戻ります。pipとpythonが更新されていることを確認してから、次のコマンドを使用して RPi.GPIO パッケージをインストールします 。
pip install RPi.GPIO
このパッケージクラスは、PiのGPIOピンを制御するのに役立ちます。正常にインストールされた場合、画面は次のようになります
ステップ4:同様に、次のコマンドを使用して spidev パッケージのインストールを続行します。Spidevは、RaspberryPiでSPI通信を実行するために使用できるLinux用のPythonバインディングです。
pip install spidev
インストールが成功すると、端末は次のようになります。
ステップ5:次に、次のpipコマンドを使用してpyLoRaパッケージをインストールします。このパッケージは、LoRaに関連付けられたRadioモデルをインストールします。
pip install pyLoRa
インストールが成功すると、次の画面が表示されます。
PyLoRaパッケージは、ArduinoおよびRaspberryPiでシームレスに使用できる暗号化通信もサポートしています。これにより、通信のデータセキュリティが向上します。ただし、暗号化はこのチュートリアルの範囲外であるため、この手順の後に別のパッケージをインストールする必要があります。詳細については、上記のgithubリンクをたどることができます。
このステップの後、パッケージパス情報をpiに追加し、最後にあるpythonプログラムで試すことができます。しかし、パスを正常に追加できなかったため、ライブラリを手動でダウンロードして、プログラムに直接使用する必要がありました。だから私は次のステップを進めなければなりませんでした
ステップ6:以下のコマンドを使用して、python-rpi.gpioパッケージとspidevパッケージをダウンロードしてインストールします。
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
両方のインストール後、ターミナルウィンドウに次のように表示されます。
ステップ7: gitもインストールし、それを使用してRaspberryPiのpythonディレクトリのクローンを作成します。次のコマンドを使用してこれを行うことができます。
sudo apt-get install git sudo git clone
この手順が完了すると、RaspberryPiホームフォルダにSX127xサブディレクトリが見つかります。これにより、必要なすべてのファイルがライブラリに関連付けられます。
LoRa用のRaspberryPiのプログラミング
ピアツーピアのLoRa通信では、情報を送信しているモジュールはサーバーと呼ばれ、情報を受信するモジュールはクライアントと呼ばれます。ほとんどの場合、Arduinoはデータを測定するためのセンサーを備えたフィールドで使用され、Piはこれらのデータを受信するために使用されます。そのため、このチュートリアルでは、Raspberry Piをクライアントとして使用し、Arduinoをサーバーとして使用することにしました。完全なラズベリーパイクライアントプログラムは、このページの下部に見つけることができます。ここでは、プログラムの重要な行について説明します。
注意:プログラムファイルがSX127xライブラリフォルダと同じディレクトリにあることを確認してください。プロジェクトを移植したい場合は、このフォルダーをコピーしてどこでも使用できます。
プログラムは非常に単純で、LoRaモジュールを433Mhzで動作するように設定してから、着信パケットをリッスンする必要があります。何かを受け取ったら、コンソールに簡単に印刷します。いつものように、必要なpythonライブラリをインポートすることからプログラムを開始します。
時間インポートスリープから SX127x.LoRaのインポート*から SX127x.board_config輸入ボードから BOARD.setup()
この場合、timeパッケージは遅延の作成に使用され、LoraパッケージはLoRa通信に使用され、 board_config はボードとLoRaパラメーターの設定に使用されます。また、 BOARD.setup() 関数を使用してボードをセットアップします。
次に、3つの定義を持つpythonLoRaクラスを作成します。プログラムをラズベリークライアントとして機能させるためにインデントするだけなので、クラスにはinitクラス、startクラス、 on_rx_done クラスの3つの関数しかあり ません 。initクラスは、 set_pa_config メソッドで設定された 125kHzの 帯域幅で433MHzでLoRaモジュールを初期化します。次に、モジュールをスリープモードにして、消費電力を節約します。
#初期化後のミディアムレンジのデフォルトは434.0MHz、Bw = 125 kHz、Cr = 4/5、Sf = 128chips / symbol、 13dBmのCRClora.set_pa_config(pa_select = 1) def __init __(self、verbose = False): super (LoRaRcvCont、self).__ init __(verbose) self.set_mode(MODE.SLEEP) self.set_dio_mapping(* 6)
開始機能は、モジュールを受信機として構成し、RSSI(受信信号強度インジケーター)、ステータス、動作周波数などを取得する場所です。モジュールをスリープモードから連続受信機モード(RXCONT)で動作するように設定し、whileループを使用してRSSIやモデムステータスなどの値を読み取ります。また、シリアルバッファ内のデータを端末にフラッシュします。
def start(self): self.reset_ptr_rx() self.set_mode(MODE.RXCONT) while True: sleep(.5) rssi_value = self.get_rssi_value() status = self.get_modem_status() sys.stdout.flush()
最後に、 on_rx_done 関数は、着信パケットが読み取られた後に実行されます。この関数では、受信フラグを高く設定した後、受信した値がRxバッファーからペイロードと呼ばれる変数に移動されます。次に、受信した値をutf-8でデコードして、ユーザーが読み取り可能なデータをシェルに出力します。また、別の値が受信されるまで、モジュールをスリープモードに戻します。
def on_rx_done(self): print( "\ nReceived:") self.clear_irq_flags(RxDone = 1) payload = self.read_payload(nocheck = True) print(bytes(payload).decode( "utf-8"、 'ignore' )) self.set_mode(MODE.SLEEP) self.reset_ptr_rx() self.set_mode(MODE.RXCONT)
プログラムの残りの部分は、受信した値をコンソールに出力し、キーボード割り込みを使用してプログラムを終了することだけです。電力を節約するために、プログラムの終了後もボードをスリープモードに設定しました。
try:lora.start()(KeyboardInterruptを除く):sys.stdout.flush()print( "")sys.stderr.write( "KeyboardInterrupt \ n")最後に:sys.stdout.flush()print( "")lora。 set_mode(MODE.SLEEP)BOARD.teardown()
LoRaがRaspberryPiと通信するためのArduinoコード
先に述べたように、 rpsreal コードはArduinoとPiの両方をサポートしているため、ArduinoとPi間の通信が可能です。AirSpayceのレディオヘッドライブラリに基づいて動作します。したがって、最初にレディオヘッドライブラリをArduinoIDEにインストールする必要があります。
これを行うには、Githubページにアクセスし、ZIPフォルダーにあるライブラリをダウンロードします。次に、ArduinoIDEのライブラリフォルダーに配置します。ここで、Arduino IDEを再起動すると、レディオヘッドライブラリのサンプルファイルが見つかります。ここでは、 0から9のようなテストパケットを送信するLoRaサーバーとして機能するようにArduinoをプログラムします。同じことを行うための完全なコードは、いつものようにこのページの下部にあります。ここでは、プログラムのいくつかの重要な行について説明します。
プログラムは、SPIプロトコル(デフォルトでインストールされている)をインポートしてSPIプロトコルを使用し、次にラジオヘッドからRH_RF95ライブラリをインポートしてLoRa通信を実行することから始めます。次に、LoRaのチップセレクト(CS)、リセット(RST)、および割り込み(INT)ピンをArduinoに接続したArduinoのピンを定義します。最後に、モジュールが434MHz周波数で動作し、LoRaモジュールを初期化する必要があることも定義します。
#include
セットアップ 機能内で、リセットピンを10ミリ秒ローに引いてLoRaモジュールをリセットし、新しく開始します。次に、レディオヘッドライブラリを使用して以前に作成したモジュールで初期化します。次に、LoRaサーバーの周波数と送信電力を設定します。伝送距離が長いほど、パケットの移動距離は長くなりますが、消費電力は大きくなります。
void setup() { //シリアルモニターを初期化し ますSerial.begin(9600); // LoRaモジュールをリセットpinMode (RFM95_RST、OUTPUT); digitalWrite(RFM95_RST、LOW); delay(10); digitalWrite(RFM95_RST、HIGH); delay(10); // LoRaモジュール を 初期化しますwhile(!rf95.init()){ Serial.println( "LoRa radio init failed"); while(1); } //デフォルトの周波数を434.0MHzに設定 if(!rf95.setFrequency(RF95_FREQ)){ Serial.println( "setFrequency failed"); while(1); } rf95.setTxPower(18); // Loraモジュールの送信能力 }
無限 ループ 関数の内部では、LoRaモジュールを介してデータパケットを送信するだけです。このデータは、ユーザーコマンドのセンサー値のようなものにすることができます。ただし、簡単にするために、1秒間隔ごとにchar値0〜9を送信し、9に達した後に値を0に初期化します。値はchar配列形式でのみ送信でき、データのタイプはunit8_tである必要があります。一度に1バイトです。同じことを行うためのコードを以下に示します
void loop() { Serial.print( "Send:"); char radiopacket = char(value)}; rf95.send((uint8_t *)radiopacket、1); delay(1000); 値++; if(value> '9') value = 48; }
RaspberryPiとArduino間のLoRa通信のテスト
これで、ハードウェアとプログラムの両方の準備ができたので、ArduinoコードをUNOボードにアップロードするだけで、Pythonスケッチをpiで起動する必要があります。両方のハードウェアを接続した状態でのテストセットアップは、次のようになります。
pythonクライアントスケッチがPiで起動されると(python 3のみを使用)、すべてが正常に機能している場合は、シェルウィンドウを介してpiで受信されたArduinoパケットが表示されます。下の画像に示すように、「Received:0」から9に気付くはずです。
必要なすべてのライブラリを含む完全なRaspberrypiコードは、ここからダウンロードできます。
これで、Arduinoサーバーを移動して、モジュールの範囲を確認できます。必要に応じて、シェルにRSSI値を表示することもできます。プロジェクトの完全な動作は、以下にリンクされているビデオで見つけることができます。これで、ArduinoとRaspberry piの間で長距離の低電力LoRa通信を確立する方法がわかったので、Arduino側にセンサーを追加し、Pi側にクラウドプラットフォームを追加して、完全なIoTパッケージを作成できます。
あなたがプロジェクトを理解し、それを構築することを楽しんだことを願っています。それを機能させるのに問題がある場合は、以下のコメントセクションまたは他の技術的な質問のためのフォーラムを使用してください。