TTNに接続する
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
TTNに接続する
この章では、TTNプラットフォームの基本的な使用方法と、センサーデータをTTNプラットフォームを通じて中継する方法について説明します。
産業用センサーへのアップグレード可能
SenseCAP S2110コントローラーとS2100データロガーを使用することで、Groveを簡単にLoRaWAN®センサーに変えることができます。Seeedはプロトタイピングを支援するだけでなく、SenseCAPシリーズの堅牢な産業用センサーを使用してプロジェクトを拡張する可能性も提供します。
IP66ハウジング、Bluetooth設定、グローバルLoRaWAN®ネットワークとの互換性、内蔵19Ahバッテリー、そしてアプリからの強力なサポートにより、SenseCAP S210xは産業用途に最適な選択肢となります。このシリーズには、土壌水分、空気温度と湿度、光強度、CO2、EC、そして8-in-1気象ステーション用のセンサーが含まれています。次の成功する産業プロジェクトには、最新のSenseCAP S210xをお試しください。
SenseCAP 産業用センサー | |||
S2100 データロガー | S2101 空気温度 & 湿度 | S2102 光 | S2103 空気温度 & 湿度 & CO2 |
S2104 土壌水分 & 温度 | S2105 土壌水分 & 温度 & EC | S2110 LoRaWAN® コントローラー | S2120 8-in-1 気象ステーション |

TTNに全く慣れていない場合は、まずTTNコンソールについて学ぶことをお勧めします。
TTNの紹介 この章では、TTNコンソールの操作について説明し、TTNコンソールの第一印象を得るための手順を紹介します。 さあ始めましょう > |
このセクションを始める前に、展開環境周辺にTTN LoRaWAN®のカバレッジがあることを確認してください。そうでない場合、LoRa®を介してTTNにデバイスを追加することはできません。詳細については、TTN LoRaWAN®をご覧ください。
Grove - Wio-E5 デバイスをTTNコンソールに追加する
センサーデータをTTNから中継するには、まずGrove - Wio-E5をTTNアプリケーションに追加し、ローカルデバイスとTTNプラットフォーム間の接続を構築する必要があります。
ステップ1. Grove - Wio-E5のDevEUI、AppEUIを取得する。
事前準備でArduinoとWio Terminalの必要な環境をダウンロードしてください。

こちらをクリックして、Grove - Wio-E5に付属するDevEUI、AppEUIを取得するコードをダウンロードし、Wio Terminalにアップロードしてください。
#include <Arduino.h>
#include "disk91_LoRaE5.h"
Disk91_LoRaE5 lorae5(&Serial); // ATコマンドとデバッグトレースが出力される場所
void setup() {
Serial.begin(9600);
uint32_t start = millis();
while ( !Serial && (millis() - start) < 3000 ); // シリアルモニタを開くか、3秒待機
// ライブラリを初期化し、利用可能なWIOポートでWio-E5を検索
if ( ! lorae5.begin(DSKLORAE5_SEARCH_WIO) ) {
Serial.println("Wio-E5 初期化失敗");
while(1);
}
}
void loop() {
// Grove - Wio-E5はDevEUI、AppEUIのクエリを許可しますが、AppKeyは許可しません。
lorae5.sendATCommand("AT+ID=DevEui","","+ID: ERROR","",1000,false,NULL);
lorae5.sendATCommand("AT+ID=AppEUI","","+ID: ERROR","",1000,false,NULL);
delay(30000);
}
Arduino IDEのシリアルポートモニタを開き、ボーレートを9600に設定して設定を確認します。

DevEUIとAppEUIの後に続く16桁の数字をメモしてください。これらはTTNでデバイスを追加する際に使用します。
ステップ2. アプリケーションを追加する
右上のAdd applicationボタンをクリックします。

アスタリスクが付いている項目を入力し、好みに応じて内容を設定してください。

その後、Create Applicationをクリックします。
ステップ3. デバイスを追加する
左側のメニューでEnd devicesに移動し、+ Add end deviceをクリックしてエンドデバイス登録ページに進みます。

デバイスリポジトリでGrove - Wio-E5を使用するには、From the LoRaWAN® Device Repositoryタブが選択されていることを確認してください。
次に、以下のオプションを選択してください。
- Brand -- SenseCAP
- Model -- LoRa-E5 STM32WLE5JC Module
- Hardware Ver. -- 1.0
- Firmware Ver. -- 1.0
- Profile (Region) -- 地域に適した周波数プランを選択してください。

地域に適した周波数プランを選択してください。デバイスとゲートウェイは同じ周波数プランを使用して通信する必要があります。異なる地域では異なる周波数プランが使用されます。例: ヨーロッパでは863-870 MHz、北米では902-928 MHzなど。
ここでは、使用しているTTNゲートウェイバンドとしてEU868を選択します。
次に、先ほど取得したDevEUIとAppEUIをTTNの対応するフィールドに入力してください。

AppKeyについては、Generateボタンをクリックし、以下のコードを使用してWio TerminalにアップロードしてGrove - Wio-E5を有効にします。
TTNによって生成された32ビットのAppKeyをコード内の内容に置き換えてください。
lorae5.sendATCommand("AT+KEY=APPKEY,\"2B7E151628XXXXXXXXXX158809CF4F3C\"","","+KEY: ERROR","",1000,false,NULL);
以下は完全なコードです。
#include <Arduino.h>
#include "disk91_LoRaE5.h"
Disk91_LoRaE5 lorae5(&Serial); // ATコマンドとデバッグトレースが出力される場所
void setup() {
Serial.begin(9600);
uint32_t start = millis();
while ( !Serial && (millis() - start) < 3000 ); // シリアルモニタを開くか、3秒待機
// ライブラリを初期化し、利用可能なWIOポートでWio-E5を検索
if ( ! lorae5.begin(DSKLORAE5_SEARCH_WIO) ) {
Serial.println("Wio-E5 初期化失敗");
while(1);
}
}
void loop() {
// Grove - Wio-E5はDevEUI、AppEUIのクエリを許可しますが、AppKeyは許可しません。
lorae5.sendATCommand("AT+KEY=APPKEY,\"2B7E151628XXXXXXXXXX158809CF4F3C\"","","+KEY: ERROR","",1000,false,NULL);
delay(30000);
}

これで、Grove - Wio-E5とTTNの3つのコードが設定されました。Register end deviceをクリックするだけです。

異なるセンサー用のデコーダー関数の作成
前のセクションでは、キット内の個々のセンサーの値をWio Terminalを使用して読み取る方法を説明しました。Grove - Wio-E5を介してセンサー値をTTNに送信するには、ATコマンドを使用する必要があります。送信されたデータはTTNで受信され、実際に読み取れるデータになる前にデコードする必要があります。このためにデコーダーを作成しました。
また、送信されるデータ形式が一様ではなく、センサーによっては整数、浮動小数点、正負のデータなどが含まれるため、各センサーに必要なデコーダーコードは異なります。
センサータイプ | ダウンロードアドレス |
---|---|
Wio Terminal 内蔵光センサー | ダウンロード |
Wio Terminal 内蔵IMUセンサー | ダウンロード |
土壌湿度センサー | ダウンロード |
VOCおよびeCO2ガスセンサー (SGP30) | ダウンロード |
温湿度センサー (SHT40) | ダウンロード |
Vision AI モジュール | ダウンロード |
オプション 1. Wio Terminal 光センサーデータデコーダー
前のセクションWio Terminal 光センサーでは、光センサーで読み取った光の値を整数変数light
に格納し、その値をsend_sync()関数を使用して送信しました。そのため、TTNで作成したデコーダーの目的は、この整数データを解析できるようにすることです。
以下はデコーダーの設定コードです。このコードをTTNのコードセクションに貼り付けてください。Save Functionをクリックしてこのデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
if (port == 8) {
decoded.light = bytes[0]<<8 | bytes[1];
}
return decoded;
}
デバイスのPayload formatters --> Uplink --> Custom Javascript formatterを順にクリックしてください。
その後、上記のデコーダーコードをFormatter codeに貼り付けます。

右側のTestウィンドウで8ビット光センサーのデータを入力し、デコーダーが正しく解析するかどうかを確認できます。

オプション 2. Wio Terminal IMUセンサーデータデコーダー
前のセクションWio Terminal IMUセンサーでは、IMUから返される3軸のデータを浮動小数点数x_values
、y_values
、z_values
に格納し、これらのデータを100倍して整数に変換してから一緒に送信しました。
特に注意すべき点は、これらのデータは正負の値を取る可能性があるため、これを解析して浮動小数点数に戻す必要があることです。
以下はデコーダーの設定コードです。このコードをTTNのコードセクションに貼り付けてください。Save changesをクリックしてこのデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
if (value >= 32768) {
value = 32768 - value;
}
value = value/100.0;
return value;
}
if (port == 8) {
decoded.x = transformers(bytes.slice(0,2));
decoded.y = transformers(bytes.slice(2,4));
decoded.z = transformers(bytes.slice(4,6));
}
return decoded;
}
右側のTestで48ビットIMUセンサーのデータを入力し、デコーダーが正しく解析するかどうかを確認できます。

オプション 3. Grove 土壌湿度センサーデータデコーダー
前のセクションGrove 土壌湿度センサーでは、土壌湿度センサーで読み取った土壌湿度値を整数変数sensorValue
に格納し、その値をsend_sync()関数を使用して送信しました。そのため、TTNで作成したデコーダーの目的は、この整数データを解析できるようにすることです。
以下はデコーダーの設定コードです。このコードをTTNのコードセクションに貼り付けてください。Save changesをクリックしてこのデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
if (port == 8) {
decoded.soil = bytes[0]<<8 | bytes[1];
}
return decoded;
}
右側のTestで8ビット土壌湿度センサーのデータを入力し、デコーダーが正しく解析するかどうかを確認できます。

オプション 4. Grove VOCおよびeCO2ガスセンサー (SGP30) データデコーダー
前のセクション Grove VOC and eCO2 Gas Sensor (SGP30) では、整数変数 tvoc_ppb
と co2_eq_ppm
を使用して VOC と eCO2 の値を格納しました。
そのデコーダーの設定コードは以下の通りです。このコードを TTN のコードセクションに貼り付けてください。Save changes をクリックしてデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
return value;
}
if (port == 8) {
decoded.voc = transformers(bytes.slice(0,2));
decoded.eco2 = transformers(bytes.slice(2,4));
}
return decoded;
}
右側の Test に 16 ビットの SGP30 のデータを入力して、デコーダーが正しく解析するか確認できます。

オプション 5. Grove Temp&Humi Sensor (SHT40) データデコーダー
前のセクション Grove Temp&Humi Sensor (SHT40) では、浮動小数点変数 temperature
と humidity
を使用して温度と湿度の値を格納しました。そして、これらの値を 100 倍に拡大して整数として送信しました。
そのデコーダーの設定コードは以下の通りです。このコードを TTN のコードセクションに貼り付けてください。Save changes をクリックしてデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
if (value >= 32768) {
value = 32768 - value;
}
value = value/100.0;
return value;
}
if (port == 8) {
decoded.temp = transformers(bytes.slice(0, 2));
decoded.humi = transformers(bytes.slice(2, 4));
}
return decoded;
}
右側の Test に 32 ビットの SHT40 のデータを入力して、デコーダーが正しく解析するか確認できます。

オプション 6. Grove Vision AI Module データデコーダー
前のセクション Grove Vision AI Module では、整数変数 model
と confi
を使用して識別されたモデルの種類とその信頼度を格納しました。
そのデコーダーの設定コードは以下の通りです。このコードを TTN のコードセクションに貼り付けてください。Save changes をクリックしてデコーダーを保存します。
function Decoder(bytes, port) {
var decoded = {};
function transformers(bytes){
value = bytes[0] * 256 + bytes[1];
return value;
}
if (port == 8) {
decoded.model = transformers(bytes.slice(0,2));
decoded.confidence = transformers(bytes.slice(2,4));
}
return decoded;
}
右側の Test に 16 ビットの Vision AI のデータを入力して、デコーダーが正しく解析するか確認できます。

TTNにデータを送信するコードのアップロード
各センサーのページでは、データをアップロードするための詳細なコードを提供しています。以下のリストから使用したいセンサーコードを見つけることもできます。
このセクションで提供されているコードを使用する前に、コード内のDevice EUI、App EUI、およびApp KeyがTTNに追加されたデバイス情報と一致していることを確認してください。また、Grove - Wio-E5に設定された周波数帯が、地域やTTNのゲートウェイ帯域と一致しているか確認してください。これを怠ると、ネットワークへのアクセスに失敗する可能性があります。
LoRaWAN®帯域を設定するコードは以下の通りです。デフォルト設定はEU868帯域です。(EU868帯域はヨーロッパ地域で一般的に使用されます。)
#define Frequency DSKLORAE5_ZONE_EU868
US915帯域(US915帯域は北米で一般的に使用されます。)
#define Frequency DSKLORAE5_ZONE_US915
AU915帯域(AU915帯域はオーストラリア地域で一般的に使用されます。)
#define Frequency DSKLORAE5_ZONE_AU915
センサータイプ | ダウンロードアドレス |
---|---|
Wio Terminal内蔵光センサー | ダウンロード |
Wio Terminal内蔵IMUセンサー | ダウンロード |
土壌湿度センサー | ダウンロード |
VOCおよびeCO2ガスセンサー(SGP30) | ダウンロード |
温湿度センサー(SHT40) | ダウンロード |
Vision AIモジュール | ダウンロード |
上記のセンサー送信データ用コードは、Arduino IDEを使用してWio Terminalに直接アップロードして実行できます。その際、シリアルモニターをオンにし、ボーレートを9600に調整してデータ送信をリアルタイムで観察してください。
詳細については、リファレンスカタログの個別センサー使用セクションに戻ってください。
リアルタイムデータ
Applicationタブで、Live dataをクリックすると、TTNが受信したデータの情報を確認できます。
デコーダーによってデコードされた後のデータ情報を直接確認することができます。

ソースコード解析
このチュートリアルの内容を独自のプロジェクト開発に適用したい場合、コードの意味を理解することが重要です。ここでは、SHT40センサーのコードを例に、コード実装のロジックを説明します。
プログラムの冒頭では、TTNに接続するための必要なトライアド情報を準備し、Wio-E5の周波数を設定する必要があります。
#define Frequency DSKLORAE5_ZONE_EU868
/*
ここで周波数帯域を選択します。
DSKLORAE5_ZONE_EU868
DSKLORAE5_ZONE_US915
DSKLORAE5_ZONE_AS923_1
DSKLORAE5_ZONE_AS923_2
DSKLORAE5_ZONE_AS923_3
DSKLORAE5_ZONE_AS923_4
DSKLORAE5_ZONE_KR920
DSKLORAE5_ZONE_IN865
DSKLORAE5_ZONE_AU915
*/
char deveui[] = "2CF7FXXXXXX0A49F";
char appeui[] = "80000XXXXXX00009";
char appkey[] = "2B7E151628XXXXXXXXXX158809CF4F3C";
次に、data_decord()
関数を定義します。この関数は、センサー値をTTNデコーダーで解析可能なデータフレームに変換し、LoRaWAN®プロトコルに準拠した形式でdata[]
配列に格納します。
一般的に、データのオーバーフローを防ぐため、センサーが読み取る可能性のある最大値と最小値を考慮し、オーバーフローしない16進数に分割します。
void data_decord(int val_1, int val_2, uint8_t data[4])
{
int val[] = {val_1, val_2};
for(int i = 0, j = 0; i < 2; i++, j += 2)
{
if(val[i] < 0)
{
val[i] = ~val[i] + 1;
data[j] = val[i] >> 8 | 0x80;
data[j+1] = val[i] & 0xFF;
}
else
{
data[j] = val[i] >> 8 & 0xFF;
data[j+1] = val[i] & 0xFF;
}
}
}
SHT40センサーの場合、温度データと湿度データの2つのデータがあり、正負の値が存在するため、負の数値を処理する必要があります。また、小数点以下の値も処理する必要があります。
int_temp = temperature*100;
int_humi = humidity*100;
次のステップは、SHT40の初期化とWio-E5の初期設定です。これらはすべてsetup()
関数内で実行されます。
lorae5.begin(DSKLORAE5_SWSERIAL_WIO_P2)
初期化コードでは、DSKLORAE5_SWSERIAL_WIO_P2
はWio Terminalの右側のGroveインターフェースを表し、DSKLORAE5_SWSERIAL_WIO_P1
は左側のGroveインターフェースを表します。外部センサーがないプロジェクトの場合、DSKLORAE5_SEARCH_WIO
を使用することもでき、これによりWio-E5が接続されているGroveインターフェースを自動的に検索します。
lorae5.send_sync( // センサー値を送信
8, // LoRaWanポート
data, // データ配列
sizeof(data), // データサイズ
false, // ACKを期待しない
7, // スプレッドファクター
14 // 送信出力(dBm)
)
send_sync()
関数の重要な役割は、センサー値を LoRaWAN® を介して送信することです。最初のパラメータはデータを送信するチャネル番号を示し、2番目のパラメータは送信するデータの内容を示し、3番目のパラメータは送信するデータの長さを示します。一般的に、最初の3つのパラメータの内容に注目するだけで十分です。
delay(15000);
プログラムの最後にある delay は、データを送信する頻度を決定します。10秒未満の頻度で送信することは推奨しません。あまりにも高頻度で送信すると、Wio-E5 が正常に動作しなくなる可能性があり、TTN によって異常なデバイスと認識され、ブロックされる可能性があります。
Grove - Wio-E5 のコードや機能についてさらに詳しく知りたい場合は、リポジトリの GitHub リンク を参照してください。Grove - Wio-E5 用のライブラリを作成してくださった Paul Pinault (disk91) に特別な感謝を申し上げます。
今後のコンテンツもお楽しみに!
技術サポート & 製品に関する議論
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。
声明
- LoRa® マークは Semtech Corporation またはその子会社の商標です。
- LoRaWAN® は LoRa Alliance® からライセンスを受けて使用されているマークです。