セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2023-11-29 現在

マニュアル

ここでは、製品使用における詳細情報を掲載しています。

1 - TWELITE APPS

信号伝達やシリアル通信など、すぐに使える専用ファームウェア
TWELITE APPS - トワイライトアプリはTWELITEのソフトウエア開発を行わずにそのまま使えるレディメイドソフトウエアです。

1.1 - 親機・中継機アプリ マニュアル

データ集約と通信範囲拡張に。
超簡単!標準アプリやパルアプリなどの TWELITE APPS やact のパケットを受信と中継をするアプリです。

1.1.1 - 親機・中継機アプリ マニュアル

最新版
超簡単!標準アプリやパルアプリなどの TWELITE APPS やact のパケットを受信と中継をするアプリです。

2020年6月以降に出荷される MONOSTICK BLUE や MONOSTICK RED に本アプリがあらかじめインストールされます。

1.1.1.1 - 概要

App_Wingsでできること
TWELITE APPSとactの全てのデータパケットを処理することができ、共通の親機または中継機として使用できます。

機能

  • 超簡単!標準アプリやパル専用アプリなどの TWELITE APPS や act のデータを1つの MONOSTICK で収集可能
  • 16チャンネルで複数システムを個別に運用可能
  • アプリケーションIDの設定することで、同一チャネルに複数システムを混在可能
  • 中継機能で通信範囲拡大

1.1.1.2 - 使用方法

App_Wingsを使用するには

本アプリには 親機モードと中継機モードの 2つのモードがあります。次のページからそれぞれのモードについて説明を行います。

1.1.1.2.1 - 親機モード

親機として使う

1.1.1.2.1.1 - 受信メッセージ

データを受信する

TWELTIE APPSのデータを本アプリですべて同時に受信することができます。

データを受信したときのシリアル出力書式は以下のページをご覧ください。

1.1.1.2.1.1.1 - 超簡単!標準アプリ

超簡単!標準アプリからデータを受信する

相手端末からの状態通知:ステータス0x81

データフォーマット

    
:78811501C98201015A000391000C2E00810301FFFFFFFFFB
 ^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^b^c^de1e2e3e4ef^g
番号バイト数意味データ例内容備考
11送信元の論理デバイスID78送信元の論理デバイスIDは0x78
21コマンドID81IO状態の通知
31パケット識別子15アプリケーションIDより生成される
41プロトコルバージョン0101 で固定
51LQIC92010が最小で255が最大
64送信元のシリアルID8201015A送信元のシリアルIDは201015A
71宛先の論理デバイスID00親機宛
82タイムスタンプ0391約14.3秒1秒で64カウント
91中継フラグ00中継してない※1 参照
a2電源電圧[mV]0C2E3118mV
b1未使用00
c1DI の状態ビット81DI1がON(Low)

DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1がOn(Lowレベル)。

MBSが1だったら定期送信。

d1DI の変更状態ビット03DI1とDI2が変更対象DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1が変更対象。
e11AI1の変換値0116mV※2、※3 参照
e21AI2の変換値FF未使用※2、※3 参照
e31AI3の変換値FF未使用※2、※3 参照
e41AI4の変換値FF未使用※2、※3 参照
ef1AI1~AI4の補正値FF未使用

LSBから順に2ビットずつ補正値、LSB側が AI1、MSB側が AI4

※2、※3 参照

g1チェックサムFB

※1 中継フラグは中継の回数を意味します。中継をしていない時は0になります。 ※2 AD値の復元には以下のように計算します。

AI1[mV] = (e1 * 4 + ef1) * 4 AI2[mV] = (e2 * 4 + ef2) * 4 AI3[mV] = (e3 * 4 + ef3) * 4 AI4[mV] = (e4 * 4 + ef4) * 4

※3 AI は未使用(VCC接続) の場合、対応する e1 ~ e4 値は 0xFF です。‌

任意データの送受信:コマンド0x01

データフォーマット

    
:780100112233AABBCCDD13
 ^1^2^^^^^^^^^^^^^^^3^4
番号バイト数意味データ例内容備考
11送信元の論理デバイスID78送信元の論理デバイスIDは0x78
21コマンドID01任意データの送受信
3Nデータ00112233AABBCCDD
41チェックサム13

1.1.1.2.1.1.2 - リモコンアプリ

リモコンアプリからデータを受信する

相手端末からの状態通知:ステータス0x81

データフォーマット

    :78811202848201015A003FC9000001000100010086
 ^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^^^b^^^c^d^e
  
番号バイト数意味データ例内容備考
11送信元の論理デバイスID78送信元の論理デバイスIDは0x78
21コマンドID81IO状態の通知
31パケット識別子12アプリケーションIDより生成される
41プロトコルバージョン0202 で固定
51LQI84132(0が最小で255が最大)
64送信元のシリアルID8201015A送信元のシリアルIDは201015A
71宛先の論理デバイスID00親機宛
82タイムスタンプ3FC9約255.1秒1秒で64カウント
91中継フラグ00中継してない※1 参照
a2DI の状態ビット0001DI1がON(Low)

LSBからDI1、DI2…
1がOn(Lowレベル)。

b2DI の変更状態ビット0001DI1が変更対象

LSBからDI1、DI2…
1が変更対象。

c2DIの割込状態ビット0001DI1が割り込み入力された(変化した)。
d1未使用00
e1チェックサム86

※1 中継フラグは中継の回数を意味します。中継をしていない時は0になります。

1.1.1.2.1.1.3 - シリアル通信アプリ

シリアル通信アプリからデータを受信する

簡易書式

データフォーマット

    
:780100112233AABBCCDD13
 ​^1^2^^^^^^^^^^^^^^^3^4
番号バイト数意味データ例内容備考
11送信元の論理デバイスID78送信元の論理デバイスIDは0x78
21応答ID01任意の0x00~0x7Fの値
3Nデータ00112233AABBCCDD
41チェックサム01

拡張書式

データフォーマット

    
:78A0028201015AFFFFFFFFA8000700112233AABBCCC6
​ ^1^2^3^^^^^^^4^^^^^^^5^6^^^7^^^^^^^^^^^^^8^9
番号バイト数意味データ例内容備考
11送信元の論理デバイスID78送信元の論理デバイスIDは0x78
21コマンド種別A0拡張形式0xA0固定
31応答ID02任意の0x00~0x7Fの値
44送信元のシリアルID8201015A送信元のシリアルIDは201015A
54送信先のシリアルIDFFFFFFFFFFFFFFFFのときは論理デバイスIDを指定して送信している。
61LQIA81680が最小で255が最大
72データのバイト数00077バイト
8Nデータ00112233AABBCC
91チェックサムC6

1.1.1.2.1.1.4 - 無線タグアプリ

無線タグアプリからデータを受信する

以下は、主なセンサー接続時のデータの出力例です。

アナログセンサ―

    :80000000B700628201015A0010DF08FD09A300000000E9
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^^^^^^^a^b
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し中継していない場合は80000000
21LQIB71680が最小で255が最大
32続き番号006298
44送信元のシリアルID8201015A送信元のシリアルIDは8201015A
51送信元の論理デバイスID00送信元の論理デバイスIDは00
61センサー種別10アナログセンサー
71電源電圧 [mV]DF3330mV電源電圧の計算方法を参照
82ADC1の電圧08FD2301mV
92ADC2の電圧09A32467mV
a4未使用00000000
b1チェックサムE9

加速度センサー (ADXL34x / TWELITE 2525A)

    :8000000063001781013C850035DF057702F2000000FF96FFF0BB
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^a^^^b^^^c^^^d^e
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し中継していない場合は80000000
21LQI63990が最小で255が最大
32続き番号001723
44送信元のシリアルID81013C85送信元のシリアルIDは1013C85
51送信元の論理デバイスID00送信元の論理デバイスIDは00
61センサー種別35加速度センサー(ADXL34x)
71電源電圧 [mV]DF3330mV電源電圧の計算方法を参照
82ADC1の電圧05771399mV
92ADC2の電圧02F2754mV
a1センサーモード番号00通常モード
b2X軸の加速度00000mg単位はmg*10
c2Y軸の加速度FF96-1060mg単位はmg*10
d2Z軸の加速度FFF0-160mg単位はmg*10
e1チェックサムBB

スイッチ

    :800000009C00118201015A00FEDF000709A300010064
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^a^b^c^d
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し中継していない場合は80000000
21LQI9C1560が最小で255が最大
32続き番号006298
44送信元のシリアルID8201015A送信元のシリアルIDは201015A
51送信元の論理デバイスID00送信元の論理デバイスIDは00
61センサー種別10スイッチ
71電源電圧 [mV]DF3330mV電源電圧の計算方法を参照
82ADC1の電圧00077mV
92ADC2の電圧09A32467mV
a1センサーモード番号00立ち下がり検出モード

0:立ち下り検出モード

1:立ち上り検出モード

b1DI1の状態01ON(Low)1がON(Low)
c1未使用00
d1チェックサム64

電源電圧の計算方法

  • 読み値が170(0xAA)以下の場合
    電源電圧[mV] = 1950+読み値*5

  • 読み値が170(0xAA)より大きいの場合

    電源電圧[mV] = 2800+(読み値-170)*10

1.1.1.2.1.1.5 - パル/キュー/アリアアプリ

パル/キュー/アリアアプリからデータを受信する

1.1.1.2.1.1.5.1 - パルアプリ

パルアプリからデータを受信する

センサーデータの簡易的な読み方

下記のデータ羅列は、: に始まり改行コードまでの16進数データをテキストで表現したものです。

    :80000000CF7F7382019E3B0180050F003400038135001205040406000000113008020B8611300102042E000000018015044006FFF00010FC1815044106FFF00018FC1815044206FFF00010FC0015044306FFF80000FC1015044406FFF00010FC1815044506FFE00018FBF815044606FFE80000FC0015044706FFE80010FBF815044806FFE80010FC0815044906FFE80010FC080C0E[CR][LF]
  

上記が逐次解釈する書式ですので、厳密に解釈するのが煩雑です。

そのため、以下に使用するセンサーパルごとのデータのある場所とその抽出例のコードを示します。
その際、: を 0 文字目とします。

データの位置の表記法

以下の説明では、データの位置を示す際、Pythonのリストの指定の表記ような以下の書式でご案内します。

    [データの開始位置:データの開始位置+文字数]
  

例えば、15文字目から4文字を指定する場合は、以下のように表記します。

    [15:15+4]
  

開閉センサーパル

開閉センサーパルからのデータを受信すると以下のような出力メッセージがシリアル出力されます。

    :80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E[CR][LF]
  

磁気センサーのデータは63文字目から2文字分です。
磁気センサーは下表の値を出力します。

磁気センサーデータ意味
磁気センサーのデータ意味
00磁石が遠ざかった。
01磁石のN極が近づいた。
02磁石のS極が近づいた。
80磁石が近くにない。(タイマーによる定期送信)
81磁石のN極が近くにある。(タイマーによる定期送信)
82磁石がS極が近くにある。(タイマーによる定期送信)

例えば、磁石が近くにない状態から、磁石(N極)が一定期間センサーの近くにある場合、以下のように磁気センサーの値が変化します。

    80 -- 80 -- 80 -- 01(※) -- 81 -- 81 --
  

※ 多くの場合は磁石のN極を検出したときに01になりますが、設置環境によっては、出力値が一定期間安定せず、02や稀に00が出力される場合があります。

また、磁石が近くにあるかだけ知りたい場合は、64文字目だけ確認し、0だったら磁石が近くにない、1または2の時は磁石が近くにあると判定します。

センサーのデータの抽出例

以下は磁気センサーの状態を抜き出すためのPythonの対話モードでの実行例です。
以下の例では、63文字目と64文字目を抜き出して数値に変換し、上表に従って磁気センサーが検出している状態に変換し、標準出力しております。

    
>>> t = ':80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E'
>>> v = int(t[63:63+2], 16) # 63文字目から2文字取り出し、整数値に変換
>>> periodic = True if (v & 0x80) else False # 定期送信パケットかどうか調べる(Trueだったら定期送信)
>>> status = 'S' if (v & 0x4F) == 2 else 'N' if (v & 0x4F) == 1 else 'Open' # 磁気センサーの状態を取得する。
>>> print('Magnet: %s, %s' % (periodic, status))
Magnet: False, N

アドレスなどのセンサー以外のデータ

出力メッセージは、磁気センサーのデータ以外に以下の情報が含まれております。

    データ位置  データ例   意味
[1:1+8]    80000000  中継機のシリアルID
[9:9+2]    A8        LQI
[11:11+4]  001C      続き番号
[15:15+8]  82012B1E  送信元のシリアルID
[23:23+2]  01        送信元の論理デバイスID
[25:25+2]  80        センサー種別(80で固定)
[27:27+2]  81        PAL基板バージョンとPAL基板ID(開閉センサーパルは81)
  

開閉センサーパルのデータの判別方法

親機・中継機アプリはTWELITE PALからだけではなく、様々なアプリのデータを受信することができるので、出力されたデータがどのアプリのデータか区別する必要があります。

開閉センサーパルの出力メッセージは、改行コード抜きで69文字(改行コードありでは71文字)で、ほかのセンサーパルのデータとは文字数が違うため、文字数で見分けると簡単です。
ただし、シリアル通信アプリなどのように受信メッセージの文字数が決まっていないものもありますので、文字数だけでは見分けられない場合があります。

より厳密に区別するには、文字数と以下の項目を確認してください。

  • 1文字目が8であること
  • 15文字目が8であること
  • 25、26文字目が ‘80’ であること
  • 27、28文字目が ‘81’ であること

環境センサーパル

環境センサーパルからのデータを受信すると以下のような出力メッセージがシリアル出力されます。

    :8000000084811F810EFF6D04808205113008020AEB11300102035A0501000209E3010200020E3A02030004000001BE6C00[CR][LF]
  

温度などのセンサーデータは63文字目から94文字目までに含まれております。
各データの位置やデータ形式は以下の通りです。

    データ位置 意味
[63:63+4] 温度(符号付整数、単位は°Cの100倍(23.56°C→2356))
[75:75+4] 湿度(符号無整数、単位は%の100倍(25.99%→2599))
[87:87+8] 照度(符号無整数、単位はLux)
  

以下は、環境センサーパルのデータを取得するためのPythonの対話モードでの実行例です。
出力メッセージから、温度、湿度、照度の文字列を取り出し、数値に変換します。その際、そのままだと符号無の数値ですので、温度は符号付の数値に変換します。
そのあと、センサーのデータを出力しますが、温度と湿度データは100倍されたデータですので、出力時に100で割った値を出力しています。

    
>>> t = ':8000000084811F810EFF6D04808205113008020AEB11300102035A0501000209E3010200020E3A02030004000001BE6C00'
>>> temp = int(t[63:63+4], 16) # 63文字目から4文字取り出し、整数値に変換
>>> temp = (-65536 + temp) if temp >= 32768 else temp # 符号付き16ビット整数の対応
>>> hum = int(t[75:75+4], 16)
>>> illum = int(t[87:87+8], 16)
>>> print('temperature: %f' % ( temp/100.0 ))
temperature: 25.310000
>>> print('humidity: %f' % ( hum/100.0 ))
humidity: 36.420000
>>> print('illuminance: %d' % illum)
illuminance: 446

アドレスなどのセンサー以外のデータ

出力メッセージは、温湿度、照度センサーのデータ以外に以下の情報が含まれております。

    データ位置  データ例   意味
[1:1+8]    80000000  中継機のシリアルID
[9:9+2]    84        LQI
[11:11+4]  8114      続き番号
[15:15+8]  810EFF6D  送信元のシリアルID
[23:23+2]  04        送信元の論理デバイスID
[25:25+2]  80        センサー種別(80で固定)
[27:27+2]  82        PAL基板バージョンとPAL基板ID(開閉センサーパルは81)
  

環境センサーパルのデータの判別方法

親機・中継機アプリはTWELITE PALからだけではなく、様々なアプリのデータを受信することができるので、出力メッセージがどのアプリの出力か区別する必要があります。

環境センサーパルの出力メッセージは、改行コード抜きで99文字(改行コードありでは101文字)で、ほかのセンサーパルなどのデータとは文字数が違うため、文字数で見分けると簡単です。
ただし、シリアル通信アプリなどのように受信メッセージの文字数が決まっていないものもありますので、文字数だけでは見分けられない場合があります。

より厳密に区別するには、文字数と以下の項目を確認してください。

  • 1文字目が8であること
  • 15文字目が8であること
  • 25、26文字目が ‘80’ であること
  • 27、28文字目が ‘82’ であること

動作センサーパル

動作センサーパルからのデータを受信すると以下のような出力メッセージがシリアル出力されます。

    :80000000BA002382011CEF01808312113008020D0211300102055C1504400600100010045015044106000800100430150442060000001004381504430600080018043015044406000000180458150445060000002004381504460600080018042815044706FFE80010042015044806FFF00010043815044906FFE80018043015044A06FFF80018044015044B06FFF80018041815044C0600000010042015044D0600000028045015044E0600000008043815044F0600000018043828A5[CR][LF]
  

加速度データは63文字目から時系列順でX、Y、Zに並んだ加速度が16個分格納されます。
加速度は、符号付整数で単位はmg(1重力加速度(g)の1/1000)です。
*データが12文字、ヘッダが8文字で、20文字ごとにデータが並びます。

    データ位置    データ例      意味
[63:63+12]   001000100450 データ1 0010(X軸)/0010(Y軸)/0450(Z軸)
[83:83+12]   000800100430 データ2 0008(X軸)/0010(Y軸)/0430(Z軸)
[103:103+12] 000000100438 ...
[123:123+12] 000800180430
[143:143+12] 000000180458
[163:163+12] 000000200438
[183:183+12] 000800180428
[203:203+12] FFE800100420
[223:223+12] FFF000100438
[243:243+12] FFE800180430
[263:263+12] FFF800180440
[283:283+12] FFF800180418
[303:303+12] 000000100420
[323:323+12] 000000280450
[343:343+12] 000000080438
[363:363+12] 000000180438 データ16
  

以下は、1サンプル目の加速度を取得するためのPythonの対話モードでの実行例です。
出力メッセージから、1サンプル目の加速度の文字列を取り出し、数値に変換します。その際、そのままだと符号無の数値ですので、符号付の数値に変換します。
変換後、加速度データを出力します。

    
>>> t = ':80000000BA002382011CEF01808312113008020D0211300102055C1504400600100010045015044106000800100430150442060000001004381504430600080018043015044406000000180458150445060000002004381504460600080018042815044706FFE80010042015044806FFF00010043815044906FFE80018043015044A06FFF80018044015044B06FFF80018041815044C0600000010042015044D0600000028045015044E0600000008043815044F0600000018043828A5'
>>> x = int(t[63:63+4], 16) # 63文字目から4文字取り出し、整数値に変換(X軸)
>>> x = (-65536 + x) if x >= 32768 else x # 符号付き16ビット整数の対応
>>> y = int(t[67:67+4], 16) # 67文字目から4文字取り出し、整数値に変換(Y軸)
>>> y = (-65536 + y) if y >= 32768 else y # 符号付き16ビット整数の対応
>>> z = int(t[71:71+4], 16) # 63文字目から4文字取り出し、整数値に変換(Z軸)
>>> z = (-65536 + z) if z >= 32768 else z # 符号付き16ビット整数の対応
>>> print('x:%d, y:%d, z:%d' % ( x, y, z ))
x:16, y:16, z:1104

アドレスなどのセンサー以外のデータ

出力メッセージは、加速度センサーのデータ以外に以下の情報が含まれております。

    データ位置  データ例   意味
[1:1+8]    80000000  中継機のシリアルID
[9:9+2]    BA        LQI
[11:11+4]  0023      続き番号
[15:15+8]  82011CEF  送信元のシリアルID
[23:23+2]  01        送信元の論理デバイスID
[25:25+2]  80        センサー種別(80で固定)
[27:27+2]  83        PAL基板バージョンとPAL基板ID(開閉センサーパルは81)
  

動作センサーパルのデータの判別方法

親機・中継機アプリはTWELITE PALからだけではなく、様々なアプリのデータを受信することができるので、出力メッセージがどのアプリのデータか区別する必要があります。

動作センサーパルの出力メッセージは、改行コード抜きで379文字(改行コードありでは381文字)で、ほかのセンサーパルなどのデータとは文字数が違うため、文字数で見分けると簡単です。
ただし、シリアル通信アプリなどのように出力メッセージの文字数が決まっていないものもありますので、文字数だけでは見分けられない場合があります。

より厳密に区別するには、文字数と以下の項目を確認してください。

  • 1文字目が8であること
  • 15文字目が8であること
  • 25、26文字目が ‘80’ であること
  • 27、28文字目が ‘83’ であること

出力例

以下は、パルごとのデータの出力例です。

開閉センサーパル

    :80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8​^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^n^o^p
 0                   10                  20                  30
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQIA8168
32続き番号001C28
44送信元のシリアルID82012B1E送信元のシリアルIDは2012B1E
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID81開閉センサーパル Ver.1
81センサーデータの数033つ
91各種情報ビット値11

拡張バイトあり
符号なしShort型

a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D0C3340mV
e1各種情報ビット値11

拡張バイトあり
符号なしShort型

f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ03E4996mV
j1各種情報ビット値00

拡張バイトなし

符号なしChar型

k1データソース00磁気
l1拡張バイト000
m1データ長011バイト
n1データ01磁石(N極)が近づいた

00: 磁石が離れた。
01: N極が近づいた
02: S局が近づいた
80: 変化なし(磁石なし)
81: 変化なし(N極が近くにある)
82: 変化なし(S極が近くにある)

o1チェックサム1EC
p1チェックサム26E

環境センサーパル

    ​:8000000084811F810EFF6D04808205113008020AEB11300102035A0501000209E3010200020E3A02030004000001BE6C00
 ​^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^^^n^o^p^q^r^^^s^t^u^v^w^^^^^^^x^y^z
 0                   10                  20                  30                  40
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQI84132
32続き番号811F33055
44送信元のシリアルID810EFF6D送信元のシリアルIDは810EFF6D
51送信元の論理デバイスID04送信元の論理デバイスIDは04
61センサー種別80
71PAL基板バージョンとPAL基板ID82環境センサーパル Ver.1
81センサーデータの数055つ
91各種情報ビット値11

拡張バイトあり
符号なしShort型

a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0AEB2795mV
e1各種情報ビット値11

拡張バイトあり
符号なしShort型

f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ035A858mV
j1各種情報ビット値05

拡張バイトなし

符号ありShort

k1データソース01温度
l1拡張バイト000
m1データ長022バイト
n2データ09E325.31°C
o1各種情報ビット値01

拡張バイトなし

符号なしShort

p1データソース02湿度
q1拡張バイト000
r1データ長022バイト
s2データ0E3A36.42%
t1各種情報ビット値02

拡張バイトなし

符号ありLong

u1データソース03照度
v1拡張バイト000
w1データ長044バイト
x4データ000001BE446 lux
y1チェックサム16C
z1チェックサム200

動作センサーパル

出力例

    :80000000BA002382011CEF01808312113008020D0211300102055C1504400600100010045015044106000800100430150442060000001004381504430600080018043015044406000000180458150445060000002004381504460600080018042815044706FFE80010042015044806FFF00010043815044906FFE80018043015044A06FFF80018044015044B06FFF80018041815044C0600000010042015044D0600000028045015044E0600000008043815044F0600000018043828A5
 ​^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^^^^^^^^^^^n^o^p^q^r^^^^^^^^^^^s  ...                                                                                                                                                                                                                                                               ^t^u^v^w^^^^^^^^^^^x^y^z
 0                   10                  20                  30                  40                  50                  60                  70                  80                  90                  100                 110                 120                 130                 140                 150                 160                 170                 180
  
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQIBA186
32続き番号002335
44送信元のシリアルID82011CEF送信元のシリアルIDは82011CEF
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID83動作センサーパル Ver.1
81センサーデータの数1218
91各種情報ビット値11

拡張バイトあり
符号なしShort型

a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D023330mV
e1各種情報ビット値11

拡張バイトあり
符号なしShort型

f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ055C1372mV
j1各種情報ビット値15

拡張バイトあり

符号ありShort

k1データソース04加速度
l1拡張バイト40

サンプリング周波数 : 100Hz

0サンプル目

m1データ長066バイト
n2データ001000100450

X : 16mg

Y : 16mg

Z : 1104mg

o1各種情報ビット値15

拡張バイトあり

符号ありShort

p1データソース04加速度
q1拡張バイト41

サンプリング周波数 : 100Hz

1サンプル目

r1データ長062バイト
s2データ000800100430

X : 8mg

Y : 16mg

Z : 1072mg

t1各種情報ビット値15

拡張バイトあり

符号ありShort

u1データソース04加速度
v1拡張バイト4F

サンプリング周波数 : 100Hz

15サンプル目

w1データ長066バイト
x4データ000000180438

X : 0mg

Y : 24mg

Z : 1080mg

y1チェックサム128
z1チェックサム2A5

通知パル

    :80000000C9BBC082014C3501808403113008020D0C1130010203F9120504041000000097C6
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^n^^^^^o^p^q
 0                   10                  20                  30
  
番号バイト数意味データ例データ例の内容備考
14中継機のシリアルID80000000中継無し
21LQICQ186
32続き番号BBC048064
44送信元のシリアルID82014C35送信元のシリアルIDは82014C35
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID84通知パル Ver.1
81センサーデータの数033
91各種情報ビット値11拡張バイトあり 符号なしShort型
a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D0C3340mV
e1各種情報ビット値11拡張バイトあり 符号なしShort型
f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ03F91017mV
j1各種情報ビット値12拡張バイトあり符号なしLong
k1データソース05イベント
l1拡張バイト04加速度によるイベント
m1データ長044バイト
n1データ110イベント0x10(16)が発生

加速度の場合
0x01(1)~0x06(6):さいころ
0x08(8):シェイク
0x10(16):タップ

o3データ20000000将来の拡張用。現在は未使用
p1チェックサム128
q1チェックサム2A5

1.1.1.2.1.1.5.2 - キューアプリ

キューアプリからデータを受信する

TWELITE CUEには加速度センサーと磁気センサーが搭載されており、両方のセンサーのデータも出力メッセージに含まれます。

このページでは出力メッセージからそれらのセンサーデータの読み方について解説します。

センサーデータの簡易的な読み方

下記のデータ羅列は、: に始まり改行コードまでの16進数データをテキストで表現したものです。

    :80000000CF7F7382019E3B0180050F003400038135001205040406000000113008020B8611300102042E000000018015044006FFF00010FC1815044106FFF00018FC1815044206FFF00010FC0015044306FFF80000FC1015044406FFF00010FC1815044506FFE00018FBF815044606FFE80000FC0015044706FFE80010FBF815044806FFE80010FC0815044906FFE80010FC080C0E[CR][LF]
  

上記は逐次解釈する書式ですので、厳密に解釈するのは煩雑です。

そのため、各センサーの値の場所とその抽出例をご説明します。
その際、: を 0 文字目とします。

データの位置の表記法

以下の説明では、データの位置を示す際、Pythonのリストの指定の表記ような以下の書式でご案内します。

    [データの開始位置:データの開始位置+文字数]
  

例えば、15文字目から4文字を指定する場合は、以下のように表記します。

    [15:15+4]
  

加速度

加速度データは103文字目から時系列順でX、Y、Zに並んだ加速度が10個分格納されます。
加速度は、符号付整数で単位はmg(1重力加速度(g)の1/1000)です。
*データが12文字、ヘッダが8文字で、20文字ごとにデータが並ぶ。

    [93:93+2]    80           磁気センサー
[103:103+12] FFF00010FC18 データ1 FFF0(X軸)/0010(Y軸)/FC18(Z軸)
[123:123+12] FFF00018FC18 データ2 FFF0(X軸)/0018(Y軸)/FC18(Z軸)
[143:143+12] FFF00010FC00 ...
[163:163+12] FFF80000FC10
[183:183+12] FFF00010FC18
[203:203+12] FFE00018FBF8
[223:223+12] FFE00018FBF8
[243:243+12] FFE80010FBF8
[263:263+12] FFE80010FC08
[283:283+12] FFE80010FC08 データ10
  

磁気センサー

磁気センサーは93文字目から2文字分です。
磁気センサーは下表の値を出力します。

磁気センサーデータ意味
磁気センサーのデータ意味
00磁石が遠ざかった。
01磁石のN極が近づいた。
02磁石のS極が近づいた。
80磁石が近くにない。(タイマーによる定期送信)
81磁石のN極が近くにある。(タイマーによる定期送信)
82磁石がS極が近くにある。(タイマーによる定期送信)

例えば、磁石が近くにない状態から、磁石(N極)が一定期間センサーの近くにある場合、以下のように磁気センサーの値が変化します。

    80 -- 80 -- 80 -- 01(※) -- 81 -- 81 --
  

※ 多くの場合は磁石のN極を検出したときに01になりますが、設置環境によっては、出力値が一定期間安定せず、02や稀に00が出力される場合があります。

また、磁石が近くにあるかだけ知りたい場合は、94文字目だけ確認し、0だったら磁石が近くにない、1または2の時は磁石が近くにあると判定します。

センサーのデータの抽出例

1サンプル目の加速度と磁気センサーのデータを取得するPythonの対話モードでの実行例です。
シリアルメッセージから、1サンプル目の加速度の文字列を取り出し、数値に変換します。その際、そのままだと符号無の数値ですので、符号付の数値に変換します。
磁気センサーのデータをシリアル出力から抜き出し、上表に従って磁気センサーが検出している状態に変換し、加速度データと磁気センサーの情報を標準出力しております。

    
>>> t =':80000000CF7F7382019E3B0180050F003400038135001205040406000000113008020B8611300102042E000000018015044006FFF00010FC1815044106FFF00018FC1815044206FFF00010FC0015044306FFF80000FC1015044406FFF00010FC1815044506FFE00018FBF815044606FFE80000FC0015044706FFE80010FBF815044806FFE80010FC0815044906FFE80010FC080C0E'
>>> x = int(t[103:103+4], 16) # 103文字目から4文字(データ1のX軸)取り出し整数値へ変換
>>> x = (-65536 + x) if x >= 32768 else x # 符号付き16ビット整数の対応
>>> y = int(t[107:107+4], 16) # 103文字目から4文字(データ1のX軸)取り出し整数値へ変換
>>> y = (-65536 + y) if y >= 32768 else y # 符号付き16ビット整数の対応
>>> z = int(t[111:111+4], 16) # 103文字目から4文字(データ1のX軸)取り出し整数値へ変換
>>> z = (-65536 + z) if z >= 32768 else z # 符号付き16ビット整数の対応
>>> print("x=%d, y=%d, z=%d" % (x, y, z))
x=-16, y=16, z=-1000
>>> v = int(t[93:93+2], 16) # 63文字目から2文字取り出し、整数値に変換
>>> periodic = True if (v & 0x80) else False # 定期送信パケットかどうか調べる(Trueだったら定期送信)
>>> status = 'S' if (v & 0x4F) == 2 else 'N' if (v & 0x4F) == 1 else 'Open' # 磁気センサーの状態を取得する。
>>> print('Magnet: %s, %s' % (periodic, status))
Magnet: True, Open

アドレスなどのセンサー以外のデータ

出力メッセージは、加速度、磁気センサーのデータ以外に以下の情報が含まれております。

    データ位置  データ例   意味
[1:1+8]    80000000  中継機のシリアルID
[9:9+2]    AE        LQI
[11:11+4]  0098      続き番号
[15:15+8]  810B6492  送信元のシリアルID
[23:23+2]  01        送信元の論理デバイスID
[25:25+2]  80        センサー種別(80で固定)
[27:27+2]  05        PAL基板バージョンとPAL基板ID(TWELITE CUEは05)
  

開閉センサーパルのデータの判別方法

親機・中継機アプリはTWELITE PALからだけではなく、様々なアプリのデータを受信することができるので、出力されたデータがどのアプリのデータか区別する必要があります。

TWELITE CUEの出力メッセージは、改行コード抜きで299文字(改行コードありでは301文字)で、ほかのセンサーパルのデータとは文字数が違うため、文字数で見分けると簡単です。
ただし、シリアル通信アプリなどのように受信メッセージの文字数が決まっていないものもありますので、文字数だけでは見分けられない場合があります。

より厳密に区別するには、文字数と以下の項目を確認してください。

  • 1文字目が8であること
  • 15文字目が8であること
  • 25、26文字目が ‘80’ であること
  • 27、28文字目が ‘05’ であること

TWELITE CUEモード

出力例

    :80000000B1001B810B64650180050F003400038135001205040403000000113008020D3411300102052E000000018015044006FC28FFB0001815044106FC28FFB0000815044206FC30FFB0FFF815044306FC30FFC0FFF815044406FC28FFB0000015044506FC38FFA8001015044606FC30FFB0FFF015044706FC30FFB8FFD815044806FC20FFB0000015044906FC40FFA80018A62C
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^9^^^^^^^^^^^^^^^a^^^^^^^b^^^c^^^^^^^d^^^e^^^^^^^f^g^^^^^^^h^^^i^^^j^^^k^^^^^^^l^^^m^^^n^^^o                                                                                                                                                                ^p^q
  
意味バイト数データ例備考
1中継機シリアルID480000000
2LQI1B1
3続き番号2001B
4送信元シリアルID4810B6465
5送信元LID101
6センサー種別180
7PAL IDとPAL Ver105TWELITE CUE
8センサーデータ数10F15
9センサーデータ0700340003813500パケットプロパティ 参照
aセンサーデータ181205040403000000イベント 参照
bセンサーデータ2 (ヘッダ)411300802

2バイト、拡張ビット有
電圧(電源電圧)
詳しくはこちらを参照してください。

cセンサーデータ220D343350mV
dセンサーデータ3 (ヘッダ)411300102

2バイト、拡張ビット有
電圧(ADC1)
詳しくはこちらを参照してください。

eセンサーデータ32052E1432mV
fセンサーデータ4 (ヘッダ)400000001

1バイト拡張ビットなし

ホールIC

詳しくはこちらを参照してください。

gセンサーデータ4180

変化なし、オープン
(00: 磁石が離れた。
01: N極が近づいた
02: S局が近づいた
80: 変化なし(磁石なし)
81: 変化なし(N極が近くにある)
82: 変化なし(S極が近くにある))

hセンサーデータ5 (ヘッダ)415044006

符号あり2バイト、拡張ビット有

加速度(1サンプル目)

詳しくはこちらを参照してください。

iセンサーデータ5(X軸)2FC28X = 392mg
jセンサーデータ5(Y軸)2FFB0Y = -800mg
kセンサーデータ5(Z軸)20018Z = 240mg
lセンサーデータ6 (ヘッダ)415044106

符号あり2バイト、拡張ビット有

加速度(2サンプル目)

詳しくはこちらを参照してください。

mセンサーデータ6(X軸)2FC28X = 176mg
nセンサーデータ6(Y軸)2FFB0Y = -1248mg
oセンサーデータ6(Z軸)20008Z = -96mg
中略
pチェックサム11A61~pの1つ前までのCRC8
qチェックサム212C1~pまでのLRC

パケットプロパティ

    00340003810402
^1^2^3^4^5^6^7
  
意味バイト数データ例備考
1各種情報ビット値100拡張バイトなし、符号なしChar
2データソース134起床要因
3拡張バイト100
4データ長103
5パケットID181

0~127、MSBはイベントがあるかどうか
0もしくは0x80はADC1と電源電圧、イベント以外はデータがないことを示す

6起床要因センサー104

磁気センサー:0x00
温度:0x01
湿度:0x02
照度:0x03
加速度:0x04
DIO:0x31

タイマー:0x35

7起床要因102

送信要因 イベントが発生した:0x00
値が変化した:0x01
値が閾値を超えた:0x02
閾値を下回った:0x03
閾値の範囲に入った:0x04

イベント

    1205040410000000
^1^2^3^4^5^6^7^8
  
意味バイト数データ例備考
1各種情報ビット値112拡張バイトあり、符号なしLong
2データソース105イベント
3拡張バイト104

イベントの発生要因

磁気センサー:0x00
温度:0x01
湿度:0x02
照度:0x03
加速度:0x04

MSBが1の場合はデータ2にデータが存在する。

4データ長104
5データ1110

イベント発生要因が磁気センサーの場合

0x00(0):近くに磁石がない
0x01(1):磁石のN極が近くにある
0x02(2):磁石のS極が近くにある

イベント発生要因が加速度の場合

0x01(1)~0x06(6):さいころ
0x08(8):シェイク
0x10(16):ムーブ

6データ23000000未使用

1.1.1.2.1.1.5.3 - アリアアプリ

アリアアプリからデータを受信する

TWELITE ARIAには温湿度センサーと磁気センサーが搭載されており、両方のセンサーのデータも出力メッセージに含まれます。

このページでは出力メッセージからそれらのセンサーデータの読み方について解説します。

センサーデータの簡易的な読み方

下記のデータ羅列は、: に始まり改行コードまでの16進数データをテキストで表現したものです。

    :80000000CF00028201BAA201800607003400038135001205350401000000113008020D201130010204ED00000001800501000209D0010200020F347934[CR][LF]
  

上記は逐次解釈する書式ですので、厳密に解釈するのは煩雑です。

そのため、各センサーの値の場所とその抽出例をご説明します。
その際、: を 0 文字目とします。

データの位置の表記法

以下の説明では、データの位置を示す際、Pythonのリストの指定の表記ような以下の書式でご案内します。

    [データの開始位置:データの開始位置+文字数]
  

例えば、15文字目から4文字を指定する場合は、以下のように表記します。

    [15:15+4]
  

温湿度センサー

温度などのセンサーデータは103文字目から118文字目までに含まれております。
各データの位置やデータ形式は以下の通りです。

    データ位置   意味
[103:103+4] 温度(符号付整数、単位は°Cの100倍(23.56°C→2356))
[115:115+4] 湿度(符号無整数、単位は%の100倍(25.99%→2599))
  

磁気センサー

磁気センサーは93文字目から2文字分です。
磁気センサーは下表の値を出力します。

磁気センサーデータ意味
磁気センサーのデータ意味
00磁石が遠ざかった。
01磁石のN極が近づいた。
02磁石のS極が近づいた。
80磁石が近くにない。(タイマーによる定期送信)
81磁石のN極が近くにある。(タイマーによる定期送信)
82磁石がS極が近くにある。(タイマーによる定期送信)

例えば、磁石が近くにない状態から、磁石(N極)が一定期間センサーの近くにある場合、以下のように磁気センサーの値が変化します。磁石(N極)が一定期間センサーの近くにある場合、以下のように磁気センサーの値が変化します。

    80 -- 80 -- 80 -- 01(※) -- 81 -- 81 --
  

※ 多くの場合は磁石のN極を検出したときに01になりますが、設置環境によっては、出力値が一定期間安定せず、02や稀に00が出力される場合があります。

また、磁石が近くにあるかだけ知りたい場合は、94文字目だけ確認し、0だったら磁石が近くにない、1または2の時は磁石が近くにあると判定します。

センサーのデータの抽出例

以下は、温湿度と磁気センサーのデータを取得するPythonの対話モードでの実行例です。
出力メッセージから、温度、湿度、照度の文字列を取り出し、数値に変換します。その際、そのままだと符号無の数値ですので、温度は符号付の数値に変換します。
そのあと、センサーのデータを出力しますが、温度と湿度データは100倍されたデータですので、出力時に100で割った値を出力しています。
また、磁気センサーのデータをシリアル出力から抜き出し、上表に従って磁気センサーが検出している状態に変換し、加速度データと磁気センサーの情報を標準出力しております。

    
>>> t = ':80000000CF00028201BAA201800607003400038135001205350401000000113008020D201130010204ED00000001800501000209D0010200020F347934'
>>> temp = int(t[103:103+4], 16) # 63文字目から4文字取り出し、整数値に変換
>>> temp = (-65536 + temp) if temp >= 32768 else temp # 符号付き16ビット整数の対応
>>> hum = int(t[115:115+4], 16)
>>> print('temperature: %f, humidity: %f' % ( temp/100.0, hum/100.0 ))
temperature: 25.120000, humidity: 38.920000
>>> v = int(t[93:93+2], 16) # 93文字目から2文字取り出し、整数値に変換
>>> periodic = True if (v & 0x80) else False # 定期送信パケットかどうか調べる(Trueだったら定期送信)
>>> status = 'S' if (v & 0x4F) == 2 else 'N' if (v & 0x4F) == 1 else 'Open' # 磁気センサーの状態を取得する。
>>> print('Magnet: %s, %s' % (periodic, status))
Magnet: True, Open

アドレスなどのセンサー以外のデータ

出力メッセージは、センサーのデータ以外に以下の情報が含まれております。

    データ位置  データ例   意味
[1:1+8]    80000000  中継機のシリアルID
[9:9+2]    CF        LQI
[11:11+4]  0002      続き番号
[15:15+8]  8201BAA2  送信元のシリアルID
[23:23+2]  01        送信元の論理デバイスID
[25:25+2]  80        センサー種別(80で固定)
[27:27+2]  06        PAL基板バージョンとPAL基板ID(TWELITE ARIAは06)
  

TWELITE ARIAのデータの判別方法

親機・中継機アプリはTWELITE PALからだけではなく、様々なアプリのデータを受信することができるので、出力メッセージがどのアプリの出力か区別する必要があります。

TWELITE ARIAの出力メッセージは、改行コード抜きで123文字(改行コードありでは125文字)で、ほかのセンサーパルなどのデータとは文字数が違うため、文字数で見分けると簡単です。
ただし、シリアル通信アプリなどのように受信メッセージの文字数が決まっていないものもありますので、文字数だけでは見分けられない場合があります。

より厳密に区別するには、文字数と以下の項目を確認してください。

  • 1文字目が8であること
  • 15文字目が8であること
  • 25、26文字目が ‘80’ であること
  • 27、28文字目が ‘06’ であること

TWELITE ARIAモード

出力例

    :80000000CF00028201BAA201800607003400038135001205350401000000113008020D201130010204ED00000001800501000209D0010200020F347934
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^9^^^^^a^^^^^^^b^^^^^^^c^^^^^^^d^^^e^^^^^^^f^^^g^^^^^^^h^i^^^^^^^j^^^k^^^^^^^l^^^m^n^o
  
意味バイト数データ例備考
1中継機シリアルID ​480000000中継されていない場合は80000000
2LQI1CF大きいほど電波品質が良い
3続き番号20002
4送信元シリアルID48201BAA2
5送信元LID101
6センサー種別180TWELITE ARIAは80固定
7PAL ID106TWELITE ARIAモードは06
8センサーデータ数107
9センサーデータ0(ヘッダ)400340003拡張バイトなし、符号なし1バイト、パケットプロパティが3バイト
aセンサーデータ03813500タイマーイベントで送信した
bセンサーデータ1(ヘッダ)412053504拡張バイトあり、符号なしLong、タイマーイベント情報
cセンサーデータ1401000000タイマーが起床させた
dセンサーデータ2(ヘッダ)411300802符号なし2バイト、電源電圧
eセンサーデータ220D203360mV
fセンサーデータ3(ヘッダ)411300102符号なし2バイト、ADC1
gセンサーデータ3204ED1261mV
hセンサーデータ4(ヘッダ)400000001拡張バイトなし、符号なし1バイト、磁気センサー
iセンサーデータ4180

変化なし、オープン
(00: 磁石が離れた。
01: N極が近づいた
02: S局が近づいた
80: 変化なし(磁石なし)
81: 変化なし(N極が近くにある)
82: 変化なし(S極が近くにある))

jセンサーデータ5(ヘッダ)405010002拡張バイトなし、符号あり2バイト、温度
kセンサーデータ5209D025.12°C
lセンサーデータ6(ヘッダ)401020002拡張バイトなし、符号なし2バイト、湿度
mセンサーデータ620F3438.92%
nチェックサム11791~mまでのLRC
oチェックサム21341~nまでのCRC8

1.1.1.2.1.1.5.4 - 出力書式の詳細

パル・キュー・アリアアプリ出力書式の詳細

出力書式

    :80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^​^9^a^b
  
番号バイト数意味データ例備考
14中継機のシリアルID80000000中継していない場合は80000000
21LQIA80が最小で255が最大
32続き番号001C
44送信元のシリアルID82012B1E
51送信元の論理デバイスID01
61センサー種別8080で固定
71PAL基板バージョンとPAL基板ID81
81センサーデータの数03
9Nセンサーデータ113008020D0C1130010203E40000000101センサーデータ 参照
a1チェックサム1EC1~9までのCRC8
b1チェックサム26E1~aまでのLRC

センサーデータ

センサーデータは以下のような構成で表記されます。

    113008020D0C
^1^2^3^4^^^5
  
番号バイト数意味データ例備考
11情報ビット11データの大きさや拡張バイトの有無を保持する
21データソース30センサーの種類
31拡張バイト08データの補足情報が付与される
41データ長02データのバイト数
5Nデータ0D0Cセンサーの実データ

情報ビット

データの型や拡張バイトの有無、読み込みエラーの有無を示すデータです。
読み方は以下の通りです。

ビット位置意味
7読み込みエラーの有無。1だったら読み込みエラー
6-
5-
4拡張バイトの有無。1だったら拡張バイトあり。
3-
2データの符号の有無。1だったら符号あり、もしくはデータ型が可変長
1, 0

データ型。

00 : char(1バイト)

01 : short(2バイト)

10 : long (4バイト)

11 : 可変長

データソース

データの種類を示します。

ID内容
0x00磁気
0x01温度
0x02湿度
0x03照度
0x04加速度
0x05イベント
0x30電圧
0x34パケットプロパティ

拡張バイト

何サンプル目のデータか、ADCの何番目のデータかなどデータの補助的な値が格納されます。

データソース内容
磁気なし
温度なし
湿度なし
照度なし
加速度

7-5ビット:サンプリング周波数。0=25Hz, 1=50Hz, 2=100Hz, 3=190Hz, 4以上=未定義

4-0ビット:サンプリング番号。0が最も古く、31が最も新しい。

イベント

イベントの発生要因を示す。

磁気センサー:0x00, 温度:0x01, 湿度:0x02, 照度:0x03, 加速度:0x04

MSBが1の場合はデータ2にデータが存在する。

電圧

1 : ADC1
2 : ADC2
3 : ADC3
4 : ADC4
8 : 電源電圧

パケットプロパティなし

データ長

データのバイト数を示します。

データ

センサーの実データが格納されています。

データソースバイト数内容数値例 (16進数)数値例の内容
磁気1(符号無1バイト)

0x00=近くに磁石がない
0x01=N極が近い
0x02=S極が近い
0x80= 定期送信ビット(このビットが1の時は定期送信、0の時は磁気センサーの状態が変化したことを示す)

01磁石のN極が近くにある
温度2(符号有2バイト)温度の100倍 (°C)09E325.31°C
湿度2(符号無2バイト)湿度の100倍 (%)0E3A36.42%
照度4(符号無4バイト)照度 (lux)000001BE446 lux
加速度6(符号有2バイト*3)X 軸、Y 軸、Z軸の順でそれぞれの2バイトの重力加速度 (mg)001000100450

X : 16mg

Y : 16mg

Z : 1104mg

イベント4(符号無1バイト+3バイト)

1バイト : イベント内容

・拡張バイトが磁気の場合

0x00(0):近くに磁石がない
0x01(1):磁石のN極が近くにある
0x02(2):磁石のS極が近くにある

・拡張バイトが加速度の場合

0x01(1)~0x06(6):さいころ
0x08(8):シェイク
0x10(16):ムーブ

3バイト : 未使用(将来の拡張用)

01000000

拡張バイトが磁気の場合 : 磁石のN極が近くにある
拡張バイトが加速度の場合 : さいころの1(加速度センサーが上を向いている)

電圧2(符号無2バイト)電圧 (mV)03E4996mV
パケットプロパティ3(符号無1バイト*3)

1バイト : パケットID
0~127、MSBが1の時はイベントあり。
0もしくは128はADC1と電源電圧、イベント以外はデータがないことを示す。

1バイト : 起床要因データソース

磁気センサー:0x00
温度:0x01
湿度:0x02
照度:0x03
加速度:0x04
DIO:0x31

タイマー:0x35

1バイト : 起床要因

送信要因 イベントが発生した:0x00
値が変化した:0x01
値が閾値を超えた:0x02
閾値を下回った:0x03
閾値の範囲に入った:0x04

810402パケットIDが1でイベントあり、起床要因データソースは加速度で、閾値を超えたので起床した。

1.1.1.2.1.1.5.5 - パルアプリ

パルアプリからデータを受信する

出力書式

    
:80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^​^9^a^b
番号バイト数意味データ例備考
14中継機のシリアルID80000000中継していない場合は80000000
21LQIA80が最小で255が最大
32続き番号001C
44送信元のシリアルID82012B1E
51送信元の論理デバイスID01
61センサー種別8080で固定
71PAL基板バージョンとPAL基板ID81
81センサーデータの数03
9Nセンサーデータ113008020D0C1130010203E40000000101センサーデータ 参照
a1チェックサム1EC1~9までのCRC8
b1チェックサム26E1~aまでのLRC

センサーデータ

センサーデータは以下のような構成で表記されます。

    
113008020D0C
^1^2^3^4^^^5
番号バイト数意味データ例備考
11情報ビット11データの大きさや拡張バイトの有無を保持する
21データソース30センサーの種類
31拡張バイト08データの補足情報が付与される
41データ長02データのバイト数
5Nデータ0D0Cセンサーの実データ

情報ビット

データの型や拡張バイトの有無、読み込みエラーの有無を示すデータです。 読み方は以下の通りです。

ビット位置意味
7読み込みエラーの有無。1だったら読み込みエラー
6-
5-
4拡張バイトの有無。1だったら拡張バイトあり。
3-
2データの符号の有無。1だったら符号あり、もしくはデータ型が可変長
1, 0

データ型。

00 : char(1バイト)

01 : short(2バイト)

10 : long (4バイト)

11 : 可変長

データソース

データの種類を示します。

ID内容
0x00磁気
0x01温度
0x02湿度
0x03照度
0x04加速度
0x05イベント
0x30電圧
0x34パケットプロパティ

拡張バイト

何サンプル目のデータか、ADCの何番目のデータかなどデータの補助的な値が格納されます。

データソース内容
磁気なし
温度なし
湿度なし
照度なし
加速度

7-5ビット:サンプリング周波数。0=25Hz, 1=50Hz, 2=100Hz, 3=190Hz, 4以上=未定義

4-0ビット:サンプリング番号。0が最も古く、31が最も新しい。

イベント

イベントの発生要因を示す。

磁気センサー:0x00, 温度:0x01, 湿度:0x02, 照度:0x03, 加速度:0x04

MSBが1の場合はデータ2にデータが存在する。

電圧1 : ADC1
2 : ADC2
3 : ADC3
4 : ADC4
8 : 電源電圧
パケットプロパティなし

データ長

データのバイト数を示します。

データ

センサーの実データが格納されています。

データソースバイト数内容数値例 (16進数)数値例の内容
磁気10x00=近くに磁石がない
0x01=N極が近い
0x02=S極が近い
0x80= 定期送信(この ビットが0の場合は、 磁石までの距離が変化し たことを示す)
01磁石のN極が近くにある
温度2温度の100倍 (℃)09E325.31℃
湿度2湿度の100倍 (%)0E3A36.42%
照度4照度 (lux)000001BE446 lux
加速度6X 軸、Y 軸、Z軸の順でそれぞれの2バイトの重力加速度 (mg)001000100450

X : 16mg

Y : 16mg

Z : 1104mg

イベント4

1バイト : イベント内容

・拡張バイトが磁気の場合

0x00(0):近くに磁石がない
0x01(1):磁石のN極が近くにある
0x02(2):磁石のS極が近くにある

・拡張バイトが加速度の場合

0x01(1)~0x06(6):さいころ
0x08(8):シェイク
0x10(16):ムーブ

3バイト : 未使用(将来の拡張用)

01000000

拡張バイトが磁気の場合 : 磁石のN極が近くにある
拡張バイトが加速度の場合 : さいころの1(加速度センサーが上を向いている)

電圧2電圧 (mV)03E4996mV
パケットプロパティ3

1バイト : パケットID
0~127、MSBが1の時はイベントあり。
0もしくは128はADC1と電源電圧、イベント以外はデータがないことを示す。

1バイト : 起床要因データソース

磁気センサー:0x00
温度:0x01
湿度:0x02
照度:0x03
加速度:0x04
DIO:0x31

タイマー:0x35

1バイト : 起床要因

送信要因 イベントが発生した:0x00
値が変化した:0x01
値が閾値を超えた:0x02
閾値を下回った:0x03
閾値の範囲に入った:0x04

810402パケットIDが1でイベントあり、起床要因データソースは加速度で、閾値を超えたので起床した。

出力例

以下は、パルごとのデータの出力例です。

開閉センサーパル

    
:80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8​^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^n^o^p
 0                   10                  20                  30
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQIA8168
32続き番号001C28
44送信元のシリアルID82012B1E送信元のシリアルIDは2012B1E
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID81開閉センサーパル Ver.1
81センサーデータの数033つ
91各種情報ビット値11拡張バイトあり
符号なしShort型
a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D0C3340mV
e1各種情報ビット値11拡張バイトあり
符号なしShort型
f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ03E4996mV
j1各種情報ビット値00

拡張バイトなし

符号なしChar型

k1データソース00磁気
l1拡張バイト000
m1データ長011バイト
n1データ01磁石(N極)が近くにある
o1チェックサム1EC
p1チェックサム26E

環境センサーパル

    
​:8000000084811F810EFF6D04808205113008020AEB11300102035A0501000209E3010200020E3A02030004000001BE6C00
 ​^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^^^n^o^p^q^r^^^s^t^u^v^w^^^^^^^x^y^z
 0                   10                  20                  30                  40
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQI84132
32続き番号811F33055
44送信元のシリアルID810EFF6D送信元のシリアルIDは810EFF6D
51送信元の論理デバイスID04送信元の論理デバイスIDは04
61センサー種別80
71PAL基板バージョンとPAL基板ID82環境センサーパル Ver.1
81センサーデータの数055つ
91各種情報ビット値11拡張バイトあり
符号なしShort型
a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0AEB2795mV
e1各種情報ビット値11拡張バイトあり
符号なしShort型
f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ035A858mV
j1各種情報ビット値05

拡張バイトなし

符号ありShort

k1データソース01温度
l1拡張バイト000
m1データ長022バイト
n2データ09E325.31℃
o1各種情報ビット値01

拡張バイトなし

符号なしShort

p1データソース02湿度
q1拡張バイト000
r1データ長022バイト
s2データ0E3A36.42%
t1各種情報ビット値02

拡張バイトなし

符号ありLong

u1データソース03照度
v1拡張バイト000
w1データ長044バイト
x4データ000001BE446 lux
y1チェックサム16C
z1チェックサム200

動作センサーパル

出力例

    
:80000000BA002382011CEF01808312113008020D0211300102055C1504400600100010045015044106000800100430150442060000001004381504430600080018043015044406000000180458150445060000002004381504460600080018042815044706FFE80010042015044806FFF00010043815044906FFE80018043015044A06FFF80018044015044B06FFF80018041815044C0600000010042015044D0600000028045015044E0600000008043815044F0600000018043828A5
 ​^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^^^^^^^^^^^n^o^p^q^r^^^^^^^^^^^s  ...                                                                                                                                                                                                                                                               ^t^u^v^w^^^^^^^^^^^x^y^z
 0                   10                  20                  30                  40                  50                  60                  70                  80                  90                  100                 110                 120                 130                 140                 150                 160                 170                 180
番号バイト数意味データ例内容備考
14中継機のシリアルID80000000中継無し
21LQIBA186
32続き番号002335
44送信元のシリアルID82011CEF送信元のシリアルIDは82011CEF
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID83動作センサーパル Ver.1
81センサーデータの数1218
91各種情報ビット値11拡張バイトあり
符号なしShort型
a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D023330mV
e1各種情報ビット値11拡張バイトあり
符号なしShort型
f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ055C1372mV
j1各種情報ビット値15

拡張バイトあり

符号ありShort

k1データソース04加速度
l1拡張バイト40

サンプリング周波数 : 100Hz

0サンプル目

m1データ長066バイト
n2データ001000100450

X : 16mg

Y : 16mg

Z : 1104mg

o1各種情報ビット値15

拡張バイトあり

符号ありShort

p1データソース04加速度
q1拡張バイト41

サンプリング周波数 : 100Hz

1サンプル目

r1データ長062バイト
s2データ000800100430

X : 8mg

Y : 16mg

Z : 1072mg

...
t1各種情報ビット値15

拡張バイトあり

符号ありShort

u1データソース04加速度
v1拡張バイト4F

サンプリング周波数 : 100Hz

15サンプル目

w1データ長066バイト
x4データ000000180438

X : 0mg

Y : 24mg

Z : 1080mg

y1チェックサム128
z1チェックサム2A5

通知パル

    
:80000000C9BBC082014C3501808403113008020D0C1130010203F9120504041000000097C6
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^9^a^b^c^^^d^e^f^g^h^^^i^j^k^l^m^n^^^^^o^p^q
 0                   10                  20                  30
番号バイト数意味データ例データ例の内容備考
14中継機のシリアルID80000000中継無し
21LQICQ186
32続き番号BBC048064
44送信元のシリアルID82014C35送信元のシリアルIDは82014C35
51送信元の論理デバイスID01送信元の論理デバイスIDは01
61センサー種別80
71PAL基板バージョンとPAL基板ID84通知パル Ver.1
81センサーデータの数033
91各種情報ビット値11拡張バイトあり 符号なしShort型
a1データソース30ADC
b1拡張バイト08電源電圧
c1データ長022バイト
d2データ0D0C3340mV
e1各種情報ビット値11拡張バイトあり 符号なしShort型
f1データソース30ADC
g1拡張バイト01ADC1
h1データ長022バイト
i2データ03F91017mV
j1各種情報ビット値12拡張バイトあり符号なしLong
k1データソース05イベント
l1拡張バイト04加速度によるイベント
m1データ長044バイト
n1データ110イベント0x10(16)が発生加速度の場合 0x01(1)~0x06(6):さいころ 0x08(8):シェイク 0x10(16):タップ
o3データ20000000将来の拡張用。現在は未使用
p1チェックサム128
q1チェックサム2A5

1.1.1.2.1.1.6 - アクト

アクトからデータを受信する

データフォーマット

    
:FEAA008201015A00000000B7000F424154310F0CEE000B03FF03FF03FF92
​ ^1^2^3^^^^^^^4^^^^^^^5^6^^^7^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8^9
番号バイト数意味データ例内容備考
11送信元の論理デバイスIDFE送信元の論理デバイスIDは0xFE
21コマンド種別AAアクトのパケット0xAA固定
31応答ID00任意の0x00~0x7Fの値
44送信元のシリアルID8201015A送信元のシリアルIDは201015A
54送信先のシリアルID0000000000000000のときは論理デバイスIDを指定して送信している。
61LQIB71830が最小で255が最大
72データのバイト数000F15バイト
8Nデータ424154310F0CEE000B03FF03FF03FF
91チェックサム92

1.1.1.2.1.2 - 送信コマンド

子機を操作する

コマンドを入力することで子機に対して電波を送信することができます。

送信できるコマンドは以下のページをご覧ください。

1.1.1.2.1.2.1 - 0x90コマンド

TWELITE PALを操作するコマンド
TWELITE PALに対して送信するコマンドです。
    :0190010004000169[CR][LF]
 ^1^2^3^^^^^^^4^5
  
番号バイト数意味データ例備考
11送信先の論理デバイスID01

送信先のTWELITE PALの論理デバイスIDを指定します。
0x01から0x64まで指定可能です。

21コマンド種別90
31コマンドパラメータ数01コマンドパラメータの数を指定します。例えば、コマンドパラメータを1つだけ指定するなら1に、2つ指定するには2にします。
4コマンド数x4コマンドパラメータ00040001

イベントやLEDの色などを指定するためのパラメータを指定します。
詳細はコマンドパラメータを参照してください。

51チェックサム69

1~4の各バイトの和を8ビット幅で計算し2の補数をとります。つまりデータ部の各バイトの総和+チェックサムバイトを8ビット幅で計算すると0になります。
チェックサムバイトをアスキー文字列2文字で表現します。
例えば 00A01301FF123456 では 0x00 + 0xA0 + … + 0x56 = 0x4F となり、この二の補数は0xB1 です。(つまり 0x4F + 0xB1 = 0)
チェックサムをXにすることでチェックサムを省略可能です。

62フッター[CR][LF][CR] (0x0D) [LF] (0x0A) を指定します。ただし、チェックサムをXで省略する場合はフッターも省略可能です。

コマンドパラメータ

4バイトのコマンドパラメータを組み合わせてコマンドを指定します。

0x00:イベントIDを送信する

TWELITE PALは受信したイベントIDごとの振る舞いが設定されております。 本パラメータでは送信先のTWELITE PALにイベントIDを送信し、設定した動作を行います。

番号バイト数内容備考
11コマンドパラメータID0x00
21送信先PAL ID

送信先のPAL IDを指定します。
0x04:通知パル
0xFF:すべてのTWELITE PAL

31未使用領域0x00固定
41イベントID0~16までのイベントIDを指定します。

0x01 : LEDの色、点滅パターン、明るさを送信する

送信先の通知パルにLEDの色、点滅パターン、明るさを送信します。

番号バイト数内容備考
11コマンドパラメータID0x01
21


0:赤
1:緑
2:青
3:黄色
4:紫
5:水色
6:白
7:暖かい白

31点滅パターン

0:常時点灯
1~3:点滅パターン(数値が大きくなるほど点滅が早くなる。)

41明るさ

0:消灯
0x01~0x0F:明るさ(数値が大きいほど明るくなる。)

0x02 : 点灯時間を送信する

通知パルのLEDの点灯時間を送信します。

番号バイト数内容備考
11コマンドパラメータID0x02
21

未使用領域

0xFF固定
31未使用領域0x00固定
41点灯時間秒で指定(0は常時点灯)

0x03:LEDの色をRGBWで指定する

通知パルのLEDの点灯色をRGBWで送信します。

番号バイト数内容備考
11コマンドパラメータID0x03
21

未使用領域

0xFF固定
32LEDの点灯色

LSBからRGBWの順番で4ビットずつ指定する。

数値が大きいほど明るい

0x04:点滅パラメータを指定する。

通知パルのLEDの点滅周期と点滅Dutyを送信します。

番号バイト数内容備考
11コマンドパラメータID0x04
21

未使用領域

0xFF固定
31点滅時間の割合

0x00~0xFFで指定する。

数値が大きいほど1周期当たりの点灯時間が長くなる。

1周期の半分だけ点灯させるには0x7Fを指定する。

41点滅周期

0x00~0xFFで指定する。

設定値が1大きくなるごとに点滅の周期が約0.04sずつ増える。

1周期1秒にするには0x17を指定する。

コマンド例

例1:イベントを送信する

論理デバイスIDが1のNOTICE PALに対してイベント1を送信するコマンド例です。

    :0190010004000169
 ^1^2^3^4^5^6^7^8
  
番号バイト数意味データ例データ例の内容備考
11送信先の論理デバイスID01送信先の論理デバイスIDは0x01
21コマンド種別900x90コマンド90固定
31コマンド数01コマンドは1個
41コマンドID00コマンド00
51送信先PAL ID04通知パルに対して送信する
61未使用領域00
71イベントID01イベント10x00~0x10まで
81チェックサム69

例2:通知パルのLEDの点灯色を送信する

論理デバイスIDが1のNOTICE PALに対して明るさ8で白色にゆっくり点滅させるためのコマンドです。

    :019001010601085E
 ^1^2^3^4^5^6^7^8
  
番号バイト数意味データ例データ例の内容備考
11送信先の論理デバイスID01送信先の論理デバイスIDは0x01
21コマンド種別900x90コマンド90固定
31コマンド数01コマンドは1個
41コマンドパラメータID01コマンドパラメータID 0x01
5106
61点滅パターン01点滅
71明るさ08明るさ80x00~0x0Fまで
81チェックサム5E

例3:通知パルのLEDの点灯色と点灯時間を送信する。

論理デバイスIDが1のNOTICE PALに対して紫に点灯させ、点灯後1秒で消灯させるコマンドです。

    :0190020104000802FF00015E
 ^1^2^3^4^5^6^7^8^9^a^b^c
  
番号バイト数意味データ例データ例の内容備考
11送信先の論理デバイスID01送信先の論理デバイスIDは0x01
21コマンド種別900x90コマンド90固定
31コマンド数02コマンドは2個
41コマンドパラメータID01コマンドパラメータID 0x01
5104
61点滅パターン00点灯
71明るさ08明るさ80x00~0x0Fまで
81コマンドパラメータID02コマンドパラメータID 0x02
91未使用領域FF
a1未使用領域00
b1点灯時間01点灯後1秒で消える
c1チェックサム5E

例4:通知パルに詳細な点灯色送信する。

論理デバイスIDが1のNOTICE PALに対して紫に点灯させるコマンドです。

    :01900103FF0F0459
 ^1^2^3^4^5^^^6^7
  
番号バイト数意味データ例データ例の内容備考
11送信先の論理デバイスID01送信先の論理デバイスIDは0x01
21コマンド種別900x90コマンド90固定
31コマンド数01コマンドは2個
41コマンドパラメータID03コマンドパラメータID 0x03
51未使用FF
62LEDの点灯色0F04青:15、赤4の明るさで点灯させる。

LSBからRGBWの順番で各色4bitずつ(0~15)で指定する。

数値が大きいほど明るい

71チェックサム59

例5:通知パルのLEDの点灯色と点灯時間を送信する。

論理デバイスIDが1のNOTICE PALに対して紫に点灯させ、点灯後1秒で消灯させるコマンドです。

    :0190020104000802FF00015E
 ^1^2^3^4^5^6^7^8^9^a^b^c
  
番号バイト数意味データ例データ例の内容備考
11送信先の論理デバイスID01送信先の論理デバイスIDは0x01
21コマンド種別900x90コマンド90固定
31コマンド数02コマンドは2個
41コマンドパラメータID01コマンドパラメータID 0x01
5104
61点滅パターン00点灯
71明るさ08明るさ80x00~0x0Fまで
81コマンドパラメータID02コマンドパラメータID 0x02
91未使用領域FF
a1未使用領域00
b1点灯時間01点灯後1秒で消える
c1チェックサム5E

1.1.1.2.2 - 中継機モード

中継機として使う
親機モードで受信できるアプリの電波を中継することができます。通信距離を延ばしたり、アクセスポイントとして中継機を使用することができます。

設定例

中継機として使用する場合、以下のようにインタラクティブモードで動作モード(l)を1以上に設定してください。

     a: (AID=0x67720102) Application ID1 [HEX:32bit]
 C: (CHL=18        ) Channels Set
 x: (PWR=      0x03) RF Power/Retry [HEX:8bit]
 b: (UOP=38400,8N1 ) UART Baud [9600-230400]
 o: (OPT=0x00000000) Option Bits [HEX:32bit]
 k: (KEY=0xA5A5A5A5) Encryption Key [HEX:32bit]
 l:$(MOD=         1) Mode (Parent or Router)
 A: (ADR=0x00000000) Access point address [HEX:32bit]
  

詳しい説明は以下のページをご覧ください。

インタラクティブモード

中継方式

TWELITE NETでは無線パケットの中継配送について、大きく分けて下表で示す2つの方式を用意しており、アプリケーションごとに異なります。本アプリでは下表で示すアプリケーションのパケットを識別し、中継することができます。

中継方式対応アプリ
単純ネット超簡単!標準アプリ、リモコンアプリ、シリアル通信アプリ、アクト
中継ネット無線タグアプリ、パルアプリ、キューアプリ

単純ネットを使用した中継

単純ネットを使用するアプリの中継を行う場合、動作モードの値を1以上に設定することで3回まで中継することができます。

例えば、1. のように親機と子機の間に中継機が3台以内であれば親機にデータが届きますが、2. ように中継機が4台以上ある場合は親機にデータが届きません。

  1. 子機 —> 中継機 —> 中継機 —> 中継機 —> 親機
    → 親機が子機のデータを3回中継して受信できる。
  2. 子機 —> 中継機 —> 中継機 —> 中継機 —> 中継機 -x-> 親機
    → 中継4回目で中継することをやめる。

単純ネットによる中継は、基本的に同報通信を使用して通信を行い、受信したパケットをすべて中継を行います。そのため、中継ネットワークを形成、維持するための通信が必要ないという利点がありますが、中継機が増えるほど爆発的に通信量が多くなることがあるという欠点もあります。

詳しくは こちら を参照ください。

中継ネットを使用した中継

中継ネットを使用するアプリのデータを1段の中継を行う場合、動作モードの値を1に設定してしてください。

複数回の中継を行う場合は、親機から遠くなるにつれて動作モードの設定値を大きくしてください。(設定値が昇順になっていれば設定値が飛んでもかまいません。)

本方式の最大中継回数は63回までです。

例1:1回の中継を行う場合
子機 —> 中継機(動作モード:1) —> 親機

例2:2回の中継を行う場合
子機 —> 中継機(動作モード:2) —> 中継機(動作モード:1) —> 親機

例3:3回の中継を行う場合
子機 —> 中継機(動作モード:6) —> 中継機(動作モード:3) —> 中継機(動作モード:1) —> 親機

中継ネットは上り方向の配送を効率的に実施する目的を持って設計されたツリー型ネットワークで、中継機は上位レイヤ(より動作モードの設定値が小さい親機もしくは中継機)を探索し、発見した上位レイヤ1台に対して中継を行います。

そのため、中継機の台数が増えても単純ネットほどは通信量が多くなりにくいですが、接続先を探索、維持するための通信が発生します。

詳しくは こちら をご覧ください。

静的ルーティング(中継先を直接指定)をする場合

中継ネットでの中継を行うときに、下図のような配置を考えた場合、中継機2の接続先は親機もしくは中継機1のどちらかを自動的に選択します。

基本的には、中継する回数が少ない方が親機への配送率が高くなる場合が多いですが、中継機2の接続先として親機が選択されてしまった場合、親機と中継機2の間に障害物があるため、通信品質が悪くなり、親機への配送率が中継機1を経由するときより低くなる可能性が高くなります。

そのため、本アプリには中継機の接続先を TWELITE のシリアル番号で指定する機能 (静的ルーティング機能) があります。

中継ネット

静的ルーティングを行う場合は、中継機2→中継機1への経路を静的にする、または全ての経路を静的に設定します。

すべての経路の設定にはその分だけ設定が多くなり、また、中継機の故障や電波状況の変化といった状況を想定した冗長化に対応できない点がありますが、上位通信先を確定するまでの時間をなくし、速やかに中継動作に移行できる利点があります。

静的ルーティングをするには下表のように中継機1には親機のSID、中継機2には中継機1のSIDになるように接続先を設定してください。

例: 2段中継の場合 (親機 ← 中継機1 ← 中継機2 ← 子機)

TWELITEのSID例接続先(A: Access Point Address)の設定例動作モード(l:Mode)の設定例
親機810F155E-0
中継機1810E18E8810F155E (親機のSID)※1
中継機2810F17FF810E18E8 (中継機1のSID)2

※上図の壁による影響のみに対処したい場合は設定不要です。

1.1.1.3 - インタラクティブモード

App_Wingsのインタラクティブモード

インタラクティブモードでアプリの詳細設定を行うことができます。

インタラクティブモードに入るには、パソコン上のターミナルソフトから + + + と + を3回入力します。+ と + の間には 0.2 秒から 1.0 秒の間隔をあけてください。
また、TWELITE プログラマや TWELITE STAGE には簡単にインタラクティブモードに入れるショートカット機能もありますので、そちらもご利用ください。

インタラクティブモードに入ると以下の画面が表示されます。

    [CONFIG MENU/App_Wings:PARENT:0/v1-00-1/SID=82011098]
a: (AID=0x67720102) Application ID1 [HEX:32bit]
c: (CHL=18        ) Channels Set
x: (PWR=      0x03) RF Power/Retry [HEX:8bit]
b: (UOP=38400,8N1 ) UART Baud [9600-230400]
o: (OPT=0x00000000) Option Bits [HEX:32bit]
k: (KEY=0xA5A5A5A5) Encryption Key [HEX:32bit]
m: (MOD=         0) Mode (Parent or Router)
A: (ADR=0x00000000) Access point address [HEX:32bit]

 [ESC]:Back [!]:Reset System [M]:Extr Menu
  

設定コマンド一覧

コマンド設定項目初期値説明
aアプリケーションID0x67720102

同じアプリケーションID同士のみ通信可能です。 異なった値を設定することにより、同一の周波数チャネルを複数のグループで使用することが可能です。
値は32ビットで任意に設定できます。
通信させたい端末は全て同じアプリケーションIDに設定する必要があります。

本設定を変更することで、TWELITE APPS のほかのアプリのデータを受信することできます。詳しくは [こちら](#TWELITE APPS のアプリケーションIDと周波数チャンネルの初期設定値) をご確認ください。

c周波数チャンネル18

チャネル (11~26) を選択します。複数チャネルを指定した場合は チャネルアジリティにより電波干渉の回避に役立ちます。最大3チャネルまで指定可能です。例えばチャネル 13 とチャネル 22 を使用する場合は 13,22 と入力します。

本設定を変更することで、TWELITE APPS のほかのアプリのデータを受信することできます。詳しくは [こちら](#TWELITE APPS のアプリケーションIDと周波数チャンネルの初期設定値) をご確認ください。

x中継時の送信出力と再送回数03

XYの2桁で指定します。 X : 再送回数で1-9 が指定の回数、0 が再送なし Y : 送信出力を指定します。

3が最強で2,1,0と1段階小さくなるたびに -11.5db 出力が低下します。出力を制限し電波の有効伝達範囲を小さくしたい場合に使用します。ただし、伝達可能距離は環境(ノイズ・遮蔽物など)に影響を受けます。 ※ 理論上の伝達距離は 6db 出力が小さくなるたびに 1/2 になりますので、1段階小さくすることで見通し・環境ノイズ無しでの伝達距離は約1/4になります。

例えば 43 を指定すると再送4回、電波出力最強となります。

bUARTオプション38400,8N1

ボーレートとパリティの設定をカンマで区切って指定することができます。

ボーレートは9600、19200、38400、57600、115200、230400が設定可能です。他の値も設定可能ですが、オシロスコープ等を用いて誤差を検証した上で使用してください。
パリティはN: 無し、O: Odd(奇数)、E: Even(偶数)を設定します。ストップビットは1で固定。ハードウェアフローは設定不可です。また、8N1, 7E2 といったビット数、パリティ、ストップビットの設定が可能ですが、動作検証は 8N1 のみとなります。動作検証以外の設定で利用される場合は、オシロスコープなどで波形を観察し要求を満足するか確認の上利用してください。
設定を反映させるにはオプションビットを設定する必要があります。設定しない場合は設定値は使用されず115200bps固定です。

oオプションビット0x00000000各種詳細設定ができます。オプションビットの説明は以下をご参照ください。
k暗号化鍵0xA5A5A5A532bitの16進数を設定します。
m動作モード0

0は親機モードになります。

1は中継モードになります。
2~63は中継ネットを使用したアプリのパケットを多段中継するときに使用します。詳しくは こちら をご確認ください。

A接続先0x00000000中継機モード時に静的ルーティングをするときの接続する上位段のTWELITEのSIDを指定します。近くに存在しないSIDや下位段のSIDを指定したときは不定となるので指定する場合は必ず存在する上位段のSIDを入力してください。0x00000000の時は自動で上位段を検索し、発見したTWELITEを通信を試みます。
S設定値の保存設定を保存します。
R初期値に設定を戻す続けてS キーによる設定の保存を行ってください。
!モジュールの再起動TWELITEを再起動します。
Mルートメニューへ移行

不具合などがあったときに使用するコマンドです。

技術サポートの指示がない限り、使用しないでください。

オプションビットの設定

オプションビット設定値を各ビットごとに解説します。

設定値(16進)機能説明
0x00000200UARTオプションの適用シリアルのボーレートやパリティの設定を反映させます。
0x00000400定期送信パケットのUART出力の停止超簡単!標準アプリとリモコンアプリの1秒毎の定期送信と連続モード時のUART出力を停止します。
0x00001000暗号化通信の設定暗号化通信を有効にします。(相手側の暗号化設定もしてください。)
0x00002000暗号化通信時の平文受信暗号化通信が有効な時に暗号化していないパケットも受信します。

TWELITE APPS のアプリケーションIDと周波数チャンネルの初期設定値

本アプリが初期設定の時は超簡単!標準アプリと通信できるようになっておりますが、アプリケーション ID と周波数チャンネルを通信相手の TWELITE に合わせることでほかの TWELITE APPS とも通信することができます。下表は TWELITE APPS のアプリケーション ID と周波数チャンネルの初期設定値なので、これを参考に本アプリを設定してください。

TWELITE APPSアプリケーション ID の初期設定値周波数チャンネルの初期設定値
超簡単!標準アプリ (App_Twelite)0x6772010218
リモコンアプリ (App_IO)0x6772010716
シリアル通信アプリ (App_Uart)0x6772010318
無線タグアプリ (App_Tag)0x6772630515
パルアプリ (App_PAL)0x6772630515
キューアプリ (App_CUE)0x6772010218

異なる複数の TWELITE APPS のデータを同時に受信する場合

本アプリは異なる TWELITE APPS の電波が混在していても、アプリケーション ID と周波数チャンネルをそろえていただければ受信することできます。例えば、超簡単!標準アプリの子機とパルアプリの子機がそれぞれある場合に、アプリケーションIDと周波数チャンネルをすべての TWELITE でそろえれば、本アプリがインストールされた TWELITE で子機の電波を受信・中継が可能になります。
その際は、下表の例のように設定を行います。

TWELITE の役割アプリケーション ID の設定例周波数チャンネルの設定例
親機 (App_Wings)0x1234567822
中継機 (App_Wings)0x1234567822
子機1 (App_Twelite)0x1234567822
子機2 (App_PAL)0x1234567822

1.2 - シリアル通信アプリ マニュアル

シリアルでつなぐ。
UART(シリアル)通信の無線伝送に特化したアプリケーションです。

1.2.1 - シリアル通信アプリ マニュアル

最新版

シリアル通信アプリ(App_Uart)は、UART(シリアル)通信に特化したアプリケーションです。UARTはマイコンで一般的に利用されるシリアル通信方式です。

TWELITE UARTには本アプリがあらかじめインストールされており、配線すればすぐにマイコン等で無線通信をすることができます。

ダウンロード

TWELITE STAGE - トワイライトステージ をインストールして、TWELITE STAGEのメニューから[アプリ書換] → [TWELITE APPSビルド&書換] → [App_Uart]を選択してアプリを書換えてください。

1.2.1.1 - ピン割り当て

App_Uartに使用するピン

本解説で使用するピン名は、超簡単!標準アプリの名前定義 (M1-M3, BPS, TX, RX, I1-I4) を用います。以下に各TWELITEの配列を記載します。

ピン配列表(v1.2以降)

TWELITE/TWELITE DIP

※ DIO番号は半導体データシートに基づく信号名で、ピン番号ではありません。TWELITE DIP の場合はピンに記載されるシルクの数字記載が DIO 番号です。

ピン名機能

TWELITE DIO番号
(超簡単!標準アプリと同じ)

M1

親機子機の設定。ソフト上からも設定可能。
オープン: 子機
Lo: 親機

10
M2

子機設定で Lo で中継と設定する(Role=1 または Role=0x12 と等価)。
※ 親機設定で Lo にしないこと。

2
M3ピンが Lo の間スリープする3
EX1

Lo で起動すると UART mode を書式モード(バイナリ形式)に強制する
※標準アプリケーションのAI2ピンです。

0
EX2

未使用
※標準アプリケーションのAI4ピンです。

1
BPSピンが Lo で起動すると、設定したボーレート、パリティ設定で UART を初期化する17
TXUARTの出力 (TX)6
RX

UARTの入力 (RX)
※ 本ピンに Lo > Hi への立下り信号を投入するとスリープ復帰します。

7
RTSUART の RTS 出力 (Hi 時に入力を禁止すると、データ欠落等を抑制できる)5
TX_SUB副UARTの出力 (TX)14
RX_SUB副UARTの入力 (RX)15

※ オープンは Hi レベルでも可。設計上必要と考える場合はプルアップ(10k~100kΩ)してください。
※ Lo は GND レベル。設計上必要と考える場合はプルダウン(100Ω程度)してください。
※ 未使用ピンはオープンにしてください。

TWELITE UART

各部の説明はこちら をご確認ください。

名称機能

TWELITE DIO番号
(超簡単!標準アプリと同じ)

GND電源のマイナス側GND
TXDシリアル出力通信線(相手側はシリアル入力端子に接続)6
PRGGNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移SPIMISO
RXDシリアル入力通信線(相手側はシリアル出力端子に接続)7
RSTGNDに接続するとリセットRESETN
VCC電源のプラス側(2.0V - 3.6V)VCC
SETLo で起動すると UART mode を書式モード(アスキー形式)に強制する11

1.2.1.2 - 使用方法

App_Uartを使用するには
TWELITE UARTの使用方法を3つのステップに分けて説明します。

1.2.1.2.1 - 動作確認

MONOSTICKやTWELITE UARTを使って、PCで動作確認を行うための流れを説明します。
TWELITE UARTやMONOSTICKを使って通信してみましょう。
PCとの接続例

必要なもの

MONOSTICKとTWELITE UARTを使用する場合

  1. TWELITE UART
  2. TWELITE R2
  3. USBケーブル (充電専用不可)
  4. MONOSTICK

TWELITE UARTを2つ使用する場合

  1. TWELITE UART x 2
  2. TWELITE R2 x 2
  3. USBケーブル (充電専用不可) x 2

TWELITE STAGE SDKの準備

まず最初にTWELITE STAGE SDK の最新版をパソコンにインストールします。

MONOSTICKの準備

TWELITE UARTを2つ使用して動作確認をする場合は、ここを読み飛ばしてください。

TWELITE STAGE APPを起動する

1. MONOSTICKをパソコンのUSBポートに接続します。

PCにMONOSTICKを接続した様子

2. インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
・TWELITE_stage.exe(Windows)
・TWELITE_stage.command(macOS)
・TWELITE_stage.run(Linux)
起動するとUSBに接続されたMONOSTICKが画面上に表示されます。

3. シリアルポート選択画面から 1: MONOSTICK を選択してください。

シリアルポート選択画面

4. デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。

トップメニュー画面

シリアル通信アプリを書き込む

通信相手としてMONOSTCK - モノスティック を使用することができます。
以下の手順でシリアル通信アプリをMONOSTICK - モノスティックに書き込んでください。

1. トップメニューから 2:アプリの書換 > 1:BINから選択を選択してください。

アプリ書換画面

2. MONOSTICK BLUE を使用している場合はApp_Uart_BLUE… _を選択し、_MONOSTICK RED _を使用している場合は_App_Uart_RED… を選択してください。

ファームウェア選択画面

3. 書き込み完了後はインタラクティブモードに入らずにESCキーを長押ししてトップメニューに戻ってください。

アプリ書換画面
書換完了画面

4. トップメニューから 1:ビューア> 1: ターミナル を選択します。

ターミナル画面

TWELITE UARTの準備

TWELITE UARTを2つ使用する場合は、以下の作業を2回行ってください。

TWELITE R2と接続する

図のようにTWELITE R2とTWELITE UARTを接続します。

TWELITE R2接続例

接続できたら、TWELITE R2のUSBコネクターに通信ができるUSBケーブルを接続してください。

TWELITE STAGE APPを起動する

1. TWELITE R2に接続されているUSBケーブルをパソコンのUSBポートに接続します。

2. インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
・TWELITE_stage.exe(Windows)
・TWELITE_stage.command(macOS)
・TWELITE_stage.run(Linux)
起動するとUSBに接続されたTWELITE R2が画面上に表示されます。

3. シリアルポート選択画面から1: TWELITE R2を選択してください。

TWELITE R2の選択画面

4. デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。

TWELITE R2のトップメニュー

5. トップメニューから 1:ビューア> 1: ターミナル を選択します。

TWELITE R2のターミナル画面

ターミナルを開くと上図のように出力されます。

通信を確認する

TWELITE UARTにHELLO<Enter>と入力すると、MONOSTICKに補助情報が含まれた形でHELLOが表示されます。TWELITE UARTにも出力が出ますが、これは送信完了を示すメッセージです。

MONOSTICKからも同様にメッセージを送信できます。

    [送信側]
HELLO                                           <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;55; <- 出力

[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;26;       <-出力
  
通信したときのターミナル出力の例

1.2.1.2.2 - 出力書式

実例を交えて書式の変更方法を説明します。
シリアル通信アプリでは、出力の書式を自由に変更することができ、処理しやすい形式にしたり、欲しい付加情報だけを得ることができます。

初期設定

初期モードではインタラクティブモードのh: set header formatを設定することで書式を自由に設定できます。

初期設定では、書式が以下のように設定されています。

    ;U;%t;%i;0x%A;%q;%s;<*>;%X;\n
  

この設定の意味は以下の通りです。

文字内容
%tメッセージを出力したときのシステム時間(秒)
%i

メッセージの送り主の8bit論理アドレス
0-100,120: 子機から

219: 自身から(起動時や送信完了メッセージの場合)

%Aメッセージの送り主のアドレス(32bitロングアドレス、シリアル番号)
%q電波強度 (自身からの場合は000)
%s送信元が設定したメッセージの続き番号
<チェックサム計算開始位置を設定する(設定しない場合は出力の先頭)
*送信文字列
>(無視されます)
%X開始位置から直前までのチェックサムの出力
\nCRLF (0x0d 0x0a) の出力
それ以外の文字そのまま出力

例えば送信側からHELLO<Enter>と入力した場合、出力側からは以下のように出力され、それぞれのデータの意味は下表の通りです。

    ;U;00777;120;0x81025A17;120;013;HELLO;79;
;1;2----;3--;4---------;5--;6--;7----;8-;
  
No.意味
1固定 (データの識別子としてご使用ください。)
2受信側が起動してから777s後に受信した。
3送信機の論理アドレスが120(0x78)
4送信機のシリアル番号が1025A17(先頭の8は通常、読み飛ばします。)
5電波強度が120
6送信機が起動してから13回目の送信データ
7送信データ
8HELLO; のチェックサム (0x48 xor 0x45 xor 0x4C xor 0x4C xor 0x4F xor 0x3B)

出力の設定の詳細については出力のカスタマイズ をご覧ください。

出力の変更例

実際に設定を変更してみましょう。

例えば、Excelで取り扱いやすくするためにカンマ(,)でデータを区切り、付加情報を送信機のシリアル番号と電波強度、続き番号のみにすると設定は以下のようになります。

    --- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
...
 h: set header format [%A,%q,%s,*\n]
...
---
 S: save Configuration
 R: reset to Defaults
  

この設定をし、送信側からHELLO<Enter>と入力した場合、出力側からは以下のように出力されます。

    81025A17,120,013,HELLO
  

1.2.1.2.3 - マイコンとの接続

App_Uartをマイコンと接続する
Arduino Unoと接続して通信を行う例をご紹介します。

シリアル通信を行う

PCからArudinoに入力したシリアルデータをTWELITE UARTを介して、もう一台のArduinoに無線で送信し、そのデータを解釈するサンプルです。

用意する電子部品

以下のものを2セット用意してください。

  1. TWELITE UART
  2. Arduino UNO
  3. 抵抗 2.2kΩ(赤・赤・赤)
  4. 抵抗 3.3kΩ(橙・橙・赤)

配線

Arduinoとの配線

設定

TWELITE UARTをTWELITE R2などを使用して、以下のような設定にしてください。

    --- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
 a: set Application ID (0x67720103)
 i: set Device ID (120=0x78)
 c: set Channels (18)
 x: set RF Conf (3)
 r: set Role (0x0)
 l: set Layer (0x1)
 b: set UART baud (38400)
 B: set UART option (8N1)
 m: set UART mode (E)
 k: set Tx Trigger (sep=0x0d0a, min_bytes=0 dly=0[ms])
 h: set header format [;%A;%q;*;\n]            <- ここを変更(書式の変更)
 C: set crypt mode (0)
 o: set option bits (0x00010100)               <- ここを変更(ボーレートの変更)
---
 S: save Configuration
 R: reset to Defaults
  

サンプルSketch

Arduino IDEを起動させ、以下のプログラムをコピー&ペーストし、Arduinoに書き込んでください。

    
#include <SoftwareSerial.h>

SoftwareSerial MWSerial(2, 3); // RX, TX

#define BLOCK_MAX 10

char *p;
char buf[256];

// データ列を区切り文字で分割してString型の配列に入れる。
int split( char* source, char delimiter, String* result ){
  char* p = source;
  char tmp[81];
  memset(tmp, 0, sizeof(tmp));
  int n = 0;
  int block = 0;

  // ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
  while( *p != 0 && block < BLOCK_MAX ){

    // 区切り文字が来たら、String型に変換する。
    if( *p == delimiter ){
      // 分割したデータが0バイトの時は何もしない。
      if( n > 0 ){
        // 念のためヌル文字を末尾に代入。
        tmp[n] = 0;
        result[block] = String(tmp);
        block++;

        n = 0;
        memset(tmp, 0, sizeof(tmp));
      }
    }else{
      tmp[n] = *p;
      n++;
    }
    p++;
  }

  return block;
}

void setup() {
  Serial.begin(38400);
  MWSerial.begin(38400);

  p = buf;
  memset(buf, 0, sizeof(buf));
}

void loop() {
  while (MWSerial.available()) {
    char before = *p;
    *p = MWSerial.read();

    if( before=='\r' && *p=='\n' ){
      *p = 0;                  // 末尾をNull文字にする
      String str[BLOCK_MAX];   // 区切り文字で分割した文字列を入れる
      int len = p-buf;         // シリアルで読み込んだデータ量の計算
      int block = split( buf, ';', str );  // データの分割

      if( block == 3 ){
        Serial.print("Message: ");
        Serial.println(buf);
        Serial.print("Serial No.: ");
        Serial.println(str[0]);
        Serial.print("LQI: ");
        Serial.println(str[1]);
        Serial.print("Data: ");
        Serial.println(str[2]);
        Serial.println();
      }

      p = buf;
      memset(buf, 0, sizeof(buf));
    }else{
      if( *p >= 0x20 ){
        p++;
      }
    }
  }

  while(Serial.available()){
    MWSerial.write(Serial.read());
  }
}

使用方法

Arduino IDE のシリアルモニターなどを使用して、送信側のArduinoにメッセージを入力(ここではHELLO)すると受信側のArduinoから以下のようなメッセージがシリアル出力されます。

    [送信側]
HELLO                                       <- 入力
Message: ;820109F1;000;12,1,HEL...;         <- 出力
Serial No.: 820109F1                        <- 出力
LQI: 000                                    <- 出力
Data: 12,1,HEL...                           <- 出力

[受信側]
Message: ;820109F1;177;HELLO;               <- 出力
Serial No.: 820109F1                        <- 出力
LQI: 177                                    <- 出力
Data: HELLO                                 <- 出力
  

Sketchの解説

メインループ

下記の関数がシリアル通信の処理を記述したメインループ関数です。

2~30行目ではTWELITEからのシリアル出力を読み込む処理を行っております。
TWELITEからCR+LFが来るまでは内部のバッファに受信したシリアル電文をためておき、CR+LFが来たらsplit()関数で保持していたデータを分割し、PCにシリアル出力します。

32~34行目はPCから来たシリアルデータをそのままTWELITEに送ります。

    
void loop() {
  while (MWSerial.available()) {
    char before = *p;
    *p = MWSerial.read();

    if( before=='\r' && *p=='\n' ){
      *p = 0;                  // 末尾をNull文字にする
      String str[BLOCK_MAX];   // 区切り文字で分割した文字列を入れる
      int len = p-buf;         // シリアルで読み込んだデータ量の計算
      int block = split( buf, ';', str );  // データの分割

      if( block == 3 ){
        Serial.println(buf);
        Serial.print("Serial No.: ");
        Serial.println(str[0]);
        Serial.print("LQI: ");
        Serial.println(str[1]);
        Serial.print("Data: ");
        Serial.println(str[2]);
        Serial.println();
      }

      p = buf;
      memset(buf, 0, sizeof(buf));
    }else{
      if( *p >= 0x20 ){
        p++;
      }
    }
  }

  while(Serial.available()){
    MWSerial.write(Serial.read());
  }
}

文字列を分割する関数

split()は保持しているシリアルデータを区切り文字ごとに分割する関数です。

引数の配列を前から順番に中を確認し、区切り文字になったらそこまでの配列をString型に変換してて保管します。

分割が終わったら、分割した数を戻します。

もとのシリアルデータはString型ではなくchar型の配列で、分割後はString型になりますので、変数の方の取り扱いをご注意ください。

    
int split( char* source, char delimiter, String* result ){
  char* p = source;
  char tmp[81];
  memset(tmp, 0, sizeof(tmp));
  int n = 0;
  int block = 0;

  // ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
  while( *p != 0 && block < BLOCK_MAX ){

    // 区切り文字が来たら、String型に変換する。
    if( *p == delimiter ){
      // 分割したデータが0バイトの時は何もしない。
      if( n > 0 ){
        // 念のためヌル文字を末尾に代入。
        tmp[n] = 0;
        result[block] = String(tmp);
        block++;

        n = 0;
        memset(tmp, 0, sizeof(tmp));
      }
    }else{
      tmp[n] = *p;
      n++;
    }
    p++;
  }

  return block;
}

1.2.1.3 - 通信モード

App_Uartの通信モード
App_Uartの通信の振る舞いを切り替える方法をご案内いたします。

アプリ選択

TWELITE UARTにはあらかじめシリアル通信アプリが書き込まれておりますが、アプリを書き換えて振る舞いを変えることができます。
例えば、TWELITE UARTに親機・中継機アプリ を書き込むことで、TWELITE PALやTWELITE CUEなどの親機としても使用できます。

以降では、デフォルトで書き込まれているシリアル通信アプリを使用する場合の使用方法を説明します。

モード選択

TWELIET UARTではいくつかのモードがありますが、無線の1パケットの範囲で送信するのが効率が良いため、パケットサイズに対応した80バイト以下のデータを単位送信します。

ヘッダ付き透過モード(E)

TWELIET UARTではヘッダ付き透過モード(E)が標準になっています。以下のように送信側にHELLO<Enter>と入力すると受信側に補助情報が含まれた形でHELLOが表示されます。入力側にも出力が出ますが、これは送信完了を示すメッセージです。

    [送信側]
HELLO                                           <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;67; <- 出力

[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;79;       <-出力
  

補助情報には送信元のアドレス情報や受信時の電波強度、チェックサムなどが含められます。また、書式をカスタマイズすることも可能です。

書式モード(A、B)

書式モード(A、B)では、送信コマンドを使用してデータを送信するモードです。このコマンドを送る際にデータ形式をアスキー形式とバイナリ形式の2種類から選択できます。

SETピンをLoにした状態で電源を投入するとアスキー書式モード(A)で起動します。

送信コマンドには論理IDのみを使用した簡易形式と、32bitアドレス指定や様々な送信オプションを設定可能な拡張形式が有り、再送回数やMAC ACKの使用の有無などのオプションを指定可能です。

    [送信側]
:000148454C4C4F8B                            <-入力
:DBA1800103                                  <-出力

[受信側]
:780148454C4C4F13                            <-出力
  

書式モードでは、インタラクティブモードではなくコマンドによる設定も可能です。

詳しくはこちら をご確認ください。

チャットモード(C)

チャットモード(C)では、プロンプトの表示とエコーバック(自身が入力した文字が端末にも表示される)が行われます。全ての無線端末は子機の設定とします。電波到達範囲の全ての端末にメッセージが伝達され複数の端末でチャットできます。

    [送信側]
810A4778:0> Hello                           <-入力
810A4778:1>                                 <-出力

[受信側]
[810A4778:0] Hello                          <-出力
82018CA0:0>                                 <-出力
  

プロンプトに表示されるTWELITEのシリアル番号の代わりにハンドル名を出力することも可能です。

詳しくはこちら をご確認ください。

透過モード(D)

透過モード(D)では、書式を必要としない通信が可能です。エコーバックやプロンプト表示がないためマイコンとの通信に適しています。

    [送信側]
Hello                                       <-入力

[受信側]
Hello                                       <-出力
  

詳しくはこちら をご確認ください。

1.2.1.3.1 - ヘッダ付き透過モード(E)

受信側の出力にヘッダを付加するモード
ヘッダ付き透過モード(E)は、受信側の出力にヘッダを付加するモードです。

TWELIET UARTではヘッダ付き透過モード(E)が標準になっています。

以下のようにして送信側にHELLO<Enter>と入力すると、受信側に補助情報が含まれた形でHELLOが表示されます。入力側にも出力が出ますが、これは送信完了を示すメッセージです。

    [送信側]
HELLO                                           <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;67; <- 出力

[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;79;       <-出力
  

補助情報には送信元のアドレス情報や受信時の電波強度、チェックサムなどが含められます。また、書式をカスタマイズすることも可能です。

送信可能データ長

無線の1パケットの範囲で送信するのが効率が良いため、パケットサイズに対応した80バイト以下のデータを単位送信します。

送信側と受信側について

Eモードでは送信側と受信側の区別はありません。無線設定(チャネルとアプリケーションID)が同じであれば、いずれかの送信側から送信したデータは他の受信側に伝達されます。

アドレスについて

TWELITE URATは各々32bitの固定アドレスと8bit(0-100,120)の論理アドレスを設定することができます。

標準の出力書式について

出力書式は以下のような;(セミコロン)区切りになっています。

    ;U;00777;120;0x81025A17;120;013;HELLO;79;
;1;2----;3--;4---------;5--;6--;7----;8-;
  
#解説
1U固定
2メッセージを出力したときのシステム時間(秒)
3

メッセージの送り主の8bit論理アドレス
0-100,120: 子機から

219: 自身から(起動時や送信完了メッセージの場合)

4メッセージの送り主のアドレス(32bitロングアドレス、シリアル番号)
5電波強度 (自身からの場合は000)
6送信元が設定したメッセージの続き番号
7メッセージ内容
86の先頭の文字から直前の文字までの XOR チェックサム (例では HELLO; までを計算対象)

上記書式はカスタマイズできます。

1.2.1.3.1.1 - 出力のカスタマイズ

ヘッダ付き透過モード(E)の出力をカスタマイズ
インタラクティブモードにより、ヘッダ付き透過モード(E)の受信側出力をカスタムできます。

ヘッダ付き透過モード (E) の出力はインタラクティブモードのh: set header formatで設定できます。

一番簡単な書式は*\nで、送信されたデータそのものを表示し、CRLFの改行コードを付与します。

    --- CONFIG/TWE UART APP V1-04-5/SID=0x810a479c/LID=0x01 -E ---
...
 h: set header format [*\n]

受信側で上記の設定を行うと、以下のように表示されます。
 [送信側] HELLO または HELLO
 [受信側] HELLO
  

特殊文字を含めることで様々な出力が可能です。

文字意味
*送信文字列
&hl任意の文字を16進数で指定 (例:&20→0x20空白)
<チェックサム計算開始位置を設定する(設定しない場合は出力の先頭)
>チェックサム計算終了位置を指定する(v1.4.6以降。それ以前のバージョンは無視されます)

\(バックスラッシュ, ¥)に続く文字

\nCRLF (0x0d 0x0a) の出力
\tTAB の出力
\**の出力
\%%の出力
\<<の出力
\>>の出力
\&&の出力

%に続く文字

%A送信元アドレス(32bit)の出力(8桁16進数)
%a送信元アドレス(32bit)の出力(10桁10進数)
%I送信元論理アドレス(8bit)の出力(2桁16進数)
%i送信元論理アドレス(8bit)の出力(3桁10進数)
%T現在のシステム時間(秒)の出力(4桁16進数)
%t現在のシステム時間(秒)の出力(5桁10進数)
%S送信元が設定した続き番号の出力(2桁16進数)
%s送信元が設定した続き番号の出力(3桁10進数)
%Q受信時の電波強度を出力(2桁16進数)
%q受信時の電波強度を出力(3桁10進数)
%Xチェックサムの出力(2桁16進数)
%xチェックサムの出力(3桁10進数)

チェックサムの計算

チェックサムは開始位置(<で指定する場合はその場所から、なければ出力の先頭)から%X,%xの出力直前までをXOR(排他的論理和)にて計算します。

     h: set header format [;%I;*;%X]
 上記のように設定した場合、

受信側で上記の設定を行うと、以下のように表示されます。
 [送信側] HELLO または HELLO
 [受信側] ;000;HELLO;49

送信側のアドレスはでHELLOという文字が届きチェックサムが0x49です。
チェックサムの計算範囲は ;000;HELLO; です。
  

計算プログラム例

    
#include <stdio.h>

int main() {
  unsigned char x = 0;
  char *p = ";000;HELLO;";

  while(*p) {
    x ^= *p;
    p++;
  }
  printf("%s -> %02x\n", argv[1], x);
}

// ;000;HELLO; -> 49

1.2.1.3.2 - 書式モード(A, B)

送受信双方の出力にヘッダを付加するモード
書式モード(A, B)は、送受信双方の出力にヘッダを付加するモードです。
書式モードによるネットワークの構成例

特徴

書式モードはTWELITE-トワイライトのUART(シリアル通信ポート)に所定の書式により入力するモードです。以下の特徴があります。

  • チェックサムによるエラーチェックを行う事で UART通信のデータ化けを検出する。
  • マイコンからバイナリ形式で直接送受信する。

設定方法

書式モードはインタラクティブモード にてUARTモード(m)をアスキー形式(A)またはバイナリ形式(B)に設定します。

アスキー形式(A)

送信したいバイナリデータ列をアスキー文字列(0-9,A-F)に変換して無線モジュールに入力します。

Modbus ASCII 形式の書式に倣っています。(例: バイナリ系列 0x00 0x11 0x22 0x33 0xAA 0xBB 0xCC は “:00112233AABBCC69” という文字列で表現されます。)

バイナリー形式(B)

送信したいバイナリデータ列にヘッダとチェックサムを付加し直接無線モジュールに入力します。

人手による検証は困難になりますが、マイコン間通信では最も効率が良い形式です。

送信可能文字数

  • 最大送信バイト数は640バイトですが、1パケットに収めて送受信する事を推奨します。
    下記【書式】のAにあたる[送受信したいデータ]
  • 1パケットに収めるためには80バイト以下にしてください。

書式

書式モードは、送信コマンドを使用してデータを送信するモードです。このコマンドを送る際にデータ形式をアスキー形式とバイナリ形式の2種類から選択できます。送信コマンドとデータ形式の関係は以下の図の通りです。

本ページでは下図に示す送信コマンドについて解説します。

    A: [送受信したいデータ]
 ↓↑
B: [送信コマンド[A: ] ]
 ↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
   [形式ヘッダ [B: [A: ] ] 終端]
 ↓↑
マイコンのUART入出力
  

送信コマンドには論理IDのみを使用した簡易形式と、32bitアドレス指定や様々な送信オプションを設定可能な拡張形式が有ります。それぞれの形式を以下で説明します。

送信コマンド (簡易形式)

入力

データ形式バイト数解説
バイト1

送信先の論理ID。
0x00 ⇒ 親機宛
0x01 ~ 0x64(100) ⇒ 子機論理ID宛
0x78 ⇒ 全子機宛

バイト1

コマンド種別(0x80未満任意)
※ データ領域として利用可能だが、0x80以上を入力してはならない。

バイト列N送受信したいバイト列。

出力

TWELITE-トワイライトから出力される形式は、入力時と同形式です。

データ形式バイト数解説
バイト1

送信元の論理ID。
0x00 ⇒ 親機
0x01 ~ 0x64(100) ⇒ 子機論理ID
0x78 ⇒ 子機。(論理ID未設定)

バイト1

コマンド種別(0x80未満任意)
※ 送信時に指定した値がそのまま入る。

バイト列N送受信したいバイト列。

使用例

以下のコマンドを親機に入力した場合、全子機に対し 0x11 0x22 0x33 0xAA 0xBB 0xCC というバイト列を送信します。

      0x78 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC
  

受信側は、以下のように親機の論理ID (0x00)から以下の バイト列を得ます。

      0x00 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC
  

上記バイト列はTWELITEに直接入力するわけではあり ません。アスキー形式またはバイナリ形式で表現した上、 UARTの入出力を行います。

例えば上記の出力形式の場合、アスキー形式では以下のよう に表現されます。

    :0001112233AABBCC68[CR][LF]
  

末尾の68はチェックサムです。

送信コマンド(拡張形式)

入力

データ形式バイト数解説
バイト1

送信先の論理ID。
0x00 ⇒ 親機宛
0x01 ~ 0x64(100) ⇒ 子機論理ID宛
0x78 ⇒ 全子機宛
0x80 ⇒ 拡張アドレス

バイト10xA0
バイト1

応答ID。
任意に指定できる。後述の応答メッセージ(送信完了などの通知)に使用され、送信コマンドとの対応を付けるために使用する。

ビッグエンディアン4バイト4先頭バイトが拡張アドレス(0x80)指定の場合、アドレス指定を行います。拡張アドレス指定でない場合は、本領域は0バイトとなります。
バイト列N

オプション列。
オプションは {オプションバイト} {オプション引数} が連続し、オプションバイトが 0xFF を指定する事で終端します。オプションを指定しない場合は 0xFF の1バイトを指定します。

バイト列N送受信したいバイト列。

出力

TWELITE-トワイライトから出力される形式は、宛先の論理IDの次に0xA0バイトが続きます。

データ形式バイト数解説
バイト1

送信元の論理ID。
0x00 ⇒ 親機宛
0x01 ~ 0x64(100) ⇒ 子機論理ID宛
0x78 ⇒ 子機(論理ID未設定)

バイト10xA0
バイト1送信元で指定した応答ID。
ビッグエンディアン4バイト4送信元拡張アドレス。
ビッグエンディアン4バイト4

送信先拡張アドレス。
1バイトの論理IDの指定で送信された場合 0xFFFFFFFF が格納される。

バイト1

通信品質 LQI 値。
0..255 の値を取り、受信時の電波強度に対応する。0が一番弱く、255が一番強い。

ビッグエンディアン2バイト2続くデータ領域のバイト数。
バイト列N送受信したいバイト列。

オプション

各種送信時のオプションが指定できます。アプリケーション再送や遅延のためのオプションは、1パケットで送信できるデータ量(送受信したいデータが78バイト以内)で使用してください。

※ 本オプションはネットワーク層を利用した送信では使用しないでください。

オプションバイトパラメータバイト数規定値v1.2.13以降解説
0x10無効

MAC ACK を設定します。
※ 中継機による中継が行われなくなります。
※ 送信先が 0x78(子機ブロードキャスト) の場合、この設定は無効になります。

0x210x00

アプリケーション再送を行います。
・0x00 ~ 0x0F: 0 から 16 回の再送を行います。 送信成功を持って終了します。主にMAC ACK 設定時に使用します。
・0x81 ~ 0x8F: 1 から 16 回の再送を行います。失敗成功に関わらず指定回数の送信を行います。主に MAC ACK を設定しない場合に利用します。
応答メッセージは、全ての再送処理が終わってから処理されます。

0x320x0000

初回の送信までの遅延を設定し、その最小値を与えます。
パラメータはビッグエンディアンの2バイトで、遅延[ms]を指定します。

0x420x0000

初回の送信までの遅延を設定し、その最大値を与えます。
パラメータはビッグエンディアンの2バイトで、遅延[ms]を指定します。最小値より小さい値を与えた場合は無効になります。

結果、送信要求発行からの遅延は (最小値)+(最大値-最小値)x(乱数 0…1) となります。

0x52パケット数 x 10 [ms]

アプリケーション再送の再送間隔を指定します。
パラメータはビッグエンディアンの2バイトで、送信間隔[ms]を与えます。

0x60無効

併行要求処理を行う。
このオプションが設定された要求は、要求完了までブロックせず、次の要求処理を受け付けます。
例えば 0.5 秒の遅延を設定した要求を 3 ヶを連続して投入した場合、本オプションを付けない場合は 0.5 秒後、1.0秒後、1.5秒ごと順次処理されますが、本オプションを付加すると 0.5秒後に3つの送信要求が処理されます。
※ パケット分割しない送信処理に限ります。
※ 併行動作の最大数は5ヶで、送信順は保証されません。

0x070無効送信後、応答メッセージを表示しません。
0x080無効

送信後、速やかにスリープします。
※ スリープからの復帰は RX ポート (DIO7) に Lo → Hi への割り込み信号を入力します(何か1バイト入力する)。コマンドはUART初期化が終わってから入力します。

※ 遅延や再送回数などによりコマンド入力から1秒を経過すると、コマンド処理がタイムアウトし、処理待ちのコマンドが処理されます。

※ 遅延処理やアプリケーション再送が行われている間は、内部のパケットバッファー(10ヶ)が処理待ちで埋まっていて新しい処理要求が実行されない場合が有ります。また同時に平行処理できるパケットは5ヶとなります。

※ パケットの重複確認は、内部で割り振っている連番で新しいものを優先し旧いものは採用しません。新しい要求受け付けのパケットが先に届き、旧い要求受け付けのパケットが後に届くような場合、古いパケットは受信されません。(特に 0x06 オプションを付加した時に、このような現象が発生しやすくなります)

※ パケット分割されるデータサイズの場合に遅延処理やアプリケーション再送処理を行うと、後半のパケットが前半のパケットの処理完了後に処理されるため、大きな時間差が発生し受信側でタイムアウトを起こし受信が失敗します。原則として遅延が発生するオプションはパケット分割しない範囲で使用してください。

応答メッセージ

応答メッセージはコマンドの入力に対し、処理結果を通知します。

データ形式バイト数解説
バイト10xDB
バイト10xA1
バイト1

応答ID。
拡張形式では指定した応答ID、 簡易形式では続き番号(128~255)が振られます。
※ 拡張形式と簡易形式を混在させて利用する場合、応答IDに128以上の値を使用すると識別できなくなります。

バイト10:失敗 1:成功

使用例

以下の例では、バイトまたはバイト列を 0x を省略して表記します。

    0x01 0x02 0x0A 0x0B ⇒ 01020A0B
  

※ 以下の例をそのままTWELITEに入力できるわけではなく、アスキーまたはバイナリ形式で表現します。

簡易形式

子機から親機へ( 0203 の2バイトを送信、コマンドバイトは 01)

    
・送信コマンド
  00010203
  ^1^2

  *1 00:親機宛
  *2 データ
  
    
・応答メッセージ
  DBA18001
        ^1
  *1 01:成功, 00:失敗
  
    
・受信
  78010203
  ^1

  *1 78:子機(論理ID設定なし)から来た
  

親機から全子機へ(長い系列)

    
  78020304DB32807005D70101100001000080A005D718DB32807005D7010110
  0001000080A005D718DB32807005D70101100001000080A005D718DB328070
  05D70101100001000080A005D718DB32807005D70101100001000080A005D7
  

拡張形式

子機→親機(単純な送信)

    
・送信コマンド
  00A012FF123456
      ^1^2^3

  *1 応答番号 12
  *2 オプション無し
  *3 データ
  
    ・応答メッセージ
  DBA11201
      ^1^2

  *1 応答番号 12
  *2 01:成功
  
    ・受信データ
  78A01286300001FFFFFFFFD80003123456
      ^1^2      ^3      ^4^5  ^6

  *1 応答番号 12
  *2 送信元アドレス(86300001)
  *3 送信先アドレス(FFFFFFFF 情報なし)
  *4 通信品質(LQI)
  *5 データ部バイト数 (0003=3バイト)
  *6 データ (3バイトのデータ)
  

子機→親機(Ack付きの送信)

    
・送信コマンド
  00A01301FF123456
        ^1

   *1 ACK 指定
  

子機→親機(0.768秒後に送信)

    
・送信コマンド
  00A01001030300FF123456
          ^1^2  ^3

  *1 送信遅延最小の設定
  *2 0300(=768ms)後
  *3 オプション終端
  

カスタムデフォルト

ファームウェアバイナリに設定情報を付記した設定済みファームウェアバイナリが利用できます。例えば、ボーレートを最初から設定したファームウェアを作成しておけば、毎回インタラクティブモードなどで設定する必要がなくなります。

0xDB コマンド

インタラクティブモードでの設定を行う替わりに、書式モード(バイナリモード・アスキーモード)では、コマンドによりモジュールの動作(リセット・サイレント解除)や設定を行えます。

サイレントモード

サイレントモードでは、受信回路を動作させず稼働中にパケット受信を行いません。起動後にマイコン経由で毎回特定の設定を反映させてから、通信を始めるような場合に利用します。

1.2.1.3.2.1 - アスキー形式

アスキー文字列を使った形式
書式モードでコマンド表現されたバイト列をアスキー形式に変換します。
    A: [送受信したいデータ]
 ↓↑
B: [コマンド表現 [A: ] ]
 ↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
   [形式ヘッダ [B: [A: ] ] 終端]
 ↓↑
マイコンのUART入出力
  

例えば、コマンド表現で 00A01301FF123456 (子機から親機に ACK 付きで 123456 を送信する)をアスキー形式で表現すると、以下のようになります。先頭は : で B1 がチェックサム、終端は [CR][LF] となります。

    :00A01301FF123456B1[CR][LF]
  

形式の定義

元データのバイト数表現形式におけるバイト数解説
ヘッダ1‘:’ (0x3A) コロンを指定します。
データ部N2N

元データの各バイトをアスキー文字列2文字(A-F は大文字)で表現します。
例えば 0x1F は ‘1’ (0x31) ‘F’ (0x46) と表現します。

チェックサム2

データ部の各バイトの和を8ビット幅で計算し2の補数をとります。つまりデータ部の各バイトの総和+チェックサムバイトを8ビット幅で計算すると0になります。
チェックサムバイトをアスキー文字列2文字で表現します。
例えば 00A01301FF123456 では 0x00 + 0xA0 + … + 0x56 = 0x4F となり、この二の補数は0xB1 です。(つまり 0x4F + 0xB1 = 0)

フッタ2[CR] (0x0D) [LF] (0x0A) を指定する。

チェックサムの省略

送信コマンドを入力する時に限ってチェックサムとフッタを省略し替わりに ‘X’ を指定できます。

    :00A01301FF123456B1[CR][LF] ⇒ :00A01301FF123456X
  

1.2.1.3.2.2 - バイナリ形式

バイナリデータを使った形式
書式モードでコマンド表現されたバイト列をバイナリ形式に変換します。
    A: [送受信したいデータ]
 ↓↑
B: [コマンド表現 [A: ] ]
 ↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
   [形式ヘッダ [B: [A: ] ] 終端]
 ↓↑
マイコンのUART入出力
  

例えば、コマンド表現で 00A01301FF123456 (子機から親機に ACK 付きで 123456 を送信する)をバイナリ形式で表現すると、以下のようになります。

    0xA5 0x5A 0x80 0x08 0x00 0xA0 0x13 0x01 0xFF 0x12 0x34 0x56 0x3D
  

形式の定義

元データのバイト数表現形式におけるバイト数解説
ヘッダ20xA5 0x5A を指定します。
データ長2

データ長はビッグエンディアン形式の2バイトで、MSB (0x8000) を設定した上、データ部の長さを指定します。
例えばデータ部の長さが 8 バイトなら 0x8008 を指定します。

データ部NN元データを指定します。
チェックサム1

データ部の各バイトの XOR を計算します。
例えばデータ部が 00A01301FF123456 なら 0x00 xor 0xA0 xor … 0x56 = 0x3D となります。

フッタ(1)チェックサムが事実上の終端です。無線モジュールからの出力では 0x04 (EOT) が付加されます。

使ってみる

バイナリ形式の確認は一般に難易度が高く、上手くコマンドが入力できない場合の分析が非常に困難です。マイコンなどでデバッグされるのに先立って、PCなど確認しやすい環境で予め実行しておくことを強くお勧めします。

1.2.1.3.2.2.1 - バイナリ形式で使ってみる

書式モードのバイナリ形式の使用例
ここでは、App_Uart を書式モードのバイナリ形式で使ってみます。

バイナリ形式では、App_Uart で直接送信したいデータをバイナリ列で入出力できるため、マイコン間通信では取り扱いがしやすくなります。反面、ヘッダやチェックサムなどの計算が必要になります。

簡易的に送信する場合は「チャットモード、プロンプト無し」も利用できます。

接続の確認

最初に基本設定とアスキー形式による動作確認を行います。接続や設定等の問題がある場合、バイナリ形式では出力等を含め確認が難しいためです。

設定

PC(TeraTerm) や macOS, Linux のターミナルソフト(CoolTerm など) を動作可能状態にして、インタラクティブモードによる設定が出来る事を確認しておいてください。

インタラクティブモードに入るには、+ + + と + を3回、一呼吸置きながら (0.2秒~1秒) 入力します。(参考:インタラクティブモードの詳細 )

インタラクティブモードで以下の設定を済ませておきます。

  1. 親機側は Device ID を 121 (0x79) に設定します。(i を押して 121[Enter] と入力します)
  2. UART Mode を A に設定します。(m を押して A[Enter] と入力します)
  3. S キーを押してセーブ&リセットを実行します。
    --- CONFIG/TWE UART APP V1-02-3/SID=0x81001f1c/LID=0x78 -- ---
...
 i: set Device ID (121=0x79)*
...
 m: set UART mode (A)*
 ---
 S: save Configuration
 R: reset to Defaults
  

以下のようなメッセージが出力されます。:DB… は起動時のメッセージで、アプリケーションIDやアドレス情報が含まれます。

    !INF Write config Success
!INF RESET SYSTEM...(再起動中)
:DB6772010300010203F181001F1C0095 (再起動後の始動メッセージ)
  

アスキー 形式で確認する

アスキー形式での動作を確認します。マイコンで利用される方も、まず Windows PC などでご確認ください。

コマンド列の送信方法

マイコンなどプログラムからコマンド列が入力されることを想定しており、一定時間入力が無ければ(1000ms)タイムアウトが発生して入力を無効にするようになっています。

このため、コマンド列を入力する際には、ターミナルソフト等のコピー&ペースト機能(TeraTermならAlt+V)などを利用し、タイムアウトしないように入力してください。

なお、インタラクティブモードでは、タイムアウトが発生せず入力毎のエコーバック(入力した文字がターミナルに表示される)とチェックサムが間違えていた時にメッセージが表示できるようになっています。このためキーボードから直接入力しても試せます。

アスキー形式による親子間送受信

子機から親機にメッセージを送ります。書式モードの簡易形式 を用いて親機 (0x00) 宛に、コマンド種別 0x00、データ 0x11, 0x22, 0x33 の3バイトを送信します。末尾の X はチェックサムを省略しています。

     子機から親機
     :0000112233X
  ↓
 親機の受信メッセージ
     :780011223322
  

受信データは 0x78 からコマンド種別 0x00 でデータ 0x11 0x22 0x33 が届き、チェックサムが 0x22 です。この出力が確認できたら、今度は子機から親機に同様のメッセージを送ってみます。

     親機から親機
     :7800112233X
  ↓
 子機の受信メッセージ
     :00001122339A
  

親子間の簡易通信を確認しました。続いてこれと同じ送受信をバイナリ形式で行ってみます。

親機のみバイナリ形式で親子間送信

バイナリ形式の無線端末とアスキー形式の無線端末は互いに通信が可能です。入出力の書式が違うだけで、無線パケットは同じです。

ここでは親機だけバイナリ形式にしてみます。バイナリ形式での送受信を行うためには、バイナリ対応のターミナルソフトウェアが必要です。バイナリではターミナルソフトごとに操作や表示が異なりますので、よく習熟してください。

参考までに Linux, macOS 対応のターミナルを列挙します。

親機の設定

親機側のインタラクティブモードに入って UART Mode を B に設定します。

  • UART Mode を B に設定します。(m を押して A[Enter] と入力します)

バイナリ対応のターミナルソフト (RealTermの場合)

親機のターミナルソフトウェアを閉じて、バイナリ対応のものを立ち上げてください。

以下では RealTerm の操作例です。

  1. [Port] タブを選択し、Baud を 115200・Port を COM ポートの番号を指定して [Open] ボタンを押します。
  2. [Display] タブを選択し、[Display As] 中から Hex[space] を選択しておきます。

送受信を確認する

子機からアスキー形式での送信例と同じものを送信してみます。

     子機から親機(アスキー形式)
     :0000112233X
  ↓
 親機の受信メッセージ(バイナリ形式)
     A5 5A 80 05 78 00 11 22 33 78 04
  

親機からは 0xA5 0x5A … に続くデータが表示されます。送信したいデータに簡易書式のヘッダが付加され、さらにバイナリ書式のためのヘッダ・フッタが追加される点に注意してください。

データ形式バイト数解説
ヘッダ20xA5 0x5A
データ長2

0x8000 + 続くデータ長
この例では0x80 0x05 で5バイト

データ部5

データ部で、あて先情報等のヘッダおよび送信したいデータが含まれる。
・例は簡易形式で子機宛に 0x11 0x22 0x33 を送信します。
0x78 0x00 0x11 0x22 0x33
0x78 ⇒ 送信元アドレス(簡易)
0x00 ⇒ コマンド種別 (0x00 は特別な意味は無い)
0x11 0x22 0x33 ⇒ 送信したいデータ

フッタ・チェックサム1

データ部の前バイトのXORとなります。
・0x78 xor 0x00 xor 0x11 xor 0x22 xor 0x33 = 0x78

フッタ・終端1

0x04
出力時には 0x04 が付加されるが入力時には不要

親機子機、バイナリ形式で親子間送信

親機、子機双方をバイナリ形式に設定して送受信を試みます。

子機の設定

子機側でもインタラクティブモードに入って UART Mode を B に設定します。

  • UART Mode を B に設定します。(m を押して A[Enter] と入力します)

バイナリ対応のターミナルソフト (RealTermの場合)

子機のターミナルソフトウェアを閉じて、バイナリ対応のものを立ち上げてください。

以下では RealTerm の操作例を示します。

  1. RealTerm を立ち上げます。
  2. [Port] タブを選択し、Baud を 115200・Port を COM ポートの番号を指定して [Open] ボタンを押します。
  3. [Display] タブを選択し、[Display As] 中から Hex[space] を選択しておきます。

子機から親機への送信

子機から親機にデータ送信してみます。

     子機から親機(バイナリ形式)
     A5 5A 80 05 00 00 11 22 33 00

  ↓
 親機の受信メッセージ(バイナリ形式)
     A5 5A 80 05 78 00 11 22 33 78 04
  

子機側からデータ送信する方法はターミナルソフト毎に操作方法が違います。RealTerm の場合は、以下となります。

  1. [Send]タブを開きます。
  2. [Send Numbers] の2つある入力ボックスのいずれかに 0xA5 0x5A 0x80 0x05 0x78 0x00 0x11 0x22 0x33 0x78 を入力します。
  3. [Send Numbers] ボタンを押します。

子機から親機への送信

親機から子機へデータ送信してみます。

     親機から子機 (バイナリ形式)
     A5 5A 80 05 78 00 11 22 33 78

  ↓
 子機の受信メッセージ(バイナリ形式)
     A5 5A 80 05 00 00 11 22 33 00 04
  

1.2.1.3.2.3 - 0xDB コマンド

インタラクティブモードを使用しない設定方法
書式モード(バイナリモード・アスキーモード)では、インタラクティブモードでの設定を行う替わりに、コマンドによりモジュールの動作(リセット・サイレント解除)や設定が可能です。

コマンド書式

書式は先頭をDBとし、コマンド種別およびコマンドごとに決まるパラメータとなります。

番号名前データ形式バイト数解説
1対象OCTET10xDB
2コマンド種別OCTET1下表に解説
3パラメータ種別による種別による設定データを示す。

例えばアプリケーションIDを 0x12345678 に設定する場合、コマンド種別が F2 で、パラメータが 00 12 34 56 78 、コマンドは DB F2 12 34 56 78 となります。

アスキー形式(チェックサム省略)では :DBF212345678X となります。コマンド発行後には応答が戻ります。

バイナリー形式では、0xA5 0x5A … XOR という加工が必要になります。 DB F2 00 12 34 56 78 というコマンドに対してバイナリで A5 5A 80 07 DB F2 00 12 34 56 78 21 という 12 バイトを送ります。

(インタラクティブモード中での入力はしないでください)

コマンド種別

コマンド
種別

機能説明パラメータ応答対応バージョン
F0ACKACK 応答の要求を行う。なし

OCTET 0xDB
OCTET 0xF0
OCTET 0x01

v1.2以降
F1モジュールアドレスモジュールアドレス情報などを表示する。モジュール起動時にも出力される。なし

OCTET 0xDB
OCTET 0xF1
BE_DWORD アプリケーションID
BE_DWORD バージョン番号
OCTET IDアドレス(1バイト)
BE_DWORD モジュールのシリアル番号
OCTET 0:通常 1:サイレントモード中
OCTET 0:ネットワークDOWN, 1:ネットワークUP

v1.2以降
F2設定モジュールに設定します。設定後、設定内容は「セーブ&リセット」しない限り反映されません。応答はコマンド種別F3の設定値となります。別表参照成功すればコマンド種別F3 で、設定した内容が報告される。失敗すればコマンド種別 F3、パラメータ FF が報告される。v1.2以降
F3設定取得モジュールに設定内容を要求します。v1.2以降
F8モジュール制御

■ 0x10
サイレントモードで起動したモジュールを稼働状態にする。

■ 0x10
OCTET 0x10

■ 0x10
OCTET 0xDB
OCTET 0xF8
OCTET 0x11
OCTET 0:サイレント 1:解除

v1.2以降
FDクリア&リセット不揮発領域をクリアして無線モジュールをリセットします。なし

応答はありません。
リセット後に始動メッセージが出力されます。

v1.2以降
FEセーブ&リセットデータをセーブして無線モジュールをリセットします。v1.2以降
FFリセット無線モジュールをリセットします。設定内容は破棄されます。v1.2以降

パラメータ (F2, F3)

設定(F2)、設定取得(F3) 時のパラメータは、設定種別と設定内容を列挙します。設定内容は種別によって書式が変化します。

番号名前データ形式バイト数解説
1設定種別OCTET1

設定の種別を示す。
0xFF は無効・エラーを意味し、続く 設定内容は格納されない。

2設定内容種別による種別による設定データを示す。

設定種別ごとのパラメータを解説します。
※ 0xFF(OCTET) 0xFFFF(BE_WORD) 0xFFFFFFFF(BE_DWORD) の場合は、無効値として無視されます。

設定種別名前設定データ形式バイト数解説対応バージョン
0x00アプリケーションIDBE_DWORD4アプリケーションIDを設定する。※v1.2以降
0x01チャネルマスクBE_DWORD4利用するチャネルを指定する(ch11 なら 1UL « 11 = 0x800)v1.2以降
0x02出力設定BE_WORD2

再送回数と電波の出力を設定する。
下位の1バイトのみを使用し、再送回数を上位4ビット、電波の出力を下位4ビットで設定する。
例)再送回数を8回、電波の出力を3(最大出力)に設定する場合は 0x0083 を指定します。※

v1.2以降
0x03IDOCTET10x00: 親機 0x01~0x64: 子機ID指定 0x78:子機ID未指定v1.2以降
0x04役割OCTET1

子機のみ有効で、以下のいずれかを指定します。通常はネットワーク層を利用しない配送方式を選択してください。

■ ネットワーク層を利用しない配送方式:
0 -> 通常の指定(親機または子機)
1-3 -> 中継子機(id 指定で 1~100 または 120の子機指定と同時に指定します。)1~3 は最大中継段数です。この中継方式は受信したパケットを中継段数が指定回数になるまで再送を繰り返す方式ですので、中継機の配置や数によっては重複したパケットが中継されることになります。

■ ネットワーク層を利用する配送方式:
(書式モードのみ)
11 -> 親機
12 -> 中継機
13 -> 子機

■ サイレント モード:
サイレントモードでは起動時に受信回路を開きませんので、解除コマンドを実行するまでは無線パケットに応答する事はありません。
設定は上記指定に 80 を足します。
例えば 93 を指定すると「ネットワーク層利用かつサイレントモード」となります。※

v1.2以降
0x05中継レイヤOCTET1中継レイヤ番号です。中継機は中継レイヤ数の上位(より小さい値)の中継機・親機に接続を試みます。本設定は役割がネットワーク層を利用する配送方式で中継機に設定しているときにだけ設定してください。※v1.2以降
0x06UARTモードOCTET10:透過モード 1:書式・アスキー 2:書式・バイナリ 3:チャット 4:プロンプト無しチャットv1.2以降
0x07UARTボーレートBE_DWORD4ボーレートを指定します。※v1.2以降
0x08UARTパリティOCTET1

以下の設定の組み合わせで、各設定値の総和を指定する。
Parity = 0: None, 1: Odd, 2: Even
Stop = 0: STOP 1, 4: STOP 2
Bit = 0: 8Bit, 8: 7Bit
例)7E1 なら 8+2+0=10(0xA) を指定します。

v1.2以降
0x09暗号化設定OCTET10: 暗号化なし 1: AES128bit暗号化v1.2以降
0x0A暗号化キーOCTET[16]1616バイトの暗号化キーを指定します。インタラクティブモードでは設定できないバイナリ列を格納できます。この場合、インタラクティブモードの表示が崩れる場合があります。v1.2以降
0x0C区切り文字の指定BE_WORD2区切り文字列の指定を行います。(0x00-0xFF)v1.2以降
OCTET1最小パケットサイズを指定します。(1-80)
OCTET1未入力タイムアウトを指定します。(0, 10-200)
0xFFエラー無し0エラーや異常を示します。v1.2以降

凡例

  • OCTET: 8bit=1バイトを示す。
  • BE_WORD: ビッグエンディアン 2 OCTETを示す。例えば 0x1234 は 0x12 0x34 の順に並びます。
  • BE_DWORD: ビッグエンディアン 4 OCTETを示す。例えば 0x12345678 は 0x12 0x34 0x56 0x78の順に並びます。

1.2.1.3.2.4 - サイレントモード

起動時に受信回路を動作させない設定
サイレントモードでは、受信回路を動作させないため稼働中にパケット受信を行いません。起動後にマイコン経由で毎回特定の設定を反映させてから、通信を始めるような場合に利用します。

設定

インタラクティブモードで以下の設定を行います。

  • Role に 80 を足しておく。通常の親機子機なら 80 で良い。
  • UART mode を書式モード(アスキー・バイナリ形式)に設定しておく。

サイレントモードの動作状態確認

起動直後に DB F1 メッセージが出力 され、メッセージ中にサイレントモード状態かどうかの値が格納されています。

サイレントモードについて

インタラクティブモードでサイレントモードおよび書式モード(バイナリ・アスキー)に設定した場合、サイレントモードを利用できます。

サイレントモードを解除するには、サイレントモード解除の DB F8 コマンド (0xDB 0xF8 0x10, アスキー形式では :DBF810X) を送信します。

注意点

  • サイレントモードを解除後は、サイレントモード状態に再設定する事は出来ません。
  • 送信コマンドを投入した時の動作は未定義です。

1.2.1.3.3 - チャットモード(C)

プロンプト表示とエコーバックを行うモード
チャットモード(C)は、プロンプト表示とエコーバックを行うモードです。
チャットモードによるネットワークの構成例

チャットモードでは、プロンプトの表示とエコーバック(自身が入力した文字が端末にも表示される)が行われます。全ての無線端末は子機の設定とします。電波到達範囲の全ての端末にメッセージが伝達され複数の端末でチャットできます。

親子関係は無く複数の端末間で通信できますが、宛先の指定はできずデータはブロードキャストで全ての端末に伝達されます。アスキーデータのみでバイナリデータは送れません。(0x00-0x1F, 0x7F は送信不可)

中継は最大3段(3ホップ)まで対応しています。初期設定では中継はしません。中継機能を使用する場合はインタラクティブモードにて設定が必要です。

チャットモードはインタラクティブモードにてUARTモード(m)をCに設定します。(初期設定はチャットモード)

使用例

チャットモードの表示例

MONOSTICK-モノスティックをパソコンやスマートフォン、タブレット端末のUSBポートに接続することで複数の端末同士でテキストチャットをすることができます。

送信可能文字数

  • 1パケットの最大データ数は80バイトです。
  • 送信データサイズは本文のバイト数+ハンドル名のバイト数です。
  • 送信可能な最大送信バイト数は640バイトです。80バイト以上の場合は複数パケットに分割され送信されます。

書式

チャットモードの書式は単純です。入力はプロンプト先頭から始まり改行文字で終端となります。

  • {本文(0x0-0x1F,0x7F以外)}[CRまたはLF]

表示

プロンプト

プロンプトはモジュール(またはハンドル)名と、発言の続き番号が表示されます。

  • {モジュールのアドレス8桁}:{続き番号 0-255}>
    例: 86300001:0>
  • {ハンドル名}:{続き番号 0-255}>
    例: モノワイヤレス:2>

入力中のエラーメッセージなど

  • (err), (canceled) など () 書きのメッセージが出ます。

ハンドル名はインタラクティブモード で任意に設定できます。

出力メッセージ

出力メッセージはプロンプト同様、モジュールアドレス(またはハンドル名)と、発言番号の後、本文が出力されます。

  • {モジュールのアドレス8桁}:{続き番号 0-255}>
    例: [86300038:5] Hello!
  • {ハンドル名}:{続き番号 0-255}>
    例: [モノワイヤレス:2] こんにちわ

プロンプト上での操作

プロンプト上ではいくつかの制御コマンドを使用できます。

  • Ctrl+L ⇒ 画面のクリア(画面消去エスケープシーケンス対応のターミナル)
  • Ctrl+C ⇒ 入力のキャンセル
  • BS/DEL ⇒ 入力バッファを1バイト戻し、画面に Ctrl+H を出力します(対応ターミナルの場合、カーソルが1文字左に移動します)

中継機能の説明

通信距離が足りない場合や障害物があって通信できない場合に中継機を使用することで通信距離を延長したり通信範囲を拡張することが期待できます。

中継機能を持った端末は受信したパケットをそのまま送信します。

設定方法

M2ピンをGNDに接続すると1ホップの中継機能が設定されます。インタラクティブモードで1ホップ以上の中継機能の設定もできます。

中継機能を使用する場合はインタラクティブモードで”r”を入力し、set Roleの値を1~3に設定してください。初期値は0です。

    r: set Role (0x0)
  

1~3は最大中継回数です。0を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。

※ 設定は子機のみに有効です。
※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。

設定例

中継機の設定例1

図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。

青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機の設定例2

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。

1.2.1.3.3.1 - どこでもチャット

チャットモードを使ったテキストチャット
チャットモードを使って、テキストチャットを行う方法をご紹介します。
チャットの様子

MONOSTICK-モノスティックをパソコンやスマートフォン、タブレット端末のUSBポートに接続することで複数の端末同士でテキストチャットをすることができます。

イーサーネットやWiFi等のネットワーク環境が無い場所でもどこでも無料でテキストチャットが行えます。

アプリの書換え

MONOSTICK-モノスティックに書込まれているアプリを「シリアル通信アプリ」に書き換える必要があります。アプリの書換えは「TWELITE STAGE 」で簡単に行えます。

TWELITE STAGE をインストールして、メニューから[アプリ書換]>[TWELITE APPSビルド&書換]>[App_Uart]を選択すると書換えができます。

使用方法

パソコンを2台以上用意してください。(複数人でチャットできます。)

それぞれのパソコンのUSBポートにMONOSTICK-モノスティックを接続してください。

TWELITE STAGEを使う場合

  1. TWELITE STAGEのメニューから[ビューア]>[ターミナル]を選択してください。
  2. キーボードから文字を入力するとMONOSTICK-モノスティックが接続された全てのパソコンのターミナル上に表示されます。

ターミナルソフトウエアを使う場合

  1. 接続しているシリアルポート名(Windows では COMポート)を調べて設定してください。(Windows の場合はデバイスマネージャを用いるのが簡単です。)
  2. それぞれのパソコン上でターミナルソフトウエア( TeraTerm 等)を起動してください。
  3. ターミナルソフトウエアの通信設定を「115200bps/8bit/パリティ無し/ストップビット1/フロー制御なし」にしてください。
  4. ローカルエコーは OFF に設定してください。
  5. キーボードから文字を入力するとMONOSTICK-モノスティックが接続された全てのパソコンのターミナルソフトウエア上に表示されます。

ハンドルネーム(名前)の設定

初期状態ではハンドルネーム(名前)は「8xxxxxxx:0>」のようにシリアル番号が設定されています。最後の数字は発言回数を表し、発言毎に1つ増え255になると0に戻ります。

ハンドルネーム(名前)は任意の名前に変更することが出来ます。例えば「MONOW」と設定した場合はプロンプトが「MONOW:0>」と言う表示になり誰からのメッセージか、わかりやすくなります。

ハンドルネーム(名前)の設定はインタラクティブモード(設定変更モード)で行います。インタラクティブモードに入るには、+ を3回、一呼吸(0.2~1秒間隔)置きながら入力します。上手くいかない場合は、根気よく + を入力してください。

インタラクティブモードに入ると以下のような画面が表示されます。

    
--- CONFIG/TWE UART APP V1-00-0/SID=0x81001f57/LID=0x78 ---
a: set Application ID (0x67720103)
i: set Device ID (--)
c: set Channels (18)
o: set Output Tx Power (3)
r: set Role (0x0)
b: set UART baud (38400)
p: set parity (N)
m: set uart mode (C)
h: set handle name []
C: set crypt mode (0)
K: set crypt key []
---
S: save Configuration
R: reset to Defaults
  1. hを入力すると”Input handle name:”と表示されますので、好みのハンドルネーム(名前)を入力してください。
  2. Sを入力して変更内容をセーブしてください。

複数のグループで使用する場合

初期状態ではアプリケーションIDは(0x67720103)で周波数チャネルは18chです。アプリケーションIDと周波数チャネルの両方の値が同じ場合に通信が可能になるので、通信範囲にあるパソコン全てにメッセージが伝わります。相手を特定せずにチャットを楽しむことが出来ます。

特定のグループ内でのみチャットを行いたい場合は、アプリケーションIDと周波数チャネルの値をグループ毎に変えることで複数のグループで混信せずにメッセージのやり取りができます。

周波数チャネルを変更する

  1. インタラクティブモードに入ってください。
  2. c(小文字)を入力すると"Input Channel(s):”と表示されますので、11~26を入力してください。
  3. Sを入力して変更内容をセーブしてください。

アプリケーションIDを変更する

  1. インタラクティブモードに入ってください。
  2. aを入力すると"Input Application ID (HEX:32bit):”と表示されますので、16進数の00010001~7FFFFFFEを入力してください。
  3. Sを入力して変更内容をセーブしてください。

暗号化の設定

アプリケーションIDと周波数チャネルの両方の値が同じ場合に通信が可能になるので、両方の値が同じユーザーのみメッセージを見ることができます。更にアプリケーションIDと周波数チャネルが同じでも暗号化を設定することで許可されたユーザー以外がメッセージを見ることができなくなります。

  1. インタラクティブモードに入ってください。
  2. C(大文字)を入力すると"Input crypt mode (0,1):”と表示されますので、1を入力してください。これで暗号化がオンになります。(0を入力すると暗号化がオフになります。)
  3. K(大文字)を入力すると"Input crypt key:”と表示されますので、任意の16バイトの文字列(暗号キー)を入力してください。共通の文字列(暗号キー)を使用している相手だけと通信が可能になります。
  4. Sを入力して変更内容をセーブしてください。

1.2.1.3.4 - 透過モード(D)

ヘッダの付加、エコーバックおよびプロンプト表示を行わないモード
透過モード(D)は、ヘッダの付加、エコーバックおよびプロンプト表示を行わないモードです。
外部マイコンと接続したネットワーク

チャットモードに対し、エコーバックやプロンプト表示がないためマイコンとの通信に適しています。

連続して入力された文字列を1パケット(最大80バイト)として送信します。

通信はブロードキャストで行われます。アスキーまたはバイナリデータの送信が可能です。

中継は最大3段(3ホップ)まで対応しています。初期設定では中継はしません。中継機能を使用する場合はインタラクティブモードにて設定が必要です。

透過モード:ブロードキャスティングはインタラクティブモードにてUARTモード(m)をDに設定します。

インタラクティブモード

送信可能文字数

1パケットの最大送信文字数は80バイトです。

データサイズが80バイトを超えた場合は80バイト毎のパケット分割機構が働きますが、80バイト以上の一括送信は通信安定性の面で推奨しません。\

送信トリガー

本モードで、パケット送信の引き金となるのは以下です。インタラクティブモードで設定します。

  • データを入力して設定時間のタイムアウト時( 初期値:100ms)
  • 送信トリガー文字の入力時 (要設定)
  • データが最低パケットバイト数に達した時 (要設定)

インタラクティブモードでの設定方法

インタラクティブモードでは、以下の設定が可能です。

  • 送信タイムアウト
    最後の1バイトが入力されてから、パケットを送信するまでの待ち時間です。
  • 送信トリガー文字
    送信トリガー文字を入力した時点でパケット送信を行います。「最小データサイズ」を設定している場合は設定値に達するまではデータ内に送信トリガー文字が含まれていても送信は行いません。送信時は送信トリガー文字も同時に送信されます。送信トリガー文字を有効にする場合にはオプションビット 0x00000100 を設定してください。
  • 最小データサイズ
    最小のデータサイズを規定することにより、データの途中に含まれている送信トリガー文字によってパケットが分断されてしまう事を防ぎます。最小データTx Trigger min_bytesの値を1-80に設定すると、入力バイト数が指定のバイト数になるまで送信を保留します。0 に設定するとこの処理は行われません。

インタラクティブモードではUART modeをDに設定するとset Tx Triggerのメニューが表示されます。例えば0a,8,30と設定するとLFをトリガー文字にし、最小データは8バイト、30msのタイムアウトを設定します。

     m: set UART mode (D)
 k: set Tx Trigger (sep=0x0a, min_bytes=8 dly=30[ms])
 o: set option bits (0x00000100)
  

送信タイミング

  • 送信タイムアウト処理が優先されます。
  • 送信トリガー文字を有効にした場合、
    最小データバイト数に到達前のトリガー文字は無視され、最小バイト数以上かつトリガー文字が入力された時点で送信となります。
  • 送信トリガー文字を無効にした場合、
    最小データバイト数に到達した時点で送信となります。

送信元の判別

  • 複数のノードから送信された場合、どのノードから送信されたかを判別する場合は、送信データに送信元情報を含めてください。
  • データはパケット単位で出力されますので、データ単位を80バイト以内で送信している場合は複数のノードからのデータが途中で混ざることはありません。

中継機能

通信距離が足りない場合や障害物があって通信できない場合に中継機を使用することで通信距離を延長したり通信範囲を拡張することが期待できます。

中継機能を持った端末は受信したパケットをそのまま送信します。

設定方法

M2ピンをGNDに接続すると1ホップの中継機能が設定されます。インタラクティブモードで1ホップ以上の中継機能の設定もできます。

中継機能を使用する場合はインタラクティブモードで”r”を入力し、set Roleの値を1~3に設定してください。初期値は0です。

    r: set Role (0x0)
  

1~3は最大中継回数です。0を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。

※ 設定は子機のみに有効です。
※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。

設定例

中継機の設定例1

図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。

青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機の設定例2

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。

1.2.1.4 - その他の機能

App_Uartのその他の機能
その他の機能をご紹介します。

カスタムデフォルト

ファームウェアバイナリに設定情報を付記した設定済みファームウェアバイナリが利用できます。例えば、ボーレートを最初から設定したファームウェアを作成しておけば、毎回インタラクティブモードなどで設定する必要がなくなります。

カスタムデフォルト

UART バッファサイズ

UART の入力バッファは、入力側が 4KB、出力側が 4KB 確保しています。UARTを2系統出力させる場合は、各系統ごとに 入力 2KB、出力 2KB を利用します。

書式モードやチャットモードでは1系列単位で送信を行うためバッファのサイズを意識する場面は多くありませんが、透過モードなどで連続的に系列を投入する場合、書式モードであっても多数の系列を一度に投入する場合は、このバッファを上限として入力されます。出力についても、ボーレートが遅いにもかかわらずこれ以上の無線パケットが伝送されると、UART 出力が間に合わなくなります。

バッファの上限を超えた場合は、その境界でのデータは保護されません。データ抜けが発生します。特に入力側では後述のフロー制御ピンを参照することを検討してください。

UART のフロー制御について

入力側のフロー制御について RTS ピン同様の振る舞いをするように実装しています。使用するピンは DIO5 で、監視対象は主UARTポート(UART0)です。入力受付不可時は Hi、入力可能時は Lo となります。出力側のフロー制御には対応しませんので、受信側では十分なボーレートと処理速度を準備してください。

  • 電源投入、リセット直後は Hi で、UART が初期化されると Lo になります。
  • UART の入力バッファが 7/8 を超えたときに Hi になり、下回ると Lo になります。
  • 透過モード(D)では、パケット送信中は Hi になります。

通信エラー対策

データー抜けが発生する場合は再送回数を増やしてください。再送回数はインタラクティブモード で設定できます。(x: set RF Conf)

1.2.1.4.1 - カスタムデフォルト

App_Uartのデフォルト設定値を変更
カスタムデフォルト機能では、ファームウェアに含まれるデフォルトのパラメータを変更することができます。

カスタムデフォルト機能の解説を行います。ファームウェアバイナリに設定情報を付記した設定済みファームウェアバイナリが利用できます。例えば、ボーレートを最初から設定したファームウェアを作成しておけば、毎回インタラクティブモードなどで設定する必要がなくなります。

※ 本機能はApp_Uart、App_IOに対応しています。

1. モジュールで設定を済ませておく

インタラクティブモードで必要な設定を済ませ、動作確認を行っておきます。

2. 設定をダウンロードする

TeraTerm など xmodem プロトコルのダウンロード可能なターミナルソフトを用います。インタラクティブモードの入力待ち状態で (何か入力して設定待ち状態では動作しません)、xmodem のダウンロードを行います。(xmodem はチェックサム、128バイトパケットで、後に拡張された 1KB や CRC ではありません)

TeraTerm では、以下の操作を行います。

  • File->Transfer->XMODEM->Receive… を選択します。
  • Option を Checksum、Binary を選択しておきます。
  • 書き出すファイル名を指定します。
  • Open (開く) ボタンを押します。

成功すれば、指定したファイル名のファイルが出来上がり、サイズが128バイトになっているはずです。xmodem の実装によってはこれより小さいサイズになることもあります。

3. ファイルの末尾に連結する

ダウンロードした設定ファイルをファームウェアの末尾に連結します。コマンドライン、ファイル連結ツールなどを利用します。

    
  Windows でのコマンドラインの実行例:
     C:\work> copy App_Uart_Master_JN5164_1_2_X.bin App_Uart_custom_1_2_X.bin
     C:\work> type conf.bin >> App_Uart_custom_1_2_X.bin
  Linux, macOS では、
     $ cat App_Uart_Master_JN5164_1_2_X.bin conf.bin > App_Uart_custom_1_2_X.bin

4. カスタムファイルを書き込む

出来あがったカスタムファイルを TWELITE に書き込みます。上記の例では App_Uart_custom_1_2_X.bin です。

起動してインタラクティブモードでは、最後の方に C- と出ます。この C はカスタム設定がロードされたことを意味します。

    
     --- CONFIG/TWE UART APP V1-02-2/SID=0x81001f1c/LID=0x78 C- ---

モジュール始動時にカスタム設定を読み込み、続いて不揮発領域に保存された設定を読み出します。保存された設定情報が存在する場合は、インタラクティブモードでは以下のように CE と表示されます。動作確認時は必ず保存された設定を消去してください。

※ 保存された設定を消去するには、インタラクティブモードで R 入力後、S を入力します。

    
     --- CONFIG/TWE UART APP V1-02-2/SID=0x81001f1c/LID=0x78 CE ---

1.2.1.5 - インタラクティブモード

App_Uartのインタラクティブモード
インタラクティブモードでアプリの詳細設定を行うことができます。

ここではシリアル通信アプリ(App_Uart)固有の機能を説明します。共通機能については、インタラクティブモード(共通機能) を参照してください。

インタラクティブモードに入ると以下の画面が表示されます。

    
--- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
 a: set Application ID (0x67720103)
 i: set Device ID (120=0x78)
 c: set Channels (18)
 x: set RF Conf (3)
 r: set Role (0x0)
 l: set Layer (0x1)
 b: set UART baud (38400)
 B: set UART option (8N1)
 m: set UART mode (E)
 k: set Tx Trigger (sep=0x0d0a, min_bytes=0 dly=0[ms])
 h: set header format [;U;%t;%i;0x%A;%q;%s;<*>;%X;\n]
 C: set crypt mode (0)
 o: set option bits (0x00000100)
---
 S: save Configuration
 R: reset to Defaults

設定コマンド一覧

コマンド設定項目初期値説明
aアプリケーションID0x67720103同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。
i論理デバイスID120子機の論理デバイスIDを設定します。1~100および以下に挙げる特別な値を設定できます。
0: 親機 (=121)
1-100: 子機
120: 子機(ID設定無し)
121: 親機
これ以外の値も設定した場合の動作は未定義です。
c周波数チャネル18チャネル (11~26) を選択します。複数チャネルを指定した場合は チャネルアジリティにより電波干渉の回避に役立ちます。最大3チャネルまで指定可能です。例えばチャネル 13 とチャネル 22 を使用する場合は 13,22 と入力します。
x送信出力31桁、または2桁の数字を指定します。2桁目は省略可能です。

1桁目は、送信出力を設定します。3が最強で2,1,0と1段階小さくなるたびに -11.5db 出力が低下します。出力を制限し電波の有効伝達範囲を小さくしたい場合に使用します。ただし、伝達可能距離は環境(ノイズ・遮蔽物など)に影響を受けます。
※ 理論上の伝達距離は 6db 出力が小さくなるたびに 1/2 になりますので、1段階小さくすることで伝達距離は約1/4になります。

2桁目は透過モード・プロンプト無しチャットモード時の再送回数を設定します。2桁目は 0~9を指定し、0はデフォルトで再送なし、1~9は再送回数に対応します。

例:
3 -> 再送なし・最強出力(デフォルト、省略時)
42 -> 再送4回・出力は2(1段階弱める)
r役割0子機のみ有効で、以下のいずれかを指定します。通常はネットワーク層を利用しない配送方式を選択してください。

■ ネットワーク層を利用しない配送方式:
0 -> 通常の指定(親機または子機)
1-3 -> 中継子機(id 指定で 1~100 または 120の子機指定と同時に指定します。)1~3 は最大中継段数です。この中継方式は受信したパケットを中継段数が指定回数になるまで再送を繰り返す方式ですので、中継機の配置や数によっては重複したパケットが中継されることになります。

■ ネットワーク層を利用する配送方式:
(書式モードのみ)
11 -> 親機
12 -> 中継機
13 -> 子機

■ サイレント モード:
サイレントモードでは起動時に受信回路を開きませんので、解除コマンドを実行するまでは無線パケットに応答する事はありません。
設定は上記指定に 80 を足します。
例えば 93 を指定すると「ネットワーク層利用かつサイレントモード」となります。
bUARTボーレート38400BPSピンを Lo (GND) レベルにして電源投入した場合に有効になります。Hi レベルでは常に 115200 8N1 条件で UART を初期化します。
9600、19200、38400、57600、115200、230400が設定可能です。 他の値も設定可能ですが、オシロスコープ等を用いて誤差を検証した上で使用してください。
※ オプションビットの設定により、BPS ピンの状態を無視したり、UART1 に出力する事も可能です。
BUARTパリティNN: 無し、O: Odd(奇数)、E: Even(偶数)を設定します。ストップビットは1で固定。ハードウェアフローは設定不可です。
v1.2以降では、8N1, 7E2 といったビット数、パリティ、ストップビットの設定が可能ですが、動作検証は 8N1 のみとなります。動作検証以外の設定で利用される場合は、オシロスコープなどで波形を観察し要求を満足するか確認の上利用してください。
mUARTモードE

TWELITEの通信方式を決定します。
A: 書式モード、アスキー形式
B: 書式モード、バイナリ形式

C: チャットモード
D: 透過モード
E: ヘッダ付き透過モード

kトリガー文字0d0a,0,0トリガー文字列(オプションビットで有効化)を設定します。
後述の最小パケットサイズ、無入力タイムアウトの設定を行っても反映されません。原則としてトリガー文字列を入力まで送信を保留し、トリガー文字列が来た時点でトリガー文字列も含めた形でパケット送信を試みます。
■ 透過モード(D)とヘッダ付き透過モード(E)時のみ有効です。
■ 設定書式
カンマ区切りで3つのパラメータを一度に設定し 20,8,100 の場合、トリガー文字列が 0x20、最小パケットサイズが 8 バイト、無入力タイムアウトが 100ms と設定します。
■ 値
・トリガー文字列 :16進数で指定します。0000-FFFF
・最小パケットサイズ: 1-80 を指定します。
・無入力タイムアウト:0なら無効、10-200 を指定します。あまり小さい値を指定すると、1バイトごとにタイムアウトするようになりますので、十分な時間を設定してください。
hヘッダのカスタマイズ/ハンドル名;U;%t;%i;0x%A;%q;%s;<*>;%X;\n

・ヘッダ付き透過モード

出力のカスタマイズをします。
詳しくはこちらをご確認ください。

・チャットモード

ハンドル名を指定します。ハンドル名は 23 文字まで利用可能です。各通信ごとにハンドル名が送信されるため、長いハンドル名は通信データ増大させます。

C暗号化00 は平文通信、1 は暗号化通信(AES128)です。同じ暗号化鍵で通信しないと受信時に暗号解読が出来ないため受信が失敗します。
※ 暗号化設定しない無線ノードからの平文メッセージは受信します。
※ ただし Ack 応答はするため、送信側では受信失敗を確認できません。(受信成功失敗の確認には受信側から返しのメッセージをもらうといった処理が必要です)
K暗号化鍵暗号化鍵を入力します。テキストで16文字を設定します。(バイナリ列を設定する事は出来ません)
※ 暗号化の鍵は平文で保存されます。
!リセットTWELITEをリセットします。
R初期値に戻す各設定をデフォルト値に戻します。この時点では設定値は保存されません。続けて設定する事も可能です。
※ 他の入力を行わず続けて S コマンドで保存すると、セーブ(不揮発)領域を初期化状態に戻します
S設定を保存する設定値を保存し、TWELITEをリセットします。

オプションビットの設定

オプションビット設定値を各ビットごとに解説します。

設定ビット
(16進)
説明
00000001スリープ設定用のIOピン(M3ピン)のプルアップを停止します。
プルアップ停止時には対象ピンをオープンにしないようにしてください。
※ M3 をオープン状態で起動すると、スリープ状態になる場合があり、設定変更等の操作を受け付けなくなります。M3ピンをHiにすることでスリープを解除します。
00000002透過モード選択ピン(I1-I4)のプルアップを停止します。
プルアップ停止時には対象ピンをオープンにしないようにしてください。
00000100送信トリガー文字の設定をします。
透過モード(D)、透過モード・ペアリング(T)で、設定された文字が入力されるとそれをトリガーとしてデータを送信します。例えば0x0Aを設定しておくと、LF改行文字毎にパケット分割され無線送信されます。
例) 改行文字などで終端されるコマンド列を連続的に送信したい場合に、遅延の少ない効率的な無線送信が行えます。
00000200新しい入力系列を優先します。
書式モード(A,B)、透過モード(D)で、送信完了前までに確定したUART入力データを破棄し、より新しい入力データを優先して送信します。
例) 制御値やセンサー値などを連続的に送信して、最新データを反映させたい場合
00001000応答メッセージの出力を停止します。
書式モード(A,B)、ヘッダ付き透過モード(E)時の送信処理完了メッセージを出力しません。
00004000

重複チェッカーの条件を緩くします。

数100ms以下の間隔で送信するなど、短い間隔で送信する場合はこのオプションを有効にしてください。

00010000BPSピンの設定と関係なくBAUD設定を反映します。
※ 外部から入出力できないボーレートに設定した場合、インタラクティブモード等の操作が出来なくなり、簡易な手段での回復は出来なくなります。セーブデータ領域を初期化する必要があります。
00020000UART1(副ポート)にも出力します。
※ 副ポートには原則として入力しないことを前提としていますが、インタラクティブモード・書式モード・チャットモード・透過モードの入力は受けつけるように実装されています。
※ UART入出力用に確保しているバッファ(入力4KB,出力4KB)は、主ポート・副ポートで半々(入力2KB,出力2KB)として利用します。
00040000UART0とUART1 を入れ替えます。
UART1 を主ポートとします。
00100000(ネットワーク層)中継器は1階層上位に限定して接続します。
ネットワーク層利用時のみ有効です。中継器が上位階層を探索する場合、通常はより上位の中で最大の電波強度を持つ中継器・親機に接続しますが、この設定では1段階上位に限定して接続します。
※ 中継テストを行う場合などに利用します。

中継機の設定

通信距離が足りない場合や障害物があって通信できない場合に中継機を使用することで通信距離を延長したり通信範囲を拡張することが期待できます。

中継機能を持った端末は受信したパケットをそのまま送信します。

設定方法

中継機能を使用する場合はインタラクティブモードで”r”を入力し、set Roleの値を1~3に設定してください。初期値は0です。

    
r: set Role (0x0)

1~3は最大中継回数です。0を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。

※ 設定は子機のみに有効です。 ※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。

設定例

図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。

中継機の設定例1

青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機の設定例2

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。

設定の初期化

設定内容によっては、操作が困難になる場合があります。(ボーレートを設定したが、ターミナルソフトが対応しないボーレートだった等)その場合は以下の方法で初期化してください。

  • 別のアプリを改めて書き込み、そのアプリ上で初期化操作を行う 。(インタラクティブモードで ‘R’ キーを押して、次に ‘S’ キーを押すと初期化します)

1.2.1.6 - 使用上の注意

App_Uartを使用する上での注意点
シリアル通信アプリを使用する上での注意点をご案内いたします。

マイコンとの接続

UARTポートのTX,RX信号を使用します。電圧範囲(2.0~3.6V範囲)が合致すれば直接接続ができます。動作電圧が5Vのマイコンは直接接続できません。接続する場合は電圧のレベル変換(レベルシフト)をしてください。

RS232Cとの接続

動作電圧が違うため直接接続することはできません。RS232C-UART信号変換回路を使用して接続してください。

1.3 - キューアプリ マニュアル

モノの動きを無線でお知らせ。
キューアプリ(App_CUE)は磁気・加速度センサータグ TWELITE CUE専用のアプリです。

1.3.1 - キューアプリ マニュアル

最新版

TWELITE CUEは無線マイコンTWELITE、3軸加速度センサー、磁気センサー、コイン電池ホルダ、アンテナをワンパッケージにしたものです。専用のCUEアプリ(ソフトウエア)があらかじめ書き込まれており、コイン型電池(CR2032)を入れるとすぐに動作を開始します。省電力で年単位の連続稼働も可能です。

無線タグを活用するアイデアを持っているがハードウエアやソフトウエアは苦手、または開発リソースが限られているという場合に最適です。

TWELITE CUEはよく飛び、電池長持ち、小型な無線タグです。

1.3.1.1 - 概要

App_CUEでできること
モノに装着することで動きや状態を無線送信できます。

機能

  • 複数の無線タグからのデータを親機で収集可能
  • 複数の無線タグを親機で制御可能
  • 16チャネルで複数システムを個別に運用可能
  • グループ毎に異なるアプリケーションIDを設定することで、同一チャネルに複数システムを混在可能
  • 暗号化と暗号化鍵の設定

1.3.1.2 - 各部の説明

TWELITE CUE ハードウェア各部の説明
各部の説明

1. TWELITE

TWELITE-トワイライトはセンサーの値を読み取ったり無線でデータを送受信する無線マイコンです。

2. LED

相手側の端末からLEDを点灯・消灯させることが出来ます。

3. 7Pインターフェイス

アプリの設定や書き込み時に使用するための標準インターフェイスです。

以下は信号ピンの対応表です。

名称信号名TWELITE DIPTWELITE(SMD)説明
GNDGND1, 1420, 28, 30, 31, 32電源のマイナス側
TXDDIO6108シリアル通信線(PC側はRX端子に接続)
PRGSPIMISO72GNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移
RXDDIO739シリアル通信線(PC側はTX端子に接続)
RSTRESETN2121GNDに接続するとリセット
VCCVCC285電源のプラス側
SET---拡張制御信号

4. 加速度センサー

XYZの3方向の加速度を検出するセンサーです。

5. I2C拡張端子

I2Cセンサーを拡張するための端子です。

6. 磁気センサー

磁石の近接を感知するセンサーです。磁石の極性がSかNかの判別もできます。

7. 電池ホルダー

CR2032用の電池ホルダーです。

8. 基板アンテナ

基板アンテナ(MW-A-P1934 )です。基板上に回路パターンで構成されたアンテナです。

1.3.1.3 - 動作モード

App_CUEの動作モード

本アプリには、以下の3種類の動作モードがあります。

1.3.1.3.1 - TWELITE CUEモード

衝撃の検知やドアの開閉、加速度の計測のすべてを行うことができるオールインワンモード

加速度の計測、衝撃の検知、姿勢の検知、磁石の検知といった機能をすべて利用できるオールインワンモードです。

工場出荷時は本モードに設定されております。

設定

本モードを使用する場合は以下の項目を設定してください。

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定00000000

親機の出力

親機の出力はこちら をご確認ください。

代表的な電池寿命

  • 5秒に1度の定期送信のみの場合、約80日
  • 5秒に1度の定期送信 + 1分に1度TWELITE CUEを動かした場合、約80日
  • 1分に1度の定期送信のみの場合、約700日
  • 1分に1度の定期送信 + 1分に1度TWELITE CUEを動かした場合、約565日

1.3.1.3.2 - 動作センサーパルモード

動作センサーパルとして動作するモード

動作センサーパルと同等の機能を使用できるモードです。

連続で加速度を計測する際や衝撃の検知を行う際は本モードを使用します。

本モードは次の3つのモードに分けられます。

  • 加速度計測モード
  • イベント検出モード
  • ダイスモード

加速度計測モード

加速度を間欠もしくは連続で計測し、送信するモードです。

設定

設定コマンド設定項目設定値備考
t送信間隔の設定0 or 1~4095単位は秒。
0:連続送信
1+:間欠送信
pセンサ固有パラメータの設定x3000yyyx : TWELITE 2525Aモードフラグ
yyy : 加速度センサープロパティ

TWELITE2525Aモードフラグ

TWELITE 2525Aモードフラグを1(センサ固有パラメータを13000000)に設定すると、TWELITE 2525AFIFO(通常)モード として動作します。TWELITE 2525Aの代替として使用したい場合にはこのモードをご使用ください。

加速度センサープロパティ

加速度センサープロパティで連続送信サンプル数やサンプリング周波数を変更できます。

これらの設定は足し合わせることで機能を組み合わせて使用できます。

設定値(16進)説明
0x?3????00~0x?3????FF間欠送信モード時に送信するサンプル数を設定できます。
送信するサンプル数は16サンプル単位で設定できます。
サンプル数=16+16x設定値

0x00000000 の場合:16サンプル(初期設定)
0x00000001 の場合:32サンプル
:
0x00000007 の場合:128サンプル
:
0x000000FF の場合:4096サンプル
0x?3???0??~0x?3???F??加速度のサンプリング周波数を変更できます。設定値毎のサンプリング周波数は下記の通りです。
0x00000000:25Hz(初期設定)
0x00000100:50Hz
0x00000200:100Hz
0x00000300:190Hz
0x00000400~0x00000F00:未定義

親機の出力

親機からの出力はこちらの項目 を参考にしてください。 親機の出力はこちら を参考にしてください。

ムーブモード

動き出し(Move)やシェイク(Shake)を検出することができます。

通知パルのLEDを制御することができます。

設定

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定01100000

親機の出力

親機の出力はこちら を参考にしてください。

使用上の注意

本モードは動きを検知してしてデータを送信します。
そのため、ゆっくり動かしたときは動きを検知できず、出力が変化しない場合があります。
その際は少し強めに動かしてください。

また、センサー固有パラメータ(p)を01000000にすると、動作検知の感度が厳しくなります。
もし、意図しないタイミングで電波を送信する場合は、センサー固有パラメータを01000000に設定してください。

ダイスモード

TWELITE CUEが上に向いている面を検出することができます。

イベント検出モードと同様に通知パルのLEDを制御することができます。

設定

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定02100000

親機の出力

親機の出力はこちら の動作センサーをご確認ください。

使用上の注意

本モードは動きを検知して面の判定を行います。
そのため、ゆっくり動かしたときは面が判定できず、出力が変化しない場合があります。
その際は机に置く、軽く衝撃を与えるなどをしてください。

また、センサー固有パラメータ(p)を02000000にすると、動作検知の感度が厳しくなります。
もし、意図しないタイミングで電波を送信する場合は、センサー固有パラメータを02000000に設定してください。

代表的な電池寿命

  • 加速度計測モード(間欠送信)で1分に1度送信した場合、約3.5年
  • 加速度計測モード(連続送信)でサンプリング周波数が25Hzの場合、約20日
  • イベント検出モードもしくはダイスモードで1分に1度、TWELITE CUEを動かした場合、約3年

1.3.1.3.3 - 開閉センサーパルモード

開閉センサーパルとして動作するモード

モノに装着し、磁石の有無によってその開閉を知ることができるモードです。

ドアの開閉や工場設備の稼働状況を計測する場合は本モードを使用します。

設定

本モードを使用する場合は以下の項目を設定してください。

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定04000000

親機の出力

親機の出力はこちら の開閉センサーをご確認ください。

代表的な電池寿命

1日に200回の開閉を行なった場合、約4年です。(含1分毎の定期送信)
1日に0回の開閉を行なった場合、約4.5年です。(含1分毎の定期送信)

1.3.1.4 - 設定方法

App_CUEの設定
TWELITE CUEを設定する方法は2種類あります。

お好みの設定方法をお選びください。

1.3.1.4.1 - OTAによる設定

ケーブル接続を必要としない設定方法

OTA設定はインタラクティブモード の設定をケーブル接続不要で行う機能です。

OTAによる設定手順

以下の手順でOTAによる設定を行います。

  1. TWELITE STAGE APPを起動する。
    パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。

  2. MONOSTICKにOTA設定用のアプリを書き込む。
    TWELITE STAGE APPのトップメニューから
    2: アプリ書換>3: TWELITE APPS ビルド&書換> 2: App_CUE_OTA
    を選択する。

  3. インタラクティブモードで設定値を入力する。
    TWELITE STAGE APPのトップメニューから3: インタラクティブモードを選択して値を変更し保存する。

  4. OTA設定を実行する。
    MONOSTICKから約20cm以内の距離で、TWELITE CUEの磁気センサーに磁石を近づけたり遠ざけたりを5回以上繰り返し、TWELITECUEのLEDが点滅することを確認する。

  5. MONOSTICKの出力を確認する。
    MONOSTICKより以下のようなメッセージが出力することを確認する。
    出力されない場合は、こちら を確認する。

    OTA成功時の出力

OTAがうまくいかなかった場合

OTAが何らかの原因でうまくいかなかった場合、MONOSTICKから以下のように出力されます。

エラー出力エラー内容
OTA FAILURE
  OTA request TS=20515[ms]
  LQI:63 (RF strength, >= 100)
  SID:810BA765
  TWELITE CUE:v1.0.2
  Protocol Version:0x11

  — LQI is small. Please make TWELITE CUE closer. —
MONOSTICKとTWELITE CUEの距離が遠い場合に出力されるエラーです。

TWELITE CUEとMONOSTICKをもっと近接させた状態で電源を入れなおすか磁気センサーの近くで磁石をスライドさせてください。

1.3.1.4.2 - TWELITE R2による設定

TWELITE R2の接続を必要とする設定方法

TWELITE CUEの7PインターフェイスにTWELITE R を接続することで設定することもできます。

コイン電池の挿入方法

TWELITE R2を使用して設定する場合は以下の手順で設定してください。

  1. TWELITE STAGE APPを起動する。
    パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。
  2. インタラクティブモードで設定値を入力する。
    TWELITE STAGE APPのトップメニューから 3:インタラクティブモード を選択して値を変更し保存する。

1.3.1.4.3 - インタラクティブモード

App_CUEの設定可能なパラメータ

本アプリでは、インタラクティブモードからアプリの詳細設定を行うことができます。

インタラクティブモードに入ると以下の画面が表示されます。

    --- CONFIG/App_CUE V1-00-2/SID=0x810ba765/LID=0x01 ---
 a: set Application ID (0x67720102)
 i: set Device ID (--)
 c: set Channels (18)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0xA5A5A5A5)
 o: set Option Bits (0x00000001)
 t: set Transmission Interval (5)
 p: set Senser Parameter (0x00000000)
---
 S: save Configuration
 R: reset to Defaults
  

設定コマンド一覧

コマンド設定項目初期値説明
aアプリケーションID0x67720102同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。
i論理デバイスID子機の論理デバイスIDを設定します。1~100までの値を設定できます。
設定値が “–” の場合は、論理デバイスIDは内部で1に設定されます。
c周波数チャネルの設定18チャネル(11~26)を選択します。省電力動作を優先する観点から、複数チャネルの指定は無効としています。
x送信出力の設定131桁、または2桁の数字を指定します。2桁目は省略可能です。 1桁目は、送信出力を設定します。3が最強で2,1,0と1段階小さくなるたびに -11.5db 出力が低下します。出力を制限し電波の有効伝達範囲を小さくしたい場合に使用します。ただし、伝達可能距離は環境(ノイズ・遮蔽物など)に影響を受けます。
※ 理論上の伝達距離は 6db 出力が小さくなるたびに 1/2 になりますので、1段階小さくすることで伝達距離は約1/4になります。 2桁目は再送回数を設定します。2桁目は 0~9を指定し、0はデフォルトで再送なし、1~9は再送回数に対応します。

例:
3 -> 再送なし・最強出力(デフォルト、省略時)
42 -> 再送4回・出力は2(1段階弱める)
bUARTボーレートの設定38400入力値にかかわらず115200bps固定です。
BUARTパリティの設定8N1入力値にかかわらず8N1で固定です。
k暗号化鍵の設定0xA5A5A5A5暗号化鍵を入力します。32bitの16進数を設定します。通信グループ内は全て同一の値に設定してください。
oオプションビットの設定0x00000001各種詳細設定ができます。
t送信間隔の設定5定期送信パケットの送信間隔を秒単位で設定します。1〜4095の値で指定可能です。範囲外の設定をした場合の動作は不定です。
pセンサ固有パラメータの設定0モードの切り替えやパラメータの設定をします。0以上の16進数で指定できます。詳細は、各種モード のページを参照ください。
S設定値の保存設定を保存し、モジュールを再起動します。
R初期値に設定を戻す設定を初期化します。他の操作を行わず、続けてS キーによる設定の保存を行うとセーブ領域のクリアを行います。

オプションビットの設定

オプションビット設定値を各ビットごとに解説します。

ビット(16進)説明
0x00000001各中継機または親機宛に送信し、受信した中継機すべての情報が親機に転送され、シリアル出力されます。
この場合、複数の受信パケットを分析する事で一番近くで受信したルータを特定することができます。
0x00000040OTAを無効にする。
0x00001000暗号化通信を有効にします。(相手側の暗号化設定もしてください。)
0x00010000UART通信でのメッセージ出力を有効にします。

1.3.1.5 - 使用上の注意

TWELITE CUE 使用上の注意

対応するハードウェア

キューアプリは、工場出荷時のTWELITE CUEに始めから書き込まれております。

キューアプリはTWELITE CUEで動作しますが、類似製品のTWELITE 2525Aとは互換性がありません。

1.4 - アリアアプリ マニュアル

温度・湿度を無線でお知らせ。
アリアアプリ(App_ARIA)は磁気・湿度・温度センサータグ TWELITE ARIA専用のアプリです。

1.4.1 - アリアアプリ マニュアル

最新版

TWELITE ARIAは無線マイコンTWELITE、温湿度センサー、磁気センサー、コイン電池ホルダ、アンテナをワンパッケージにしたものです。専用のCUEアプリ(ソフトウエア)があらかじめ書き込まれており、コイン型電池(CR2032)を入れるとすぐに動作を開始します。省電力で年単位の連続稼働も可能です。

無線タグを活用するアイデアを持っているがハードウエアやソフトウエアは苦手、または開発リソースが限られているという場合に最適です。

TWELITE ARIAは同時に複数台使用することができ、下図のように親機1台で複数の温湿度、扉の開閉状態のデータを受信することが可能です。

複数台の子機を使うイメージ

複数台の子機を使用可能

親機・中継機アプリ(App_Wings) を書き込んだMONOSTICKTWELITE UART などを親機としてご使用いただけます。
親機のシリアル出力の書式は以下のページをご確認ください。

アリアアプリ

また、通信距離が足りない場合、親機・中継機アプリを書き込んだTWELITEで中継することで、通信距離を延長することが可能です。

中継機を使用するイメージ

中継機を使用可能

中継機の使用方法は以下のページをご確認ください。

中継機モード

TWELITE ARIAのデータシートは以下のページをご参照ください。

TWELITE ARIA データシート

製品ページ

TWELITE ARIA

1.4.1.1 - 各部の説明

TWELITE ARIA 各部の説明
各部の説明

TWELITE ARIA

1. TWELITE

TWELITE-トワイライトはセンサーの値を読み取ったり無線でデータを送受信する無線マイコンです。

2. LED

相手側の端末からLEDを点灯・消灯させることが出来ます。

3. 7Pインターフェイス

アプリの設定や書き込み時に使用するための標準インターフェイスです。

以下は信号ピンの対応表です。

名称信号名説明
GNDGND電源のマイナス側
TXDDIO6シリアル通信線(PC側はRX端子に接続)
PRGSPIMISOGNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移
RXDDIO7シリアル通信線(PC側はTX端子に接続)
RSTRESETNGNDに接続するとリセット
VCCVCC電源のプラス側
SET-拡張制御信号

4. 温湿度センサー

温湿度XYZの3方向の加速度を検出するセンサーです。

5. I2C拡張端子

I2Cセンサーを拡張するための端子です。

6. 磁気センサー

磁石の近接を感知するセンサーです。磁石の極性がSかNかの判別もできます。

7. 電池ホルダー

CR2032用の電池ホルダーです。

8. 基板アンテナ

基板アンテナ(MW-A-P1934 )です。基板上に回路パターンで構成されたアンテナです。

1.4.1.2 - 使用方法

TWELITE ARIAの使用方法
TWELITE ARIAの使用方法を2つのステップに分けて説明します。

1.4.1.2.1 - 動作確認

MONOSTICKとPCを使用して、TWELITE ARIAの動作確認を行う
TWELITE CUEとMONOSTICKを使用して温度を計測してみましょう。

必要なもの

  1. TWELITE CUE
  2. MONOSTICK

電池を入れる

CR2032電池の+側を電池ホルダー(+)の向きで差し込みます。TWELITE CUEのLEDが3回点滅すれば正常です。
起動後は5秒毎に送信をし、送信時にLEDが1回点滅します。

電池の装着方法の説明図

電池の装着

また、TWELITE ARIAの電池ホルダーは構造上、半田付け部が外れやすいため、以下に注意して電池を挿入してください。

  • コイン電池の取り外し時には電池ホルダーの半田付け部に力がかかりにくくなるように、電池ホルダーを上から軽く指で押さえながらコイン電池を取り外すことを推奨します。
  • TWELITE ARIAの運用時は、専用ケースで電池ホルダーを上から押さえながら使用することを推奨します。

固定用磁石を取り付ける

図の位置の窪みに磁石を取り付けると、TWELITE ARIAを金属面に貼り付けることができます。必要に応じてお使いください。

磁石の設置箇所

磁石の設置箇所

ケースに入れる

丸印で示したようにケースの縁にある爪に引っ掛けて収めてください。

基板の挿入方法の説明図

基板の挿入

ケースを開ける

ケースの切り込みにコインを差し込みこじ開けてください。

コインを差し込む場所の説明図

コインを差し込む場所

親機・中継機の準備

通信相手として親機が必要です。通信距離を延長する場合は中継機 が使用できます。親機、中継機にはMONOSTCK - モノスティック を使用することができます。

MONOSTCK - モノスティックのアプリは親機・中継機アプリ Wings-ウイングス のバージョンv1-01-4以上を書き込んでください。

動作確認をする

TWELITE ARIAを動かしたり、磁石を近づけたりして、パソコンに接続したMONOSTICKで受信したデータを確認してみましょう。

TWELITE STAGE SDKの準備

まず最初にTWELITE STAGE SDK の最新版をパソコンにインストールします。

TWELITE STAGE APPを起動する

  1. MONOSTICKをパソコンのUSBポートに接続します。
  2. インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
    ・TWELITE_stage.exe(Windows)
    ・TWELITE_stage.command(macOS)
    ・TWELITE_stage.run(Linux)
    起動するとUSBに接続されたMONOSTICKが画面上に表示されます。
  3. シリアルポート選択画面から1: MONOSTICKを選択してください。
  4. デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。

親機の準備

通信相手として親機が必要です。親機にはMONOSTCK - モノスティック を使用することができます。
以下の手順で親機・中継機アプリ Wings-ウイングス をMONOSTICK - モノスティックに書き込んでください。

  1. トップメニューから 2:アプリの書換 > 1:BINから選択を選択してください。
  2. MONOSTICK BLUE を使用している場合はApp_Wings_MONOSTICK_BLUE_… を選択し、MONOSTICK RED を使用している場合はApp_Wings_MONOSTICK_RED_… を選択してください。
  3. 書き込み完了後はインタラクティブモードに入らずにESCキーを長押ししてトップメニューに戻ってください。

ビューアを選択する

  1. トップメニューから 1:ビューア > 4: CUE/ARIAビューア を選択します。
  2. TWELITE ARIA タブをクリックします。
TWELITE ARIAビューアの画面

TWELITE ARIAビューア

TWELITE ARIAの動作確認をする

温度、湿度を計測する

5秒ごとに温湿度の値が更新されます。

磁石を検出させる

  • 磁石のN極を磁気センサーに近づけると「[N極]」と表示されます。
  • 磁石のS極を磁気センサーに近づけると「[S極]」と表示されます。
  • 磁石を磁気センサーから遠ざけると「 —- 」と表示されます。

モードを変更する

モードを変更することで、TWELITE ARIAの振る舞いを変更することができます。

詳しくは以下のページをご確認ください。

モード選択

設定を変更する

グループ分けや送信頻度の変更などはインタラクティブモードで設定できます。

インタラクティブモードへの移行方法は以下のページをご確認ください。

設定方法

また、設定できる項目については以下のページをご確認ください。

インタラクティブモード

ログを出力する

パルスクリプトで温湿度などのデータをCSV形式でログに出力することができます。

詳しくは以下のページをご確認ください。

パルスクリプト

グラフを描画する

パルビューアで温湿度や磁気センサーの値をグラフで見ることができます。

詳しくは以下のページをご確認ください。

パルビューア

1.4.1.2.2 - モード選択

動作モード変更によってTWELITE ARIAの振る舞いをカスタマイズ
TWELITE ARIAはTWELITE ARIAモードと開閉センサーパルモードの2種類があります。

TWELITE ARIAモード

TWELITE ARIAの初期設定モードです。

温湿度計測とドアの開閉の検知を同時に行うことができるオールインワンモードです。

開閉センサーパルモード

開閉センサーパルとして動作するモードです。

ドアの開閉や工場設備の稼働状況を計測する場合は本モードを使用します。

1.4.1.2.2.1 - TWELITE ARIAモード

初期設定のモード
温湿度の計測、磁石の有無のすべてを試すことができるオールインワンモードです。

工場出荷時は本モードに設定されております。

設定

本モードを使用する場合は以下の項目を設定してください。

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定00000000

親機の出力

以下の出力例をもとに出力メッセージを解説します。

    :80000000C90005810A07B701800607003400038135001205350401000000113008020D1611300102055E0000000180050100020A3A0102000211B3DF13
 ^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^9^^^^^^^^^^^^^^^a^^^^^^^b^^^c^^^^^^^d^^^e^^^^^^^f^g^^^^^^^h^^^i^^^^^^^j^^^k^l^m
  
意味バイト数データ例備考
1中継機シリアルID480000000
2LQI1C9
3続き番号20005
4送信元シリアルID4810A07B7
5送信元LID101
6センサー種別180
7PAL IDとPAL Ver106TWELITE ARIA
8センサーデータ数1077
9センサーデータ0700340003813500

イベントデータあり

タイマー起床

aセンサーデータ181205350401000000タイマー0で起床
bセンサーデータ2 (ヘッダ)411300802

2バイト、拡張ビット有
電圧(電源電圧)

cセンサーデータ220D163350mV
dセンサーデータ3 (ヘッダ)411300102

2バイト、拡張ビット有
電圧(ADC1)

eセンサーデータ32055E1432mV
fセンサーデータ4 (ヘッダ)400000001

1バイト、拡張ビットなし

ホールIC

gセンサーデータ4180オープン(変化なし)
hセンサーデータ5 (ヘッダ)405010002

符号あり2バイト

温度

iセンサーデータ520A3A26.18°C
jセンサーデータ6 (ヘッダ)401020002符号なし2バイト 
kセンサーデータ6211B345.31%
lチェックサム11DF1~lのCRC8
mチェックサム21131~mのLRC

代表的な電池寿命

  • 5秒に1度の定期送信のみの場合、約340日
  • 5秒に1度の定期送信 + 1分に1度磁石を近づけた場合、約300日
  • 1分に1度の定期送信のみの場合、約4年
  • 1分に1度の定期送信 + 1分に1度磁石を近づけた場合、約2.5年

1.4.1.2.2.2 - 開閉センサーパルモード

開閉センサーパルとして動作するモード
モノに装着し、磁石の有無で開閉を知ることができるモードです。

設定

本モードを使用する場合は以下の項目を設定してください。

設定コマンド設定項目設定値備考
pセンサ固有パラメータの設定04000000
設定方法は設定方法 をご確認ください。

親機の出力

親機の出力はこちら の開閉センサーをご確認ください。

代表的な電池寿命

1日に200回の開閉を行なった場合、約4年です。(含1分毎の定期送信)
1日に0回の開閉を行なった場合、約4.5年です。(含1分毎の定期送信)

1.4.1.3 - 設定方法

TWELITE ARIAの設定方法

TWELITE ARIAを設定する方法は以下の2種類あります。

設定できる内容に関してはインタラクティブモードをご確認ください。

OTAによる設定

OTAとはOver the Airの略です。非接触での通信を意味します。OTA設定はインタラクティブモード での設定をケーブル接続不要で行う機能です。

OTAを実行するには MONOSTICK-モノスティック が必要です。

TWELITE R2を使用する設定

TWELITE CUEの7PインターフェイスにTWELITE R2 を接続してインタラクティブモードで設定を行うことも可能です。

1.4.1.3.1 - OTAによる設定

TWELITE ARIAとMONOSTICKとの無線通信による設定

OTAによる設定手順

以下の手順でOTAによる設定を行います。

  1. TWELITE STAGE APPを起動する。
    パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。\

  2. MONOSTICKにOTA設定用のアプリを書き込む。
    TWELITE STAGE APPのトップメニューから
    2: アプリ書換>3: TWELITE APPS ビルド&書換> 2: App_ARIA_OTA
    を選択する。\

  3. インタラクティブモードで設定値を入力する。
    TWELITE STAGE APPのトップメニューから3: インタラクティブモードを選択して値を変更し保存する。\

  4. OTA設定を実行する。
    MONOSTICKから約20cm以内の距離で、TWELITE ARIAの磁気センサーに磁石を近づけたり遠ざけたりを5回以上繰り返し、TWELITE ARIAのLEDが点滅することを確認する。\

  5. MONOSTICKの出力を確認する。
    MONOSTICKより以下のようなメッセージが出力することを確認する。
    出力されない場合は、こちら を確認する。

OTAの成功時の出力

OTAがうまくいかなかった場合

OTAが何らかの原因でうまくいかなかった場合、MONOSTICKから以下のように出力されます。

エラー出力エラー内容

OTA FAILURE

OTA request TS=20515[ms]
LQI:63 (RF strength, >= 100)

SID:810BA765

TWELITE ARIA:v1.0.0

Protocol Version:0x11

— LQI is small. Please make TWELITE ARIA closer. —

MONOSTICKとTWELITE ARIAの距離が遠い場合に出力されるエラーです。

TWELITE ARIAとMONOSTICKをもっと近接させた状態で電源を入れなおすか磁気センサーの近くで磁石をスライドさせてください。

1.4.1.3.2 - TWELITE R2による設定

TWELITE ARIAとTWELITE R2を有線接続して行う設定
TWELITE R2との接続方法

TWELITE R2との接続

TWELITE R2を使用して設定する場合は以下の手順で設定してください。

  1. TWELITE STAGE APPを起動する。
    パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。
  2. インタラクティブモードで設定値を入力する。
    TWELITE STAGE APPのトップメニューから 3:インタラクティブモード を選択して値を変更し保存する。

1.4.1.4 - インタラクティブモード

TWELITE ARIAのインタラクティブモード
インタラクティブモードでアプリの詳細設定を行うことができます。

ここではTWELITE ARIA固有の機能を説明します。共通機能については、インタラクティブモード(共通機能) を参照してください。

インタラクティブモードに入ると以下の画面が表示されます。

    --- CONFIG/App_ARIA V1-00-0/SID=0x810ba765/LID=0x01 ---
 a: set Application ID (0x67720102)
 i: set Device ID (--)
 c: set Channels (18)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0xA5A5A5A5)
 o: set Option Bits (0x00000001)
 t: set Transmission Interval (5)
 p: set Senser Parameter (0x00000000)
---
 S: save Configuration
 R: reset to Defaults
  

設定コマンド一覧

コマンド設定項目初期値説明
aアプリケーションID0x67720102同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。
i論理デバイスID子機の論理デバイスIDを設定します。1~100までの値を設定できます。
c周波数チャネルの設定18チャネル(11~26)を選択します。省電力動作を優先する観点から、複数チャネルの指定は無効としています。
x送信出力の設定13

1桁、または2桁の数字を指定します。2桁目は省略可能です。 1桁目は、送信出力を設定します。3が最強で2,1,0と1段階小さくなるたびに -11.5db 出力が低下します。出力を制限し電波の有効伝達範囲を小さくしたい場合に使用します。ただし、伝達可能距離は環境(ノイズ・遮蔽物など)に影響を受けます。
※ 理論上の伝達距離は 6db 出力が小さくなるたびに 1/2 になりますので、1段階小さくすることで伝達距離は約1/4になります。 2桁目は再送回数を設定します。2桁目は 0~9を指定し、0はデフォルトで再送なし、1~9は再送回数に対応します。
例:
3 -> 再送なし・最強出力(デフォルト、省略時)
42 -> 再送4回・出力は2(1段階弱める)

bUARTボーレートの設定115200入力値にかかわらず115200bps固定です。
BUARTパリティの設定8N1入力値にかかわらず8N1で固定です。
k暗号化鍵の設定0xA5A5A5A5暗号化鍵を入力します。32bitの16進数を設定します。通信グループ内は全て同一の値に設定してください。
oオプションビットの設定0x00000001各種詳細設定ができます。
t送信間隔の設定5定期送信パケットの送信間隔を秒単位で設定します。1〜4095の値で指定可能です。範囲外の設定をした場合の動作は不定です。
pセンサ固有パラメータの設定0PALごとに決められたパラメータの設定をします。0以上の16進数で指定できます。
S設定値の保存設定を保存し、モジュールを再起動します。
R初期値に設定を戻す設定を初期化します。他の操作を行わず、続けてS キーによる設定の保存を行うとセーブ領域のクリアを行います。

オプションビットの設定

オプションビット設定値を各ビットごとに解説します。

ビット(16進)説明
ビット(16進)説明
0x00000001

各中継機または親機宛に送信し、受信した中継機すべての情報が親機に転送され、シリアル出力されます。
この場合、複数の受信パケットを分析する事で一番近くで受信したルータを特定することができます。

0x00000040OTAを無効にする。
0x00001000暗号化通信を有効にします。(相手側の暗号化設定もしてください。)
0x00010000UART通信でのメッセージ出力を有効にします。

1.4.1.5 - 使用上の注意

TWELITE ARIAの使用上の注意

ケースの防水性能について

TWELITE ARIAのケースは防水仕様ではありません。

屋外で使用する場合は、以下の対策などが考えられますが、防水方法についてはお客様が検討・評価いただきますようお願いいたします。

  • ケースの合わせ目を防水テープなどで封をする
  • 空気穴に通気テープを張り付ける
  • ねじ止め穴にOリングをいれる
  • ねじをしっかり締める

2 - TWELITE STAGE APP

ビルドや書き換え、設定やデータ表示を行うアプリケーション
TWELITE STAGE APP は、ファームウェアのビルドや書き換え、TWELITE APPSの設定やデータ表示を行うアプリケーションです。評価開発環境 TWELITE STAGE で使用します。

2.1 - TWELITE STAGE APP マニュアル

ビルドや書き換え、設定やデータ表示を行うアプリケーション
TWELITE STAGE APP は、ファームウェアのビルドや書き換え、TWELITE APPSの設定やデータ表示を行うアプリケーションです。評価開発環境 TWELITE STAGE で使用します。

様々なプラットフォームで動作します。

  • Windows10
  • macOS (High Sierra 以降、Intel および Apple Silicon Mac に対応)
  • Linux (Ubuntu18.04)
  • Raspberry Pi (Raspberry Pi 3 Model B, Lcd Touch Screen, Raspberry Pi OS August-2020)
  • (M5stack : バージョン1.0 まで対応。v1.3以降はソースレベルで非対応です。)

※ プラットフォームによって、動作条件や配布形式、また機能が異なります。

ルートメニュー

ルートメニュー

加速度リアルタイムグラフ

加速度リアルタイムグラフ

本資料について

  • 対象のプラットフォームを示すため、一部のページでは以下を記載しています。
    • Windows   – Windows 10
    • macOS   – Mac OS X, OS X, macOS
    • Linux   – Ubuntuなど(64bit)
    • RasPi   – Raspberry Pi

2.1.1 - パッケージの取得

TWELITE STAGE APP の取得方法

最新版のTWELITE STAGE アプリは、以下のいずれかの方法で取得できます。

TWELITE STAGE SDK 全体(公式サイト)

モノワイヤレス公式サイトでは、TWELITE STAGE アプリを含む開発ツール一式(Windows/macOS/Linux用)を配布しています。

TWELITE STAGE-トワイライトステージ - MONO-WIRELESS.COM

TWELITE STAGE アプリのみ(GitHub)

モノワイヤレス公式リポジトリでは、TWELITE STAGE アプリ単体のバイナリを配布しています。 TWELITE STAGE アプリだけを更新する場合や、M5Stack版を取得する際にはこちらをご利用ください。 各バイナリのバージョンはGitHub上のtagから識別できます。

Windows

monowireless/TWELITE_Stage_BIN_Win: Binary Distribution of TWELITE Stage.

macOS

monowireless/TWELITE_Stage_BIN_macOS: Binary distribution of TWELITE Stage for macOS

Linux

Linux 版のバイナリは個別に配布しておりません。 バイナリは TWELITE STAGE SDK パッケージから取得してください。 もしくは、ソースコードからビルドしてください。

Raspberry Pi

Raspberry Pi 版のバイナリは個別に配布しておりません。 バイナリは TWELITE STAGE SDK パッケージから取得してください。 もしくは、ソースコードからビルドしてください。

M5Stack

バージョン 1.0.3a までを以下のページで配布しております。

monowireless/TWELITE_STAGE_Bin_M5Stack

ソースコード (MWM5ライブラリ)

TWELITE STAGE のソースコードを含む MWM5 ライブラリは以下のページで公開しています。

monowireless/mwm5

TWELITE STAGE アプリのソースコードは、examples/TWELITE_Stageに配置しています。

2.1.2 - インストール

TWELITE STAGE APP のインストール方法

動作環境によっては、本アプリケーションの動作に各種設定が必要です。問題が生じた場合には、本資料の記述を参考にして環境を整備してください。

TWELITE STAGE SDK のインストール手順

① アーカイブを取得

各プラットフォーム (Windows / macOS / Linux) 用の TWELITE STAGE SDK を ダウンロード します。

② アーカイブを展開

ダウンロードしたZipアーカイブを展開します。

③ ファイルを確認

展開先のフォルダを確認します。

展開先のフォルダ {MWSTAGE インストール} には、以下が含まれます。

  • TWELITE STAGE APP
    • Windows の場合:TWELITE_Stage.exe(通常版)、TWELITE_Stage_VSCode.exe(VSCode対応版)
    • macOS の場合:TWELITE_Stage.command(通常版)、TWELITE_Stage_VSCode.command(VSCode対応版)
    • Linux の場合:TWELITE_Stage.run(通常版)、TWELITE_Stage_VSCode.run(VSCode対応版)
  • TWELITE_STAGE - TWELITE STAGE APP の関連ファイル
  • MWSDK - ライブラリ、ソースコードなど
  • Tools - ビルドするためのツールチェインなど
  • BIN - TWELITE STAGE APP の [BINから選択]メニューで参照されるTWELITE 向け.BINファイル
  • log - TWELITE STAGE APP のログ機能やデータベースファイルの保存先
  • flask_wsns_db - Python, Flask, sqlite3 による簡易的なサーバ

詳細は「フォルダ構成 」をご覧ください。

2.1.2.1 - プラットフォーム別の注意事項

インストールにおけるプラットフォーム別の注意事項

TWELITE STAGE APP を各プラットフォームにインストールする際の注意事項を記載しています。

2.1.2.1.1 - Windowsへインストールする際の注意事項

TWELITE STAGE APP を Windows へインストールする際の注意事項
Windows

環境

以下の環境で開発・動作確認しています。

  • Windows10 バージョン 1903
  • VisualStudio 2019 (32bit ビルド)

シリアルポートの取り扱い

MONOSTICK や TWELITE R シリーズには、 FTDI社の USBシリアル変換IC(FT230/FT232 シリーズ)を搭載しています。これらを利用するために、デバイスドライバのインストールが必要となる場合があります。

PC がMONOSTICK や TWELITE R を認識しない場合には、 https://www.ftdichip.com より D2XX ドライバをインストールしてください。

Visual C++ ランタイムライブラリの追加インストール

場合によっては、Visual Studio 2019 の Visual C++ 頒布可能コード(ランタイムライブラリ)が必要です。

アプリケーションの起動時にエラーが出て起動しない場合は、本パッケージで再配布している TWELITE_Stage¥INSTALL¥VC_redist.x86.exe を実行するか、マイクロソフト社のウェブサイトから入手してください。なお、再配布バイナリは 32bit です。

2.1.2.1.2 - macOSインストールする際の注意事項

TWELITE STAGE APP を macOS へインストールする際の注意事項
macOS

環境

以下の環境で開発・動作確認しています。

  • macOS 10.14 (Mojave, Intel)
  • macOS 12 (Monterey, Apple Silicon)

依存するソフトウェアや警告ダイアログについて

下記の事象が発生した場合には、 TWELITE_Stage.command の動作のために、実行の許可やインストールが必要です。

  • ツールチェインにはコード署名がなされていますが、コード署名が正しく認証されない場合は、ビルドツールチェイン (ba-elf-gcc など) の実行形式一つずつについて、動作許可を求められる場合があります。
  • ダウンロードアーカイブには署名しておりません。実行時には、インターネットからダウンロードされたアプリケーションとしてセキュリティ警告が出る場合があります。
  • TWELITE_Stage.command をインストールしたパスからの実行許可を要求される場合があります。
  • ビルド実行時に make ユーティリティのインストールダイアログが出る場合があります。

make ユーティリティの追加インストール

場合によっては、make ユーティリティをインストールしなくてはなりません。

コマンドライン (zsh) から make を実行したときに、エラーが出る場合には Command Line Tools をインストールします。


    
xcode-select --install

インストールが完了したら、make を入力して以下のメッセージの出力を確認します。


    
make
make: *** No targets specified and no makefile found.  Stop.

シリアルポートの取り扱い

MONOSTICK や TWELITE R シリーズには、 FTDI社 (https://www.ftdichip.com ) の USBシリアル変換IC(FT230/FT232 シリーズ)を搭載しています。これらを利用するために、デバイスドライバのインストールが必要となる場合があります。

TWELITE_Stage.command を起動してもシリアルポートが表示されない場合は、FTDI社のドライバをアンロード(無効化)してください。

https://www.ftdichip.com/Drivers/D2XX.htm より D2xxHelper をダウンロードできます。 なお、TWELITE STAGE SDKの TWELITE_Stage/INSTALL フォルダにも同じものを収録しています。

参考:FTDI社デバイスドライバの手動アンロード

FTDI 関連のドライバをアンロードするには、以下のコマンドを実行します。


    
sudo kextunload -b com.apple.driver.AppleUSBFTDI

2.1.2.1.3 - Linuxへインストールする際の注意事項

TWELITE STAGE APP を Linux へインストールする際の注意事項
Linux

環境

以下の環境で開発・動作確認しています。

  • Ubuntu 16.04, 18.04, 20.04
  • NNLinux Beta8 64bit
  • CentOS 7

シリアルポートの取り扱い

TWELITE STAGE から MONOSTICK や TWELITE-R を認識するには、ftdi_sioモジュールをアンロードし、USBデバイスに対して読み書き権限を与える必要があります。

なお、この設定を自動化するための udev の設定スクリプト(Ubuntu, CentOS) を用意しています。

/etc/udev/rules.d に定義をコピーして、設定をリロードします。 設定後は USB デバイスを抜き差ししてから TWELITE_Stage.run を実行してください。起動直後の画面で USB デバイスが表示されたなら、設定が反映されています。

Ubuntu 16.04, 18.04, 20.04


    
cd ./MWSTAGE/TWELITE_Stage/INSTALL/ubuntu/
sudo ./set_udev_sudo.sh

定義ファイル(読みやすいように改行しています)

    ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",
   MODE="0666",
   RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"
ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015",
   MODE="0666",
   RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"
  

Centos 7


    
cd ./MWSTAGE/TWELITE_Stage/INSTALL/centos/
sudo ./set_udev_sudo.sh

定義ファイル(読みやすいように改行しています)

    ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",
   MODE="0666",
   RUN+="/bin/sh -c '/usr/sbin/rmmod ftdi_sio'"
ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015",
   MODE="0666",
   RUN+="/bin/sh -c '/usr/sbin/rmmod ftdi_sio'"
  

アプリケーションの登録

必要に応じて、お使いのデスクトップ環境に合った方法でアプリケーションを登録してください。

Ubuntu 16.04, 18.04, 20.04

Ubuntu用の定義ファイル生成スクリプトを用意しています。


    
cd ./MWSTAGE/TWELITE_Stage/INSTALL/ubuntu/
./make_launch_icon.sh

このスクリプトは .desktop ファイル(アプリ定義)を $HOME/.local/share/applications に作成します。

スクリプト実行後に、アプリケーション一覧に TWELITE STAGE のアイコンが追加されます。

2.1.2.1.4 - Raspberry Piへインストールする際の注意事項

TWELITE STAGE APP を Raspberry Pi へインストールする際の注意事項
RasPi

TWELITE STAGE APPは、一部を除く Raspberry Pi で動作します。

  • マウスとタッチスクリーンに対応します。
  • ビルドツールチェインが付属しており、コンパイルもできます。
  • 実行形式には、X11版のほかにフレームバッファ版(nox)があるほか、半透明エフェクトなどを省略した軽量版があります。

環境

以下の環境で開発・動作確認しています。

ハードウェア

  • Raspberry Pi 3 Model B
  • LCD Screen: Raspberry Pi Touch Display (7")

ソフトウェア

  • Raspberry PI OS (32bit) Lite (Version:August 2020)

既知の問題・制限事項

  • 1回目の起動で /dev/serial0 の動作に失敗することがあります。
  • Raspberry Pi 4B では /dev/serial0 の動作は未検証です。
  • Raspberry Pi 4B ではタッチスクリーンの動作は未検証です。
  • TWELITE STAGE への入力文字列が/dev/tty1上で動作してるシェルやgettyへ入力文字列がそのまま渡されます。/dev/tty1から起動することを推奨します。
  • 他のインストールや動作のプログラム(X11など)に影響を受けることがあります。

アーカイブの展開

ダウンロードしたアーカイブファイルは、パス名に空白や日本語などが含まれないフォルダに展開します。

以下ではRaspberry Piのホームフォルダに展開しています。


    
cd /home/pi
unzip MWSTAGE2020_XX_YYYY.zip

フォルダ構成

    ../MWSTAGE
     TWELITE_Stage.run    TWELITE_Stage アプリ
     BIN/                 ファームウェアBINファイル
     MWSDK/               MWSDK ライブラリなど
     TWELITE_Stage/       TWELITE_Stage アプリ関連ファイル
  

デバイスドライバ

TWELITE STAGE から MONOSTICK や TWELITE R を認識するためには、ftdi_sioモジュールのアンロードや、USBデバイスに対する読み書き権限の付与が必要です。

この設定を自動化するための udev の設定スクリプトを用意しています。/etc/udev/rules.d に定義をコピーして、設定をリロードしています。設定後は USB デバイスを抜き差ししてから TWELITE_Stage.run を実行してください。起動直後の画面で USB デバイスが表示されたなら、設定が反映されています。


    
cd ./MWSTAGE/TWELITE_Stage/INSTALL/ubuntu/
sudo ./set_udev_sudo.sh

定義ファイル(読みやすいように改行しています)

    ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001",
   MODE="0666",
   RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"
ACTION=="add",
   ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015",
   MODE="0666",
   RUN+="/bin/sh -c 'rmmod ftdi_sio && rmmod usbserial'"
  

シリアルポートの取り扱い

上述の環境では、raspi-config よりシリアルポートの設定をすることで /dev/serial0 が利用できます。


    
sudo raspi-config

メニューより

      "3 Interface Options    Configure connections to peripherals"
  →"P6 Serial Port Enable/disable shell messages on the serial connection"
  

以下のようにログインシェルとしては利用しない、ハードウェアを有効化するを選択します。

      "Would you like a login shell to be accessible over serial?" -> 
  "Would you like the serial port hardware to be enabled?" → 
  

配線例

     [TWELITE]               [Raspberry Pi]
  GND  ------------------ Gound (#6,#9,#14,#20,#25,#30,#34,#39のいずれか)
  TXD(DIO6,DIP#10) ------ GPIO15/UART0 RXD (#10)
  PRG(SPIMISO,DIP#7) ---- GPIO23 (#16)
  RXD(DIO7,DIP#3) ------- GPIO14/UART0 TXD (#8)
  RST(RESETN,DIP#21) ---- GPIO22 (#15)
  VCC  ------------------ 3V3 (#1,#17のいずれか)
  SET(DIO12,DIP#15) ----- GPIO12 (#32)
  
  • TWELITE, Raspberry Pi それぞれのマニュアルを参照してください。
  • DIP## は TWELITE DIP のピン番号です。
  • 上記の配線は TWELITEが安定稼働することを保証するものではありません。

TWELITE STAGE APPの起動

  • フレームバッファ版(nox)はX11のデスクトップ上では動作しません。X11を終了しておきます。
  • TWELITE_Stage.runを実行します。スクリーン画面上のTWELITE STAGE APPが表示されます。

留意事項

  • マウスとタッチパネルに対応します。
  • TWELITE STAGE APP中で、入力した文字はコンソール画面にも表示される場合があります。

その他

/dev/dri エラー

TWELITE_Stage.run の起動時に以下のエラーが出る場合がありますが、無視して構いません。

      "The path /dev/dri/ cannot be opened or is not available"
  

メモリ不足

CPU数が4以上の場合、ビルド時はCPU数を一つ引いた値の並列コンパイルを実行します(4コアなら3並列)。 場合によってはメモリ不足が発生するかもしれません。その場合は並列数を変更してください。

Raspberry Pi 4

以下の設定が必要です。OpenGL関連のドライバが有効にする必要があります。

  • raspi-config の Advanced Settings → A2 GL Driver → G2 GL (Fake KMS) を選択します
  • libgles-dev パッケージを導入しておきます
  • タッチスクリーンの動作は未検証です

2.1.3 - 使用方法

TWELITE STAGE APP の使用方法
TWELITE STAGE APP の画面・操作方法を解説します。

アプリの起動方法

TWELITE STAGE アプリを起動するには、{MWSTAGE インストール} にある実行形式を実行します。

実行はプラットフォーム(Windows, macOS, Linux)によって方法が異なります。

システム拡張子備考
Windows.exeエクスプローラで実行形式をダブルクリック
macOS.commandFinder で実行形式をダブルクリック
Linux RasPi.runディストリビューションやインストール環境に依存します。
Xウインドウシステム上のターミナル画面(xtermなど)から、コマンドとして実行します

アプリの実行形式

TWELITE STAGE APP には、2種類の実行形式があります。

  • TWELITE_Stage.{拡張子} - 標準設定で起動します。
  • TWELITE_Stage_VSCode.{拡張子} - 「VSCode を使う」設定済みです(設定はTWELITE_Stage_VSCode.iniに保存)。VSCodeを使う設定を有効にすると、VSCodeを用いた開発作業に適した動作を行うようになります。

アプリの実行画面

アプリを起動すると、以下の2種類のウィンドウが表示されます。

  • メイン画面
    • TWELITE STAGE APPのユーザインタフェースを表示します。
    • TWELITE STAGE APPの操作はこの中で行います。
  • コマンド画面
    • 通常は使用しませんが、補助情報を表示します。
      • シリアル通信の内容が表示されるため、ログを確認する用途に最適です。
      • コマンドラインから実行した場合には、実行元のターミナルがコマンド画面となります。
TWELITE STAGE APP 画面例

TWELITE STAGE APP 画面例

アプリの終了

いずれかの方法で終了してください。

  • 実行画面上の右上にマウスポインタを移動し、画面内に表示された終了ボタンを押します。
  • 実行画面のウインドウを閉じます(macOSの場合は⌘Qも使用できます)。

2.1.3.1 - キーとマウスの操作

TWELITE STAGE APP に使用するキーとマウスの操作説明

Windows   macOS   Linux   RasPi

TWELITE STAGE APP に使用するキーとマウスの操作を解説します。

キー操作

Windows   macOS   Linux   RasPi

Alt(⌘)を押しながら行うキー入力は、TWELITE STAGE APP の設定を変える操作等に割り当てられています。その他のキー操作は、通常は文字入力として機能します。

共通のキー

Windows   macOS   Linux   RasPi

キー意味
ESC ESC素早く2回ESCを押す。キャンセル、または前画面に戻る。
画面によっては1回の押下で前画面に戻ります。
ENTER入力、選択
BS一文字削除
カーソルキー
項目の選択

ヘルプ画面

Windows   macOS   Linux   RasPi

Alt(⌘)を押し続けることでヘルプ画面を表示します。ヘルプ画面ではAlt(⌘)と一緒に操作できるキーの説明や一部動作状況を表示します。

ヘルプ画面は画面の左上部分にマウスポインタを移動することでも表示できます。

ヘルプ画面

ヘルプ画面

Alt(⌘)+操作

Windows   macOS   Linux   RasPi

Alt(⌘)を押しながら行う操作について解説します。

表中ではAlt(⌘)+の表記は省略しています。上記のヘルプ画面から使用可能なキーを確認できますが、下表に補足説明を示します。

Alt(⌘)+キー意味
I+ + + を入力します。インタラクティブモードに入るキーシーケンスです。
※ スリープによる間欠動作を行うアプリは非対応。
Rモジュールをリセットします。TWELITE R や MONOSTICK の機能を用いてリセットピンの制御を行います。
A, S, DA, B, C ボタンを押します。
Shift+A, S, DA, B, C ボタンを長押しします。
C表示されている画面の文字列をクリップボードにコピーします。(画面によって範囲は異なります)
Vクリップボードからキーボード入力としてペーストします。
Fフルスクリーン表示に遷移します。Shift+Fの場合、可能であればより拡大します。
G画面の描画方法を変更します。640x480の液晶画面をエミュレートしていますが、拡大時の描画方式として(1. 液晶モニタ風の描画 / 2. ブラウン管風の描画 / 3. ドットを目立たせた拡大 / 4. ドットをぼやかせた拡大)の4種類が選択できます。
※ 設定メニューで起動時の設定を変更できます。
J画面サイズを選択します。選択可能な画面サイズは {640,480}, {1280, 720}, {1280,960}, {1920,1440}, {2560,1440}, {320,240} です。
※ 設定メニューで起動時設定にできます。
QTWELITE STAGE APPを終了します。
0シリアルポートを切断し、再度シリアルポートの一覧を表示します。
1, 2, …シリアルポートを選択します。
L, Shift+Lシリアルポートの入出力のログを開始します。終了時にはログファイルが Windows であればメモ帳、macOS であれば ログビューア で開かれます。Shift+L でログ格納フォルダを開きます。
その他の操作
キー意味
Alt(⌘)+Shift+Ctrl+mMWX ライブラリコードのフォルダを開きます。
Alt(⌘)+Shift+llog フォルダを開きます。

マウス操作

Windows   macOS   Linux   RasPi

マウス操作は左クリックが中心ですが、右クリック、右ダブルクリック、ホイールを使う場合があります。

マウス操作意味
左クリック選択
左クリックしながらドラッグ画面によっては利用(グラフ画面でのドラッグ)
左ダブルクリック使用しない
右クリック画面によっては使用する
右ダブルクリック画面から脱出する(ESC ESCと同様)
ホイール画面によって利用する(グラフ画面で拡大縮小)

マウスによるA,B,Cボタン

Windows   macOS   Linux   RasPi

画面下部のメニュー表示にマウスポインタを移動すると、[ A ], [ B ], [ C ] という表記のボタンが表示されます。 TWELITE STAGE APPは、この3つ並びのハードウェアボタンを模したメニューに画面ごとの機能を割り当てています。 このボタンを左クリックまたは左長押しクリックすることで、機能を呼び出しできます。(Alt(⌘)+a,s,d`` または Alt(⌘)+Shift+a,s,d`でも選択可能)

画面下部の仮想[ B ]ボタンの表示例

画面下部の仮想[ B ]ボタンの表示例

マウスによる画面操作

Windows   macOS   Linux   RasPi

Windows/macOS/Linuxでは、TWELITE STAGE APP の画面を原則文字列のみで構成しますが、メニューやボタン、タブについてはマウスによる操作が可能です。

コマンダー画面例

コマンダー画面例

画面はテキストのみの構成ですが、画面上部のタブや、反転表示の文字はマウスの左クリックで選択可能です。

2.1.3.2 - 画面の操作

TWELITE STAGE APP の各画面における操作説明

Windows   macOS   Linux   RasPi

メニュー画面の例

メニュー画面の例

Windows / macOS / Linux / Raspberry Pi

TWELITE STAGE APPはコンソール画面(コマンドライン)から起動するアプリケーションです。コンソール画面とウインドウ画面の両方に情報を出力します。

コンソール画面には、ターミナルと同様にUART出力を表示します。

Raspberry Pi (nox)

X11 を使わず、フレームバッファに表示します。

通常(フレームバッファ上のシェル画面から起動した場合)はコンソール画面を表示しません。

2.1.3.2.1 - シリアルポート選択

シリアルポート選択画面の操作説明

Windows   macOS   Linux   RasPi

概要

Windows / macOS / Linux では、始動時にTWELITEが接続されたシリアルポートを選択する画面を表示します。 ただし、シリアルポートは、あとから接続することもできます。

シリアルポート選択画面の例

シリアルポート選択画面の例

Windows

cキーを押すと、リストで反転中のシリアルポートのCOMポート名が表示されます。

Raspberry Pi

Raspberry Pi ではUSBデバイスに加えて/dev/serial0 /dev/serial1があれば serial0, serial1 を表示します。なお、通常はserial0を使用します。

2.1.3.2.2 - メインメニュー

メインメニュー画面の操作説明

Windows   macOS   Linux   RasPi

階層化されたメニューの最上位に位置します。

メインメニュー画面の例

メインメニュー画面の例

この画面では、メニュー選択を行います。メニューを反転すると、下部緑色文字部分に簡易的な解説を表示します。

  • ビューア : TWELITE から受信した電文を解釈して表示するビューアです。多くの場合、受信側の TWELITE には App_Wings を書き込んでおきます。
  • アプリ書き換え : ファームウェアをビルドし、接続した TWELITE に書き込みます。
  • インタラクティブモード : 接続した TWELITE 設定を、インタラクティブモードによって行います。
  • TWELITE STAGEの設定 : TWELITE STAGE アプリの各種設定を行います。
  • シリアルポートの選択 : シリアルポートを選択します。
  • 説明書 : 説明書を表示するメニューです。以下の説明書をブラウザで開きます。
    • TWELITE STAGE アプリ(この文書)
    • MWX ライブラリ
    • TWENET_C ライブラリ

2.1.3.2.2.1 - ビューア

ビューアについて

Windows   macOS   Linux   RasPi

ビューアは、接続した TWELITE から受信した情報を表示したり、コマンドを送ったりするための機能です。

2.1.3.2.2.1.1 - ターミナル

ターミナル画面の操作説明

Windows   macOS   Linux   RasPi

ターミナル画面の例

ターミナル画面の例

概要

一般的なVT100系のシリアルターミナルです。

TWELITE のインタラクティブモードやリセット制御をサポートしています。

操作

操作説明
[ A ]+ + + シーケンスの入力(インタラクティブモード)
[ A ]
長押し
この画面を抜けて、前のメニューに戻ります。
[ B ]大きなフォントで最初の画面の部分領域を表示します。
カーソルが画面中に表示されるように領域を選びますが、画面出力によっては見たい部分が見えない場合もあります。
[ B ]
長押し
折返し制御のON/OFFを変更します。
標準では折返し表示を行うようになっていますが、折り返ししないように表示することもできます。画面右端以降の文字列は表示されません。
[ C ]ファーム書換画面に移動します。
ファームウェアの開発中には頻繁にソースコードの修正、動作確認、ビルド&書き込みを行うため、ショートカットを用意しています。
[ C ]
長押し
TWELITE のリセットピンを制御し、リセットします。
ESC ESCESCキーを2回素早く入力することで、この画面を抜けます。
※ 殆どの画面ではESCキーを1回押すことで画面から抜ける操作となっていますが、ターミナルではESCキーの単独入力を使用する場合があるため、2回連続入力の割当になっています。

2.1.3.2.2.1.2 - 標準アプリ ビューア

標準アプリビューア画面の操作説明

Windows   macOS   Linux   RasPi

標準アプリビューア画面の例

標準アプリビューア画面の例

概要

通信相手の TWELITE には App_Twelite(標準アプリ)を書き込んでおきます。標準アプリのボタンやアナログ入力の状態のメッセージ (0x81メッセージ) を受信すると、その内容を mwm5 のパーサーライブラリにより解釈して表示します。

操作

操作説明
[ A ]割当なし
[ A ]
長押し
この画面を抜けて、前のメニューに戻ります。
[ B ]フォントを変更します。
[ B ]
長押し
テスト用のダミーデータによる画面表示を行います。
[ C ]割当なし
[ C ]
長押し
TWELITE のリセットピンを制御し、リセットします。
ESC ESCESCキーを入力することで、この画面を抜けます。

2.1.3.2.2.1.3 - グラフ

グラフ画面の一覧
  • 加速度リアルタイムグラフ:加速度センサーのパケットをリアルタイムで表示します。周波数領域の表示や CSV ファイルの保存ができます。
  • センサーグラフ:TWELITE 各種センサーのデータを sqlite3 データベースに保存し、グラフを表示します。

2.1.3.2.2.1.3.1 - 加速度リアルタイムグラフ

加速度リアルタイムグラフ画面の操作説明

Windows   macOS   Linux   RasPi

デモデータの表示例

デモデータの表示例

概要

TWELITE CUETWELITE 動作センサーPAL から受信したパケットを参照します。加速度データをリアルタイムで表示できるほか、周波数解析や CSV 出力の機能があります。

CUE モード、MOTモード、2525 FIFO モードの3種類に対応しています。

連続したサンプルが一定数(解析窓)以上になると、XYZ軸を周波数解析した表示を行います。ただし 2525 FIFO モードでは常に連続していると仮定します。

パケットの区切りが明示的である場合(直前のパケットから3秒以上経過したとき、CUEモードは1パケットごと、MOTモードはパケットのシーケンス番号が不連続になった場合)には、4サンプル分のダミーデータを挿入しピンク色の背景色を表示します。

先着順に最大4ノードまでのデータを格納します。

操作

操作説明
右上部
(i)ID# ボタン
クリックするごとにIDの切り替えを行います。
(注:FIFOモードによる連続サンプルデータは、複数IDによる運用に向きません)
右上部
(f)SMP# ボタン
クリックするごとに解析窓サイズを 64,128,256 と変更します。
右下部
(c)表示データ保存 ボタン
log フォルダにCSV形式のデータ出力を行います。
バッファにある最も古いサンプルから、画面右端の最新のサンプルまでを出力します。
(注:出力数は常に 5120 サンプルであり、末尾のデータが最新です)
右下部
PAUSE( ) ボタン
表示更新を中断します。
(注:サンプルの取得は内部の一時サンプルバッファが一杯になるまで行います)
マウスドラッグ
(グラフ部分)
表示サンプルの位置を移動します。
マウスドラッグ
(下部スクロールバー)
より大きなステップで表示サンプルの位置を移動します。
カーソルキー
サンプルの表示領域を移動させます。
カーソルキー
サンプルの横軸を拡大・縮小(等倍 / 2倍 / 3倍 / 4倍)します。
(注:解析サンプル数 256 の場合は2倍まで)

サンプルレートの推定

サンプリングレートは、パケットの受信時間から計算しています。過去複数サンプルの受信時間を平均して1サンプル分としているため、パケットの飛びなどがある場合は誤差が大きくなります。 また、関連するログ記録のタイムスタンプ(T_SMPL)も同様に推測値であり、パケット取得時と比較して遅れたタイムスタンプになります。 なお、サンプルレートの推定が終わると、グラフ表示のスクロールをスムーズにします。

CUEグラフモードの起動時に開く

[STAGE 共通設定→起動アプリ指定]にて31を指定してください。

ログ出力(表示データ保存)

(c)表示データ保存 ボタンを押すことで、画面上の表示位置(右端サンプル)を起点とした最大 512 サンプル分のデータを出力できます。

ログファイル名は {logフォルダ}/acc_snap_{タイムスタンプ}.csv です。

  • データは、画面右端の一番新しいサンプルが 512 番目(ファイルの末尾)です。
  • 周波数解析実行時は、最後のサンプルから 周波数解析サンプル数分が対象です。
  • 周波数解析対象サンプルが記録されている行に周波数解析結果を追加しています(64 サンプルの場合は 449 番目から 32 行が結果で DC 成分から高周波成分までが並びます)。
ラベル項目名説明
#サンプル
番号
T_PKT[ms]パケット
受信時刻
1パケットに複数のサンプルが含まれるため、同じタイムスタンプのサンプルが並びます。
SEQパケット
続き番号
各パケットに付与されており、連続していればパケットの欠落がないと考えられます。
T_SMPL[ms]サンプル
時刻(仮想・推定)
パケットの受信時刻から生成した各サンプルのタイムスタンプです。
実際にサンプルが行われた時刻とは一致しません。
(注:サンプルレートをパケット受信間隔から推定しているため誤差が大きくなるほか、サンプル周期を都度加算しているため実際のサンプル時刻よりも1パケット周期分遅れたタイムスタンプを記録します)
X[G]X軸のサンプル値単位はGです。センサーの値に基づいています。
Y[G]Y軸のサンプル値単位はGです。センサーの値に基づいています。
Z[G]Z軸のサンプル値単位はGです。センサーの値に基づいています。
FD#周波数解析計算値の番号周波数解析サンプル数が 64 の場合は DC,1,2,...,31 の順で並びます。
Hz周波数解析計算結果の周波数軸の値推定の周波数です。(FD# / FD_Len) * FD_Freq のように計算しています。
XX軸の周波数解析計算値
YY軸の周波数解析計算値
ZZ軸の周波数解析計算値
Label追加情報名下表 参照
Info追加情報下表 参照

追加情報

情報名解説
ModuleSID送信側のシリアル番号
Tick[ms]ログファイルを開いたときのシステム時間
(注:TWELITE STAGEアプリ側)
Dateログファイルを開いたときの日付
Timeログファイルを開いたときの時刻
Time_Msec_partログファイルを開いたときの秒未満部分 [ms]
Samples有効サンプルデータ
FD_Len周波数解析サンプル数
FD_Start#周波数解析開始サンプル番号
FD_Freq周波数解析範囲の周波数推定値[Hz]
(注:サンプル受信間隔からの推定)

ログ出力(自動保存)

加速度リアルタイムグラフ画面を開き、データが入力された時点から自動的にログファイルを出力します。

ログファイル名は logフォルダ/accel_{シリアル番号}_{タイムスタンプ}.csv です。

ラベル項目名説明
#サンプル
番号
T_PKT[ms]パケット
受信時刻
1パケットに複数のサンプルが含まれるため、同じタイムスタンプのサンプルが並びます。
SEQパケット
続き番号
各パケットに付与されており、連続していればパケットの欠落がないと考えられます。
T_SMPL[ms]サンプル
時刻(仮想・推定)
パケットの受信時刻から生成した各サンプルのタイムスタンプです。
実際にサンプルが行われた時刻とは一致しません。
(注:サンプルレートをパケット受信間隔から推定しているため誤差が大きくなるほか、サンプル周期を都度加算しているため実際のサンプル時刻よりも1パケット周期分遅れたタイムスタンプを記録します)
X[G]X軸のサンプル値単位はGです。センサーの値に基づいています。
Y[G]Y軸のサンプル値単位はGです。センサーの値に基づいています。
Z[G]Z軸のサンプル値単位はGです。センサーの値に基づいています。
Label追加情報名下表 参照
Info追加情報下表 参照

追加情報

情報名解説
ModuleSID送信側のシリアル番号
Tick[ms]ログファイルを開いたときのシステム時間
(注:TWELITE STAGEアプリ側)
Dateログファイルを開いたときの日付
Timeログファイルを開いたときの時刻
Time_Msec_partログファイルを開いたときの秒未満部分 [ms]

2.1.3.2.2.1.3.2 - センサーグラフ

センサーグラフ画面の操作説明

Windows   macOS   Linux   RasPi

データの表示例

データの表示例

概要

各種センサーデータを SQLite データベースに記録し、画面上にグラフ形式で表示します。データベースファイルは外部のアプリケーションから参照することも可能です。

  • データベースには SQLite (sqlite3) を使用しており、{MW_STAGE Install}/log/{実行形式名}_WSns.sqlite というファイルに格納されます。
  • 画面遷移は [一覧(グラフプレビューあり)]>[24時間データ] >[ライブビュー]です。
    • [24時間データ] から更に [年] [月] [日(グラフプレビューあり)] 選択画面に遷移できます。
  • [ライブ]表示画面について
    • 一覧から特定のノードを選択します。
    • 1秒おきのリアルタイム表示を行い、過去 450 秒間のデータを表示します。
  • [24時間データ] 表示画面について
    • 特定の日のデータを表示します。
    • 1秒おきの更新とし、その間に複数のデータがあった場合は間引かれます。
    • 最大拡大時(1ピクセル1秒)以外は、各ピクセルの範囲における取得値の平均を表示します。
    • 値が画面よりはみ出す場合は、上下端に測定点を表示します。
    • 現在時刻が含まれる場合には、新着データで表示を更新します。
    • マウスホイールやカーソルキー の入力:時間軸の拡大・縮小
    • マウスポインタの移動:マウスポインタに対応した時間軸にある取得データを簡易表示します。
      • カーソルキー :隣の取得データに移動します。
    • マウスクリック&ドラッグ:スクロール(拡大時のみ)
    • 拡大時はスクロールバーによる操作も可能です。
    • [CSV出力] 機能では、データベースに含まれるすべての取得値を表示します。

操作

操作説明
マウスドラッグ
(グラフ部分)
拡大時に表示サンプルの位置を移動します。
マウスドラッグ
(下部スクロールバー)
表示サンプルの位置を移動します。
カーソルキー
サンプルの表示領域を移動させます。
カーソルキー
サンプルの横軸を拡大・縮小します。
[ライブ]1秒刻みで最新のデータを表示するビューに移動します。
[24時間データ]1日単位のグラフに移動します。
[<<一覧]一覧選択画面に移動します。
[年] [月] [日]年月日で、特定の日を選択します。
[最新]今日のデータに移動します。
[CSV出力]1日分のデータをCSVファイルに出力します。
一覧で[表示]リストの表示方式を変更します。
一覧で[ソート]リストの並び順を変更します。
一覧で[↑]リストの並び順を反転します。

センサーノードのメモ(補助情報)の編集

v1.3.9+

「24時間データ画面」で、画面右上のセンサーノードのメモ部分を左クリックすると、メモを編集するためのプロンプトを使用できます。

センサーノードのメモを編集する様子

センサーノードのメモを編集する様子(IMEオン)

キー説明
通常の半角文字通常の半角英数文字列を直接入力した場合は画面上にも表示されます。
IME による入力IMEからの入力は画面左上部分に入力途上の文字列が表示されます。
ENTERキーで入力中の文字列を確定します。
BS表示されている末尾の文字を削除します。
ENTER入力した文字列をデータベースに反映します。

画面遷移

基本の画面は一覧、24時間、ライブの3種類に分けられます。

    [一覧] <--> [24時間] <--> [ライブ]
              ↓↑
          [年月日選択]
  

センサーグラフモードの起動時に開く

[STAGE 共通設定 → 起動アプリ指定] にて 32 を指定してください。

DBのテーブルについて

sensor_data

受信したデータを格納します。

カラム名解説
_uqidINTEGERデータベースで使用する続き番号
sidINTEGER
int32_t
int32_t 型で格納しているシリアル番号です。
例えば “8123abcd” というシリアル番号の場合は整数値で -2,128,368,691 の値が格納されます。
tsINTEGER
int64_t
システムがパケットを受信した時刻で、int64_t 型で格納されるタイムスタンプ値です。
UNIX epoch (エポック、1970年からの経過秒) です。
ts_msecINTEGERタイムスタンプのミリ秒部分です。
yearINTEGERタイムスタンプよりローカル時間の年部分です。
monthINTEGERタイムスタンプよりローカル時間の月部分です。
dayINTEGERタイムスタンプよりローカル時間の日部分です。
hourINTEGERタイムスタンプよりローカル時間の時部分です。
lidINTEGERユーザにより割り当てられた LID などの識別値です。
lqiINTEGER受信強度の目安値です (Link Quality Indicator) 。
pkt_seqINTEGERパケットの続き番号です。どのような値を取りうるのかはファームウェアによって異なります。
pkt_typeINTEGER無線パケットの種別です。
2 PAL AMB 6 ARIA 1 PAL MAG *3 PAL MOT 5 CUE 0x101 App_Twelite *0x103 App_IO
*現時点で非対応
valueREAL計測値です(パケット種別によって定義が異なります)。
pkt_type->
2,6: 温度[°C]
1: 磁石の判定有無 (00->磁石なし, 01->N極, 02->S極)
3,5: X軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G]
0x101,103: 入力IOのビットマップ(val_dioの下位8ビットと同値)
value1REAL計測値です(パケット種別によって定義が異なります)。
pkt_type->
2,6: 湿度[%]
1: 未使用
3,5: Y軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G]
0x101: ADC1[V]
103: 未使用
value2REAL計測値です(パケット種別によって定義が異なります)。
pkt_type->
2: 照度[lx]
6: 未使用
1: 未使用
3,5: Z軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G]
0x101: ADC2[V]
103: 未使用
value3REAL計測値です(パケット種別によって定義が異なります)。
pkt_type->
2: 未使用
6: 未使用
1: 未使用
3,5: 未使用
0x101: ADC3[V]
103: 未使用
val_vcc_mvINTEGER電源電圧[mV]
val_dioINTEGER
int32_t
b0..b7: DI1..DI8の値 (1はLOW, 0はHIGHレベル)
b24..b25: マグネット値 (b281の場合) 00->磁石なし, 01->N極, 10->S極
b28: 1の場合マグネットデータがb24..b25に格納される
b31: 定期送信ビット(マグネットのみ)
val_adc1_mvINTEGERpkt_type->
1,2,3,0x101: ADC1の計測値
val_adc2_mvINTEGERpkt_type->
0x101: ADC4の計測値
val_auxINTEGERその他データ格納目的
ev_srcINTEGERイベント発生元
ev_idINTEGERイベントID
pal_type->
5: サイコロ(1...6)
16→MOVE他資料参照
ev_paramINTEGERイベントパラメータ
sensor_node

センサーノードにテキストメモ(付加情報)を格納します。

カラム名解説
sidINTEGER上述のSID
sid_textTEXT可読性のためにSIDを16進数に変換した文字列
descTEXT
UTF-8
SIDに対応するメモ(補助情報)。一覧などで表示する
sensor_last

最後に受信したタイムスタンプを管理します。

カラム名解説
sidINTEGER上述のSID
tsINTEGER最後の受信したときのタイムスタンプ
lid以下、最後に受信時のデータの抜粋
lqi
pkt_type
value
value1
value2
value3
val_vcc_mv
val_dio
ev_id

2.1.3.2.2.1.4 - 簡易モニタ

簡易モニタの一覧
  • CUEビューア : TWELITE CUE からのパケットを解釈して簡易表示します
  • ARIAビューア : TWELITE ARIA からのパケットを解釈して簡易表示します
  • Glancer : TWELITE の多くの形式に対応した簡易モニタです

2.1.3.2.2.1.4.1 - CUE ビューア

CUE ビューア画面の操作説明

Windows   macOS   Linux   RasPi

サイコロ面の検出例

サイコロ面の検出例

概要

TWELITE CUE から受信したメッセージを解釈して表示します。

TWELITE CUE の動作

工場出荷時の TWELITE CUE は、TWELITE CUEモード に設定されています。

TWELITE CUEモードでは、コイン電池で駆動できるように間欠駆動をしながら、いくつかの要因によってスリープから起床して、様々なデータを送信します。

起床要因

TWELITE CUE がスリープから起床するには、以下のうちいずれかの要因を必要とします。

  • タイマーによる起床(定期的な起床)
  • 加速度の検出による起床
  • 磁気センサーによる起床(磁石が近づいたことを検出した場合)

送信するデータの種類

TWELITE CUE は、以下のデータをパケットに収めて送信します。

  • 検出イベント(後述
  • モジュール電源電圧
  • 磁気センサーの検出値
  • 加速度データ

パケットの属性

受信したパケットの属性からは、その基本情報を得ることができます。

属性解説
#????これまでの受信パケット数です。
種別mwm5ライブラリにおけるE_PKTの値で、パケット種別です。
TWELITE CUEからのパケットは通常PKT_PAL=02です。
ID送信元の論理IDです。通常は0..100の値になります。
AD送信元のシリアル番号です。
LQ受信強度の目安値です (Link Quality Indicator) 。
SQパケットの続き番号です。

イベント

TWELITE CUEモードでは、必ず加速度イベントを出力します。 起床要因に関わらず、起床後には一定サンプル数の加速度を計測します。このとき、加速度の計測結果に応じてイベントを判定します。

イベント番号解説
ダイス1(0x00) .. 6(0x06)定期起床と磁気センサー検出起床を起点に判定します。
起床後に大きな加速度が検出される場合は、
判定不可としたイベント(0xFF)を検出する場合があります。
ムーブ16(0x10)加速度センサーが一定以上の加速度を検出したときに、
ムーブまたはシェイクのイベントが発生します。
ムーブは、計測した加速度の変化が比較的小さい場合
(加速度の変化は検出したが、連続的な加速度の変化がなかった場合)に発生します。
シェイク0x08加速度センサーが一定以上の加速度を検出したときに、
ムーブまたはシェイクのイベントが発生します。
シェイクは、計測した加速度の変化が比較的大きい場合
(連続的な加速度の変化を検出した場合)に発生します。

電圧

モジュールの電源電圧[mV]です。

磁石

検出された磁石の極または未検出を表示します。

加速度

起床後に計測された加速度を表示します。

  • サンプル:加速度のサンプル数を表示しています。10サンプル固定です。
  • レートID:加速度のサンプルレートです。04固定で100Hzです。
  • X,Y,Z:3つの軸の加速度です。8サンプル分の平均値として求めています。単位はミリG (1000mG=1G=9.8m/s2)です。

画面の表示例

ムーブイベントの検出例

ムーブイベントの検出例

シェイクイベントの検出例

シェイクイベントの検出例

2.1.3.2.2.1.4.2 - ARIA ビューア

ARIA ビューア画面の操作説明

Windows   macOS   Linux   RasPi

温湿度データ表の表示例

温湿度データ表の表示例

概要

TWELITE ARIA から受信したメッセージを解釈して表示します。

TWELITE ARIA の動作

工場出荷時の TWELITE ARIA は、TWELITE ARIAモード に設定されています。

TWELITE ARIAモードでは、コイン電池で駆動できるように間欠駆動をしながら、いくつかの要因によってスリープから起床して、様々なデータを送信します。

起床要因

TWELITE ARIA がスリープから起床するには、以下のうちいずれかの要因を必要とします。

  • タイマーによる起床(定期的な起床)
  • 磁気センサーによる起床(磁石が近づいたことを検出した場合)

送信するデータの種類

TWELITE ARIA は、以下のデータをパケットに収めて送信します。

  • モジュール電源電圧
  • 磁気センサーの検出値
  • 温湿度データ

パケットの属性

受信したパケットの属性からは、その基本情報を得ることができます。

属性解説
#????これまでの受信パケット数です。
種別mwm5ライブラリにおけるE_PKTの値で、パケット種別です。
TWELITE ARIAからのパケットは通常PKT_PAL=02です。
ID送信元の論理IDです。通常は0..100の値になります。
AD送信元のシリアル番号です。
LQ受信強度の目安値です (Link Quality Indicator) 。
SQパケットの続き番号です。

温湿度データ表

TWELITE ARIAから受信した過去9回分のデータの履歴を表示します。最新のデータが最上部に表示されます。

時間[s]

TWELITE STAGE APPが起動してからデータを受信するまでの時間[秒]です。

ID

モジュールの論理デバイスIDです。

VCC(mV)

モジュールの電源電圧[mV]です。

温度(C)

モジュールが計測した温度(°C)です。

湿度(%)

モジュールが計測した湿度(%)です。

磁石

検出された磁石の極または未検出を表示します。

2.1.3.2.2.1.4.3 - グランサー

グランサー画面の操作説明

Windows   macOS   Linux   RasPi

概要

Glancer は、受信メッセージ中の情報 を簡易的に表示します。

接続する TWELITE には App_Wings を書き込んでおくことで、通信相手のTWELITE (App_Twelite, TWELITE PAL, … アプリケーションIDと周波数チャネルを一致させれば混在も可) から受信した情報を表示できます。

操作

一覧表示の画面と選択表示の画面を切り替えて使用します。

一覧表示

一覧表示の例

一覧表示の例

通信相手からの情報を列挙します。

表示内容は(メッセージの種別、論理デバイスID、シリアルID、LQI (Lq)、電源電圧(情報に含まれている場合)、タイムスタンプ)です。

操作説明
[ A ]リストの前項目に移動します。
[ A ]
長押し
この画面を抜けて、前メニューに戻ります。
[ B ]選択表示に移行します。
[ B ]
長押し
項目をソートします。
ソートを実行するたびに、ソートキーは順に変わります。
[ C ]リストの次項目に移動します。
[ C ]
長押し
TWELITE のリセットピンを制御し、リセットします。
ESCこの画面を抜けます。

選択表示

選択表示の例

選択表示の例

一覧表示で項目を移動し反転表示になったところで選択操作を行うことで、この画面に遷移します。特定の通信相手に関する情報を到着順に表示します。

選択されてからの受信パケット数と LQI の平均値が表示されます。

操作説明
[ A ]割当なし
[ A ]
長押し
この画面を抜けて、前メニューに戻ります。
[ B ]割当なし
[ B ]
長押し
割当なし
[ C ]割当なし
[ C ]
長押し
TWELITE のリセットピンを制御し、リセットします。
ESC選択画面に戻ります。

2.1.3.2.2.1.5 - コマンダー

コマンダー画面の操作説明

Windows   macOS   Linux   RasPi

概要

コマンダーは、TWELITE にシリアルメッセージを送信する機能です。

操作

コマンダーの最初の画面は留意事項について記載しています。

画面上部にはテキストで表現されたタブがあり、これをマウスでクリックすることでタブ中の画面に移動できます。

操作説明
[ A ]タブの移動(左)
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]割当なし
[ B ]
長押し
割当なし
[ C ]タブの移動(右)
[ C ]
長押し
TWELITE のリセットピンを制御し、リセットします。
ESCこの画面を抜けて、選択画面に戻ります。

タブ:TWELITE

この画面では、 標準アプリ(App_Twelite)0x80コマンド を生成し、送信します。

接続する TWELITE には App_Twelite または 親機・中継機アプリ(App_Wings) を書き込んでおき、アプリケーションID・チャネルを設定した上で、通信相手からメッセージが受信されていることを確認してください。

TWELITEタブの表示例

TWELITEタブの表示例

項目内容
宛先送信先の TWELITE を指定します。
自身が子機の場合は「親機:0」宛を指定してください。
自身が親機の場合は「全子機=0x78」または特定の子機ID(1..8まで指定可能)を指定します。
DI1..DI4DI1からDI4までの設定状態です。
■は選択(LOW=GNDレベル)、□は(HIGH=VCCレベル)を意味します。
下項目のSELを指定してください。
SEL各DIの選択ビットです。
(0ならDIの指定を無視し、1なら指定を有効化します。)
PWM1..4PWMのデューティ比を設定します。
0はGNDレベル相当、1024(100%)はVCCレベル相当です。
N.A.にしたPWMポートは変更しません。
(注:MW-STA-KIT-0/MW-STA-SOLO-0基板のPWM1はVCCからの吸い込みとなっているため、
 LEDは0のときに最も明るく点灯し、100%で消灯します。)

タブ:NOTICE

この画面では、通知PAL(NOTICE PAL)LED制御コマンド を生成します。

接続する TWELITE には App_Wings を書き込んでおき、アプリケーションID・チャネルを設定した上で、通信相手からメッセージが受信されていることを確認します。

TWELITEタブの表示例

TWELITEタブの表示例

項目内容
宛先送信先の TWELITE PAL の ID を指定します。
値の範囲は 1..8 です。
点灯色を7色から指定します。
白は2種類ありますが、一方はRGBの混色でもう一方は白色LED単体が点灯します。
明るさ0..15で指定します。0は消灯です。
点灯点滅点灯または点滅パターンを選択します。
点灯時間コマンド発行後、一定時間経過すると自動的に消灯する機能です。
消灯(x)消灯メッセージを生成し、LEDを消灯させます。
点灯(SPACE)現在の設定を送信し、LEDを点灯させます。

画面下部の表示

画面下部には、コマンドが生成されたタイムスタンプと :で始まるコマンドが表示されます。クリップボードにはこの画面の内容がコピーされます。

2.1.3.2.2.2 - アプリ書換

アプリ書換の機能について

Windows   macOS   Linux   RasPi

アプリ書換機能では、TWELITE のアプリ(ファームウェア)を書き込むことができます。

  • ビルド済みの.BINファイルを書き込む
  • アクト(act)などのソースファイルからビルドして書き込む

ソースファイルのビルド、ターミナル切断、書き込みユーティリティ起動、ターミナル接続といった煩雑さを解消できます。

  • TWELITE を自動で認識する
  • 書き込み終了後にリセットしてからインタラクティブモードまたはターミナルに遷移する
  • 各プロジェクトのリストから、プロジェクトフォルダまたはVSCode等の環境を起動する (Raspberry Pi版を除く)
  • 各プロジェクトのリストから、関連情報のウェブページを開く (Linux版、Raspberry Pi版を除く)

2.1.3.2.2.2.1 - BINから選択

BINから選択の画面の操作説明

Windows   macOS   Linux   RasPi

概要

ビルド済みのアプリ(.BINファイル)を書き込むことができます。

BINから選択画面の例

BINから選択画面の例

メニューを選択すると、.BINファイルの一覧が表示されます。書き込むファームウェアを選択してください。

あらかじめ用意されている.BINファイルとは別のファイルを使用する際は、メニューを選択する前に書き込むファイルを以下に格納してください。

プラットフォーム場所
Windows, macOS, Linux, Raspberry Pi{MWSTAGEフォルダ}/BIN

BINフォルダには、ファイル名を変更せずに TWELITE STAGE でビルドした .BINファイル(各プロジェクトのbuildフォルダ以下に格納されています)を格納してください。

    ../BIN/App_Wings_MONOSTICK_BLUE_L1304_V1-1-3.bin
       App_Wings_MONOSTICK_RED_L1304_V1-1-3.bin
       App_Twelite_BLUE_L1304_V1-9-1.bin
       App_Twelite_RED_L1304_V1-9-1.bin
       ...
  

2.1.3.2.2.2.2 - actビルド&書換

actビルド&書換の画面の操作説明

Windows   macOS   Linux   RasPi

概要

MWX ライブラリによって記述されたアクト(act)のビルドと書き換えを行うことができます。

サンプルアクト選択画面の例

サンプルアクト選択画面の例

この画面では、以下のパスに配置されたアクトによるプロジェクトの一覧を表示します。

    {MWSTAGEインストールフォルダ}/MWSTAGE/Act_samples
  

操作

一覧から書き込むプロジェクトを選択することで、ビルド~書き込みを行えます。

なお、書き込み終了後に ENTER または[ B ]ボタンを押すことで、TWELITE をリセットしてインタラクティブモード画面(もしくはターミナル画面、要設定)に遷移できます。

ビルド~書き込み画面

操作説明
[ A ]メニュー選択↑
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]選択
[ B ]
長押し
関連ウェブサイトをOS標準のブラウザで開きます。
(プロジェクトフォルダの000desc.txtに登録されている場合)
[ C ]メニュー選択↓
[ C ]
長押し
フォルダ(プロジェクト、関連フォルダ)を開きます。
設定メニューでVS Codeで開くように設定できます。
ESCこの画面を抜けて、アプリ書換メニューに戻ります。
マウスクリック[ヘルプ]関連ウェブサイトを開きます。
マウスクリック[フォルダ] または [VSCode]関連フォルダを開きます。
マウスクリック [▽] または [△]次ページ、前ページに移動します。

2.1.3.2.2.2.3 - TWELITE APPSビルド&書換

TWELITE APPSビルド&書換の画面の操作説明

Windows   macOS   Linux   RasPi

概要

TWENET C ライブラリによって記述された TWELITE APPS のビルドと書き換えを行うことができます。

アプリ選択画面の例

アプリ選択画面の例

この画面では、以下のパスに配置されたプロジェクトの一覧を表示します。

    {MWSTAGEインストールフォルダ}/MWSTAGE/Wks_TweApps
  

操作

一覧から書き込むプロジェクトを選択することで、ビルド~書き込みを行えます。

なお、書き込み終了後に ENTER または[ B ]ボタンを押すことで、TWELITE をリセットしてインタラクティブモード画面(もしくはターミナル画面、要設定)に遷移できます。

ビルド~書き込み画面

操作説明
[ A ]メニュー選択↑
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]選択
[ B ]
長押し
関連ウェブサイトをOS標準のブラウザで開きます。
(プロジェクトフォルダの000desc.txtに登録されている場合)
[ C ]メニュー選択↓
[ C ]
長押し
フォルダ(プロジェクト、関連フォルダ)を開きます。
設定メニューでVS Codeで開くように設定できます。
ESCこの画面を抜けて、アプリ書換メニューに戻ります。
マウスクリック[ヘルプ]関連ウェブサイトを開きます。
マウスクリック[フォルダ] または [VSCode]関連フォルダを開きます。
マウスクリック [▽] または [△]次ページ、前ページに移動します。

2.1.3.2.2.2.4 - Act_extras

Act_extras画面の操作説明

Windows   macOS   Linux   RasPi

概要

MWX ライブラリによって記述されたアクト(act)のビルドと書き換えを行うことができます。

アクト選択画面の例

アクト選択画面の例

この画面では、以下のパスに配置されたアクトによるプロジェクトの一覧を表示します。

    {MWSTAGEインストールフォルダ}/MWSTAGE/Act_extras
  

操作

一覧から書き込むプロジェクトを選択することで、ビルド~書き込みを行えます。

なお、書き込み終了後に ENTER または[ B ]ボタンを押すことで、TWELITE をリセットしてインタラクティブモード画面(もしくはターミナル画面、要設定)に遷移できます。

ビルド~書き込み画面

操作説明
[ A ]メニュー選択↑
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]選択
[ B ]
長押し
関連ウェブサイトをOS標準のブラウザで開きます。
(プロジェクトフォルダの000desc.txtに登録されている場合)
[ C ]メニュー選択↓
[ C ]
長押し
フォルダ(プロジェクト、関連フォルダ)を開きます。
設定メニューでVS Codeで開くように設定できます。
ESCこの画面を抜けて、アプリ書換メニューに戻ります。
マウスクリック[ヘルプ]関連ウェブサイトを開きます。
マウスクリック[フォルダ] または [VSCode]関連フォルダを開きます。
マウスクリック [▽] または [△]次ページ、前ページに移動します。

2.1.3.2.2.2.5 - 指定

プロジェクトを指定した書き込み

Windows   macOS   Linux  

フォルダまたは.BINファイルを TWELITE STAGE APP の画面にドラッグ&ドロップすることで、特定のプロジェクトを書き込むことができます。 ドロップした対象のビルドや書き込みを行うときに選択します。

2.1.3.2.2.2.6 - 再書換

直前に書き込んだプロジェクトの再書き込み

Windows   macOS   Linux   RasPi  

直前に書き換え・指定したプロジェクトを再選択します。

2.1.3.2.2.2.7 - ビルド・書換画面

ビルド・書換画面の操作説明

Windows   macOS   Linux   RasPi  

ここでは、プロジェクトのビルドや書換を行うときに表示される画面の操作説明を行います。

ビルド中

ビルド(コンパイル)中の画面です。ビルドコマンドの内容は、コンソール画面に出力されます。画面中の ... はビルドしたファイル数、下部の暗い色の表示はビルドしているファイル名です。

コンパイル中の画面の例

コンパイル中の画面の例

ビルドエラー

ビルドエラーが発生した場合は、上記のような画面を表示します。再ビルドの実行やエラーログの表示を行うことができます。また、一定時間でタイムアウトして直前のメニューに戻ります。

エラー表示画面の例

エラー表示画面の例

画面上のエラーメッセージは、代表的なものだけが表示されます。ビルドが失敗したとき、エラー内容のメッセージが表示されないこともあります。

操作説明
[ A ]割当なし
[ A ]
長押し
この画面を抜けて、前のメニューに戻ります。
[ B ]エラー時に再ビルドします。
[ B ]
長押し
割当なし
[ C ]
[ C ]
長押し
エラーログを表示します(Windows/macOS)。
保存場所は{プロジェクトフォルダ}/build/builderr.logです。
ESCこの画面を抜けて、書換メニューに戻ります。
ENTERエラー時に再ビルドします。

書換中

ビルドが成功すると、ファームウェアを書き込む画面を表示します。

書換中画面の例

書換中画面の例

書換失敗

書換がエラーの場合は、下記のような画面を表示します。

書換失敗画面の例

書換失敗画面の例

操作説明
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]再度書換を行う
(直前の書き換えメニューに戻ります。
 自動的にメニュー項目が選択されるため、
 もう一度[ B ]を押すことで再書換できます)
ESCこの画面を抜けて、書換メニューに戻ります。

書換完了

書換が無事に成功すると、下記のような画面を表示します。

書換完了画面の例

書換完了画面の例

操作説明
[ A ]
長押し
この画面を抜けて、選択画面に戻ります。
[ B ]TWELITE をリセットして、
インタラクティブモード画面(または設定によりターミナル)画面に移動します。
ESCこの画面を抜けて、書換メニューに戻ります。

2.1.3.2.2.3 - インタラクティブモード

インタラクティブモードの利用

Windows   macOS   Linux   RasPi

概要

この画面から、接続した TWELITE のインタラクティブモードを利用できます。

インタラクティブモード画面の例

インタラクティブモード画面の例

この画面はターミナルとほぼ同じ振る舞いをしますが、インタラクティブモードに遷移するための操作と離脱の検出を行うなど、インタラクティブモードに固有の機能を追加しています。

  • 接続する TWELITE には、インタラクティブモードに対応したファームウェアをあらかじめ書き込んでおく必要があります。
  • TWELITE の入出力を使用するため、シリアル通信に文字化けなどが発生した場合など、期待通りにインタラクティブモードへの遷移や離脱ができない場合もあります。
  • マウス操作には対応しておりません。キーボード(カーソル での操作は可能)操作を行ってください。

インタラクティブモード画面の動作フロー

以下に大まかな処理の流れを記載します。

    [画面黒背景にする]
  ↓
[TWELITEのリセット (制御可能ならSET=LO)]
  ↓
<間欠動作アプリのインタラクティブモードメッセージを検出?> --YES--> [操作画面]へ
  ↓タイムアウト
['+' を3回入力]
  ↓
<通常アプリのインタラクティブモードメッセージを検出?> --YES--> [操作画面]へ
  ↓タイムアウト
[操作画面へ] ※ この状態はインタラクティブモードではない

[操作画面]
  ↓
<インタラクティブモード脱出メッセージ?> --> [終了]
  ↓
<画面離脱操作 [ A ] 長押しなど> --> [終了]
  ↓
 -> <入力中判定> --NO-> [終了]
  ↓            ↓
[入力文字列をTWELITEへ送信]
  ↓
[操作画面]へ戻る

[終了]
  ↓
[TWELITEのリセット]
  ↓
[画面離脱] インタラクティブモード画面を終了し前の画面へ戻る
  

2.1.3.2.2.4 - TWELITE STAGE の設定

TWELITE STAGE APP の設定

Windows   macOS   Linux   RasPi

概要

この画面から、TWELITE STAGE APP の各種設定を行います。

設定画面の例

設定画面の例

以下の解説のメニュー中には、プラットフォームによっては存在しない項目がありますが、全てを列挙して解説します。

共通メニュー以外の色設定については、解説を省略します。

ルートメニュー

    共通設定
 ターミナル
 標準アプリ ビューア
 グラフ表示 (加速度リアルタイム/センサー)
 簡易モニター (CUA/ARIA/Glancer)
 グランサー(簡易モニタ)
 コマンダー
 アプリ書換
 インタラクティブモード
セーブデータ ユーティリティ(ダンプ/消去)
情報
  

共通設定

    a: (      0x00) 起動アプリ指定
G: (      0x00) 画面サイズ・描画方法
F: (          ) シリアルデバイスID
f: (0x00FFFFFF) 文字色
b: (0x005A0032) 背景色
B: (    115200) ボーレート
  
設定内容
起動アプリ指定TWELITE STAGE始動時にビューアアプリに移動する設定です。
設定値は1..{ビューアアプリメニューで列挙されている数}です。
注:シリアルデバイスIDを設定しておかないと、
始動時に接続するシリアルデバイス選択画面で入力待ちになります。
画面サイズ・描画方法(M5Stack版を除く)XYの2桁の文字で指定します(X:画面サイズ Y:描画方法)。
X 0:640x480 1:1280x720 2:1280x960 3:1920x1440 4:2560x1440 5:320x240
Y 0:LCD風 1:CRT風 2:ぼやけ 3:ブロック
シリアルデバイスID(M5Stack版を除く)設定はシリアルデバイス名または数値の1..9を指定します。
注:数値の場合はデバイス列挙順になります。
文字色・背景色文字色、背景色を指定します。
共通設定の色設定値は他の画面の設定にも継承されます。
他の画面で未設定の場合は共通設定の色設定が採用されます。
色はRGB 24bitを16進数で指定しますが、内部的には16bit 565形式に値が丸められます。
ボーレートTWELITE 側のボーレートが 115200 ではない場合に、ターミナルなどの表示が化けないように設定します。

アプリ書換

    f: (0x00FFFFFF) 文字色
b: (0x005A0032) 背景色
j: (         0) ビルド時のmakeジョブ数
v: (         0) codeでフォルダを開く(VSCode)
l: (         0) LTOを行わない
n: (         0) 書換完了後の画面
  
設定内容
ビルド時のmakeジョブ数(M5Stack版を除く)ビルドを行う際の並列ジョブ数です。適切な数を設定することでビルド時間の短縮を期待できます。
規定値0は(物理プロセッサ数-1)でジョブ数を計算しています。
目安としては論理プロセッサ数を上限とすると良いでしょう。
codeでフォルダを開く (VSCode)(VSCodeのインストールが必要)1を設定することでOS標準のフォルダウインドウの代わりにcodeコマンド(VSCode)でフォルダを開きます。
実行ファイルTWELITE_Stage_VSCodeではデフォルトで1に設定されています。
書換完了後の画面(M5Stack版を除く)1を設定することでインタラクティブモード画面の代わりにターミナルを開きます。
2を設定することで、書換メニューに戻ります。
TWELITE_Stage_VSCodeでは2に設定されています。
LTOを行わない(Windowsのみ)1を設定すると、WindowsのコンパイラでLTOを行いません。
LTOは比較的小さなバイナリを生成できる一方でリンクに時間を要します。
LTOを省略することでより高速なリンクが実現できます。

セーブデータユーティリティ

    r: Read sector.
R: Read ALL sectors.
e: Erase sector.
E: Erase ALL sectors.
  

この画面は、データセーブ領域のメンテナンスを行うユーティリティです。EEPROM(64バイトを1セクタとして最大60セクタ、3840バイト)をエミュレートします。

設定内容
rセクタを読み出します。
0..59を入力すると、入力したセクタ番号のセクタの内容を表示します。
RYESを入力すると全セクタの読み出しを行いますが、末尾の部分のみを表示します。
eセクタを消去(0xFF)します。
0..59を入力すると、入力したセクタ番号のセクタが消去されます。
EYESを入力すると全セクタを消去します。

2.1.3.2.2.5 - シリアルポートの選択

シリアルポートの選択

Windows   macOS   Linux   RasPi

概要

この画面では、シリアルポートを再選択できます。

シリアルポート選択画面の例

シリアルポート選択画面の例

2.1.3.3 - ログ機能

TWELITE と PC 間のログ機能

Windows   macOS   Linux   RasPi

TWELITE と PC 間のシリアル通信のログを記録できます。

操作

記録開始

Alt(⌘)+L を押します。

ログの開始画面の例

ログの開始画面の例

記録終了

記録中に再度 Alt(⌘)+L キーを押します。

ログの終了画面の例

ログの終了画面の例

ログの記録が終了し、その時点のログファイルをOS標準の方法(Windowsはメモ帳、macOSはコンソール.app)で開きます。

仕様

ログの記録

TWELITE から受信した文字列は、そのまま記録されます。

TWELITE に送信した文字列は、1文字ずつ記録されます。 Windowsの場合は 「 」、 macOS / Linux / RaspBerryPi は « » で囲われます。 例えば«t»とある場合は、キーボードからtを入力したことを意味します。

ログ記録のフォルダとファイル名

{TWELITE STAGE APP の実行形式のあるフォルダ}/log にログ開始時の日時を元にしたファイル名で保存されます。

Alt(⌘)+Shift+L を押すことで、そのフォルダを開きます。

ログ出力フォルダの例

ログ出力フォルダの例

2.1.4 - 詳細な仕様

TWELITE STAGE APP の詳細な仕様

2.1.4.1 - フォルダ構成

TWELITE STAGE APP のフォルダ構成について

TWELITE STAGE APP は、TWELITE STAGE SDK のフロントエンドアプリケーションとして動作します。

ここでは、そのフォルダ構成について解説します。

    MWSTAGE/            : TWELITE STAGE SDK インストール
  TWELITE_Stage.??? : 実行形式 (Windwows .exe, macOS .command, Linux .run)
  TWELITE_Stage.sav : 設定ファイル
  TWELITE_Stage.ini : その他設定
  TWELITE_Stage/    : TWELITE STAGE APP の関連ファイル

  MWSDK/            : MWSDKのライブラリなど
  BIN/              : [BINファイル選択]時の格納先
  log/              : ログ・データベース格納先

  Tools/            : gcc コンパイラなどのツール一式

  flask_wsns_db/    : Python, Flask, sqlite3 による簡易的なサーバ
  

MWSDK フォルダ

    MWSDK/
  Act_samples/        : mwx ライブラリによるサンプルコード
  Wks_TweApps/        : TWELITE APPS のソースコード
  Act_extras/         : mwx ライブラリによるより専門的なサンプル、他のライブラリを引用したもの
  TWENET/             : TWENET ライブラリ (mwx ライブラリなど)
  ChipLib/            : 半導体ライブラリ
  MkFiles/            : Makefile の本体処理部分
  docs/               : ライブラリマニュアルなど
  LICENSE             : MWSDKのライセンス記述
  000manifest         : MWSDKのバージョン情報
  ReleaseNotes.md     : 更新履歴(トップページ)
  ReleaseNotes_en.md  : 更新履歴(英語)
  ReleaseNotes_jp.md  : 更新履歴(日本語)
  

MWSDK フォルダには、TWELITE のソフトウェアを構築するためのライブラリや、サンプル、TWELITE APPS のソースコードが含まれます。

TWELITE_Stage.sav

TWELITE STAGE APPの設定情報を記録します。

ファイル名は TWELITE STAGE APP 実行形式名 + .sav です。

TWELITE_Stage.ini

.iniファイルの詳細はこちら

  • MWSDK= MWSDK/ フォルダの替わりに別のフォルダを指定したいときに編集します。複数のライブラリバージョンを混在させる場合に便利です。上記の例では MWSDK2020_10 フォルダを利用します。
  • LANG= TWELITE STAGE APP の表示言語を英語にする場合は LANG=en を指定します。

設定の異なる TWELITE STAGE APP を実行する

TWELITE_Stage.exe (Windows の場合) を別のファイル名でコピーします。 例えば TWS1.exe と変更した場合は、TRS1.sav, TRS1.ini という設定ファイルを参照します。

BIN フォルダ

TWELITE STAGE APP の [BINから選択] メニューを選択したときには、このフォルダにある ファームウェアファイル (.BIN) を利用します。

log フォルダ

TWELITE STAGE APP でシリアルポートのログ機能を実行したときには、このフォルダにログファイルを格納します。

グラフ機能を用いた場合のデータベースファイルの格納先や、csvファイルの出力先もこのフォルダです。

Tools フォルダ

gcc, g++ など、クロスコンパイラの toolchain 等が含まれます。

プラットフォームに固有のユーティリティもこのフォルダに格納されます。詳しくは Tools/readme.txt を参照してください。

flask_wsns_db フォルダ

TWELITE STAGE APP のセンサーグラフビューアで作成したデータベースにアクセスするためのPythonのサンプルスクリプトです。 本サンプルでは表やグラフでデータをWebブラウザで閲覧することができます。

詳しくは flask_wsns_db/README.html を参照してください。

ビルドプロジェクトフォルダ

フォルダの検索順

TWELITE STAGE APP は、以下の順でビルドプロジェクトフォルダ (Act_samples など) を検索します。

  1. TWELITE STAGE APP が起動したときのフォルダ
  2. TWELITE STAGE APP の実行形式があるフォルダ
  3. {MWSDKフォルダ}/..
  4. {MWSDKフォルダ}

Wks_Acts

Wks_Acts フォルダを作成した場合には、Act_samples フォルダの替わりに、このフォルダをメニューの[actビルド&書換]メニューから参照します。

2.1.4.2 - コマンドライン引数とiniファイルによる詳細設定

コマンドライン引数とiniファイルによる TWELITE STAGE APP の詳細設定

コマンドライン引数

コマンドライン引数は、TWELITE STAGE APPのいくつかの細かい設定を行います。

コマンドライン引数内容
-E 0フェードアウトのようなグラフィカルな効果を無効にする。
-R {type}{type} 値でレンダリングタイプを設定します。
0: デフォルト
1: OpenGL
2: DirectX(Windows) Metal(macOS)
3: ソフトウェア
-Jゲームコントローラーを有効にします。
-x {x_pos},
-y {y_pos}
起動時のTWELITE STAGE Appのグラフィカルウィンドウの位置を設定します。
{x_pos}と{y_pos}はウィンドウの左上のスクリーン座標です。

iniファイル

iniファイルはTWELITE STAGE APPの基本的な設定(MWSDKのフォルダを参照するなど)を行うために使用されます。

iniファイル名は{TWELITE STAGE APPの実行ファイルのベース名} + .ini です。 通常は TWELITE_Stage.ini となります。

    ;;; MWSDKの参照を変更します。
; MWSDK=MWSDK
mwsdk=mwsdk2020_10

;;; インターフェース言語
; LANG=en

;;; ウィンドウのジオメトリ
GEOM_X=200
GEOM_Y=100
  

シンタックス

  • ini ファイルはプレーンテキストファイルとして記述される。
  • キーと値は = で区切られた1行に格納される (例: KEY=value)。
  • キーと値の文字列は行頭から始まる(キーの前に空白や他の文字は許されない)。
  • キーと値の間にスペースを入れてはならない。
  • コメント行は ; または # を行頭に追加する。

設定

キー
MWSDKMWSDKのフォルダを変更する。デフォルトのフォルダは、TWELITE STAGE APPの実行ファイルが置かれているのと同じフォルダにある MWSDK です。古いMWSDKやカスタムMWSDKを使用する必要がある場合は、そのフォルダの名前を指定することができます。
LANGLANG=en は、ユーザーインターフェースの言語をデフォルト(日本語)から英語に変更します。
GEOM_X, GEOM_YTWELITE STAGEアプリのウィンドウが表示される場所を変更する。

異なる設定の TWELITE STAGE APP を実行する

異なる設定の TWELITE STAGE APP が必要な場合は、TWELITE STAGE APPと同じフォルダに実行ファイルをコピーして、同じ名前の .ini ファイルを作成します。

例えば、英語のインターフェースを使用する場合、TWELITE_Stage.exe(注: .exe はWindowsの実行ファイルの拡張子)を TWELITE_Stage_en.exe にコピーして、 LANG=en の設定を TWELITE_Stage_en.ini に書き込むことで、英語のインターフェースを有効化した実行ファイルを作成できます。

      TWELITE_Stage.exe
  TWELITE_Stage.ini | 特別な設定なし

  TWELITE_Stage_ja.exe | TWELITE_Stage.exe のコピー
  TWELITE_Stage_en.ini | LANG=en が設定されている。
  

2.1.4.3 - 環境変数

TWELITE STAGE APP が使用する環境変数

内部的に設定される環境変数

環境変数解説
MWSDK_ROOT標準では TWELITE STAGE APP の実行形式が格納されるフォルダにある MWSDK フォルダ(つまり../MWSTAGE/MWSDK)が指定されます。 MWSDK.iniが指定される場合は、指定されたフォルダ名を採用します。
MWSDK_TWENET_LIBSRCサンプルコードやTWELITE APPSのソースコードフォルダには、Microsoft社の Visual Studio Code (VS Code) 用の定義ファイルを予め作成しています。この定義ファイル中にVS Codeエディタ中でコード解釈を行う目的でライブラリソースコードの参照先を指定しますが、この環境変数を用いています。
MWSDK_TWENET_LIBSRC環境変数が適切に指定されると、MWSDK以下ではないプロジェクトフォルダでもコード解釈が行われ、ライブラリ関数名の補完などが機能します。(参考
LANG=Cツールチェインのメッセージを規定の言語(英語)にするため、明示的に設定しています。
PATHWindowsでは、SDK添付のmsysユーティリティへのPATHを追加します。
MWSDK_MAKE_JOBS
MWSDK_MAKE_DISABLE_LTO
VS Codeの設定定義で利用します。
JOBS : STAGE APPで設定された並列ビルド数を渡します
DISABLE_LTO : LTOを無効化します( Windows )

参考

.vscode/settings.json の設定例(抜粋)

    
    "C_Cpp.default.includePath": [
        "${env:MWSDK_TWENET_LIBSRC}/include/**",
        "${env:MWSDK_TWENET_LIBSRC}/src/**"
    ],
    "C_Cpp.default.browse.path": [
        "${env:MWSDK_TWENET_LIBSRC}/include/**",
        "${env:MWSDK_TWENET_LIBSRC}/src/**"
    ],

"../../"で始まる定義は、TWELITE STAGEアプリからプロジェクトを開く場合は不要です。環境変数MWSDK_TWENET_LIBSRCを設定しない場合に、既定のフォルダ構成の時にソース参照先を指定しています。

2.1.4.4 - 000desc.txt によるプロジェクト説明の追加

000desc.txt によるプロジェクト説明の追加方法について

プロジェクトフォルダに000desc.txtを作成した場合には、TWELITE STAGE APP が、プロジェクトフォルダの一覧にその内容を表示します。

000desc.txtの表示例

000desc.txtの表示例

ファイルは UTF-8 形式のプレーンテキストで記述します。書式は以下の2種類があります。

書式1

    
スイッチを押した時にLEDを点灯
act4はTWELITE DIPに接続されたスイッチを押した時にLEDを点灯させるactを動作させます。
https://mono-wireless.com/jp/products/act/index.html
  • 1行目はタイトル行です。
  • 2行目以降は詳細の記述です。
  • 最終行が http で始まる場合は、ウェブサイトへのリンクになります。

書式2

    
[JAPANESE]
TITLE=actのテンプレート
DESC=中身が何もない setup(), loop() のみのファイルです。
新しく act を記述するのに利用してください。
URL=jp/MWX/content/Act_samples/README.html
[ENGLISH]
TITLE=act empty template
DESC=This act file only contains empty setup() and loop(),
which is intended to write a new act.
URL=en/MWX/content/Act_samples/README.html

iniファイルのような書式です。行頭から始まる項目名と=文字までを項目の定義として=以降が項目の内容です。

項目定義詳細
[JAPANESE], [ENGLISH]ブロックの区切り
TITLE=タイトル行
DESC=詳細の記述。改行を含めて複数行にすることもできます。
URL=ウェブサイトまたはファイルへのリンク

URL 指定について

URL=詳細
https:, http: で始まるそのアドレスを開きます
それ以外{MWSDK_ROOT}/docs/ を起点とした相対フォルダを指定します。
a/b/c.html とした場合は {MWSDK_ROOT}/docs/a/b/c.html に変換されます。

2.1.5 - ライセンス

ライセンスについて

モノワイヤレス 株式会社が配布するTWELITE_Stageの実行形式は MW-SLA-1J,1E が適用されます。

利用したオープンソース成果物

高品質なソースコードを提供いただいたオープンソースプロジェクトに感謝いたします。

名前記述
SDL2Simple DirectMedia Layer Copyright (C) 1997-2020 Sam Lantinga
getoptCopyright (c) 1987, 1993, 1994The Regents of the University of California. All rights reserved.
regexregex - Regular expression pattern matching and replacementBy: Ozan S. Yigit (oz) Dept. of Computer Science York University
printfCopyright (c) 2014 Marco Paland
東雲フォント2001 The Electronic Font Open Laboratory http://openlab.ring.gr.jp/efont/
M+ BITMAP FONTSCopyright 2002-2005 COZ coz@users.sourceforge.jp
SQLiteC++Copyright (c) 2012-2021 Sebastien Rombauts (sebastien.rombauts@gmail.com )
sqlite3All of the code and documentation in SQLite has been dedicated to the public domain by the authors.

2.1.6 - 改訂履歴

TWELITE STAGE APPの改訂履歴

ソースコードの変更履歴は https://mwm5.twelite.info/changes および https://github.com/monowireless/mwm5 を参照してください。

プラットフォームによっては、配布中の最新バージョンと改訂履歴の最新バージョンが一致しない場合があります。

1.3.8 MWSTAGE2022_08収録版

メジャーバージョンアップ。

  • 内部描画解像度を320x240から640x480ピクセルに変更
  • 加速度センサーのリアルタイムグラフの追加
  • センサーデータの保存とグラフ表示を行うセンサーグラフを追加
  • 英語表示に対応
  • 主要マニュアルをローカルhtmlファイルに変更

1.0.8 MWSTAGE2021_09収録版

  • [ A ] [ B ] [ C ]ボタンで、ポインタから外れたボタンが残ってしまう場合があった
  • STAGE APPでEnter入力の際にTWELITEに対してCRLFを送信するようにした
  • MacのFTDIライブラリを更新しApple Silicon(M1)でもシリアル仲介プログラムを利用しなくても、動作できるようになった
  • Windowsでmsysツール群のPATHを内部設定し、期待しないmakeが呼び出されないようにした
  • TWELITE未接続でも書き込み画面に移動できるようにした(B,Rキーを入力し、対象のTWELITEモデルを指定する)
  • VSCodeを利用する設定を行った場合は、actやTweAppsを選択したときに、ビルドを実行せず、build/以下の.binファイルを書き込む画面を開くようにした。(ビルドはVSCodeから実施します)
  • いくつかの環境変数を内部的に設定し、TWELITE STAGEから起動したVSCodeにこれらを参照させることで、VSCodeから適切なビルドを実行、VSCodeのコード解釈に対して適切なライブラリソースを参照できるようにした
  • MWSDKフォルダ以下にサンプルコードが格納されているが、ビルド対象のフォルダをドロップすることで、MWSDK以外のフォルダでもビルドや書き込み作業をできるようにした(フォルダ名に空白や日本語文字などが含まれてはいけません)
  • 始動時のコンソール画面に、内部のフォルダ設定や環境変数の設定内容を表示するようにした
  • 終了時は1秒待ってからSTAGE APPを終了するようにした

1.0.7pre2

  • Raspberry Pi の対応を強化 (1.0.7pre2)
    • serial0 の対応(TWELITE STAGE HAT)
    • Zero 向けビルドを追加(対応ライブラリでビルド&描画フェード機能を無効化)
    • X11 デスクトップ向けビルドを追加
  • 一般のFTDIデバイス(FT232,FT230)でも利用できるようにした。ファームウェア書き込みモードは手動で行う必要があります
  • Windowsで、シリアルポート選択画面でcキーを押すことでWindowsで割り当てられているCOMポートを表示する機能を追加した
  • ボーレートを115200bpsから変更できるようにした
  • 描画フェード機能を無効にするコマンドラインオプション(-E 0)を追加。

1.0.3 MWSTAGE2020_12収録版

  • TWELITE CUE対応(パーサー・CUEビューア)
  • 書換メニューで、書き込み時にベリファイ(比較)を行うようにした。
  • Apple Silicon暫定対応(TWELITE_Stage.command はユニバーサルアプリ、シリアル処理用の外部コマンドsersrv_ftdi.command、Toolsは Rosetta2 で動作可能な intel バイナリを再ビルド、シリアル通信は外部コマンド経由のため遅くなります)
  • フォルダ構成で MWSTAGE/MWSDK/Tools を MWSTAGE/Toolsに移動した。(MWSDKをMWSDK_COMMONレポジトリをそのまま利用できるようにするため)
  • TWELITE_Stage.ini (起動ファイル名から拡張子を取り除き .ini を付加) を、起動時に読み込みMWSDKフォルダを選択できるようにした。(古い版のライブラリ一式を簡単に切り替えられるようにした)
  • 画面描画用のSDL2ライブラリを 2.0.12 に変更した (Windows, MacOS, RaspberryPi)。
  • Windows では static ビルドとして DLL ファイル不要とした。
  • make -j による並列ビルド数を(物理CPU数 - 1)とした。
  • 書換メニューのいくつかの場所で、シリアルポートの再オープンを明示的に行うようにした。デバイスの抜き差しを行ったときなどにUSB接続が切断した場合などに、復帰しやすいようにした。
  • Alt(Cmd)+Shift+m, t で mwx, twesettings を開くとき TWENET/usever.mk 記載のフォルダを
  •  開くようにした。
  • [Raspberry Pi] 初回起動時に /dev/serial0 での書込メニュー遷移が失敗する問題を修正。

既知の問題

  • 起動時にAlt(Cmd)押し下げ時のヘルプメッセージが出現しない場合がある。Alt(Cmd)+0を入力することで表示されます。
  • 書換メニューでファイル名が長すぎる場合に、行の行事が乱れる場合がある。
  • Apple Siliconでの動作については十分な検証を行っていません。

0.9.11 MWSTAGE2020_10, Raspberry Pi 版 (暫定版)

(※包括的な検証を実施しないバージョンです)

  • Raspberry Pi での動作
  • その他、機能調整

0.9.9 - MWSTAGE2020_10収録版

  • 最上位メニューにも [ウェブ] ボタンを追加し、関連リンクをブラウザで開けるようにした。
  • Linux版のフォルダ、ウェブ、VS Code で開く機能を実装した。
  • TWELITE が頻繁に UART 出力している場合に、書き込みメニューへ遷移しづらいことがあった

0.9.8a

https://github.com/monowireless/TWELITE_STAGE_Bin_M5Stack/releases/tag/0.9.8a

M5Stack版で MW-SLA-1J,E / MW-OSSLA-1J,E のデュアルライセンスとし、readme-j.txt を更新した。

0.9.8

ビューア一覧表示に[ウェブ]ボタンを追加し、関連サイトを開く機能を追加など。

改定内容

  • ビューア>コマンダーの追加
    • 標準アプリ 0x80 コマンド
    • NOTICE PALのLED制御 (App_Wingsにコマンドを送付)
  • ビューア>PALビューアのNOTICE PAL対応。
  • Act_extrasのメニューを追加
    • Act_samplesより高度なもの
    • 外部のオープンソースライブラリ(センサー手続きなど)を利用したもの
  • マウスによる操作を拡大 (リスト、ボタン、タブ)
    • マウス移動でフォーカス、左クリックで確定、右クリックは[ESC]キー入力
  • 画面表示負荷の低減
    • アプリケーションがバックグラウンドの時はスクリーンセーバーを無効にした
    • アプリケーションがバックグラウンドの時は、描画回数を減らして CPU 負荷を減らした
  • ビルドプロジェクト(act, TWE_Apps, Act_extras)の一覧の機能強化
    • 項目選択時に下部に概要を表示 (000desc.txtを読み込む。TWE_Descクラスにより処理)
    • プロジェクトフォルダを開く(またはVSCodeで開く)機能
    • 関連ウェブサイトを開く機能
    • ALt+Shift+m mwxライブラリ、Alt+Shift+t twesettingsライブラリを開く機能
    • ビルドメニュー中で選択中のフォルダやビルドエラーファイルを開けるようにした。
  • ログ(シリアルポート入出力)機能の追加
    • (Alt/Cmd+L)でログの開始・終了
    • ログファイルを {TWELITE_Stage 実行形式のあるフォルダ}/log に格納
    • ファイル名は twestage_{日付-時刻}.log
    • Shift+Alt/Cmd+L でログファイルフォルダを開く
  • その他、変更・修正など
    • シリアル(FTDI)デバイス名、IDの表示方法を変更
    • App_UARTでインタラクティブモードに遷移しなかった問題を修正
    • フォルダドロップ時の挙動を変更した (これまではバイナリ書き込みになる場合があったが、メニュー遷移とした)
    • ターミナル長押し時[C]でリセットに加え、画面クリアするようにした。

既知の問題

  • M5Stack で設定を保存するときにハングアップし、設定内容が初期化される場合があります。

0.8.9

2020_05 リリース版

  • ウインドウアイコンの追加
  • BINファイル一覧画面での最大リスト数の制約を緩和 (win/linux/mac)
  • Glancerビューアの追加
  • 解説文面等の調整
  • コンソール画面の描画の調整
  • ファーム書き込み後の移動先画面(インタラクティブモードかターミナルか)の設定が動作していなかった
  • Alt(or Cmd)+W の割り当てを変更
  • その他不具合の修正

0.8.6

Linux 版リリース初版

0.8.5

リリース初版

3 - TWELITE SPOT

無線 LAN ゲートウェイ
TWELITE SPOT - トワイライトスポットは TWELITE 親機を搭載した無線 LAN ゲートウェイを手軽に試作できるキットです。

3.1 - 導入済みアプリケーションの概要

TWELITE SPOT にプリインストールされたアプリケーションの機能説明
TWELITE SPOT にプリインストールされたアプリケーション(spot-server)は、無線 LAN アクセスポイントとして振る舞い、Web ページ上に子機からのデータを表示します。
動作イメージ

動作イメージ

使用方法

TWELITE SPOT スタートガイド まずは使ってみる をご覧ください。

ビューア画面

それぞれのビューアを選択すると、対応した TWELITE 子機 から受信したデータを表示します。

Signal Viewer

TWELITE DIP (超簡単!標準アプリ) から受信したデータを表示します。 AI1-4 に入力した電圧や、DI1-4 の入力状態を確認できます。

Signal Viewer

Signal Viewer

CUE Viewer

TWELITE CUE (キューアプリ、TWELITE CUE モード) から受信したデータを表示します。 加速度センサや磁気センサのデータを確認できます。

CUE Viewer

CUE Viewer

ARIA Viewer

TWELITE ARIA (アリアアプリ、TWELITE ARIA モード) から受信したデータを表示します。 温湿度センサや磁気センサのデータを確認できます。

ARIA Viewer

ARIA Viewer

Serial Viewer

TWELITE SPOT が受信したパケットの電文を表示します。

Serial Viewer

Serial Viewer

工場出荷時のアプリの詳細

ESP32

ESP32 に書き込んでいるスケッチは、spot-server です。

GitHub

TWELITE

TWELITE に書き込んでいるアプリは、App_Wings_SPOT_BLUE です。

親機・中継機アプリ (App_Wings)

3.2 - 無線性能に配慮した設置方法

無線性能に配慮した TWELITE SPOT の設置方法
TWELITE SPOT の無線性能に配慮した設置方法や、壁面への設置方法をご案内します。

無線性能に配慮した設置

アンテナ方向マークを天地方向にする

TWELITE SPOT で使用しているアンテナは、アンテナ方向マークを天地方向に向けると、TWELITE SPOT を上面から見たときに、TWELITE SPOT を中心に円状に電波が放射されるため、広い範囲の電波を受信することができます。

TWELITE SPOT と TWELITE 子機のアンテナ方向マークを同じ方向にする

電波には波の振動方向があり、この方向を偏波と呼びます。 送信側と受信側の偏波が同一でない場合感度が低くなり、通信距離が短くなります。 TWELITE SPOT に表記されているアンテナ方向マークはこの偏波の向きを示しており、通信するアンテナ同士のアンテナ方向マークを合わせることにより通信感度が良くなります。

周辺に障害物がない場所に設置する

TWELITE SPOT の周辺に障害物があると電波が減衰するため、通信距離が短くなるため、この特性をご理解の上、設置場所を決めてください。 特に金属が TWELITE SPOT の周辺にあると著しく通信距離が短くなるため、TWELITE SPOT の周辺には金属を含む障害物を置かないようにしてください。 目安として TWELITE SPOT から半径 10cm 以内に金属を配置しないようにしてください。

壁面への設置

M3 ビスを 2 本使用しますが、金属製の部品は無線性能に影響を与える可能性があることに注意してください。

3.3 - ファームウェア開発環境の構築方法

TWELITE SPOT のファームウェア開発に向けた環境の構築方法
TWELITE SPOT のファームウェア開発を行うための環境構築の手順をご案内します。

3.3.1 - Arduino IDE 1.x による開発環境の構築方法

Arduino IDE 1.x を使用した開発環境の構築手順
Arduino IDE 1.x を使用した開発環境の構築手順をご案内します。

3.3.1.1 - Arduino IDE 1.x の導入

統合開発環境 (IDE) の導入手順
Arduino IDE 1.x の導入手順をご案内します。

ダウンロード

Web ブラウザで Arduino 公式ダウンロードページ を開き、Legacy IDE (1.8.X) をダウンロードしてください

Software | Arduino

Software | Arduino

インストール

ダウンロードしたファイルを実行して指示に従い、Arduino IDE 1.x をインストールしてください。

3.3.1.2 - Arduino core for the ESP32 の導入

ESP32 向けツールチェインの導入手順
Arduino に対応した ESP32 専用のコンパイラやライブラリを導入する手順をご案内します。

ボード情報の追加

Arduino IDE 1.x を起動し、ツールバーの ファイル -> 環境設定 を開いてください。

環境設定の場所

環境設定の場所

追加のボードマネージャーのURL に下記の URL を入力し、OKボタンを押してください。

    
https://espressif.github.io/arduino-esp32/package_esp32_index.json
環境設定ウィンドウ

環境設定ウィンドウ

インストール

ツールバーの ツール -> ボード: “Arduino Uno” -> ボードマネージャ を開いてください。

ボードマネージャの場所

ボードマネージャの場所

検索ボックスに “ESP32” と入力して、esp32 ボード定義をインストールしてください。

ボードマネージャ

ボードマネージャ

3.3.1.3 - Arduino core for the ESP32 の設定

ESP32 向けツールチェインの設定方法
TWELITE SPOT のファームウェア開発において必要となる Arduino core for the ESP32 の設定をご案内します。

ボード種別の選択

ツールバーの ツール ―> ボード -> ESP32 Arduino -> ESP32 Dev Module を選択してください。

ESP32 Dev Module の場所

ESP32 Dev Module の場所

ボード設定

以下の画像のように設定してください。

設定後の内容

設定後の内容

3.3.1.4 - MWings ライブラリの導入

TWELITE を使用するためのライブラリ MWings のインストール手順
TWELITE を使用するためのライブラリ MWings の導入手順をご案内します。

インストール

スケッチ -> ライブラリをインクルード -> ライブラリを管理… を開いてください。

ライブラリマネージャの場所

ライブラリマネージャの場所

検索ボックスに MWings と入力し、MWings をインストールしてください。

ライブラリマネージャ

ライブラリマネージャ

3.4 - ファームウェアの書き込み方法

TWELITE SPOT に対するファームウェアの書き込み方法
TWELITE SPOT に搭載された ESP32 および TWELITE へのファームウェアの書き込み方法をご案内します。

3.4.1 - ESP32 へのファームウェアの書き込み方法

TWELITE SPOT に搭載された ESP32 に対するファームウェアの書き込み方法
TWELITE SPOT に搭載された ESP32 へのファームウェアの書き込み方法をご案内します。

3.4.1.1 - ESP32 へのスケッチの書き込み方法

TWELITE SPOT に搭載された ESP32 に対するスケッチの書き込み方法
TWELITE SPOT に搭載された ESP32 への Arduino スケッチの書き込み方法をご案内します。

ホストとの接続

TWELITE R3 / R2 を接続

7P インターフェイス(ESP32 と記載のある側)に TWELITE R3 / R2 を接続してください。

電源を接続

側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (ESP32)

接続例 (ESP32)

Arduino IDE の操作

スケッチを開く

Arduino IDE を起動して、書き込むスケッチを開いてください。

シリアルポートを選択

ツール -> シリアルポート メニューから、 TWELITE R3 / R2 のポートを選択してください。

シリアルポート選択

シリアルポート選択

ESP32 をプログラムモードで起動

TWELITE SPOT の ESP32 リセットスイッチ EN(RST) と ESP32 ブートスイッチ BOOT を押し、EN(RST) -> BOOT の順で離してください。

ボタンの位置

ボタンの位置

書き込みを実行

Arduino IDEの マイコンボードに書き込む ボタンをクリックしてください。

マイコンボードに書き込む

マイコンボードに書き込む

ESP32 をリセット

書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST) を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置

リセットスイッチの位置

書き込み完了画面

書き込み完了画面

3.4.1.2 - ESP32 へのファイルの書き込み方法

TWELITE SPOT に搭載された ESP32 に対するファイルの書き込み方法
TWELITE SPOT に搭載された ESP32 へファイル(data/フォルダ以下のファイル群)を書き込む方法をご案内します。

プラグインの導入

ESP32 のフラッシュ領域へファイルを書き込むための Arduino プラグイン (arduino-esp32fs-plugin) をインストールします。

プラグインのダウンロード

以下のページから、esp32fs.zip を入手します。

Release Update to support Big Sur · lorol/arduino-esp32fs-plugin

プラグインのインストール

  1. ダウンロードした esp32fs.zip を展開してください。

  2. Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino)に tools フォルダがない場合は、これを作成してください。

  3. tools フォルダに ESP32FS/tool フォルダを作成し、zipファイルから得た esp32ffs.jar ファイルを配置してください。(配置例:C:\Users\foo\Documents\Arduino\tools\ESP32FS\tool\esp32fs.jar)。

  4. Arduino IDE を次に起動した際にプラグインが使用できるようになります。

ホストとの接続

TWELITE R3 / R2 を接続

7P インターフェイス(ESP32 と記載のある側)に TWELITE R3 / R2 を接続してください。

電源を接続

側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (ESP32)

接続例 (ESP32)

Arduino IDE の操作

スケッチを開く

Arduino IDE を起動して、スケッチを開いてください。

書き込むファイルの配置

  1. スケッチ -> スケッチのフォルダを表示 から、スケッチのフォルダを開いてください。

  2. スケッチファイル(.ino)と同じ階層に、data フォルダを作成してください。

  3. data フォルダ内に、書き込むファイルを配置してください。

シリアルポートを選択

ツール -> シリアルポート メニューから、 TWELITE R3 / R2 のポートを選択してください。

シリアルポート選択

シリアルポート選択

ESP32 をプログラムモードで起動

TWELITE SPOT の ESP32 リセットスイッチ EN(RST) と ESP32 ブートスイッチ BOOT を押し、EN(RST) -> BOOT の順で離してください。

ボタンの位置

ボタンの位置

書き込みを実行

  1. ツール -> ESP32 Sketch Data Upload をクリックしてください。

  2. Select FS for <スケッチ名> /data folder にて、LittleFS を選択してください。

ファイルシステムの選択画面

ファイルシステムの選択画面

  1. OK を押してください。

ESP32 をリセット

書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST) を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置

リセットスイッチの位置

3.4.1.3 - ESP32 のパーティションテーブルを指定した書き込み方法

TWELITE SPOT に搭載された ESP32 に対する書き込みにおいて、任意のパーティションテーブルを適用する方法
TWELITE SPOT に搭載された ESP32 へスケッチやファイルを書き込む際に、任意のパーティションテーブルを適用する方法をご案内します。

定義ファイルの作成

パーティションテーブルの定義は、csv ファイルに記述します。

下記の例では、16MB のフラッシュ領域のうち、8MB をファイルシステムで使うように指定しています。

    # TWELITE SPOT 16MB with 8MB LittleFS
# Name,  Type, SubType, Offset,   Size,     Flags
nvs,     data, nvs,     0x9000,   0x5000,
otadata, data, ota,     0xE000,   0x2000,
app0,    app,  ota_0,   0x10000,  0x7F0000,
spiffs,  data, spiffs,  0x800000, 0x800000,
  
  • TWELITE SPOT 16MB with 8MB LittleFS Arduino IDE に表示される名前です。
  • nvs システムで使用する領域です。変更しません。
  • otadata OTA を使う際に使用する領域です。変更しません。
  • app0 ファームウェアを書き込む領域です。
  • spiffs LittleFS ファイルシステムで使用する領域です。

csv ファイル中の Offset および Size 列の単位はバイトで、16進数です。

したがって、上記の例では、ファームウェアとファイルシステムが使えるサイズは下記のように計算できます。

  • app0 のサイズ:0x7F0000 = 8323072 より、7.875MB
  • spiffs のサイズ:0x800000 = 8388608 より、8MB

定義ファイルの登録

Arduino15フォルダ を開き、下記のパスに csv ファイルを追加します。

    
Arduino15/packages/esp32/hardware/esp32/x.x.x/tools/partitions

x.x.x は Arduino core for the ESP32 のバージョン

パーティションテーブルの適用

Arduino IDE のツールバーから ツール -> Partition Scheme を開き、追加したパーティションテーブルを選びます。

選択したパーティションテーブルが次回以降のファームウェアの書き込みやファイルシステムの書き込みに反映されます。

3.4.2 - TWELITE へのファームウェアの書き込み方法

TWELITE SPOT に搭載された TWELITE に対するファームウェアの書き込み方法
TWELITE SPOT に搭載された TWELITE へのファームウェアの書き込み方法をご案内します。

TWELITE STAGE APP をインストール

TWELITE STAGE SDK をダウンロードし、ダウンロードしたファイルをCドライブ直下に展開してください。

ホストとの接続

TWELITE R3 / R2 を接続

7P インターフェイス(TWELITE と記載のある側)に TWELITE R3 / R2 を接続してください。

電源を接続

側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (TWELITE)

接続例 (TWELITE)

TWELITE STAGE APP の操作

  1. TWELITE STAGE APP (TWELITE_Stage.exe) を起動してください。

  2. シリアルポート選択画面で TWELITE R3 / TWELITE R2 を選択してください。

  3. メインメニュー -> アプリ書換 を選択し、書換えたいアプリを選択してください。

3.4.3 - ファームウェアの初期化方法

TWELITE SPOT のファームウェアを工場出荷時に戻す方法
TWELITE SPOT に搭載された ESP32 および TWELITE へ書き込まれたファームウェアを工場出荷時の状態に初期化する方法をご案内します。

3.4.3.1 - ESP32 のファームウェアの初期化方法

TWELITE SPOT に搭載された ESP32 に書き込まれたファームウェアを工場出荷時に戻す方法
esptool によって、TWELITE SPOT に搭載された ESP32 へ書き込まれたファームウェアを手動で工場出荷時の状態に戻す方法をご案内します。

esptool をインストール

Python をインストール

Python 3.7 以降がインストールされていない場合は、Python 3.7 以降をインストールしてください。

https://www.python.org/downloads/

esptool 本体をインストール

PyPI から esptool をインストールしてください。


    
pip3 install esptool

ホストとの接続

TWELITE R3 / R2 を接続

7P インターフェイス(ESP32 と記載のある側)に TWELITE R3 / R2 を接続してください。

電源を接続

側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (ESP32)

バイナリファイルの取得

下記のリンクから、spot-server-2023-05-bin.zip をダウンロードしてください。

spot-server-2023-05-bin.zip

ダウンロードしたら、zipファイルを展開してください。

ESP32 をプログラムモードで起動

TWELITE SPOT の ESP32 リセットスイッチ EN(RST) と ESP32 ブートスイッチ BOOT を押し、EN(RST) -> BOOT の順で離してください。

ボタンの位置

ボタンの位置

esptool による書き込み

esptool をインストールした端末でspot-server-2023-05-bin.zipを展開したフォルダに移動し、下記を実行してください。


    
esptool --chip esp32 --port <シリアルポート> --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode qio --flash_freq 80m --flash_size 16MB 0x1000 spot-server.ino.bootloader.bin 0x8000 spot-server.ino.partitions.bin 0xe000 boot_app0.bin 0x10000 spot-server.ino.bin 0x100000 spot-server.littlefs.bin

ESP32 をリセット

書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST) を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置

リセットスイッチの位置

3.4.3.2 - TWELITE のファームウェアの初期化方法

TWELITE SPOT に搭載された TWELITE へ書き込まれたファームウェアを工場出荷時に戻す方法
TWELITE STAGE APP によって、TWELITE SPOT に搭載された TWELITE へ書き込まれたファームウェアを工場出荷時の状態に戻す方法をご案内します。

TWELITE STAGE APP をインストール

TWELITE STAGE SDK をダウンロードし、ダウンロードしたファイルをCドライブ直下に展開(Windowsの場合)してください。

ファームウェアの入手

下記のリンクからバイナリファイルをダウンロードし、MWSTAGE フォルダ内の BIN フォルダに配置してください。

App_Wings_TWELITESPOT_BLUE_L1305_V1-3-0.bin

ホストとの接続

TWELITE R3 / R2 を接続

7P インターフェイス(TWELITE と記載のある側)に TWELITE R3 / R2 を接続してください。

電源を接続

側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (TWELITE)

TWELITE STAGE APP の操作

  1. TWELITE STAGE APP (TWELITE_Stage.exe) を起動してください。

  2. シリアルポート選択画面で TWELITE R3 / TWELITE R2 を選択してください。

  3. メインメニュー -> アプリ書換 -> BIN から選択 を選び、先ほど入手したバイナリ(App_Wings_TWELITESPOT_BLUE_L1305_V1-3-0.bin)を書き込んでください。

3.5 - サンプルスケッチの解説

TWELITE SPOT 向けサンプルスケッチの解説
TWELITE SPOT 向けサンプルスケッチの内容を解説します。

3.5.1 - TWELITE と通信するスケッチの解説

MWings ライブラリに同梱された TWELITE SPOT の基本的なサンプルスケッチの解説
TWELITE NET だけを使用し、無線 LAN を使わない簡単なサンプルスケッチを解説します。

3.5.1.1 - 超簡単!標準アプリのデータを取得・操作

超簡単!標準アプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

3.5.1.1.1 - 超簡単!標準アプリのデータを取得・操作

最新版
超簡単!標準アプリ (App_Twelite) のデータを取得・表示するサンプルスケッチ monitor_spot_app_twelite の解説です。最後に、相手先の出力ポートを操作する改変を行います。

サンプルスケッチの保存場所

MWings ライブラリを導入 していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_twelite からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

    
// Monitor example for TWELITE SPOT: Receive data from App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

ライブラリのインクルード

4行目では、MWings ライブラリ をインクルードしています。

    
#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

    
const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

16-18行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

21-23行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    
    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

26-46行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");
    });

上記のイベントは、超簡単!標準アプリからのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppTwelitePacket 型の引数 packet に格納されています。

メッセージの内容
メッセージ内容
Packet Timestampパケットのタイムスタンプ
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Digital Inputデジタル入力の状態
Analog Inputアナログ入力の状態

TWELITE のデータの更新

52行目では、Twelite.update() を呼び出しています。

    
    Twelite.update();

相手先の出力ポートの操作

超簡単!標準アプリの入力ポートの状態を取得するだけでなく、超簡単!標準アプリの出力ポートを操作してみましょう。

ここでは、TWELITE SPOT が受信した際の LQI(無線通信品質)に基づき、相手端末が TWELITE SPOT に近づいた際に、相手端末のデジタル出力ポートを点灯させてみます。

スケッチの改変

改変内容

はじめに、13行目へ下記のコードを追加します。

    
AppTweliteCommand command;

上記のコードでは、送信するコマンドの内容を格納する AppTweliteCommand を作成しています。

次に、49-51行目へ下記のコードを追加します。

    
        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);

上記のコードでは、AppTweliteCommand を操作し、Twelite.send() でコマンドを送信しています。

これでスケッチの改変は終了です。改変後のコードを示します。

    
// Monitor example for TWELITE SPOT: Receive data from and send data to App_Twelite

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

AppTweliteCommand command;

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_Twelite");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_Twelite
    Twelite.on([](const ParsedAppTwelitePacket& packet) {
        Serial.println("");
        Serial.print("Packet Timestamp:  ");
        Serial.print(packet.u16SequenceNumber / 64.0f, 1); Serial.println(" sec");
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Digital Input:    ");
        Serial.print(packet.bDiState[0] ? " DI1:Lo" : " DI1:Hi");
        Serial.print(packet.bDiState[1] ? " DI2:Lo" : " DI2:Hi");
        Serial.print(packet.bDiState[2] ? " DI3:Lo" : " DI3:Hi");
        Serial.println(packet.bDiState[3] ? " DI4:Lo" : " DI4:Hi");
        Serial.print("Analog Input:     ");
        Serial.print(" AI1:"); Serial.print(packet.u16AiVoltage[0]); Serial.print(" mV");
        Serial.print(" AI2:"); Serial.print(packet.u16AiVoltage[1]); Serial.print(" mV");
        Serial.print(" AI3:"); Serial.print(packet.u16AiVoltage[2]); Serial.print(" mV");
        Serial.print(" AI4:"); Serial.print(packet.u16AiVoltage[3]); Serial.println(" mV");

        command.u8DestinationLogicalId = packet.u8SourceLogicalId; // LID
        command.bDiState[0] = (packet.u8Lqi >= 100) ? true : false; // DI1
        Twelite.send(command);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}
動作確認

子機の TWELITE DIP の DO1 ピンと VCC ピンの間に LED と電流制限抵抗を接続してください。

改変したスケッチを書き込むと、TWELITE DIP が TWELITE SPOT に近づいた際(=通信品質がよいとき)に LED が点灯します。

3.5.1.2 - キューアプリのデータを取得

キューアプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

3.5.1.2.1 - キューアプリのデータを取得

最新版
キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入 していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_cue からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

    
// Monitor example for TWELITE SPOT: Receive data from App_CUE (CUE Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printAccelEvent(const uint8_t event);
void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_CUE
    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printAccelEvent(const uint8_t event)
{
    switch (event) {
    case 0x01: { Serial.print("Dice (1)"); break; }
    case 0x02: { Serial.print("Dice (2)"); break; }
    case 0x03: { Serial.print("Dice (3)"); break; }
    case 0x04: { Serial.print("Dice (4)"); break; }
    case 0x05: { Serial.print("Dice (5)"); break; }
    case 0x06: { Serial.print("Dice (6)"); break; }
    case 0x08: { Serial.print("Shake"); break; }
    case 0x10: { Serial.print("Move"); break; }
    default: break;
    }
    Serial.println("");
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or Not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリ をインクルードしています。

    
#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

    
const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

19-21行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
    Serial2.begin(115200);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

24-26行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    
    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

29-49行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    
    Twelite.on([](const ParsedAppCuePacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Accel Event:       ");
        printAccelEvent(packet.u8AccelEvent);
        Serial.print("Accel X Axis [0]:  ");
        Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
        Serial.print("Accel Y Axis [0]:  ");
        Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
        Serial.print("Accel Z Axis [0]:  ");
        Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、キューアプリ(TWELITE CUE モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppCuePacket 型の引数 packet に格納されています。

メッセージの内容
メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Accel Event加速度センサーの状態
Accel X AxisX 軸加速度(1サンプル目)
Accel Y AxisY 軸加速度(1サンプル目)
Accel Z AxisZ 軸加速度(1サンプル目)
Magnet State磁気センサーの状態
加速度センサーの状態

出力される加速度センサーの状態は以下の通りです。

  • Dice (1) - Dice (6) サイコロの目(姿勢)を検知した。
  • Shake 揺さぶるような動きを検知した。
  • Move ゆっくりとした動きを検知した。
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

55行目では、Twelite.update() を呼び出しています。

    
    Twelite.update();

3.5.1.3 - アリアアプリのデータを取得

アリアアプリのデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

3.5.1.3.1 - アリアアプリのデータを取得

最新版
アリアアプリ (App_ARIA) のデータを取得・表示するサンプルスケッチ monitor_spot_app_aria の解説です。

サンプルスケッチの保存場所

MWings ライブラリを導入 していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_aria からスケッチを開くことができます。

保存場所

保存場所

スケッチ

以下はソースコード本体です。

    
// Monitor example for TWELITE SPOT: Receive data from App_ARIA (ARIA Mode)

#include <Arduino.h>
#include "MWings.h"

const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;

void printMagnetState(const uint8_t state, const bool changed);

void setup()
{
    // Initialize serial ports
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

    // Initialize TWELITE
    Twelite.begin(Serial2,
                  LED_PIN, RST_PIN, PRG_PIN,
                  TWE_CHANNEL, TWE_APP_ID);

    // Attach an event handler to process packets from App_ARIA
    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });
}

void loop()
{
    // Update TWELITE
    Twelite.update();
}

void printMagnetState(const uint8_t state, const bool changed)
{
    if (changed) {
        switch (state) {
        case 0x0: { Serial.print("Leaving or not found"); break; }
        case 0x1: { Serial.print("N-pole is getting closer"); break; }
        case 0x2: { Serial.print("S-pole is getting closer"); break; }
        default: break;
        }
    } else {
        switch (state) {
        case 0x0: { Serial.print("Not found"); break; }
        case 0x1: { Serial.print("N-pole is close"); break; }
        case 0x2: { Serial.print("S-pole is close"); break; }
        default: break;
        }
        Serial.print(" (Periodic packet)");
    }
    Serial.println("");
}

ライブラリのインクルード

4行目では、MWings ライブラリ をインクルードしています。

    
#include "MWings.h"

ピン番号の定義

6-8行目では、ピン番号を定義しています。

    
const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション ID

シリアルポートの設定

18-20行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。

    
    Serial.begin(115200);
    Serial.println("Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)");
    Serial2.begin(115200, SERIAL_8N1);

Serial は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200 bps としています。

一方、Serial2 は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200 bps としています。

TWELITE の設定

23-25行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    
    Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);

パケット受信時のイベントの登録

28-44行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

ここでは、受信したパケットの内容をシリアルモニタに出力しています。

    
    Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("");
        Serial.print("Packet Number:     #");
        Serial.println(packet.u16SequenceNumber, DEC);
        Serial.print("Source Logical ID: 0x");
        Serial.println(packet.u8SourceLogicalId, HEX);
        Serial.print("LQI:               ");
        Serial.println(packet.u8Lqi, DEC);
        Serial.print("Supply Voltage:    ");
        Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
        Serial.print("Air Temperature:   ");
        Serial.print(packet.i16Temp100x / 100.0f, 2); Serial.println(" C");
        Serial.print("Relative Humidity: ");
        Serial.print(packet.u16Humid100x / 100.0f, 2); Serial.println(" %");
        Serial.print("Magnet State:      ");
        printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
    });

上記のイベントは、アリアアプリ(TWELITE ARIA モード)からのパケットを受信したときにだけ呼び出されます。

受信したパケットの内容は ParsedAppAriaPacket 型の引数 packet に格納されています。

メッセージの内容
メッセージ内容
Packet Numberパケットの続き番号
Source Logical ID送信元 TWELITE の論理デバイスID
LQI無線通信品質(0~255)
Supply Voltage電源電圧 (mV)
Air TemperatureTWELITE ARIA が計測した気温 (°C)
Relative HumidityTWELITE ARIA が計測した相対湿度 (%)
Magnet State磁気センサーの状態
磁気センサーの状態

出力される磁気センサーの状態は以下の通りです。

  • S-pole is getting closer 新たに磁石のS極を検知した。
  • N-pole is getting closer 新たに磁石のN極を検知した。
  • Leaving or Not found 磁石が検知できなかった。
  • S-pole is close (Periodic packet) 磁石のS極を検知している。
  • N-pole is close (Periodic packet) 磁石のN極を検知している。
  • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

TWELITE のデータの更新

50行目では、Twelite.update() を呼び出しています。

    
    Twelite.update();

3.5.2 - TWELITE に加えて無線 LAN を活用するスケッチの解説

TWELITE SPOT の応用的なサンプルスケッチの解説
TWELITE NET に加えて無線 LAN を活用した高度なサンプルスケッチを解説します。

3.5.2.1 - プリインストール済みスケッチ

子機からのデータを Web ページに表示するローカルサーバのサンプルスケッチ spot-server の解説
無線 LAN アクセスポイントとして振る舞い、Web ページ上に子機からのデータを表示するサンプルスケッチ spot-server の解説です。

3.5.2.1.1 - プリインストール済みスケッチ

最新版
無線 LAN アクセスポイントとして振る舞い、Web ページ上に子機からのデータを表示するサンプルスケッチ spot-server の解説です。

ソースコードの入手

GitHub (monowireless/spot-server ) から入手できます。

システムの概要

spot-server は、TWELITE からのデータ受信と転送を行う Arduino スケッチ (.ino) と、スマホに配信する Web ページ (.html / .css / .js) で構成しています。

イメージ図

イメージ図

TWELITE 子機が送信したデータは Arduino スケッチで受信され、Arduino スケッチは公開中の Web ページに対してイベントを発火します。公開された Web ページでは、発火されたイベントに応じて HTML の内容を動的に書き換えています。

開発に必要なもの

環境整備

IDE とツールチェインの導入

Arduino IDE 1.x による開発環境の構築方法 をご覧ください。

ライブラリの導入

はじめに、Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino) に libraries フォルダがない場合は、これを作成します。

非同期 TCP 通信ライブラリ
  1. GitHub (me-no-dev/AsyncTCP) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を AsyncTCP-master から AsyncTCP に変更します
  3. libraries フォルダに AsyncTCP フォルダを配置します
非同期 Web サーバライブラリ
  1. GitHub (me-no-dev/ESPAsyncWebServer) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を AsyncWebServer-master から AsyncWebServer に変更します
  3. libraries フォルダに AsyncWebServer フォルダを配置します
OLED ディスプレイライブラリ
  1. GitHub (Seeed-Studio/OLED_Display_96X96) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を OLED_Display_96X96-master から OLED_Display_96X96 に変更します
  3. libraries フォルダに OLED_Display_96X96 フォルダを配置します
JSON ライブラリ

ライブラリマネージャを開き、Arduino_JSON をインストールします。

プラグインの導入

ファイルシステム書き込みプラグイン

HTML などのファイルを ESP32 のフラッシュ領域に書き込むには、Arduino プラグインが必要です。

ここでは、lorol/arduino-esp32fs-plugin: Arduino plugin for uploading files to ESP32 file system を利用します。

インストール方法は TWELITE SPOT マニュアル ESP32 へのファイルの書き込み方法 をご覧ください。

プロジェクトファイルの入手

  1. GitHub (monowireless/spot-server) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を spot-server-main から spot-server に変更します
  3. Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino)に spot-server フォルダを配置します

プロジェクトファイルの書き込み方法

スケッチ

ESP32 へのスケッチの書き込み方法 をご覧ください。

Web ページ

ESP32 へのファイルの書き込み方法 をご覧ください。

スケッチ

Arduino スケッチ spot-server.ino の解説です。

ライブラリのインクルード

Arduino および ESP32 公式ライブラリ

4-9行目では、Arduino および ESP32 の公式ライブラリをインクルードしています。

    
#include <Arduino.h>
#include <Arduino_JSON.h>
#include <ESPmDNS.h>
#include <LittleFS.h>
#include <WiFi.h>
#include <Wire.h>
ヘッダファイル内容備考
Arduino.hArduino の基本ライブラリ省略できる場合もあるが念のため記載
Arduino_JSON.hJSON 文字列を扱うArduinoJsonとは異なる
ESPmDNS.hmDNS を使うホスト名を使うために必要
LittleFS.hLittleFS ファイルシステムを扱うページ公開に必要
WiFi.hESP32 の WiFi を使う
Wire.hI2C を使うOLED ディスプレイ用
サードパーティのライブラリ

12-14行目では、サードパーティのライブラリをインクルードしています。

    
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <SeeedGrayOLED.h>
ヘッダファイル内容備考
AsyncTCP.h非同期 TCP 通信を行う
ESPAsyncWebServer.h非同期 Web サーバを立てるAsyncTCP に依存
SeeedGrayOLED.hOLED ディスプレイを使う
MWings ライブラリ

17行目では、MWings ライブラリをインクルードしています。

    
#include <MWings.h>

ピン番号の定義

20-24行目では、ピン番号を定義しています。

    
const uint8_t TWE_RST = 5;
const uint8_t TWE_PRG = 4;
const uint8_t LED = 18;
const uint8_t ESP_RXD1 = 16;
const uint8_t ESP_TXD1 = 17;
名称内容
TWE_RSTTWELITE の RST ピンが接続されているピンの番号
TWE_PRGTWELITE の PRG ピンが接続されているピンの番号
LED基板上の ESP32 用 LED が接続されているピンの番号
ESP_RXD1TWELITE の TX ピンが接続されているピンの番号
ESP_TXD1TWELITE の RX ピンが接続されているピンの番号

TWELITE 設定の定義

27-30行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CH = 18;
const uint32_t TWE_APPID = 0x67720102;
const uint8_t TWE_RETRY = 2;
const uint8_t TWE_POWER = 3;
名称内容
TWE_CHTWELITE の 周波数チャネル
TWE_APPIDTWELITE の アプリケーション ID
TWE_RETRYTWELITE の 再送回数(送信時)
TWE_POWERTWELITE の 送信出力

無線 LAN 設定の定義

33-38行目では、TWELITE SPOT に搭載された ESP32 に適用する無線 LAN 設定を定義しています。

    
const char* WIFI_SSID_BASE = "TWELITE SPOT";
const char* WIFI_PASSWORD = "twelitespot";
const uint8_t WIFI_CH = 13;
const IPAddress WIFI_IP = IPAddress(192, 168, 1, 1);
const IPAddress WIFI_MASK = IPAddress(255, 255, 255, 0);
const char* HOSTNAME = "spot";    // spot.local
名称内容
WIFI_SSID_BASESSID の共通部分の文字列
WIFI_PASSWORDパスワード
WIFI_CHESP32 の周波数チャネル
WIFI_IPIP アドレス
WIFI_MASKサブネットマスク
HOSTNAMEホスト名

グローバルオブジェクトの宣言

41-42行目では、グローバルオブジェクトを宣言しています。

    
AsyncWebServer server(80);
AsyncEventSource events("/events");
名称内容
server80番ポートで開く非同期 Web サーバのインタフェース
events/eventsで開くサーバー送信イベント ? のインタフェース

関数プロトタイプの宣言

45-49行目では、関数プロトタイプを宣言しています。

    
uint16_t createUidFromMac();
String createJsonFrom(const ParsedAppTwelitePacket& packet);
String createJsonFrom(const ParsedAppAriaPacket& packet);
String createJsonFrom(const ParsedAppCuePacket& packet);
String createJsonFrom(const BarePacket& packet);
名称内容
createUidFromMac()MAC アドレスから SSID に使う識別子を作ります
createJsonFrom()<ParsedAppTwelitePacket&>App_Twelite のパケットデータから JSON 文字列を作ります
createJsonFrom()<ParsedAppAriaPacket&>App_ARIA のパケットデータから JSON 文字列を作ります
createJsonFrom()<ParsedAppCuePacket&>App_CUE のパケットデータから JSON 文字列を作ります
createJsonFrom()<BarePacket&>すべてのパケットデータから JSON 文字列を作ります

TWELITE の設定

58-63行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    
Serial2.begin(115200, SERIAL_8N1, ESP_RXD1, ESP_TXD1);
    if (Twelite.begin(Serial2,
                      LED, TWE_RST, TWE_PRG,
                      TWE_CH, TWE_APPID, TWE_RETRY, TWE_POWER)) {
        Serial.println("Started TWELITE.");
    }
引数内容
Serial2HardwareSerial&TWELITE との通信に使うシリアルポート
LEDintステータス LED を接続したピンの番号
TWE_RSTintTWELITE の RST ピンを接続したピンの番号
TWE_PRGintTWELITE の PRG ピンを接続したピンの番号
TWE_CHANNELuint8_tTWELITE の 周波数チャネル
TWE_APP_IDuint32_tTWELITE の アプリケーション ID
TWE_RETRYuint8_tTWELITE の 再送回数(送信時)
TWE_POWERuint8_tTWELITE の 送信出力

App_Twelite:イベントハンドラの登録

65-72行目では、Twelite.on() <ParsedAppTwelitePacket> を呼び出し、超簡単!標準アプリの子機からのパケットを受信した際に行う処理を登録しています。

    
Twelite.on([](const ParsedAppTwelitePacket& packet) {
    Serial.println("Received a packet from App_Twelite");
    String jsonStr = createJsonFrom(packet);
    if (not(jsonStr.length() <= 0)) {
        events.send(jsonStr.c_str(), "data_app_twelite", millis());
    }
    events.send("parsed_app_twelite", "data_parsing_result", millis());
});
JSON 文字列の作成

67行目では、受信したデータからJSON 文字列を生成しています。

    
String jsonStr = createJsonFrom(packet);

受信したデータをWeb ページに表示するにはクライアント側の JavaScript にデータを送る必要がありますが、このとき文字列データのほうが扱いやすいため、JSON 文字列としています。

Web ページへのイベント送信

68-70行目では、生成した JSON 文字列を “Signal Viewer” ページへ送信しています。

    
if (not(jsonStr.length() <= 0)) {
    events.send(jsonStr.c_str(), "data_app_twelite", millis());
}

イベント名は data_app_twelite です。

71行目では、App_Twelite からのパケットを受信したことを “Serial Viewer” ページへ送信しています。

    
events.send("parsed_app_twelite", "data_parsing_result", millis());

App_ARIA:イベントハンドラの登録

74-84行目では、Twelite.on() <ParsedAppAriaPacket> を呼び出し、アリアアプリ(TWELITE ARIA モード)の子機からのパケットを受信した際に行う処理を登録しています。

    
Twelite.on([](const ParsedAppAriaPacket& packet) {
        Serial.println("Received a packet from App_ARIA");
        static uint32_t firstSourceSerialId = packet.u32SourceSerialId;
        if (packet.u32SourceSerialId == firstSourceSerialId) {
            String jsonStr = createJsonFrom(packet);
            if (not(jsonStr.length() <= 0)) {
                events.send(jsonStr.c_str(), "data_app_aria_twelite_aria_mode", millis());
            }
        }
        events.send("parsed_app_aria_twelite_aria_mode", "data_parsing_result", millis());
    });
対象の絞り込み

76-77行目では、処理の対象を 最初に受信した子機 に限定しています。

    
static uint32_t firstSourceSerialId = packet.u32SourceSerialId;
if (packet.u32SourceSerialId == firstSourceSerialId) {

こうしておかないと、複数の子機があった際にグラフの一貫性が失われてしまうからです。

JSON 文字列の作成

78行目では、受信したデータからJSON 文字列を生成しています。

    
String jsonStr = createJsonFrom(packet);
Web ページへのイベント送信

79-81行目では、生成した JSON 文字列を “ARIA Viewer” ページへ送信しています。

    
if (not(jsonStr.length() <= 0)) {
    events.send(jsonStr.c_str(), "data_app_aria_twelite_aria_mode", millis());
}

イベント名は data_app_aria_twelite_aria_mode です。

83行目では、App_Twelite からのパケットを受信したことを “Serial Viewer” ページへ送信しています。

    
events.send("parsed_app_aria_twelite_aria_mode", "data_parsing_result", millis());

App_CUE:イベントハンドラの登録

86-96行目では、Twelite.on() <ParsedAppCuePacket> を呼び出し、キューアプリ(TWELITE CUE モード)の子機からのパケットを受信した際に行う処理を登録しています。

    
Twelite.on([](const ParsedAppCuePacket& packet) {
    Serial.println("Received a packet from App_CUE");
    static uint32_t firstSourceSerialId = packet.u32SourceSerialId;
    if (packet.u32SourceSerialId == firstSourceSerialId) {
        String jsonStr = createJsonFrom(packet);
        if (not(jsonStr.length() <= 0)) {
            events.send(jsonStr.c_str(), "data_app_cue_twelite_cue_mode", millis());
        }
    }
    events.send("parsed_app_cue_twelite_cue_mode", "data_parsing_result", millis());
});

その他:イベントハンドラの登録

98-126行目では、その他のアプリの子機からのパケットを受信した際に行う処理を登録しています。

アリアアプリ等と同様に “Serial Viewer” へイベントを送信しています。

すべて:イベントハンドラの登録

128-134行目では、すべてのアプリの子機からのパケットを受信した際に行う処理を登録しています。

    
Twelite.on([](const BarePacket& packet) {
    String jsonStr = createJsonFrom(packet);
    if (not(jsonStr.length() <= 0)) {
        events.send(jsonStr.c_str(), "data_bare_packet", millis());
    }
    events.send("unparsed_bare_packet", "data_parsing_result", millis());
});

ここでも、“Serial Viewer” に対するパケットデータ文字列の送信を行っています。

OLED ディスプレイの設定

137-142行目では、OLED ディスプレイの設定を行っています。

    
    Wire.begin();
    SeeedGrayOled.init(SSD1327);
    SeeedGrayOled.setNormalDisplay();
    SeeedGrayOled.setVerticalMode();
    SeeedGrayOled.setGrayLevel(0x0F);
    SeeedGrayOled.clearDisplay();

無線 LAN の設定

146-154行目では、無線 LAN の設定を行っています。

    
WiFi.mode(WIFI_AP);
char uidCString[8];
sprintf(uidCString, " (%02X)", createUidFromMac());
char ssidCString[20];
sprintf(ssidCString, "%s%s", WIFI_SSID_BASE, uidCString);
WiFi.softAP(ssidCString, WIFI_PASSWORD, WIFI_CH, false, 8);
delay(100);    // IMPORTANT: Waiting for SYSTEM_EVENT_AP_START
WiFi.softAPConfig(WIFI_IP, WIFI_IP, WIFI_MASK);
MDNS.begin(HOSTNAME);

ファイルシステムの設定

187行目では、LittleFS ファイルシステムを設定しています。

    
if (LittleFS.begin()) { Serial.println("Mounted file system."); }

フラッシュ領域内に書き込んだ HTML などのファイルをページとして取得することができるようになります。

Web サーバの設定

190-217行目では、Web サーバの設定を行っています。

GET リクエストのハンドリング

例えば、195-199行目 では /signal-viewer への GET リクエストに対して、LittleFS ファイルシステム上の /signal-viewer.html を返しています。

    
server.on("/signal-viewer", HTTP_GET,
          [](AsyncWebServerRequest* request) {
              Serial.println("HTTP_GET: signal-viewer.html");
              request->send(LittleFS, "/signal-viewer.html", "text/html");
          });
サーバの初期化

215-217行目では、ファイルシステム上のルートをサーバのルートとして設定したあと、イベントソースを登録してサーバを立ち上げています。

    
server.serveStatic("/", LittleFS, "/");
server.addHandler(&events);
server.begin();

TWELITE のデータの更新

223行目では、Twelite.update() を呼び出しています。

    
    Twelite.update();

Twelite.update() は、TWELITE 親機から送信されるパケットデータ(ModBus ASCII 形式)を順次1バイトずつ読み出す関数です。

Web ページ

Web ページに関しては、詳しい解説を行いません。重要なポイントに絞って解説します。

HTML:グリッドシステム

このサンプルの HTML では、Flexbox Grid を使っています(ソースファイルは data/css/flexboxgrid.min.css)。

下記のようにして Bootstrap に似た 12 分割のグリッドシステムを使用しています。

    
      <div class="col-xs-6 col-sm-6 col-md-5 col-lg-4">
        <div class="neumorphic inset dense row center-xs middle-xs">
          <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 npr npl">
            <img src="./images/logo-lands.svg" class="logo" />
          </div>
        </div>
      </div>

      <div class="col-xs-6 col-sm-6 col-md-7 col-lg-8">
        <div class="neumorphic inset dense row center-xs middle-xs">
          <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 nwp npr npl">
            <span class="medium bold">TWELITE SPOT</span>
          </div>
          <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 nwp npr npl">
            <span class="small bold">CUE Viewer</span>
          </div>
        </div>
      </div>

ここでは、ロゴを中心とした要素の幅を 6/12 、文字列を中心とした要素の幅を 6/12 、すなわち両者を等しい幅で一列に配置しています。また、文字列 TWELITE SPOT を中心とした要素と CUE Viewer を中心とした要素の幅はどちらも 12/12 、すなわち1行ずつ2行に分けて配置しています。

HTML:データ表示部

TWELITE 子機から受信したデータを表示する要素には、一意の ID を付与しています。

以下は TWELITE CUE から受信した X 軸加速度を表示する部分の抜粋です。

    
<div class="col-xs-4 nwp npr npl">
  <code class="medium"
        id="latest-accel-x">±--.--</code>
  <code class="small">G</code>
</div>

ここでは、ID として latest-accel-x を付与しています。この ID を使って、スクリプトから値を書き換えます。

JS:グローバル変数

4-8行目では、最新の加速度値を保存するためのグローバル変数を宣言しています。

    
let latest_accel = {
    x: 0.0,
    y: 0.0,
    z: 0.0
};

この値はグラフからも利用するため、実装を簡素にするためにグローバル変数を使用しています。

JS:グラフ設定

11-133行目では、グラフ描画ライブラリ Chart.js | Chart.js およびそのプラグイン chartjs-plugin-streaming の設定を行っています。

JS:ページ内容の更新

136-235行目の関数 processDataAppCueTweliteCueMode() は、スケッチから data_app_cue_twelite_cue_mode イベントを受信した際にページ内容を更新する関数です。

例えば、184-208行目では、TWELITE CUE の電源電圧に応じて電圧値と絵文字を更新しています。

    
if (data.vcc >= 3000) {
    document.getElementById("latest-vcc-icon").innerHTML = "🔋";
    document.getElementById("latest-vcc-data").innerHTML = `${(data.vcc / 1000.0).toFixed(2).toString().padStart(4)}`;
    document.getElementById("latest-vcc-data").classList.remove("red");
    document.getElementById("latest-vcc-data").classList.remove("yellow");
    document.getElementById("latest-vcc-data").classList.add("green");
} else if (data.vcc >= 2700) {
    document.getElementById("latest-vcc-icon").innerHTML = "🔋";
    document.getElementById("latest-vcc-data").innerHTML = `${(data.vcc / 1000.0).toFixed(2).toString().padStart(4)}`;
    document.getElementById("latest-vcc-data").classList.remove("red");
    document.getElementById("latest-vcc-data").classList.remove("yellow");
    document.getElementById("latest-vcc-data").classList.remove("green");
} else if (data.vcc >= 2400) {
    document.getElementById("latest-vcc-icon").innerHTML = "🪫";
    document.getElementById("latest-vcc-data").innerHTML = `${(data.vcc / 1000.0).toFixed(2).toString().padStart(4)}`;
    document.getElementById("latest-vcc-data").classList.remove("red");
    document.getElementById("latest-vcc-data").classList.add("yellow");
    document.getElementById("latest-vcc-data").classList.remove("green");
} else {
    document.getElementById("latest-vcc-icon").innerHTML = "🪫";
    document.getElementById("latest-vcc-data").innerHTML = `${(data.vcc / 1000.0).toFixed(2).toString().padStart(4)}`;
    document.getElementById("latest-vcc-data").classList.add("red");
    document.getElementById("latest-vcc-data").classList.remove("yellow");
    document.getElementById("latest-vcc-data").classList.remove("green");
}

ここでは、電源電圧が 2700mV 未満に降下した際に絵文字を 🔋 から 🪫 に変えているほか、3000mV → 2700mV → 2400mV と電圧降下に従って電圧値の文字色を適用する CSS クラスを入れ替えています。

イベントリスナーの登録

254-257行目では、スケッチからのイベントを受信した際の処理を登録しています。

    
source.addEventListener("data_app_cue_twelite_cue_mode", (e) => {
    console.log("data_app_cue_twelite_cue_mode", e.data);
    processDataAppCueTweliteCueMode(JSON.parse(e.data));
}, false);

ここでは、スケッチより 受信したイベントメッセージから JSON 文字列を取り出し、パースしたデータを先ほどの関数 processDataAppCueTweliteCueMode() へ渡しています。

関連情報

Arduino

ESP32

コミュニティ

ライブラリ
プラグイン

Web関連

ECMAScript (JavaScript)
コミュニティ

3.5.2.2 - WebSocketによる中継

子機からのデータを WebSocket サーバに中継するサンプルスケッチ spot-router の解説
無線 LAN 子機として振る舞い、LAN 上の WebSocket サーバに受信したパケットデータ文字列を中継するサンプルスケッチ spot-router の解説です。

3.5.2.2.1 - WebSocketによる中継

最新版
無線 LAN 子機として振る舞い、LAN 上の WebSocket サーバに受信したパケットデータ文字列を中継するサンプルスケッチ spot-router の解説です。

ソースコードの入手

GitHub (monowireless/spot-router ) から入手できます。

システムの概要

spot-router は、TWELITE 親機が受信したデータに基づき出力した文字列(App_Wings の ModBus ASCII 形式)を WebSocket サーバへ転送します。

開発に必要なもの

環境整備

IDE とツールチェインの導入

Arduino IDE 1.x による開発環境の構築方法 をご覧ください。

ライブラリの導入

はじめに、Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino) に libraries フォルダがない場合は、これを作成します。

WebSocket ライブラリ
  1. GitHub (Links2004/arduinoWebSockets) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、libraries フォルダに arduinoWebSockets-<バージョン> フォルダを配置します

プロジェクトファイルの入手

  1. GitHub (monowireless/spot-router) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を spot-router-main から spot-router に変更します
  3. Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino)に spot-router フォルダを配置します

ユーザ設定の変更

Arduino IDE 上部のタブから config.h を開き、無線 LAN や WebSocket サーバに関する設定( 詳細 )を変更してください。

プロジェクトファイルの書き込み方法

ESP32 へのスケッチの書き込み方法 をご覧ください。

スケッチ

Arduino スケッチ spot-router.ino の解説です。

ライブラリのインクルード

Arduino および ESP32 公式ライブラリ

4-5行目では、Arduino および ESP32 の公式ライブラリをインクルードしています。

    
#include <Arduino.h>
#include <WiFi.h>
ヘッダファイル内容備考
Arduino.hArduino の基本ライブラリ省略できる場合もあるが念のため記載
WiFi.hESP32 の WiFi を使う
サードパーティのライブラリ

8行目では、サードパーティのライブラリをインクルードしています。

    
#include <WebSocketsClient.h>
ヘッダファイル内容備考
WebSocketsClient.hWebSocket クライアントになる
MWings ライブラリ

11行目では、MWings ライブラリをインクルードしています。

    
#include <MWings.h>

ユーザ設定の定義

14行目では、config.h をインクルードしています。

    
#include "config.h"

無線 LAN 設定の定義

config.h の4-5行目では、TWELITE SPOT に搭載された ESP32 に適用する無線 LAN 設定を定義しています。

    
const char* WIFI_SSID = "YOUR SSID";            // Modify it
const char* WIFI_PASSWORD = "YOUR PASSWORD";    // Modify it
名称内容
WIFI_SSID接続するネットワークの SSID
WIFI_PASSWORD接続するネットワークの パスワード

WebSocket 設定の定義

config.h の8-10行目では、WebSocket クライアントの設定を定義しています。

    
const char* WS_SERVER_IP = "YOUR ADDRESS";    // Modify it
const int WS_SERVER_PORT = 8080;
const char* WS_SERVER_PATH = "/";
名称内容
WS_SERVER_IP送信するサーバの IP アドレス
WS_SERVER_PORT送信するサーバのポート番号
WS_SERVER_PATH送信するサーバの WebSocket サーバのパス

ピン番号の定義

17-21行目では、ピン番号を定義しています。

    
const uint8_t TWE_RST = 5;
const uint8_t TWE_PRG = 4;
const uint8_t LED = 18;
const uint8_t ESP_RXD1 = 16;
const uint8_t ESP_TXD1 = 17;
名称内容
TWE_RSTTWELITE の RST ピンが接続されているピンの番号
TWE_PRGTWELITE の PRG ピンが接続されているピンの番号
LED基板上の ESP32 用 LED が接続されているピンの番号
ESP_RXD1TWELITE の TX ピンが接続されているピンの番号
ESP_TXD1TWELITE の RX ピンが接続されているピンの番号

TWELITE 設定の定義

24-27行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CH = 18;
const uint32_t TWE_APPID = 0x67720102;
const uint8_t TWE_RETRY = 2;
const uint8_t TWE_POWER = 3;
名称内容
TWE_CHTWELITE の 周波数チャネル
TWE_APPIDTWELITE の アプリケーション ID
TWE_RETRYTWELITE の 再送回数(送信時)
TWE_POWERTWELITE の 送信出力

グローバルオブジェクトの宣言

30行目では、グローバルオブジェクトを宣言しています。

    
WebSocketsClient webSocket;
名称内容
webSocketWebSocket クライアントのインタフェース

関数プロトタイプの宣言

33行目では、関数プロトタイプを宣言しています。

    
String createPacketStringFrom(const BarePacket& packet);
名称内容
createPacketStringFrom()受信したパケットデータから書式文字列を再構築します

TWELITE の設定

42-47行目では、Twelite.begin() を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。

    
Serial2.begin(115200, SERIAL_8N1, ESP_RXD1, ESP_TXD1);
    if (Twelite.begin(Serial2,
                      LED, TWE_RST, TWE_PRG,
                      TWE_CH, TWE_APPID, TWE_RETRY, TWE_POWER)) {
        Serial.println("Started TWELITE.");
    }
引数内容
Serial2HardwareSerial&TWELITE との通信に使うシリアルポート
LEDintステータス LED を接続したピンの番号
TWE_RSTintTWELITE の RST ピンを接続したピンの番号
TWE_PRGintTWELITE の PRG ピンを接続したピンの番号
TWE_CHANNELuint8_tTWELITE の 周波数チャネル
TWE_APP_IDuint32_tTWELITE の アプリケーション ID
TWE_RETRYuint8_tTWELITE の 再送回数(送信時)
TWE_POWERuint8_tTWELITE の 送信出力

イベントハンドラの登録

49-54行目では、すべてのアプリの子機からのパケットを受信した際に行う処理を登録しています。

    
Twelite.on([](const BarePacket& packet) {
    String packetStr = createPacketStringFrom(packet);
    if (not(packetStr.length() <= 0)) {
        webSocket.sendTXT(packetStr.c_str());
    }
});

ここでは、パケットデータから書式文字列(ModBus ASCII 形式)を再構成し、WebSocket サーバへ送信しています。

無線 LAN の設定

57-71行目では、無線 LAN の設定を行っています。

    
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(true);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
    static int count = 0;
    Serial.print('.');
    delay(500);
    // Retry every 5 seconds
    if (count++ % 10 == 0) {
        WiFi.disconnect();
        WiFi.reconnect();
        Serial.print('!');
    }
}

ここでは、無線 LAN 子機として設定したうえで、指定のネットワークへ接続しています。

WebSocket の設定

76-77行目では、WebSocket を設定しています。

    
webSocket.begin(WS_SERVER_IP, WS_SERVER_PORT, WS_SERVER_PATH);
webSocket.setReconnectInterval(5000);

ここでは、WebSocket サーバと再接続間隔を指定しています。

また、78-97行目では、サーバとの接続が切断されたとき、サーバと接続したとき、そしてメッセージを受信したときのイベントを登録しています。

    
webSocket.onEvent([](WStype_t type, uint8_t* payload, size_t length) {
    switch (type) {
    case WStype_DISCONNECTED: {
        Serial.println("Disconnected!");
        break;
    }
    case WStype_CONNECTED: {
        Serial.print("Connected to url: ");
        Serial.println(reinterpret_cast<char*>(payload));
        webSocket.sendTXT("This is TWELITE SPOT to ground control");
        break;
    }
    case WStype_TEXT: {
        Serial.print("Got text: ");
        Serial.println(reinterpret_cast<char*>(payload));
        break;
    }
    default: break;
    }
});

なかでも、サーバと接続したときには、サーバへメッセージを送るようにしています。

    
webSocket.sendTXT("This is TWELITE SPOT to ground control");

TWELITE のデータの更新

102行目では、Twelite.update() を呼び出しています。

    
Twelite.update();

Twelite.update() は、TWELITE 親機から送信されるパケットデータ(ModBus ASCII 形式)を順次1バイトずつ読み出す関数です。

WebSocket のデータの更新

103行目では、WebSocket のデータを更新する処理を呼び出しています。

    
webSocket.loop();

<付録> WebSocket サーバによる動作確認

extra/python-websocket-server/server.py は、Python スクリプトによって WebSocket サーバを立て、ESP32 からのパケットデータ文字列を表示するサンプルスクリプトです。このスクリプトを使うことで、スケッチの動作を確認できます。

    
# -*- coding: utf-8-unix -*-
# Python 3.11

import logging
from websocket_server import WebsocketServer

def new_client(client, server):
    server.send_message_to_all("This is ground control to TWELITE SPOT")

def new_message(client, server, message):
    print("Received an message:")
    print(message)

server = WebsocketServer(host="YOUR IP ADDRESS", port=8080, loglevel=logging.INFO)
server.set_fn_new_client(new_client)
server.set_fn_message_received(new_message)
server.run_forever()

coding 変数を指定しているのは、筆者の環境が Emacs だからです。おまじないではありません。

動作確認の手順

スクリプトの実行

依存モジュール をインストールしてから実行します。


    
pip3 install websocket-server
python3 server.py

実行すると、下記のようなメッセージが表示されます。

    
INFO:websocket_server.websocket_server:Listening on port 8080 for clients..
INFO:websocket_server.websocket_server:Starting WebsocketServer on main thread.
クライアントの接続を確認

ESP32 が 無線 LAN への接続に成功すると、WebSocket サーバへの接続を試みます。

接続に成功すると、クライアント側のシリアルコンソールには下記のように出力されます。

    
Started TWELITE.
Connecting to WiFi .....
Connected. IP: xxx.xxx.xxx.xxx
Connected to url: /
Got text: This is ground control to TWELITE SPOT

一方で、サーバ側のターミナルには下記のように出力されます。

    
Received an message:
This is TWELITE SPOT to ground control

以降、TWELITE SPOT が子機からのパケットを受信すると、下記のようにサーバ側のターミナルへパケットデータ文字列が出力されます。

    
Received an message:
:80000000DE10098201BC8201800607003400038135001205350401000000113008020A8C1130010203AF0000000180050100020AC60102000211D7AF30

Received an message:
:80000000E4100A8201BC8201800607003400038135001205350401000000113008020A8C1130010203AC0000000180050100020AC40102000211DB0DCC

関連情報

TWELITE

Arduino

ESP32

コミュニティ

ライブラリ
プラグイン

ネットワーク関連

WebSocket
コミュニティ

3.5.2.3 - REST API の使用

子機からのデータを HTTP GET リクエストに利用するサンプルスケッチ spot-httpbin の解説
無線 LAN 子機として振る舞い、Web 上のモックサーバ httpbin.org へ受信したパケットのデータを送信するサンプルスケッチ spot-httpbin の解説です。

3.5.2.3.1 - REST API の使用

最新版
無線 LAN 子機として振る舞い、Web 上のモックサーバ httpbin.org へ受信したパケットのデータを送信するサンプルスケッチ spot-httpbin の解説です。

ソースコードの入手

GitHub リポジトリ monowireless/spot-httpbin から入手できます。

システムの概要

spot-httpbin は、TWELITE 親機が受信したデータの一部と NTP による現在時刻を HTTP GET リクエストとしてモックサーバへ送信し、そのレスポンスをシリアルモニタへ表示します。

開発に必要なもの

環境整備

IDE とツールチェインの導入

Arduino IDE 1.x による開発環境の構築方法 をご覧ください。

ライブラリの導入

このサンプルでは、依存するライブラリをはじめから同梱しています。

プロジェクトファイルの入手

  1. GitHub (monowireless/spot-httpbin) から Zip ファイルをダウンロードします
  2. Zip ファイルを展開し、フォルダ名を spot-httpbin-main から spot-httpbin に変更します
  3. Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino)に spot-httpbin フォルダを配置します

ユーザ設定の変更

Arduino IDE 上部のタブから config.h を開き、Wi-Fi の SSID と パスワードを設定してください。WPA2-PSK ネットワークを想定しています。また、ルート証明書も登録してください。ルート証明書は、Chrome などのウェブブラウザの各ページに対するセキュリティ画面から入手できます。

プロジェクトファイルの書き込み方法

ESP32 へのスケッチの書き込み方法 をご覧ください。

スケッチ

Arduino スケッチ spot-httpbin.ino および config.h の解説です。

ライブラリのインクルード

Arduino および ESP32 公式ライブラリ

4-6行目では、Arduino および ESP32 の公式ライブラリをインクルードしています。

    
#include <Arduino.h>
#include <WiFiClientSecure.h>
#include <WiFiUdp.h>
ヘッダファイル内容備考
Arduino.hArduino の基本ライブラリ省略できる場合もあるが念のため記載
WiFiClientSecure.hESP32 で SSL通信を行う
WiFiUdp.hUDP 通信を行うNTP に必要
サードパーティのライブラリ

9-10行目では、同梱されたサードパーティのライブラリをインクルードしています。

    
#include "src/NTPClient/NTPClient.h"
#include "src/Time/TimeLib.h"
ヘッダファイル内容備考
NTPClient.hNTP サーバへアクセスする
TimeLib.hエポック時間を変換する
MWings ライブラリ

13行目では、MWings ライブラリをインクルードしています。

    
#include <MWings.h>

ユーザ設定の定義

16行目では、config.h をインクルードしています。

    
#include "config.h"

データ型の定義

19-26行目では、子機から受信したデータを保管しておく構造体の型を定義しています。

    
struct DataFromAria {
    uint32_t serialId;
    uint8_t logicalId;
    uint16_t supplyVoltage;
    uint8_t linkQuality;
    int16_t temp100x;
    uint16_t humid100x;
};
名称内容
serialIdシリアルID
logicalId論理デバイスID
supplyVoltage電源電圧
linkQualityLQI
temp100x100倍された温度
humid100x100倍された湿度

ここでは、TWELITE ARIA を使用します。

config.h

再起動間隔の定義

config.h の4行目では、ESP32 の再起動間隔を指定しています。

    
const uint32_t REBOOT_INTERVAL = 21600; // seconds

ここでは、21600秒=6時間としています。

TWELITE 設定の定義

config.h の7-8行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

    
const uint8_t TWE_CH = 18;
const uint32_t TWE_APPID = 0x67720102;
名称内容
TWE_CHTWELITE の 周波数チャネル
TWE_APPIDTWELITE の アプリケーション ID
Wi-Fi 設定の定義

config.h の11-12行目では、TWELITE SPOT に搭載された ESP32 に適用するWi-Fi 設定を定義しています。

    
const char* WIFI_SSID = "YOUR SSID";
const char* WIFI_PASSWORD = "YOUR PASSWORD";
名称内容
WIFI_SSID接続するネットワークの SSID
WIFI_PASSWORD接続するネットワークの パスワード
ルート証明書

config.h の14-16行目では、ルート証明書の内容を記述するためのテンプレートを用意しています。

    
const char *CA_CERT =
    "-----BEGIN CERTIFICATE-----\n"
    "-----END CERTIFICATE-----\n";

ルート証明書は、Chrome などのウェブブラウザの各ページに対するセキュリティ画面から入手してください。 すべての行をダブルクォートで囲い、末尾のダブルクォートの前には改行文字 \n を追加する必要があります。

ホストの設定

config.h の18-19行目では、ホストの設定を定義しています。

    
const char *SERVER_HOST = "www.httpbin.org";
const uint16_t SERVER_PORT = 443;
名称内容
SERVER_HOSTサーバのホスト名
SERVER_PORTサーバのポート番号
各種定数の定義

config.h の21行目からは、各種定数を定義しています。

    
const uint32_t NTP_UPDATE_INTERVAL = 10000; // ms

const int QUERIES_MAX_LENGTH = 128;         // bytes (without \0)
const int32_t CONNECT_TIMEOUT = 10;     // seconds
const uint32_t RECONNECT_MIN_INTERVAL = 5; // seconds
// SEND_MIN_INTERVAL must be longer than NTP_UPDATE_INTERVAL
const uint32_t SEND_MIN_INTERVAL = 10; // seconds
const uint32_t REQUEST_TIMEOUT = 10;   // seconds
名称内容
NTP_UPDATE_INTERVALNTP時刻の取得間隔
QUERIES_MAX_LENGTHクエリ文字列の最大長(ヌル文字含まず)
CONNECT_TIMEOUTサーバへの接続時のタイムアウト
RECONNECT_MIN_INTERVALWi-Fiアクセスポイントへ再接続する際の最短間隔
SEND_MIN_INTERVALリクエスト間隔の最短間隔
REQUEST_TIMEOUTリクエストからレスポンスまでのタイムアウト

ピン番号の定義

29-31行目では、ピン番号を定義しています。

    
static const int RST_PIN = 5;
static const int PRG_PIN = 4;
static const int LED_PIN = 18;
名称内容
RST_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

グローバルオブジェクトの宣言

34-37行目では、グローバルオブジェクトを宣言しています。

    
static WiFiClientSecure client;
static WiFiUDP ntpUDP;
static NTPClient timeClient(ntpUDP, "ntp.nict.jp",
                            32400, NTP_UPDATE_INTERVAL); // JST(UTC+9)
名称内容
clientHTTPS通信のインタフェース
ntpUDPNTP用のUDP通信のインタフェース
timeClientNTPのインタフェース

グローバル変数の宣言

40-41行目では、グローバル変数を宣言しています。

    
static DataFromAria LatestDataFromAria;
static bool IsThereNewDataFromAria;
名称内容
LatestDataFromAriaTWELITE ARIA から受信した最新のデータ
IsThereNewDataFromAriaTWELITE ARIA から新たなデータを受信したことを示すフラグ

関数プロトタイプの宣言

44-56行目では、関数プロトタイプを宣言しています。

    
void anotherLoopForTWELITE();
void anotherLoopForNTP();
名称内容
anotherLoopForTWELITETWELITEのデータを処理するためのループ関数
anotherLoopForNTPNTPで時刻を取得するためのループ関数
    
void initTWELITE();
void initWiFi();
void initNTP();
名称内容
initTWELITETWELITEの初期化関数
initWiFiWi-Fiの初期化関数
initNTPNTPの初期化関数
    
void onAppAriaPacket(const ParsedAppAriaPacket& packet);
名称内容
onAppAriaPacketTWELITE ARIA からデータを受信した際のコールバック関数
    
void sendAriaData(const DataFromAria& data)
名称内容
sendAriaDataTWELITE ARIAのデータを HTTP GET リクエストにのせて送る関数

setup()

59-87行目では、全体の初期化を行います。

    
void setup() {
    Serial.begin(115200);

    initTWELITE();
    initWiFi();
    initNTP();

    // Attach another loop function for TWELITE
    // Note: Core 0 is also used for the WiFi task, which priority is 19 (ESP_TASKD_EVENT_PRIO - 1)
    xTaskCreatePinnedToCore(
        [](void *params) {
            while (true) {
                anotherLoopForTWELITE();
                vTaskDelay(1); // IMPORTANT for Watchdog
            }
        },
        "Task for anotherLoopForTWELITE()", 8192, nullptr, 18, nullptr,
        0); // Priority is 18 (lower than WiFi)
    // Attach another loop function for NTP
    xTaskCreatePinnedToCore(
        [](void *params) {
            while (true) {
                anotherLoopForNTP();
                vTaskDelay(1); // IMPORTANT for Watchdog
            }
        },
        "Task for anotherLoopForNTP()", 8192, nullptr, 17, nullptr,
        0); // Priority is 17 (lower than WiFi and TWELITE)
}

xTaskCreatePinnedToCore() により、loop() とは別のタスクを登録しています。

下記の部分はキャプチャのない無名関数です。不要なグローバル空間の汚染を避けることができます。

    
        [](void *params) {
            while (true) {
                anotherLoopForTWELITE();
                vTaskDelay(1); // IMPORTANT for Watchdog
            }
        },

loop()

90-111行目は、主となるループ処理です。

HTTP リクエストの処理、Wi-Fi 切断時の再接続処理、定期リセットの処理を行います。

    
void loop() {
    static uint32_t lastTimeReconnected = 0;
    if (WiFi.status() == WL_CONNECTED) {
        // Regular operations
        // Check for new data
        if (IsThereNewDataFromAria) {
            IsThereNewDataFromAria = false; // Clear first; data is updated on another thread
            DataFromAria data = LatestDataFromAria; // Now, the buffer is open for incoming data
            sendAriaData(data);
        }
    } else if (millis() - lastTimeReconnected > RECONNECT_MIN_INTERVAL * 1000) {
        // Lost connection, reconnect periodically
        Serial.println("Disconnected. Reconnecting to WiFi...");
        WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
        lastTimeReconnected = millis();
    }
    // Reboot every x interval
    if (millis() > REBOOT_INTERVAL * 1000) {
        Serial.println("Rebooting...");
        ESP.restart();
    }
}

anotherLoopForTWELITE()

114-116行目は、TWELITE のためのループ処理です。

データの受信と解釈を逐次行うため、ブロッキング処理を含む loop() とは別のタスクとしています。

    
void anotherLoopForTWELITE() {
    Twelite.update();
}

anotherLoopForNTP()

117-120行目は、NTP のためのループ処理です。

こちらについても UDP の通信を行うため、ブロッキング処理を含む loop() とは別のタスクとしています。

    
void anotherLoopForNTP() {
    timeClient.update();
    setTime(timeClient.getEpochTime());
}

initTWELITE()

123-130行目は、TWELITE の初期化処理です。

TWELITE SPOT に搭載された TWELITE を指定された設定で起動し、パケット受信時のコールバック関数を登録しています。

    
void initTWELITE() {
    Serial2.begin(115200);
    if (Twelite.begin(Serial2, LED_PIN, RST_PIN, PRG_PIN, TWE_CHANNEL, TWE_APP_ID)) {
        Serial.println("Started TWELITE.");
    }
    // Attach event handlers to process packets
    Twelite.on(onAppAriaPacket);
}

initWiFi()

133-157行目は、Wi-Fi の初期化処理です。

接続されない場合は、5秒置きに再接続を試みます。

    
void initWiFi() {
    Serial.print("\nConnecting to the WiFi network ");
    Serial.print(WIFI_SSID);
    Serial.println("...");
    // Begin
    WiFi.mode(WIFI_STA);
    WiFi.setAutoReconnect(true);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    // Wait for connection
    Serial.print("Connecting.");
    while (WiFi.status() != WL_CONNECTED) x
        static int count = 0;
        Serial.print('.');
        delay(500);
        // Retry every 5 seconds
        if (count++ % 10 == 0) {
            WiFi.disconnect();
            WiFi.reconnect();
            Serial.print('!');
        }
    }
    Serial.println("\nConnected!");
    // Set Root CA certificate
    client.setCACert(CA_CERT);
}

initNTP()

160-164行目は、NTP の初期化処理です。

    
void initNTP() {
    timeClient.begin();
    timeClient.update();
    setTime(timeClient.getEpochTime());
}

onAppAriaPacket()

167-177行目には、TWELITE ARIA からデータを受信した際の処理を記述しています。

ここでは HTTP の送信処理を行わず、グローバル変数へセットしています。 グローバル変数へセットしたデータは、別のタスクで sendAriaData() によって処理します。

    
void onAppAriaPacket(const ParsedAppAriaPacket& packet)
{
    // Store data
    LatestDataFromAria.serialId = packet.u32SourceSerialId;
    LatestDataFromAria.logicalId = packet.u8SourceLogicalId;
    LatestDataFromAria.supplyVoltage = packet.u16SupplyVoltage;
    LatestDataFromAria.linkQuality = packet.u8Lqi;
    LatestDataFromAria.temp100x = packet.i16Temp100x;
    LatestDataFromAria.humid100x = packet.u16Humid100x;
    IsThereNewDataFromAria = true;
}

sendAriaData()

180-237行目は、TWELITE ARIA のデータを HTTP GET リクエストのクエリ文字列にセットして送信する関数です。

サーバへの過度な負荷を防ぐため、高頻度でパケットが到着した際には送信をスキップしています。

    
void sendAriaData(const DataFromAria& data)
{
    static uint32_t lastTimeRequested = 0;
    if (millis() - lastTimeRequested > SEND_MIN_INTERVAL * 1000 or lastTimeRequested == 0) {
        Serial.println("Connecting to the server...");
        if (not client.connect(SERVER_HOST, SERVER_PORT, CONNECT_TIMEOUT * 1000)) {
            Serial.println("Connection failed!");
        } else {
            Serial.println("Connected to the server!");
            // Make a query string
            char queries[QUERIES_MAX_LENGTH+1];
            snprintf(queries, sizeof(queries),
                     "datetime=%04d%02d%02d%02d%02d%02d&sid=%X&lid=%d&temp=%d&humid=%d&bat=%d&lqi=%d",
                     // Note that NTP_UPDATE_INTERVAL is set for 10000ms by default; second() delays up to 10s.
                     // To prevent duplication of datetime, SEND_MIN_INTERVAL is set for 10s.
                     year(), month(), day(), hour(), minute(), second(),
                     data.serialId,
                     data.logicalId,
                     data.temp100x,
                     data.humid100x,
                     data.supplyVoltage,
                     data.linkQuality);

            // Send a request
            client.println(String("GET https://") +
                           SERVER_HOST +
                           String("/get?") +
                           queries +
                           String(" HTTP/1.1"));
            client.println("Accept: */*");
            client.println(String("Host: ") + SERVER_HOST);
            client.println("Connection: close");
            client.println();
            uint32_t timeSentRequest = millis();

            // Handle a response
            while (client.connected()) {
                String line = client.readStringUntil('\n');
                if (line == "\r") {
                    Serial.println("Headers received");
                    break;
                }
                if (millis() - timeSentRequest > REQUEST_TIMEOUT * 1000) {
                    Serial.println("Request was timed out");
                    break;
                }
            }
            while (client.available()) {
                char c = client.read();
                Serial.write(c);
            }
            client.stop();
        }
        lastTimeRequested = millis();
    } else {
        Serial.println("Requests are too frequently; skip.");
    }
}

3.5.2.4 - Google スプレッドシートの利用

TWELITE ARIA からのデータを Google スプレッドシートへアップロードするサンプルスケッチ spot-google-sheets の解説
無線 LAN 子機として振る舞い、クラウド上の Google スプレッドシートに TWELITE ARIA から受信したデータをアップロードするサンプルスケッチ spot-google-sheets の解説です。

3.5.2.4.1 - Google スプレッドシートの利用

TWELITE ARIA からのデータを Google スプレッドシートへアップロードするサンプルスケッチ spot-google-sheets の解説
無線 LAN 子機として振る舞い、クラウド上の Google スプレッドシートに TWELITE ARIA から受信したデータをアップロードするサンプルスケッチ spot-google-sheets の解説です。なお、このスケッチでは ESP32 の Arduino 環境から FreeRTOS の機能を利用しています。

ソースコードの入手

GitHub (monowireless/spot-google-sheets ) から入手できます。

システムの概要

TWELITE SPOT は、事前に作成したサービスアカウントを使って自動的にスプレッドシートを作成し、指定したユーザアカウントへ、そのファイルを共有します。

ユーザアカウントへログインすると、Google ドライブの「共有アイテム」ページから、TWELITE SPOT によって作成されたスプレッドシートを閲覧・編集できます。

作成されるスプレッドシートのイメージ

作成されるスプレッドシートのイメージ

TWELITE SPOT は、作成したスプレッドシートへデータ行を次々と追加していきます。

開発に必要なもの

環境整備

IDE とツールチェインの導入

Arduino IDE 1.x による開発環境の構築方法 をご覧ください。

ライブラリの導入

ESP-Google-Sheet-Client ライブラリ

ライブラリマネージャを開き、検索ボックスに esp-google-sheet と入力してインストールします。

なお、GitHub (mobizt/ESP-Google-Sheet-Client) からも入手できます。

公式 NTP ライブラリ

ライブラリマネージャを開き、検索ボックスに ntpclient と入力してインストールします。

TimeLib ライブラリ

ライブラリマネージャを開き、検索ボックスに timelib と入力してインストールします。

事前準備:API のセットアップ

事前に、API を使用できるように準備する必要があります。Google アカウントを使います。

ここでは、下記の作業を行います。

  • Google Cloud プロジェクトの作成
  • Google Sheets API の有効化
  • Google Drive API の有効化
  • サービスアカウントの作成と設定
  • サービスアカウントの認証情報の取得

プロジェクトの作成

API を使用するにあたって、まずは Google Cloud プロジェクトを作成します。

Google Cloud プロジェクトは、システム全体を束ねるような存在です。構築するシステムの名称をプロジェクト名にするとよいでしょう。ここでは、仮に SPOT-DEV とします。

下記のリンクにアクセスし、プロジェクトを作成してください。

https://console.cloud.google.com/projectcreate

プロジェクト作成画面の例(個人)

プロジェクト作成画面の例(個人)

Sheets API の有効化

TWELITE SPOT からスプレッドシートを操作するために、Sheets API を有効化します。

下記のリンクにアクセスし、API を有効化してください。

https://console.cloud.google.com/apis/library/sheets.googleapis.com

Sheets APIの有効化を行う画面の例

Sheets APIの有効化を行う画面の例

Drive API の有効化

TWELITE SPOT からスプレッドシートを共有するために、Drive API を有効化します。

下記のリンクにアクセスし、API を有効化してください。

https://console.cloud.google.com/apis/library/drive.googleapis.com

Drive APIの有効化を行う画面の例

Drive APIの有効化を行う画面の例

サービスアカウントの作成と設定

TWELITE SPOT からスプレッドシートを作成するために、サービスアカウントを作成します。

下記のリンクにアクセスし、プロジェクト名(ここでは SPOT-DEV )を選択してサービスアカウント一覧画面を表示したのち、ページ上部のボタンからサービスアカウントの作成を開始します。

https://console.cloud.google.com/iam-admin/serviceaccounts

サービスアカウント一覧の表示画面の例

サービスアカウント一覧の表示画面の例

「① サービスアカウントの詳細」では、サービスアカウントの名称を入力します。

下記の例では、spot-dev-sa としています。

サービスアカウント名の入力画面の例

サービスアカウント名の入力画面の例

入力したら、「作成して続行」ボタンを押して次へ進みます。

「② このサービスアカウントにプロジェクトへのアクセスを許可する(省略可)」では、サービスアカウントの権限を設定します。

ここでは、下記の例のようにして「オーナー」を選択してください。

サービスアカウント権限の入力画面の例

サービスアカウント権限の入力画面の例

選択したら、「続行」ボタンを押して次へ進みます。

「③ ユーザーにこのサービスアカウントへのアクセスを許可(省略可)」では、何も行わずに「完了」を押してスキップします。

スキップする画面の例

スキップする画面の例

サービスアカウントの作成が完了すると、サービスアカウントの一覧画面へ戻ります。作成したサービスアカウントが表示されていることを確認してください。

サービスアカウントの認証情報の取得

作成したサービスアカウントを確認したら、「メール」列のリンクをクリックし、サービスアカウントの詳細画面へ移ります。

サービスアカウントアカウント作成後の一覧画面の例

サービスアカウントアカウント作成後の一覧画面の例

上部の「キー」タブを選択して、サービスアカウントの認証に必要な秘密鍵を管理する画面へ移ります。

サービスアカウントの詳細画面の例

サービスアカウントの詳細画面の例

「鍵を追加」ボタンから「新しい鍵を作成」を選択し、秘密鍵の作成を開始します。

鍵の作成ボタンの表示例

鍵の作成ボタンの表示例

次の画面では、「JSON」を選択した状態のまま「作成」ボタンを押します。

タイプ選択画面の例

タイプ選択画面の例

「作成」ボタンを押すと、秘密鍵ファイル(.json)が自動的にダウンロードされます。

秘密鍵ファイルをテキストエディタで開くと、下記のような構成になっているはずです。

    
{
  "type": "service_account",
  "project_id": "???",
  "private_key_id": "???",
  "private_key": "-----BEGIN PRIVATE KEY-----\n???\n-----END PRIVATE KEY-----\n",
  "client_email": "???@???.iam.gserviceaccount.com",
  "client_id": "???",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oau