【はじめに】
しばらく積みボードとなっていたArduinoのMKR WAN 1310を動かしてみました。このボードはLPWAのLoRaを採用しており個人でも長距離通信が手軽に使用でき、屋外で計測した温湿度などの環境データ収集やGPS位置情報の取得に使用すると面白そうですが、2022年の世界的な半導体不足やインフレの影響からMKR WAN 1310の価格が発売当初よりかなり上がったことが残念なボードです。今回はボードの動作確認のため、Arduinoのこちらのチュートリアルを試してみました。
https://docs.arduino.cc/tutorials/mkr-wan-1310/lora-button-press
【必要なもの】
上記tutorialに記載されている通りですが、一点はまりポイントとして、送信機側の消費電流が多いようでPCのUSB給電だけでは動作せず、LiPoバッテリーの接続が必要でした。私の環境によるものかもしれませんが、うまく動かず悩まされたのでご注意ください。
送信機用
・MKR WAN 1310
・GSMダイポールアンテナ
・プッシュボタン
・LiPoバッテリー
受信機用
・MKR WAN 1310
・GSMダイポールアンテナ
・LED および 抵抗
共通
・ブレッドボード
・ジャンパーワイヤー
【配線】
Lipoバッテリーの接続以外はオフィシャルサイトのチュートリアルにある通りです。ごちゃごちゃして見づらいですが実態配線はこの通りです。

【Arduino Sketch】
最重要な点として、LoRaの無線仕様は電波法に従う必要があるため、オフィシャルサイトのチュートリアルのスケッチを日本向けの周波数帯に必ず変更して使用して下さい。周波数に関する箇所は送信側、受信側それぞれ1か所になります。
送信機側
#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も送信側ボタンを押す毎に点灯、消灯のトグル動作をします。参考までに実際に動いているところの動画もご参照下さい。
以上です。
コメント