ARDUINO MKR WAN 1310のtutorialで動作確認の手順を紹介します

ARDUINO

はじめに

しばらく積みボードとなっていたArduinoのMKR WAN 1310を動かしてみました。

このボードはLPWAのLoRaを採用しており通信業社との契約の必要もなく、個人で長距離通信を手軽に使用することができ、農場で計測した温湿度の環境データや駐車場に停めている車に搭載してGPS位置情報の取得に使用すると面白そうです。

ただし、2022年の世界的な半導体不足やインフレの影響から価格が発売当初よりかなり上がったことが残念なボードです。

今回はボードの動作確認のため、Arduinoの公式サイトにあるチュートリアルを試してみましたので紹介します。

必要なもの

tutorialに記載されている通りの材料で問題は無さそうですが、一点はまりポイントとして、送信機側の消費電流が多いようでPCのUSB給電だけでは動作せず、LiPoバッテリーの接続が必要でした。

私の開発環境に依存したものかもしれませんが、数日間うまく動かず悩まされたのでご紹介します。

送信機用パーツ

1.Arduino MKR WAN 1310
2.GSM用ダイポールアンテナ
3.プッシュボタン

4.LiPoバッテリー

受信機用パーツ

5.Arduino MKR WAN 1310  
6.GSM用ダイポールアンテナ
7.LED および 抵抗

共通パーツ

8.ブレッドボード

9.ジャンパーワイヤー

配線

Lipoバッテリーの接続以外はオフィシャルサイトのLoRa® LED Control with MKR WAN 1300にある通りで特に難しい点はありません。
下の写真ではごちゃごちゃとして少々見づらいですが実態配線はこの通りです。

Arduino Sketch

最重要な点として、日本国内でLoRa使用する場合は、無線仕様が電波法(ARIB STD-T108)に準拠していなければならないため、オフィシャルサイトのチュートリアルのスケッチを日本向けの周波数帯に必ず変更して使用して下さい。

具体的に日本で利用できる周波数は920.6〜923.4MHzで200Hz毎の15ch分となります。

サンプルスケッチで周波数に関する箇所は送信側、受信側それぞれ1か所になります。
以下のスケッチ例では923MHzに設定しています。

送信機側

#include <SPI.h>
#include <LoRa.h>
int counter = 0;
int button = 2;
int buttonState;
void setup() {
  pinMode(button, INPUT_PULLUP);
  Serial.begin(9600);
  while (!Serial);
  Serial.println("LoRa Sender");
  if (!LoRa.begin(923E6)) { //日本で使用できる周波数帯
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  delay(1000);
}

void loop() {
  buttonState = digitalRead(button);
  if (buttonState == LOW) {
    // send packet
    LoRa.beginPacket();
    LoRa.print("button pressed");
    LoRa.endPacket();
    counter++;
    Serial.print("Sending packet: ");
    Serial.println(counter);
    delay(500);
  }
}

受信機側

#include <SPI.h>
#include <LoRa.h>
String contents = "";
String buttonPress = "button pressed";
bool x;
int led = 2;
void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(9600);
  while (!Serial);
  //Wire.begin();
  Serial.println("LoRa Receiver");
  if (!LoRa.begin(923E6)) { //日本で使用できる周波数帯
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}

void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");
    // read packet
    while (LoRa.available()) {  
      contents += (char)LoRa.read();
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
    Serial.println(contents);
    if(contents.equals(buttonPress)){
      x = !x;
    }
    if(x == true) {
      digitalWrite(led, HIGH);
      Serial.println("led on");
    }
    else {
      digitalWrite(led, LOW);
      Serial.println("led off");
    }
    contents = "";
  }
}

動作確認

送信側のGPIOに接続されたPUSHボタンを押すとGPIOがLOWになった事を検出し、LoRa通信により受信側に文字列”button pressed”を送信するプログラムとなっています。

送信機側のシリアルモニター

受信側はLoRa受信した文字列”button pressed”を画面に表示するとともに、RSSI(受信電界強度)を画面に表示します。同時に受信側に接続しているLEDも送信側ボタンを押す毎に点灯、消灯のトグル動作をします。

受信機側のシリアルモニター

参考までに実際に動いているところの動画もご参照下さい。

おわりに

以上でチュートでの基本的な動作確認ができました。いとも簡単に長距離通信が可能となる事はとても魅力的です。
次回はフィールドテストとして屋外で通信距離実験を試したいと思います。

なお、動画ではシリアルモニターで動作状況を確認するためにPCとUSBケーブルで接続していますが、USBケーブルを抜いてLipo電池のみでの駆動も確認しました。その際、特に電池駆動に関する設定はなく、ケーブルを抜くだけで、送信機側のボタンを押すことで、受信機側のLEDが点灯、消灯のトグル動作をすることを確認しています。

コメント

タイトルとURLをコピーしました