セクションの複数ページをまとめています。 印刷またはPDF形式で保存...
マニュアル
- 1: TWELITE APPS
- 1.1: 親機・中継機アプリ マニュアル
- 1.1.1: 親機・中継機アプリ マニュアル
- 1.1.1.1: 概要
- 1.1.1.2: 使用方法
- 1.1.1.2.1: 親機モード
- 1.1.1.2.1.1: 受信メッセージ
- 1.1.1.2.1.1.1: 超簡単!標準アプリ
- 1.1.1.2.1.1.2: リモコンアプリ
- 1.1.1.2.1.1.3: シリアル通信アプリ
- 1.1.1.2.1.1.4: 無線タグアプリ
- 1.1.1.2.1.1.5: パル/キュー/アリアアプリ
- 1.1.1.2.1.1.5.1: パルアプリ
- 1.1.1.2.1.1.5.2: キューアプリ
- 1.1.1.2.1.1.5.3: アリアアプリ
- 1.1.1.2.1.1.5.4: 出力書式の詳細
- 1.1.1.2.1.1.5.5: パルアプリ
- 1.1.1.2.1.1.6: アクト
- 1.1.1.2.1.2: 送信コマンド
- 1.1.1.2.1.2.1: 0x90コマンド
- 1.1.1.2.2: 中継機モード
- 1.1.1.3: インタラクティブモード
- 1.2: シリアル通信アプリ マニュアル
- 1.2.1: シリアル通信アプリ マニュアル
- 1.2.1.1: ピン割り当て
- 1.2.1.2: 使用方法
- 1.2.1.3: 通信モード
- 1.2.1.3.1: ヘッダ付き透過モード(E)
- 1.2.1.3.1.1: 出力のカスタマイズ
- 1.2.1.3.2: 書式モード(A, B)
- 1.2.1.3.2.1: アスキー形式
- 1.2.1.3.2.2: バイナリ形式
- 1.2.1.3.2.2.1: バイナリ形式で使ってみる
- 1.2.1.3.2.3: 0xDB コマンド
- 1.2.1.3.2.4: サイレントモード
- 1.2.1.3.3: チャットモード(C)
- 1.2.1.3.3.1: どこでもチャット
- 1.2.1.3.4: 透過モード(D)
- 1.2.1.4: その他の機能
- 1.2.1.4.1: カスタムデフォルト
- 1.2.1.5: インタラクティブモード
- 1.2.1.6: 使用上の注意
- 1.3: キューアプリ マニュアル
- 1.3.1: キューアプリ マニュアル
- 1.3.1.1: 概要
- 1.3.1.2: 各部の説明
- 1.3.1.3: 動作モード
- 1.3.1.3.1: TWELITE CUEモード
- 1.3.1.3.2: 動作センサーパルモード
- 1.3.1.3.3: 開閉センサーパルモード
- 1.3.1.4: 設定方法
- 1.3.1.4.1: OTAによる設定
- 1.3.1.4.2: TWELITE R2による設定
- 1.3.1.4.3: インタラクティブモード
- 1.3.1.5: 使用上の注意
- 1.4: アリアアプリ マニュアル
- 1.4.1: アリアアプリ マニュアル
- 1.4.1.1: 各部の説明
- 1.4.1.2: 使用方法
- 1.4.1.2.1: 動作確認
- 1.4.1.2.2: モード選択
- 1.4.1.2.2.1: TWELITE ARIAモード
- 1.4.1.2.2.2: 開閉センサーパルモード
- 1.4.1.3: 設定方法
- 1.4.1.3.1: OTAによる設定
- 1.4.1.3.2: TWELITE R2による設定
- 1.4.1.4: インタラクティブモード
- 1.4.1.5: 使用上の注意
- 2: TWELITE STAGE APP
- 2.1: TWELITE STAGE APP マニュアル
- 2.1.1: パッケージの取得
- 2.1.2: インストール
- 2.1.2.1: プラットフォーム別の注意事項
- 2.1.2.1.1: Windowsへインストールする際の注意事項
- 2.1.2.1.2: macOSインストールする際の注意事項
- 2.1.2.1.3: Linuxへインストールする際の注意事項
- 2.1.2.1.4: Raspberry Piへインストールする際の注意事項
- 2.1.3: 使用方法
- 2.1.3.1: キーとマウスの操作
- 2.1.3.2: 画面の操作
- 2.1.3.2.1: シリアルポート選択
- 2.1.3.2.2: メインメニュー
- 2.1.3.2.2.1: ビューア
- 2.1.3.2.2.1.1: ターミナル
- 2.1.3.2.2.1.2: 標準アプリ ビューア
- 2.1.3.2.2.1.3: グラフ
- 2.1.3.2.2.1.3.1: 加速度リアルタイムグラフ
- 2.1.3.2.2.1.3.2: センサーグラフ
- 2.1.3.2.2.1.4: 簡易モニタ
- 2.1.3.2.2.1.5: コマンダー
- 2.1.3.2.2.2: アプリ書換
- 2.1.3.2.2.2.1: BINから選択
- 2.1.3.2.2.2.2: actビルド&書換
- 2.1.3.2.2.2.3: TWELITE APPSビルド&書換
- 2.1.3.2.2.2.4: Act_extras
- 2.1.3.2.2.2.5: 指定
- 2.1.3.2.2.2.6: 再書換
- 2.1.3.2.2.2.7: ビルド・書換画面
- 2.1.3.2.2.3: インタラクティブモード
- 2.1.3.2.2.4: TWELITE STAGE の設定
- 2.1.3.2.2.5: シリアルポートの選択
- 2.1.3.3: ログ機能
- 2.1.4: 詳細な仕様
- 2.1.4.1: フォルダ構成
- 2.1.4.2: コマンドライン引数とiniファイルによる詳細設定
- 2.1.4.3: 環境変数
- 2.1.4.4: 000desc.txt によるプロジェクト説明の追加
- 2.1.5: ライセンス
- 2.1.6: 改訂履歴
- 3: TWELITE SPOT
- 3.1: 導入済みアプリケーションの概要
- 3.2: 無線性能に配慮した設置方法
- 3.3: ファームウェア開発環境の構築方法
- 3.3.1: Arduino IDE 1.x による開発環境の構築方法
- 3.3.1.1: Arduino IDE 1.x の導入
- 3.3.1.2: Arduino core for the ESP32 の導入
- 3.3.1.3: Arduino core for the ESP32 の設定
- 3.3.1.4: MWings ライブラリの導入
- 3.4: ファームウェアの書き込み方法
- 3.4.1: ESP32 へのファームウェアの書き込み方法
- 3.4.1.1: ESP32 へのスケッチの書き込み方法
- 3.4.1.2: ESP32 へのファイルの書き込み方法
- 3.4.1.3: ESP32 のパーティションテーブルを指定した書き込み方法
- 3.4.2: TWELITE へのファームウェアの書き込み方法
- 3.4.3: ファームウェアの初期化方法
- 3.4.3.1: ESP32 のファームウェアの初期化方法
- 3.4.3.2: TWELITE のファームウェアの初期化方法
- 3.5: サンプルスケッチの解説
- 3.5.1: TWELITE と通信するスケッチの解説
- 3.5.1.1: 超簡単!標準アプリのデータを取得・操作
- 3.5.1.1.1: 超簡単!標準アプリのデータを取得・操作
- 3.5.1.2: キューアプリのデータを取得
- 3.5.1.2.1: キューアプリのデータを取得
- 3.5.1.3: アリアアプリのデータを取得
- 3.5.1.3.1: アリアアプリのデータを取得
- 3.5.2: TWELITE に加えて無線 LAN を活用するスケッチの解説
- 3.5.2.1: プリインストール済みスケッチ
- 3.5.2.1.1: プリインストール済みスケッチ
- 3.5.2.2: WebSocketによる中継
- 3.5.2.2.1: WebSocketによる中継
- 3.5.2.3: REST API の使用
- 3.5.2.3.1: REST API の使用
- 3.5.2.4: Google スプレッドシートの利用
- 3.5.2.4.1: Google スプレッドシートの利用
1 - TWELITE APPS
1.1 - 親機・中継機アプリ マニュアル
1.1.1 - 親機・中継機アプリ マニュアル
2020年6月以降に出荷される MONOSTICK BLUE や MONOSTICK RED に本アプリがあらかじめインストールされます。
資料の取り扱いについて をご参照ください。
お気付きの点がありましたら、当サポート窓口にご連絡いただければ幸いです。
本資料の表示例(ボタン名や画面キャプチャ)は、資料作成時のバージョンのものとなっています。
一部、入手されたバージョンと差異がある場合があります。
1.1.1.1 - 概要
機能
- 超簡単!標準アプリやパル専用アプリなどの TWELITE APPS や act のデータを1つの MONOSTICK で収集可能
- 16チャンネルで複数システムを個別に運用可能
- アプリケーションIDの設定することで、同一チャネルに複数システムを混在可能
- 中継機能で通信範囲拡大
1.1.1.2 - 使用方法
本アプリには 親機モードと中継機モードの 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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | 78 | 送信元の論理デバイスIDは0x78 | |
2 | 1 | コマンドID | 81 | IO状態の通知 | |
3 | 1 | パケット識別子 | 15 | | アプリケーションIDより生成される |
4 | 1 | プロトコルバージョン | 01 | | 01 で固定 |
5 | 1 | LQI | C9 | 201 | 0が最小で255が最大 |
6 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは201015A | |
7 | 1 | 宛先の論理デバイスID | 00 | 親機宛 | |
8 | 2 | タイムスタンプ | 0391 | 約14.3秒 | 1秒で64カウント |
9 | 1 | 中継フラグ | 00 | 中継してない | ※1 参照 |
a | 2 | 電源電圧[mV] | 0C2E | 3118mV | |
b | 1 | 未使用 | 00 | | |
c | 1 | DI の状態ビット | 81 | DI1がON(Low) | DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1がOn(Lowレベル)。 MBSが1だったら定期送信。 |
d | 1 | DI の変更状態ビット | 03 | DI1とDI2が変更対象 | DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1が変更対象。 |
e1 | 1 | AI1の変換値 | 01 | 16mV | ※2、※3 参照 |
e2 | 1 | AI2の変換値 | FF | 未使用 | ※2、※3 参照 |
e3 | 1 | AI3の変換値 | FF | 未使用 | ※2、※3 参照 |
e4 | 1 | AI4の変換値 | FF | 未使用 | ※2、※3 参照 |
ef | 1 | AI1~AI4の補正値 | FF | 未使用 | LSBから順に2ビットずつ補正値、LSB側が AI1、MSB側が AI4 ※2、※3 参照 |
g | 1 | チェックサム | 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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | 78 | 送信元の論理デバイスIDは0x78 | |
2 | 1 | コマンドID | 01 | 任意データの送受信 | |
3 | N | データ | 00112233AABBCCDD | | |
4 | 1 | チェックサム | 13 |
1.1.1.2.1.1.2 - リモコンアプリ
相手端末からの状態通知:ステータス0x81
データフォーマット
:78811202848201015A003FC9000001000100010086
^1^2^3^4^5^^^^^^^6^7^^^8^9^^^a^^^b^^^c^d^e
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | 78 | 送信元の論理デバイスIDは0x78 | |
2 | 1 | コマンドID | 81 | IO状態の通知 | |
3 | 1 | パケット識別子 | 12 | アプリケーションIDより生成される | |
4 | 1 | プロトコルバージョン | 02 | 02 で固定 | |
5 | 1 | LQI | 84 | 132 | (0が最小で255が最大) |
6 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは201015A | |
7 | 1 | 宛先の論理デバイスID | 00 | 親機宛 | |
8 | 2 | タイムスタンプ | 3FC9 | 約255.1秒 | 1秒で64カウント |
9 | 1 | 中継フラグ | 00 | 中継してない | ※1 参照 |
a | 2 | DI の状態ビット | 0001 | DI1がON(Low) | LSBからDI1、DI2… |
b | 2 | DI の変更状態ビット | 0001 | DI1が変更対象 | LSBからDI1、DI2… |
c | 2 | DIの割込状態ビット | 0001 | DI1が割り込み入力された(変化した)。 | |
d | 1 | 未使用 | 00 | ||
e | 1 | チェックサム | 86 |
※1 中継フラグは中継の回数を意味します。中継をしていない時は0になります。
1.1.1.2.1.1.3 - シリアル通信アプリ
本アプリでは書式モードの電文のみ受信可能です。
透過モードやチャットモードのパケットを受信した場合の出力は未定義ですので、ご注意ください。
簡易書式
データフォーマット
:780100112233AABBCCDD13
^1^2^^^^^^^^^^^^^^^3^4
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | 78 | 送信元の論理デバイスIDは0x78 | |
2 | 1 | 応答ID | 01 | 任意の0x00~0x7Fの値 | |
3 | N | データ | 00112233AABBCCDD | ||
4 | 1 | チェックサム | 01 |
拡張書式
データフォーマット
:78A0028201015AFFFFFFFFA8000700112233AABBCCC6
^1^2^3^^^^^^^4^^^^^^^5^6^^^7^^^^^^^^^^^^^8^9
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | 78 | 送信元の論理デバイスIDは0x78 | |
2 | 1 | コマンド種別 | A0 | 拡張形式 | 0xA0固定 |
3 | 1 | 応答ID | 02 | 任意の0x00~0x7Fの値 | |
4 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは201015A | |
5 | 4 | 送信先のシリアルID | FFFFFFFF | FFFFFFFFのときは論理デバイスIDを指定して送信している。 | |
6 | 1 | LQI | A8 | 168 | 0が最小で255が最大 |
7 | 2 | データのバイト数 | 0007 | 7バイト | |
8 | N | データ | 00112233AABBCC | | |
9 | 1 | チェックサム | C6 | |
1.1.1.2.1.1.4 - 無線タグアプリ
以下は、主なセンサー接続時のデータの出力例です。
アナログセンサ―
:80000000B700628201015A0010DF08FD09A300000000E9
^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^^^^^^^a^b
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | 中継していない場合は80000000 |
2 | 1 | LQI | B7 | 168 | 0が最小で255が最大 |
3 | 2 | 続き番号 | 0062 | 98 | |
4 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは8201015A | |
5 | 1 | 送信元の論理デバイスID | 00 | 送信元の論理デバイスIDは00 | |
6 | 1 | センサー種別 | 10 | アナログセンサー | |
7 | 1 | 電源電圧 [mV] | DF | 3330mV | 電源電圧の計算方法を参照 |
8 | 2 | ADC1の電圧 | 08FD | 2301mV | |
9 | 2 | ADC2の電圧 | 09A3 | 2467mV | |
a | 4 | 未使用 | 00000000 | ||
b | 1 | チェックサム | E9 |
加速度センサー (ADXL34x / TWELITE 2525A)
:8000000063001781013C850035DF057702F2000000FF96FFF0BB
^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^a^^^b^^^c^^^d^e
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | 中継していない場合は80000000 |
2 | 1 | LQI | 63 | 99 | 0が最小で255が最大 |
3 | 2 | 続き番号 | 0017 | 23 | |
4 | 4 | 送信元のシリアルID | 81013C85 | 送信元のシリアルIDは1013C85 | |
5 | 1 | 送信元の論理デバイスID | 00 | 送信元の論理デバイスIDは00 | |
6 | 1 | センサー種別 | 35 | 加速度センサー(ADXL34x) | |
7 | 1 | 電源電圧 [mV] | DF | 3330mV | 電源電圧の計算方法を参照 |
8 | 2 | ADC1の電圧 | 0577 | 1399mV | |
9 | 2 | ADC2の電圧 | 02F2 | 754mV | |
a | 1 | センサーモード番号 | 00 | 通常モード | |
b | 2 | X軸の加速度 | 0000 | 0mg | 単位はmg*10 |
c | 2 | Y軸の加速度 | FF96 | -1060mg | 単位はmg*10 |
d | 2 | Z軸の加速度 | FFF0 | -160mg | 単位はmg*10 |
e | 1 | チェックサム | BB |
スイッチ
:800000009C00118201015A00FEDF000709A300010064
^^^^^^^1^2^^^3^^^^^^^4^5^6^7^^^8^^^9^a^b^c^d
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | 中継していない場合は80000000 |
2 | 1 | LQI | 9C | 156 | 0が最小で255が最大 |
3 | 2 | 続き番号 | 0062 | 98 | |
4 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは201015A | |
5 | 1 | 送信元の論理デバイスID | 00 | 送信元の論理デバイスIDは00 | |
6 | 1 | センサー種別 | 10 | スイッチ | |
7 | 1 | 電源電圧 [mV] | DF | 3330mV | 電源電圧の計算方法を参照 |
8 | 2 | ADC1の電圧 | 0007 | 7mV | |
9 | 2 | ADC2の電圧 | 09A3 | 2467mV | |
a | 1 | センサーモード番号 | 00 | 立ち下がり検出モード | 0:立ち下り検出モード 1:立ち上り検出モード |
b | 1 | DI1の状態 | 01 | ON(Low) | 1がON(Low) |
c | 1 | 未使用 | 00 | ||
d | 1 | チェックサム | 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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | A8 | 168 | |
3 | 2 | 続き番号 | 001C | 28 | |
4 | 4 | 送信元のシリアルID | 82012B1E | 送信元のシリアルIDは2012B1E | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 81 | 開閉センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 03 | 3つ | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D0C | 3340mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 03E4 | 996mV | |
j | 1 | 各種情報ビット値 | 00 | 拡張バイトなし 符号なしChar型 | |
k | 1 | データソース | 00 | 磁気 | |
l | 1 | 拡張バイト | 00 | 0 | |
m | 1 | データ長 | 01 | 1バイト | |
n | 1 | データ | 01 | 磁石(N極)が近づいた | 00: 磁石が離れた。 |
o | 1 | チェックサム1 | EC | ||
p | 1 | チェックサム2 | 6E |
環境センサーパル
: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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | 84 | 132 | |
3 | 2 | 続き番号 | 811F | 33055 | |
4 | 4 | 送信元のシリアルID | 810EFF6D | 送信元のシリアルIDは810EFF6D | |
5 | 1 | 送信元の論理デバイスID | 04 | 送信元の論理デバイスIDは04 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 82 | 環境センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 05 | 5つ | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0AEB | 2795mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 035A | 858mV | |
j | 1 | 各種情報ビット値 | 05 | 拡張バイトなし 符号ありShort | |
k | 1 | データソース | 01 | 温度 | |
l | 1 | 拡張バイト | 00 | 0 | |
m | 1 | データ長 | 02 | 2バイト | |
n | 2 | データ | 09E3 | 25.31°C | |
o | 1 | 各種情報ビット値 | 01 | 拡張バイトなし 符号なしShort | |
p | 1 | データソース | 02 | 湿度 | |
q | 1 | 拡張バイト | 00 | 0 | |
r | 1 | データ長 | 02 | 2バイト | |
s | 2 | データ | 0E3A | 36.42% | |
t | 1 | 各種情報ビット値 | 02 | 拡張バイトなし 符号ありLong | |
u | 1 | データソース | 03 | 照度 | |
v | 1 | 拡張バイト | 00 | 0 | |
w | 1 | データ長 | 04 | 4バイト | |
x | 4 | データ | 000001BE | 446 lux | |
y | 1 | チェックサム1 | 6C | ||
z | 1 | チェックサム2 | 00 |
動作センサーパル
出力例
: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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | BA | 186 | |
3 | 2 | 続き番号 | 0023 | 35 | |
4 | 4 | 送信元のシリアルID | 82011CEF | 送信元のシリアルIDは82011CEF | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 83 | 動作センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 12 | 18 | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D02 | 3330mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 055C | 1372mV | |
j | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
k | 1 | データソース | 04 | 加速度 | |
l | 1 | 拡張バイト | 40 | サンプリング周波数 : 100Hz 0サンプル目 | |
m | 1 | データ長 | 06 | 6バイト | |
n | 2 | データ | 001000100450 | X : 16mg Y : 16mg Z : 1104mg | |
o | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
p | 1 | データソース | 04 | 加速度 | |
q | 1 | 拡張バイト | 41 | サンプリング周波数 : 100Hz 1サンプル目 | |
r | 1 | データ長 | 06 | 2バイト | |
s | 2 | データ | 000800100430 | X : 8mg Y : 16mg Z : 1072mg | |
… | |||||
t | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
u | 1 | データソース | 04 | 加速度 | |
v | 1 | 拡張バイト | 4F | サンプリング周波数 : 100Hz 15サンプル目 | |
w | 1 | データ長 | 06 | 6バイト | |
x | 4 | データ | 000000180438 | X : 0mg Y : 24mg Z : 1080mg | |
y | 1 | チェックサム1 | 28 | ||
z | 1 | チェックサム2 | A5 |
通知パル
: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
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | CQ | 186 | |
3 | 2 | 続き番号 | BBC0 | 48064 | |
4 | 4 | 送信元のシリアルID | 82014C35 | 送信元のシリアルIDは82014C35 | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 84 | 通知パル Ver.1 | |
8 | 1 | センサーデータの数 | 03 | 3 | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D0C | 3340mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 03F9 | 1017mV | |
j | 1 | 各種情報ビット値 | 12 | 拡張バイトあり符号なしLong | |
k | 1 | データソース | 05 | イベント | |
l | 1 | 拡張バイト | 04 | 加速度によるイベント | |
m | 1 | データ長 | 04 | 4バイト | |
n | 1 | データ1 | 10 | イベント0x10(16)が発生 | 加速度の場合 |
o | 3 | データ2 | 000000 | 0 | 将来の拡張用。現在は未使用 |
p | 1 | チェックサム1 | 28 | ||
q | 1 | チェックサム2 | A5 |
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 | 中継機シリアルID | 4 | 80000000 | |
2 | LQI | 1 | B1 | |
3 | 続き番号 | 2 | 001B | |
4 | 送信元シリアルID | 4 | 810B6465 | |
5 | 送信元LID | 1 | 01 | |
6 | センサー種別 | 1 | 80 | |
7 | PAL IDとPAL Ver | 1 | 05 | TWELITE CUE |
8 | センサーデータ数 | 1 | 0F | 15 |
9 | センサーデータ0 | 7 | 00340003813500 | パケットプロパティ 参照 |
a | センサーデータ1 | 8 | 1205040403000000 | イベント 参照 |
b | センサーデータ2 (ヘッダ) | 4 | 11300802 | 2バイト、拡張ビット有 |
c | センサーデータ2 | 2 | 0D34 | 3350mV |
d | センサーデータ3 (ヘッダ) | 4 | 11300102 | 2バイト、拡張ビット有 |
e | センサーデータ3 | 2 | 052E | 1432mV |
f | センサーデータ4 (ヘッダ) | 4 | 00000001 | 1バイト拡張ビットなし ホールIC 詳しくはこちらを参照してください。 |
g | センサーデータ4 | 1 | 80 | 変化なし、オープン |
h | センサーデータ5 (ヘッダ) | 4 | 15044006 | 符号あり2バイト、拡張ビット有 加速度(1サンプル目) 詳しくはこちらを参照してください。 |
i | センサーデータ5(X軸) | 2 | FC28 | X = 392mg |
j | センサーデータ5(Y軸) | 2 | FFB0 | Y = -800mg |
k | センサーデータ5(Z軸) | 2 | 0018 | Z = 240mg |
l | センサーデータ6 (ヘッダ) | 4 | 15044106 | 符号あり2バイト、拡張ビット有 加速度(2サンプル目) 詳しくはこちらを参照してください。 |
m | センサーデータ6(X軸) | 2 | FC28 | X = 176mg |
n | センサーデータ6(Y軸) | 2 | FFB0 | Y = -1248mg |
o | センサーデータ6(Z軸) | 2 | 0008 | Z = -96mg |
中略 | ||||
p | チェックサム1 | 1 | A6 | 1~pの1つ前までのCRC8 |
q | チェックサム2 | 1 | 2C | 1~pまでのLRC |
パケットプロパティ
00340003810402
^1^2^3^4^5^6^7
意味 | バイト数 | データ例 | 備考 | |
---|---|---|---|---|
1 | 各種情報ビット値 | 1 | 00 | 拡張バイトなし、符号なしChar |
2 | データソース | 1 | 34 | 起床要因 |
3 | 拡張バイト | 1 | 00 | |
4 | データ長 | 1 | 03 | |
5 | パケットID | 1 | 81 | 0~127、MSBはイベントがあるかどうか |
6 | 起床要因センサー | 1 | 04 | 磁気センサー:0x00 タイマー:0x35 |
7 | 起床要因 | 1 | 02 | 送信要因 イベントが発生した:0x00 |
イベント
1205040410000000
^1^2^3^4^5^6^7^8
意味 | バイト数 | データ例 | 備考 | |
---|---|---|---|---|
1 | 各種情報ビット値 | 1 | 12 | 拡張バイトあり、符号なしLong |
2 | データソース | 1 | 05 | イベント |
3 | 拡張バイト | 1 | 04 | イベントの発生要因 磁気センサー:0x00 MSBが1の場合はデータ2にデータが存在する。 |
4 | データ長 | 1 | 04 | |
5 | データ1 | 1 | 10 | イベント発生要因が磁気センサーの場合 0x00(0):近くに磁石がない イベント発生要因が加速度の場合 0x01(1)~0x06(6):さいころ |
6 | データ2 | 3 | 000000 | 未使用 |
1.1.1.2.1.1.5.3 - アリアアプリ
TWELITE ARIAには温湿度センサーと磁気センサーが搭載されており、両方のセンサーのデータも出力メッセージに含まれます。
このページでは出力メッセージからそれらのセンサーデータの読み方について解説します。
センサーデータの簡易的な読み方
以下のご案内は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 | 4 | 80000000 | 中継されていない場合は80000000 |
2 | LQI | 1 | CF | 大きいほど電波品質が良い |
3 | 続き番号 | 2 | 0002 | |
4 | 送信元シリアルID | 4 | 8201BAA2 | |
5 | 送信元LID | 1 | 01 | |
6 | センサー種別 | 1 | 80 | TWELITE ARIAは80固定 |
7 | PAL ID | 1 | 06 | TWELITE ARIAモードは06 |
8 | センサーデータ数 | 1 | 07 | |
9 | センサーデータ0(ヘッダ) | 4 | 00340003 | 拡張バイトなし、符号なし1バイト、パケットプロパティが3バイト |
a | センサーデータ0 | 3 | 813500 | タイマーイベントで送信した |
b | センサーデータ1(ヘッダ) | 4 | 12053504 | 拡張バイトあり、符号なしLong、タイマーイベント情報 |
c | センサーデータ1 | 4 | 01000000 | タイマーが起床させた |
d | センサーデータ2(ヘッダ) | 4 | 11300802 | 符号なし2バイト、電源電圧 |
e | センサーデータ2 | 2 | 0D20 | 3360mV |
f | センサーデータ3(ヘッダ) | 4 | 11300102 | 符号なし2バイト、ADC1 |
g | センサーデータ3 | 2 | 04ED | 1261mV |
h | センサーデータ4(ヘッダ) | 4 | 00000001 | 拡張バイトなし、符号なし1バイト、磁気センサー |
i | センサーデータ4 | 1 | 80 | 変化なし、オープン |
j | センサーデータ5(ヘッダ) | 4 | 05010002 | 拡張バイトなし、符号あり2バイト、温度 |
k | センサーデータ5 | 2 | 09D0 | 25.12°C |
l | センサーデータ6(ヘッダ) | 4 | 01020002 | 拡張バイトなし、符号なし2バイト、湿度 |
m | センサーデータ6 | 2 | 0F34 | 38.92% |
n | チェックサム1 | 1 | 79 | 1~mまでのLRC |
o | チェックサム2 | 1 | 34 | 1~nまでのCRC8 |
1.1.1.2.1.1.5.4 - 出力書式の詳細
出力書式
:80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9^a^b
番号 | バイト数 | 意味 | データ例 | 備考 |
---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継していない場合は80000000 |
2 | 1 | LQI | A8 | 0が最小で255が最大 |
3 | 2 | 続き番号 | 001C | |
4 | 4 | 送信元のシリアルID | 82012B1E | |
5 | 1 | 送信元の論理デバイスID | 01 | |
6 | 1 | センサー種別 | 80 | 80で固定 |
7 | 1 | PAL基板バージョンとPAL基板ID | 81 | |
8 | 1 | センサーデータの数 | 03 | |
9 | N | センサーデータ | 113008020D0C1130010203E40000000101 | センサーデータ 参照 |
a | 1 | チェックサム1 | EC | 1~9までのCRC8 |
b | 1 | チェックサム2 | 6E | 1~aまでのLRC |
センサーデータ
センサーデータは以下のような構成で表記されます。
113008020D0C
^1^2^3^4^^^5
番号 | バイト数 | 意味 | データ例 | 備考 |
---|---|---|---|---|
1 | 1 | 情報ビット | 11 | データの大きさや拡張バイトの有無を保持する |
2 | 1 | データソース | 30 | センサーの種類 |
3 | 1 | 拡張バイト | 08 | データの補足情報が付与される |
4 | 1 | データ長 | 02 | データのバイト数 |
5 | N | データ | 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 |
パケットプロパティ | なし |
データ長
データのバイト数を示します。
データ
センサーの実データが格納されています。
データソース | バイト数 | 内容 | 数値例 (16進数) | 数値例の内容 |
---|---|---|---|---|
磁気 | 1(符号無1バイト) | 0x00=近くに磁石がない | 01 | 磁石のN極が近くにある |
温度 | 2(符号有2バイト) | 温度の100倍 (°C) | 09E3 | 25.31°C |
湿度 | 2(符号無2バイト) | 湿度の100倍 (%) | 0E3A | 36.42% |
照度 | 4(符号無4バイト) | 照度 (lux) | 000001BE | 446 lux |
加速度 | 6(符号有2バイト*3) | X 軸、Y 軸、Z軸の順でそれぞれの2バイトの重力加速度 (mg) | 001000100450 | X : 16mg Y : 16mg Z : 1104mg |
イベント | 4(符号無1バイト+3バイト) | 1バイト : イベント内容 ・拡張バイトが磁気の場合 0x00(0):近くに磁石がない ・拡張バイトが加速度の場合 0x01(1)~0x06(6):さいころ 3バイト : 未使用(将来の拡張用) | 01000000 | 拡張バイトが磁気の場合 : 磁石のN極が近くにある |
電圧 | 2(符号無2バイト) | 電圧 (mV) | 03E4 | 996mV |
パケットプロパティ | 3(符号無1バイト*3) | 1バイト : パケットID 1バイト : 起床要因データソース 磁気センサー:0x00 タイマー:0x35 送信要因 イベントが発生した:0x00 | 810402 | パケットIDが1でイベントあり、起床要因データソースは加速度で、閾値を超えたので起床した。 |
1.1.1.2.1.1.5.5 - パルアプリ
出力書式
:80000000A8001C82012B1E01808103113008020D0C1130010203E40000000101EC6E
^^^^^^^1^2^^^3^^^^^^^4^5^6^7^8^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^9^a^b
番号 | バイト数 | 意味 | データ例 | 備考 |
---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継していない場合は80000000 |
2 | 1 | LQI | A8 | 0が最小で255が最大 |
3 | 2 | 続き番号 | 001C | |
4 | 4 | 送信元のシリアルID | 82012B1E | |
5 | 1 | 送信元の論理デバイスID | 01 | |
6 | 1 | センサー種別 | 80 | 80で固定 |
7 | 1 | PAL基板バージョンとPAL基板ID | 81 | |
8 | 1 | センサーデータの数 | 03 | |
9 | N | センサーデータ | 113008020D0C1130010203E40000000101 | センサーデータ 参照 |
a | 1 | チェックサム1 | EC | 1~9までのCRC8 |
b | 1 | チェックサム2 | 6E | 1~aまでのLRC |
センサーデータ
センサーデータは以下のような構成で表記されます。
113008020D0C
^1^2^3^4^^^5
番号 | バイト数 | 意味 | データ例 | 備考 |
---|---|---|---|---|
1 | 1 | 情報ビット | 11 | データの大きさや拡張バイトの有無を保持する |
2 | 1 | データソース | 30 | センサーの種類 |
3 | 1 | 拡張バイト | 08 | データの補足情報が付与される |
4 | 1 | データ長 | 02 | データのバイト数 |
5 | N | データ | 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 | 0x00=近くに磁石がない 0x01=N極が近い 0x02=S極が近い 0x80= 定期送信(この ビットが0の場合は、 磁石までの距離が変化し たことを示す) | 01 | 磁石のN極が近くにある |
温度 | 2 | 温度の100倍 (℃) | 09E3 | 25.31℃ |
湿度 | 2 | 湿度の100倍 (%) | 0E3A | 36.42% |
照度 | 4 | 照度 (lux) | 000001BE | 446 lux |
加速度 | 6 | X 軸、Y 軸、Z軸の順でそれぞれの2バイトの重力加速度 (mg) | 001000100450 | X : 16mg Y : 16mg Z : 1104mg |
イベント | 4 | 1バイト : イベント内容 ・拡張バイトが磁気の場合 0x00(0):近くに磁石がない ・拡張バイトが加速度の場合 0x01(1)~0x06(6):さいころ 3バイト : 未使用(将来の拡張用) | 01000000 | 拡張バイトが磁気の場合 :
磁石のN極が近くにある |
電圧 | 2 | 電圧 (mV) | 03E4 | 996mV |
パケットプロパティ | 3 | 1バイト : パケットID 1バイト : 起床要因データソース 磁気センサー:0x00 タイマー:0x35 送信要因 イベントが発生した:0x00 | 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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | A8 | 168 | |
3 | 2 | 続き番号 | 001C | 28 | |
4 | 4 | 送信元のシリアルID | 82012B1E | 送信元のシリアルIDは2012B1E | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 81 | 開閉センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 03 | 3つ | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D0C | 3340mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 03E4 | 996mV | |
j | 1 | 各種情報ビット値 | 00 | 拡張バイトなし 符号なしChar型 | |
k | 1 | データソース | 00 | 磁気 | |
l | 1 | 拡張バイト | 00 | 0 | |
m | 1 | データ長 | 01 | 1バイト | |
n | 1 | データ | 01 | 磁石(N極)が近くにある | |
o | 1 | チェックサム1 | EC | ||
p | 1 | チェックサム2 | 6E |
環境センサーパル
: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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | 84 | 132 | |
3 | 2 | 続き番号 | 811F | 33055 | |
4 | 4 | 送信元のシリアルID | 810EFF6D | 送信元のシリアルIDは810EFF6D | |
5 | 1 | 送信元の論理デバイスID | 04 | 送信元の論理デバイスIDは04 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 82 | 環境センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 05 | 5つ | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0AEB | 2795mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 035A | 858mV | |
j | 1 | 各種情報ビット値 | 05 | 拡張バイトなし 符号ありShort | |
k | 1 | データソース | 01 | 温度 | |
l | 1 | 拡張バイト | 00 | 0 | |
m | 1 | データ長 | 02 | 2バイト | |
n | 2 | データ | 09E3 | 25.31℃ | |
o | 1 | 各種情報ビット値 | 01 | 拡張バイトなし 符号なしShort | |
p | 1 | データソース | 02 | 湿度 | |
q | 1 | 拡張バイト | 00 | 0 | |
r | 1 | データ長 | 02 | 2バイト | |
s | 2 | データ | 0E3A | 36.42% | |
t | 1 | 各種情報ビット値 | 02 | 拡張バイトなし 符号ありLong | |
u | 1 | データソース | 03 | 照度 | |
v | 1 | 拡張バイト | 00 | 0 | |
w | 1 | データ長 | 04 | 4バイト | |
x | 4 | データ | 000001BE | 446 lux | |
y | 1 | チェックサム1 | 6C | ||
z | 1 | チェックサム2 | 00 |
動作センサーパル
出力例
: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
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | BA | 186 | |
3 | 2 | 続き番号 | 0023 | 35 | |
4 | 4 | 送信元のシリアルID | 82011CEF | 送信元のシリアルIDは82011CEF | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 83 | 動作センサーパル Ver.1 | |
8 | 1 | センサーデータの数 | 12 | 18 | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D02 | 3330mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 055C | 1372mV | |
j | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
k | 1 | データソース | 04 | 加速度 | |
l | 1 | 拡張バイト | 40 | サンプリング周波数 : 100Hz 0サンプル目 | |
m | 1 | データ長 | 06 | 6バイト | |
n | 2 | データ | 001000100450 | X : 16mg Y : 16mg Z : 1104mg | |
o | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
p | 1 | データソース | 04 | 加速度 | |
q | 1 | 拡張バイト | 41 | サンプリング周波数 : 100Hz 1サンプル目 | |
r | 1 | データ長 | 06 | 2バイト | |
s | 2 | データ | 000800100430 | X : 8mg Y : 16mg Z : 1072mg | |
... | |||||
t | 1 | 各種情報ビット値 | 15 | 拡張バイトあり 符号ありShort | |
u | 1 | データソース | 04 | 加速度 | |
v | 1 | 拡張バイト | 4F | サンプリング周波数 : 100Hz 15サンプル目 | |
w | 1 | データ長 | 06 | 6バイト | |
x | 4 | データ | 000000180438 | X : 0mg Y : 24mg Z : 1080mg | |
y | 1 | チェックサム1 | 28 | ||
z | 1 | チェックサム2 | A5 |
通知パル
: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
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 4 | 中継機のシリアルID | 80000000 | 中継無し | |
2 | 1 | LQI | CQ | 186 | |
3 | 2 | 続き番号 | BBC0 | 48064 | |
4 | 4 | 送信元のシリアルID | 82014C35 | 送信元のシリアルIDは82014C35 | |
5 | 1 | 送信元の論理デバイスID | 01 | 送信元の論理デバイスIDは01 | |
6 | 1 | センサー種別 | 80 | ||
7 | 1 | PAL基板バージョンとPAL基板ID | 84 | 通知パル Ver.1 | |
8 | 1 | センサーデータの数 | 03 | 3 | |
9 | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
a | 1 | データソース | 30 | ADC | |
b | 1 | 拡張バイト | 08 | 電源電圧 | |
c | 1 | データ長 | 02 | 2バイト | |
d | 2 | データ | 0D0C | 3340mV | |
e | 1 | 各種情報ビット値 | 11 | 拡張バイトあり 符号なしShort型 | |
f | 1 | データソース | 30 | ADC | |
g | 1 | 拡張バイト | 01 | ADC1 | |
h | 1 | データ長 | 02 | 2バイト | |
i | 2 | データ | 03F9 | 1017mV | |
j | 1 | 各種情報ビット値 | 12 | 拡張バイトあり符号なしLong | |
k | 1 | データソース | 05 | イベント | |
l | 1 | 拡張バイト | 04 | 加速度によるイベント | |
m | 1 | データ長 | 04 | 4バイト | |
n | 1 | データ1 | 10 | イベント0x10(16)が発生 | 加速度の場合 0x01(1)~0x06(6):さいころ 0x08(8):シェイク 0x10(16):タップ |
o | 3 | データ2 | 000000 | 0 | 将来の拡張用。現在は未使用 |
p | 1 | チェックサム1 | 28 | ||
q | 1 | チェックサム2 | A5 |
1.1.1.2.1.1.6 - アクト
データフォーマット
:FEAA008201015A00000000B7000F424154310F0CEE000B03FF03FF03FF92
^1^2^3^^^^^^^4^^^^^^^5^6^^^7^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8^9
番号 | バイト数 | 意味 | データ例 | 内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信元の論理デバイスID | FE | 送信元の論理デバイスIDは0xFE | |
2 | 1 | コマンド種別 | AA | アクトのパケット | 0xAA固定 |
3 | 1 | 応答ID | 00 | 任意の0x00~0x7Fの値 | |
4 | 4 | 送信元のシリアルID | 8201015A | 送信元のシリアルIDは201015A | |
5 | 4 | 送信先のシリアルID | 00000000 | 00000000のときは論理デバイスIDを指定して送信している。 | |
6 | 1 | LQI | B7 | 183 | 0が最小で255が最大 |
7 | 2 | データのバイト数 | 000F | 15バイト | |
8 | N | データ | 424154310F0CEE000B03FF03FF03FF | | |
9 | 1 | チェックサム | 92 | |
1.1.1.2.1.2 - 送信コマンド
コマンドを入力することで子機に対して電波を送信することができます。
送信できるコマンドは以下のページをご覧ください。
1.1.1.2.1.2.1 - 0x90コマンド
:0190010004000169[CR][LF]
^1^2^3^^^^^^^4^5
番号 | バイト数 | 意味 | データ例 | 備考 |
---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先のTWELITE PALの論理デバイスIDを指定します。 |
2 | 1 | コマンド種別 | 90 | |
3 | 1 | コマンドパラメータ数 | 01 | コマンドパラメータの数を指定します。例えば、コマンドパラメータを1つだけ指定するなら1に、2つ指定するには2にします。 |
4 | コマンド数x4 | コマンドパラメータ | 00040001 | イベントやLEDの色などを指定するためのパラメータを指定します。 |
5 | 1 | チェックサム | 69 | 1~4の各バイトの和を8ビット幅で計算し2の補数をとります。つまりデータ部の各バイトの総和+チェックサムバイトを8ビット幅で計算すると0になります。 |
6 | 2 | フッター | [CR][LF] | [CR] (0x0D) [LF] (0x0A) を指定します。ただし、チェックサムをXで省略する場合はフッターも省略可能です。 |
コマンドパラメータ
4バイトのコマンドパラメータを組み合わせてコマンドを指定します。
0x00:イベントIDを送信する
TWELITE PALは受信したイベントIDごとの振る舞いが設定されております。 本パラメータでは送信先のTWELITE PALにイベントIDを送信し、設定した動作を行います。
番号 | バイト数 | 内容 | 備考 |
---|---|---|---|
1 | 1 | コマンドパラメータID | 0x00 |
2 | 1 | 送信先PAL ID | 送信先のPAL IDを指定します。 |
3 | 1 | 未使用領域 | 0x00固定 |
4 | 1 | イベントID | 0~16までのイベントIDを指定します。 |
0x01 : LEDの色、点滅パターン、明るさを送信する
送信先の通知パルにLEDの色、点滅パターン、明るさを送信します。
番号 | バイト数 | 内容 | 備考 |
---|---|---|---|
1 | 1 | コマンドパラメータID | 0x01 |
2 | 1 | 色 | 0:赤 |
3 | 1 | 点滅パターン | 0:常時点灯 |
4 | 1 | 明るさ | 0:消灯 |
0x02 : 点灯時間を送信する
通知パルのLEDの点灯時間を送信します。
番号 | バイト数 | 内容 | 備考 |
---|---|---|---|
1 | 1 | コマンドパラメータID | 0x02 |
2 | 1 | 未使用領域 | 0xFF固定 |
3 | 1 | 未使用領域 | 0x00固定 |
4 | 1 | 点灯時間 | 秒で指定(0は常時点灯) |
0x03:LEDの色をRGBWで指定する
通知パルのLEDの点灯色をRGBWで送信します。
番号 | バイト数 | 内容 | 備考 |
---|---|---|---|
1 | 1 | コマンドパラメータID | 0x03 |
2 | 1 | 未使用領域 | 0xFF固定 |
3 | 2 | LEDの点灯色 | LSBからRGBWの順番で4ビットずつ指定する。 数値が大きいほど明るい |
0x04:点滅パラメータを指定する。
通知パルのLEDの点滅周期と点滅Dutyを送信します。
番号 | バイト数 | 内容 | 備考 |
---|---|---|---|
1 | 1 | コマンドパラメータID | 0x04 |
2 | 1 | 未使用領域 | 0xFF固定 |
3 | 1 | 点滅時間の割合 | 0x00~0xFFで指定する。 数値が大きいほど1周期当たりの点灯時間が長くなる。 1周期の半分だけ点灯させるには0x7Fを指定する。 |
4 | 1 | 点滅周期 | 0x00~0xFFで指定する。 設定値が1大きくなるごとに点滅の周期が約0.04sずつ増える。 1周期1秒にするには0x17を指定する。 |
コマンド例
例1:イベントを送信する
論理デバイスIDが1のNOTICE PALに対してイベント1を送信するコマンド例です。
:0190010004000169
^1^2^3^4^5^6^7^8
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先の論理デバイスIDは0x01 | |
2 | 1 | コマンド種別 | 90 | 0x90コマンド | 90固定 |
3 | 1 | コマンド数 | 01 | コマンドは1個 | |
4 | 1 | コマンドID | 00 | コマンド00 | |
5 | 1 | 送信先PAL ID | 04 | 通知パルに対して送信する | |
6 | 1 | 未使用領域 | 00 | ||
7 | 1 | イベントID | 01 | イベント1 | 0x00~0x10まで |
8 | 1 | チェックサム | 69 |
例2:通知パルのLEDの点灯色を送信する
論理デバイスIDが1のNOTICE PALに対して明るさ8で白色にゆっくり点滅させるためのコマンドです。
:019001010601085E
^1^2^3^4^5^6^7^8
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先の論理デバイスIDは0x01 | |
2 | 1 | コマンド種別 | 90 | 0x90コマンド | 90固定 |
3 | 1 | コマンド数 | 01 | コマンドは1個 | |
4 | 1 | コマンドパラメータID | 01 | コマンドパラメータID 0x01 | |
5 | 1 | 色 | 06 | 白 | |
6 | 1 | 点滅パターン | 01 | 点滅 | |
7 | 1 | 明るさ | 08 | 明るさ8 | 0x00~0x0Fまで |
8 | 1 | チェックサム | 5E |
例3:通知パルのLEDの点灯色と点灯時間を送信する。
論理デバイスIDが1のNOTICE PALに対して紫に点灯させ、点灯後1秒で消灯させるコマンドです。
:0190020104000802FF00015E
^1^2^3^4^5^6^7^8^9^a^b^c
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先の論理デバイスIDは0x01 | |
2 | 1 | コマンド種別 | 90 | 0x90コマンド | 90固定 |
3 | 1 | コマンド数 | 02 | コマンドは2個 | |
4 | 1 | コマンドパラメータID | 01 | コマンドパラメータID 0x01 | |
5 | 1 | 色 | 04 | 紫 | |
6 | 1 | 点滅パターン | 00 | 点灯 | |
7 | 1 | 明るさ | 08 | 明るさ8 | 0x00~0x0Fまで |
8 | 1 | コマンドパラメータID | 02 | コマンドパラメータID 0x02 | |
9 | 1 | 未使用領域 | FF | ||
a | 1 | 未使用領域 | 00 | ||
b | 1 | 点灯時間 | 01 | 点灯後1秒で消える | |
c | 1 | チェックサム | 5E |
例4:通知パルに詳細な点灯色送信する。
論理デバイスIDが1のNOTICE PALに対して紫に点灯させるコマンドです。
:01900103FF0F0459
^1^2^3^4^5^^^6^7
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先の論理デバイスIDは0x01 | |
2 | 1 | コマンド種別 | 90 | 0x90コマンド | 90固定 |
3 | 1 | コマンド数 | 01 | コマンドは2個 | |
4 | 1 | コマンドパラメータID | 03 | コマンドパラメータID 0x03 | |
5 | 1 | 未使用 | FF | ||
6 | 2 | LEDの点灯色 | 0F04 | 青:15、赤4の明るさで点灯させる。 | LSBからRGBWの順番で各色4bitずつ(0~15)で指定する。 数値が大きいほど明るい |
7 | 1 | チェックサム | 59 |
例5:通知パルのLEDの点灯色と点灯時間を送信する。
論理デバイスIDが1のNOTICE PALに対して紫に点灯させ、点灯後1秒で消灯させるコマンドです。
:0190020104000802FF00015E
^1^2^3^4^5^6^7^8^9^a^b^c
番号 | バイト数 | 意味 | データ例 | データ例の内容 | 備考 |
---|---|---|---|---|---|
1 | 1 | 送信先の論理デバイスID | 01 | 送信先の論理デバイスIDは0x01 | |
2 | 1 | コマンド種別 | 90 | 0x90コマンド | 90固定 |
3 | 1 | コマンド数 | 02 | コマンドは2個 | |
4 | 1 | コマンドパラメータID | 01 | コマンドパラメータID 0x01 | |
5 | 1 | 色 | 04 | 紫 | |
6 | 1 | 点滅パターン | 00 | 点灯 | |
7 | 1 | 明るさ | 08 | 明るさ8 | 0x00~0x0Fまで |
8 | 1 | コマンドパラメータID | 02 | コマンドパラメータID 0x02 | |
9 | 1 | 未使用領域 | FF | ||
a | 1 | 未使用領域 | 00 | ||
b | 1 | 点灯時間 | 01 | 点灯後1秒で消える | |
c | 1 | チェックサム | 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台以上ある場合は親機にデータが届きません。
- 子機 —> 中継機 —> 中継機 —> 中継機 —> 親機
→ 親機が子機のデータを3回中継して受信できる。- 子機 —> 中継機 —> 中継機 —> 中継機 —> 中継機 -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 |
中継機1 | 810E18E8 | 810F155E (親機のSID)※ | 1 |
中継機2 | 810F17FF | 810E18E8 (中継機1のSID) | 2 |
※上図の壁による影響のみに対処したい場合は設定不要です。
1.1.1.3 - インタラクティブモード
インタラクティブモードでアプリの詳細設定を行うことができます。
インタラクティブモードに入るには、パソコン上のターミナルソフトから + + + と + を3回入力します。+ と + の間には 0.2 秒から 1.0 秒の間隔をあけてください。
また、TWELITE プログラマや TWELITE STAGE には簡単にインタラクティブモードに入れるショートカット機能もありますので、そちらもご利用ください。
インタラクティブモードに入ると以下の画面が表示されます。
うまくいかない場合は、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 | アプリケーションID | 0x67720102 | 同じアプリケーション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回、電波出力最強となります。 |
b | UARTオプション | 38400,8N1 | ボーレートとパリティの設定をカンマで区切って指定することができます。 ボーレートは9600、19200、38400、57600、115200、230400が設定可能です。他の値も設定可能ですが、オシロスコープ等を用いて誤差を検証した上で使用してください。 |
o | オプションビット | 0x00000000 | 各種詳細設定ができます。オプションビットの説明は以下をご参照ください。 |
k | 暗号化鍵 | 0xA5A5A5A5 | 32bitの16進数を設定します。 |
m | 動作モード | 0 | 0は親機モードになります。 1は中継モードになります。 |
A | 接続先 | 0x00000000 | 中継機モード時に静的ルーティングをするときの接続する上位段のTWELITEのSIDを指定します。近くに存在しないSIDや下位段のSIDを指定したときは不定となるので指定する場合は必ず存在する上位段のSIDを入力してください。0x00000000の時は自動で上位段を検索し、発見したTWELITEを通信を試みます。 |
S | 設定値の保存 | 設定を保存します。 | |
R | 初期値に設定を戻す | 続けてS キーによる設定の保存を行ってください。 | |
! | モジュールの再起動 | TWELITEを再起動します。 | |
M | ルートメニューへ移行 | 不具合などがあったときに使用するコマンドです。 技術サポートの指示がない限り、使用しないでください。 |
オプションビットの設定
オプションビット設定値を各ビットごとに解説します。
設定値(16進) | 機能 | 説明 |
---|---|---|
0x00000200 | UARTオプションの適用 | シリアルのボーレートやパリティの設定を反映させます。 |
0x00000400 | 定期送信パケットのUART出力の停止 | 超簡単!標準アプリとリモコンアプリの1秒毎の定期送信と連続モード時のUART出力を停止します。 |
0x00001000 | 暗号化通信の設定 | 暗号化通信を有効にします。(相手側の暗号化設定もしてください。) |
0x00002000 | 暗号化通信時の平文受信 | 暗号化通信が有効な時に暗号化していないパケットも受信します。 |
TWELITE APPS のアプリケーションIDと周波数チャンネルの初期設定値
本アプリが初期設定の時は超簡単!標準アプリと通信できるようになっておりますが、アプリケーション ID と周波数チャンネルを通信相手の TWELITE に合わせることでほかの TWELITE APPS とも通信することができます。下表は TWELITE APPS のアプリケーション ID と周波数チャンネルの初期設定値なので、これを参考に本アプリを設定してください。
TWELITE APPS | アプリケーション ID の初期設定値 | 周波数チャンネルの初期設定値 |
---|---|---|
超簡単!標準アプリ (App_Twelite) | 0x67720102 | 18 |
リモコンアプリ (App_IO) | 0x67720107 | 16 |
シリアル通信アプリ (App_Uart) | 0x67720103 | 18 |
無線タグアプリ (App_Tag) | 0x67726305 | 15 |
パルアプリ (App_PAL) | 0x67726305 | 15 |
キューアプリ (App_CUE) | 0x67720102 | 18 |
異なる複数の TWELITE APPS のデータを同時に受信する場合
本アプリは異なる TWELITE APPS の電波が混在していても、アプリケーション ID と周波数チャンネルをそろえていただければ受信することできます。例えば、超簡単!標準アプリの子機とパルアプリの子機がそれぞれある場合に、アプリケーションIDと周波数チャンネルをすべての TWELITE でそろえれば、本アプリがインストールされた TWELITE で子機の電波を受信・中継が可能になります。
その際は、下表の例のように設定を行います。
TWELITE の役割 | アプリケーション ID の設定例 | 周波数チャンネルの設定例 |
---|---|---|
親機 (App_Wings) | 0x12345678 | 22 |
中継機 (App_Wings) | 0x12345678 | 22 |
子機1 (App_Twelite) | 0x12345678 | 22 |
子機2 (App_PAL) | 0x12345678 | 22 |
1.2 - シリアル通信アプリ マニュアル
1.2.1 - シリアル通信アプリ マニュアル
資料の取り扱いについて をご参照ください。 お気付きの点がありましたら、当サポート窓口にご連絡いただければ幸いです。
本資料の表示例(ボタン名や画面キャプチャ)は、資料作成時のバージョンのものとなっています。一部、入手されたバージョンと差異がある場合があります。
シリアル通信アプリ(App_Uart)は、UART(シリアル)通信に特化したアプリケーションです。UARTはマイコンで一般的に利用されるシリアル通信方式です。
TWELITE UARTには本アプリがあらかじめインストールされており、配線すればすぐにマイコン等で無線通信をすることができます。
ダウンロード
TWELITE STAGE - トワイライトステージ をインストールして、TWELITE STAGEのメニューから[アプリ書換] → [TWELITE APPSビルド&書換] → [App_Uart]を選択してアプリを書換えてください。
1.2.1.1 - ピン割り当て
本解説で使用するピン名は、超簡単!標準アプリの名前定義 (M1-M3, BPS, TX, RX, I1-I4) を用います。以下に各TWELITEの配列を記載します。
ピン配列表(v1.2以降)
TWELITE/TWELITE DIP
※ DIO番号は半導体データシートに基づく信号名で、ピン番号ではありません。TWELITE DIP の場合はピンに記載されるシルクの数字記載が DIO 番号です。
ピン名 | 機能 | TWELITE DIO番号 |
---|---|---|
M1 | 親機子機の設定。ソフト上からも設定可能。 | 10 |
M2 | 子機設定で Lo で中継と設定する(Role=1 または Role=0x12 と等価)。 | 2 |
M3 | ピンが Lo の間スリープする | 3 |
EX1 | Lo で起動すると UART mode を書式モード(バイナリ形式)に強制する | 0 |
EX2 | 未使用 | 1 |
BPS | ピンが Lo で起動すると、設定したボーレート、パリティ設定で UART を初期化する | 17 |
TX | UARTの出力 (TX) | 6 |
RX | UARTの入力 (RX) | 7 |
RTS | UART の 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 |
PRG | GNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移 | SPIMISO |
RXD | シリアル入力通信線(相手側はシリアル出力端子に接続) | 7 |
RST | GNDに接続するとリセット | RESETN |
VCC | 電源のプラス側(2.0V - 3.6V) | VCC |
SET | Lo で起動すると UART mode を書式モード(アスキー形式)に強制する | 11 |
1.2.1.2 - 使用方法
1.2.1.2.1 - 動作確認

必要なもの
MONOSTICKとTWELITE UARTを使用する場合
- TWELITE UART
- TWELITE R2
- USBケーブル (充電専用不可)
- MONOSTICK
TWELITE UARTを2つ使用する場合
- TWELITE UART x 2
- TWELITE R2 x 2
- USBケーブル (充電専用不可) x 2
TWELITE STAGE SDKの準備
まず最初にTWELITE STAGE SDK の最新版をパソコンにインストールします。
MONOSTICKの準備
TWELITE UARTを2つ使用して動作確認をする場合は、ここを読み飛ばしてください。
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 - モノスティック
を使用することができます。
以下の手順でシリアル通信アプリを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の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を選択してください。

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

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

ターミナルを開くと上図のように出力されます。
通信を確認する
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論理アドレス
|
%A | メッセージの送り主のアドレス(32bitロングアドレス、シリアル番号) |
%q | 電波強度 (自身からの場合は000 ) |
%s | 送信元が設定したメッセージの続き番号 |
< | チェックサム計算開始位置を設定する(設定しない場合は出力の先頭) |
* | 送信文字列 |
> | (無視されます) |
%X | 開始位置から直前までのチェックサムの出力 |
\n | CRLF (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 | 送信データ |
8 | HELLO; のチェックサム (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 - マイコンとの接続
シリアル通信を行う
PCからArudinoに入力したシリアルデータをTWELITE UARTを介して、もう一台のArduinoに無線で送信し、そのデータを解釈するサンプルです。
用意する電子部品
以下のものを2セット用意してください。
- TWELITE UART
- Arduino UNO
- 抵抗 2.2kΩ(赤・赤・赤)
- 抵抗 3.3kΩ(橙・橙・赤)
配線

Arudino UNOは5V系のマイコンで、UART出力のHiレベルが5Vです。TWELITEに5Vを入力するとTWELITEが破損するため、分圧してHiレベルが3Vになるようにしております。
m5StackやRaspberry PiなどのようにHiレベルが3Vのマイコンなどに接続する場合はTWELITEに直接接続してください。
設定
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から以下のようなメッセージがシリアル出力されます。
送信するメッセージには必ず最後に改行コード(CR+LF)をつけてください。
改行コードをつけないとデータが送信されません。
[送信側]
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 - 通信モード
アプリ選択
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)
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-;
# | 解説 |
---|---|
1 | U 固定 |
2 | メッセージを出力したときのシステム時間(秒) |
3 | メッセージの送り主の8bit論理アドレス
|
4 | メッセージの送り主のアドレス(32bitロングアドレス、シリアル番号) |
5 | 電波強度 (自身からの場合は000 ) |
6 | 送信元が設定したメッセージの続き番号 |
7 | メッセージ内容 |
8 | 6 の先頭の文字から直前の文字までの XOR チェックサム (例では HELLO; までを計算対象) |
上記書式はカスタマイズできます。
1.2.1.3.1.1 - 出力のカスタマイズ
ヘッダ付き透過モード (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以降。それ以前のバージョンは無視されます) |
\
(バックスラッシュ, ¥)に続く文字
\n | CRLF (0x0d 0x0a) の出力 |
\t | TAB の出力 |
\* | * の出力 |
\% | % の出力 |
\< | < の出力 |
\> | > の出力 |
\& | & の出力 |
%
に続く文字
%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)

特徴
書式モードは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。 |
バイト | 1 | コマンド種別(0x80未満任意) |
バイト列 | N | 送受信したいバイト列。 |
出力
TWELITE-トワイライトから出力される形式は、入力時と同形式です。
データ形式 | バイト数 | 解説 |
---|---|---|
バイト | 1 | 送信元の論理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。 |
バイト | 1 | 0xA0 |
バイト | 1 | 応答ID。 |
ビッグエンディアン4バイト | 4 | 先頭バイトが拡張アドレス(0x80)指定の場合、アドレス指定を行います。拡張アドレス指定でない場合は、本領域は0バイトとなります。 |
バイト列 | N | オプション列。 |
バイト列 | N | 送受信したいバイト列。 |
出力
TWELITE-トワイライトから出力される形式は、宛先の論理IDの次に0xA0バイトが続きます。
データ形式 | バイト数 | 解説 |
---|---|---|
バイト | 1 | 送信元の論理ID。 |
バイト | 1 | 0xA0 |
バイト | 1 | 送信元で指定した応答ID。 |
ビッグエンディアン4バイト | 4 | 送信元拡張アドレス。 |
ビッグエンディアン4バイト | 4 | 送信先拡張アドレス。 |
バイト | 1 | 通信品質 LQI 値。 |
ビッグエンディアン2バイト | 2 | 続くデータ領域のバイト数。 |
バイト列 | N | 送受信したいバイト列。 |
オプション
各種送信時のオプションが指定できます。アプリケーション再送や遅延のためのオプションは、1パケットで送信できるデータ量(送受信したいデータが78バイト以内)で使用してください。
※ 本オプションはネットワーク層を利用した送信では使用しないでください。
オプションバイト | パラメータバイト数 | 規定値v1.2.13以降 | 解説 |
---|---|---|---|
0x1 | 0 | 無効 | MAC ACK を設定します。 |
0x2 | 1 | 0x00 | アプリケーション再送を行います。 |
0x3 | 2 | 0x0000 | 初回の送信までの遅延を設定し、その最小値を与えます。 |
0x4 | 2 | 0x0000 | 初回の送信までの遅延を設定し、その最大値を与えます。 |
0x5 | 2 | パケット数 x 10 [ms] | アプリケーション再送の再送間隔を指定します。 |
0x6 | 0 | 無効 | 併行要求処理を行う。 |
0x07 | 0 | 無効 | 送信後、応答メッセージを表示しません。 |
0x08 | 0 | 無効 | 送信後、速やかにスリープします。 |
※ 遅延や再送回数などによりコマンド入力から1秒を経過すると、コマンド処理がタイムアウトし、処理待ちのコマンドが処理されます。
※ 遅延処理やアプリケーション再送が行われている間は、内部のパケットバッファー(10ヶ)が処理待ちで埋まっていて新しい処理要求が実行されない場合が有ります。また同時に平行処理できるパケットは5ヶとなります。
※ パケットの重複確認は、内部で割り振っている連番で新しいものを優先し旧いものは採用しません。新しい要求受け付けのパケットが先に届き、旧い要求受け付けのパケットが後に届くような場合、古いパケットは受信されません。(特に 0x06 オプションを付加した時に、このような現象が発生しやすくなります)
※ パケット分割されるデータサイズの場合に遅延処理やアプリケーション再送処理を行うと、後半のパケットが前半のパケットの処理完了後に処理されるため、大きな時間差が発生し受信側でタイムアウトを起こし受信が失敗します。原則として遅延が発生するオプションはパケット分割しない範囲で使用してください。
応答メッセージ
応答メッセージはコマンドの入力に対し、処理結果を通知します。
データ形式 | バイト数 | 解説 |
---|---|---|
バイト | 1 | 0xDB |
バイト | 1 | 0xA1 |
バイト | 1 | 応答ID。 |
バイト | 1 | 0:失敗 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) コロンを指定します。 | |
データ部 | N | 2N | 元データの各バイトをアスキー文字列2文字(A-F は大文字)で表現します。 |
チェックサム | 2 | データ部の各バイトの和を8ビット幅で計算し2の補数をとります。つまりデータ部の各バイトの総和+チェックサムバイトを8ビット幅で計算すると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
形式の定義
元データのバイト数 | 表現形式におけるバイト数 | 解説 | |
---|---|---|---|
ヘッダ | 2 | 0xA5 0x5A を指定します。 | |
データ長 | 2 | データ長はビッグエンディアン形式の2バイトで、MSB (0x8000) を設定した上、データ部の長さを指定します。 | |
データ部 | N | N | 元データを指定します。 |
チェックサム | 1 | データ部の各バイトの XOR を計算します。 | |
フッタ | (1) | チェックサムが事実上の終端です。無線モジュールからの出力では 0x04 (EOT) が付加されます。 |
使ってみる
バイナリ形式の確認は一般に難易度が高く、上手くコマンドが入力できない場合の分析が非常に困難です。マイコンなどでデバッグされるのに先立って、PCなど確認しやすい環境で予め実行しておくことを強くお勧めします。
1.2.1.3.2.2.1 - バイナリ形式で使ってみる
バイナリ形式では、App_Uart で直接送信したいデータをバイナリ列で入出力できるため、マイコン間通信では取り扱いがしやすくなります。反面、ヘッダやチェックサムなどの計算が必要になります。
簡易的に送信する場合は「チャットモード、プロンプト無し」も利用できます。
接続の確認
最初に基本設定とアスキー形式による動作確認を行います。接続や設定等の問題がある場合、バイナリ形式では出力等を含め確認が難しいためです。
設定
PC(TeraTerm) や macOS, Linux のターミナルソフト(CoolTerm など) を動作可能状態にして、インタラクティブモードによる設定が出来る事を確認しておいてください。
インタラクティブモードに入るには、+ + + と + を3回、一呼吸置きながら (0.2秒~1秒) 入力します。(参考:インタラクティブモードの詳細 )
インタラクティブモードで以下の設定を済ませておきます。
- 親機側は Device ID を 121 (0x79) に設定します。(i を押して 121[Enter] と入力します)
- UART Mode を A に設定します。(m を押して A[Enter] と入力します)
- 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 の操作例です。
- [Port] タブを選択し、Baud を 115200・Port を COM ポートの番号を指定して [Open] ボタンを押します。
- [Display] タブを選択し、[Display As] 中から Hex[space] を選択しておきます。
送受信を確認する
子機からアスキー形式での送信例と同じものを送信してみます。
子機から親機(アスキー形式)
:0000112233X
↓
親機の受信メッセージ(バイナリ形式)
A5 5A 80 05 78 00 11 22 33 78 04
親機からは 0xA5 0x5A … に続くデータが表示されます。送信したいデータに簡易書式のヘッダが付加され、さらにバイナリ書式のためのヘッダ・フッタが追加される点に注意してください。
データ形式 | バイト数 | 解説 |
---|---|---|
ヘッダ | 2 | 0xA5 0x5A |
データ長 | 2 | 0x8000 + 続くデータ長 |
データ部 | 5 | データ部で、あて先情報等のヘッダおよび送信したいデータが含まれる。 |
フッタ・チェックサム | 1 | データ部の前バイトのXORとなります。 |
フッタ・終端 | 1 | 0x04 |
親機子機、バイナリ形式で親子間送信
親機、子機双方をバイナリ形式に設定して送受信を試みます。
子機の設定
子機側でもインタラクティブモードに入って UART Mode を B に設定します。
- UART Mode を B に設定します。(m を押して A[Enter] と入力します)
バイナリ対応のターミナルソフト (RealTermの場合)
子機のターミナルソフトウェアを閉じて、バイナリ対応のものを立ち上げてください。
以下では RealTerm の操作例を示します。
- RealTerm を立ち上げます。
- [Port] タブを選択し、Baud を 115200・Port を COM ポートの番号を指定して [Open] ボタンを押します。
- [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 の場合は、以下となります。
- [Send]タブを開きます。
- [Send Numbers] の2つある入力ボックスのいずれかに 0xA5 0x5A 0x80 0x05 0x78 0x00 0x11 0x22 0x33 0x78 を入力します。
- [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 | 対象 | OCTET | 1 | 0xDB |
2 | コマンド種別 | OCTET | 1 | 下表に解説 |
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 バイトを送ります。
(インタラクティブモード中での入力はしないでください)
コマンド種別
コマンド | 機能 | 説明 | パラメータ | 応答 | 対応バージョン |
---|---|---|---|---|---|
F0 | ACK | ACK 応答の要求を行う。 | なし | OCTET 0xDB | v1.2以降 |
F1 | モジュールアドレス | モジュールアドレス情報などを表示する。モジュール起動時にも出力される。 | なし | OCTET 0xDB | v1.2以降 |
F2 | 設定 | モジュールに設定します。設定後、設定内容は「セーブ&リセット」しない限り反映されません。応答はコマンド種別F3の設定値となります。 | 別表参照 | 成功すればコマンド種別F3 で、設定した内容が報告される。失敗すればコマンド種別 F3、パラメータ FF が報告される。 | v1.2以降 |
F3 | 設定取得 | モジュールに設定内容を要求します。 | v1.2以降 | ||
F8 | モジュール制御 | ■ 0x10 | ■ 0x10 | ■ 0x10 | v1.2以降 |
FD | クリア&リセット | 不揮発領域をクリアして無線モジュールをリセットします。 | なし | 応答はありません。 | v1.2以降 |
FE | セーブ&リセット | データをセーブして無線モジュールをリセットします。 | v1.2以降 | ||
FF | リセット | 無線モジュールをリセットします。設定内容は破棄されます。 | v1.2以降 |
パラメータ (F2, F3)
設定(F2)、設定取得(F3) 時のパラメータは、設定種別と設定内容を列挙します。設定内容は種別によって書式が変化します。
番号 | 名前 | データ形式 | バイト数 | 解説 |
---|---|---|---|---|
1 | 設定種別 | OCTET | 1 | 設定の種別を示す。 |
2 | 設定内容 | 種別による | 種別による | 設定データを示す。 |
設定種別ごとのパラメータを解説します。
※ 0xFF(OCTET) 0xFFFF(BE_WORD) 0xFFFFFFFF(BE_DWORD) の場合は、無効値として無視されます。
設定種別 | 名前 | 設定データ形式 | バイト数 | 解説 | 対応バージョン |
---|---|---|---|---|---|
0x00 | アプリケーションID | BE_DWORD | 4 | アプリケーションIDを設定する。※ | v1.2以降 |
0x01 | チャネルマスク | BE_DWORD | 4 | 利用するチャネルを指定する(ch11 なら 1UL « 11 = 0x800) | v1.2以降 |
0x02 | 出力設定 | BE_WORD | 2 | 再送回数と電波の出力を設定する。 | v1.2以降 |
0x03 | ID | OCTET | 1 | 0x00: 親機 0x01~0x64: 子機ID指定 0x78:子機ID未指定 | v1.2以降 |
0x04 | 役割 | OCTET | 1 | 子機のみ有効で、以下のいずれかを指定します。通常はネットワーク層を利用しない配送方式を選択してください。 | v1.2以降 |
0x05 | 中継レイヤ | OCTET | 1 | 中継レイヤ番号です。中継機は中継レイヤ数の上位(より小さい値)の中継機・親機に接続を試みます。本設定は役割がネットワーク層を利用する配送方式で中継機に設定しているときにだけ設定してください。※ | v1.2以降 |
0x06 | UARTモード | OCTET | 1 | 0:透過モード 1:書式・アスキー 2:書式・バイナリ 3:チャット 4:プロンプト無しチャット | v1.2以降 |
0x07 | UARTボーレート | BE_DWORD | 4 | ボーレートを指定します。※ | v1.2以降 |
0x08 | UARTパリティ | OCTET | 1 | 以下の設定の組み合わせで、各設定値の総和を指定する。 | v1.2以降 |
0x09 | 暗号化設定 | OCTET | 1 | 0: 暗号化なし 1: AES128bit暗号化 | v1.2以降 |
0x0A | 暗号化キー | OCTET[16] | 16 | 16バイトの暗号化キーを指定します。インタラクティブモードでは設定できないバイナリ列を格納できます。この場合、インタラクティブモードの表示が崩れる場合があります。 | v1.2以降 |
0x0C | 区切り文字の指定 | BE_WORD | 2 | 区切り文字列の指定を行います。(0x00-0xFF) | v1.2以降 |
OCTET | 1 | 最小パケットサイズを指定します。(1-80) | |||
OCTET | 1 | 未入力タイムアウトを指定します。(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)

チャットモードでは、プロンプトの表示とエコーバック(自身が入力した文字が端末にも表示される)が行われます。全ての無線端末は子機の設定とします。電波到達範囲の全ての端末にメッセージが伝達され複数の端末でチャットできます。
親子関係は無く複数の端末間で通信できますが、宛先の指定はできずデータはブロードキャストで全ての端末に伝達されます。アスキーデータのみでバイナリデータは送れません。(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を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。
※ 設定は子機のみに有効です。
※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。
設定例

図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。
青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。
1.2.1.3.3.1 - どこでもチャット

MONOSTICK-モノスティックをパソコンやスマートフォン、タブレット端末のUSBポートに接続することで複数の端末同士でテキストチャットをすることができます。
イーサーネットやWiFi等のネットワーク環境が無い場所でもどこでも無料でテキストチャットが行えます。
アプリの書換え
MONOSTICK-モノスティックに書込まれているアプリを「シリアル通信アプリ」に書き換える必要があります。アプリの書換えは「TWELITE STAGE 」で簡単に行えます。
TWELITE STAGE をインストールして、メニューから[アプリ書換]>[TWELITE APPSビルド&書換]>[App_Uart]を選択すると書換えができます。
使用方法
パソコンを2台以上用意してください。(複数人でチャットできます。)
それぞれのパソコンのUSBポートにMONOSTICK-モノスティックを接続してください。
TWELITE STAGEを使う場合
- TWELITE STAGEのメニューから[ビューア]>[ターミナル]を選択してください。
- キーボードから文字を入力するとMONOSTICK-モノスティックが接続された全てのパソコンのターミナル上に表示されます。
ターミナルソフトウエアを使う場合
- 接続しているシリアルポート名(Windows では COMポート)を調べて設定してください。(Windows の場合はデバイスマネージャを用いるのが簡単です。)
- それぞれのパソコン上でターミナルソフトウエア( TeraTerm 等)を起動してください。
- ターミナルソフトウエアの通信設定を「115200bps/8bit/パリティ無し/ストップビット1/フロー制御なし」にしてください。
- ローカルエコーは OFF に設定してください。
- キーボードから文字を入力すると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
- hを入力すると”Input handle name:”と表示されますので、好みのハンドルネーム(名前)を入力してください。
- Sを入力して変更内容をセーブしてください。
複数のグループで使用する場合
初期状態ではアプリケーションIDは(0x67720103)で周波数チャネルは18chです。アプリケーションIDと周波数チャネルの両方の値が同じ場合に通信が可能になるので、通信範囲にあるパソコン全てにメッセージが伝わります。相手を特定せずにチャットを楽しむことが出来ます。
特定のグループ内でのみチャットを行いたい場合は、アプリケーションIDと周波数チャネルの値をグループ毎に変えることで複数のグループで混信せずにメッセージのやり取りができます。
周波数チャネルを変更する
- インタラクティブモードに入ってください。
- c(小文字)を入力すると"Input Channel(s):”と表示されますので、11~26を入力してください。
- Sを入力して変更内容をセーブしてください。
アプリケーションIDを変更する
- インタラクティブモードに入ってください。
- aを入力すると"Input Application ID (HEX:32bit):”と表示されますので、16進数の00010001~7FFFFFFEを入力してください。
- Sを入力して変更内容をセーブしてください。
暗号化の設定
アプリケーションIDと周波数チャネルの両方の値が同じ場合に通信が可能になるので、両方の値が同じユーザーのみメッセージを見ることができます。更にアプリケーションIDと周波数チャネルが同じでも暗号化を設定することで許可されたユーザー以外がメッセージを見ることができなくなります。
- インタラクティブモードに入ってください。
- C(大文字)を入力すると"Input crypt mode (0,1):”と表示されますので、1を入力してください。これで暗号化がオンになります。(0を入力すると暗号化がオフになります。)
- K(大文字)を入力すると"Input crypt key:”と表示されますので、任意の16バイトの文字列(暗号キー)を入力してください。共通の文字列(暗号キー)を使用している相手だけと通信が可能になります。
- Sを入力して変更内容をセーブしてください。
1.2.1.3.4 - 透過モード(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を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。
※ 設定は子機のみに有効です。
※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。
設定例

図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。
青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。
1.2.1.4 - その他の機能
カスタムデフォルト
ファームウェアバイナリに設定情報を付記した設定済みファームウェアバイナリが利用できます。例えば、ボーレートを最初から設定したファームウェアを作成しておけば、毎回インタラクティブモードなどで設定する必要がなくなります。
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_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)固有の機能を説明します。共通機能については、インタラクティブモード(共通機能) を参照してください。
インタラクティブモードに入ると以下の画面が表示されます。
--- 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 | アプリケーションID | 0x67720103 | 同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。 |
i | 論理デバイスID | 120 | 子機の論理デバイスIDを設定します。1~100および以下に挙げる特別な値を設定できます。 0: 親機 (=121) 1-100: 子機 120: 子機(ID設定無し) 121: 親機 これ以外の値も設定した場合の動作は未定義です。 |
c | 周波数チャネル | 18 | チャネル (11~26) を選択します。複数チャネルを指定した場合は チャネルアジリティにより電波干渉の回避に役立ちます。最大3チャネルまで指定可能です。例えばチャネル 13 とチャネル 22 を使用する場合は 13,22 と入力します。 |
x | 送信出力 | 3 | 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段階弱める) |
r | 役割 | 0 | 子機のみ有効で、以下のいずれかを指定します。通常はネットワーク層を利用しない配送方式を選択してください。 ■ ネットワーク層を利用しない配送方式: 0 -> 通常の指定(親機または子機) 1-3 -> 中継子機(id 指定で 1~100 または 120の子機指定と同時に指定します。)1~3 は最大中継段数です。この中継方式は受信したパケットを中継段数が指定回数になるまで再送を繰り返す方式ですので、中継機の配置や数によっては重複したパケットが中継されることになります。 ■ ネットワーク層を利用する配送方式: (書式モードのみ) 11 -> 親機 12 -> 中継機 13 -> 子機 ■ サイレント モード: サイレントモードでは起動時に受信回路を開きませんので、解除コマンドを実行するまでは無線パケットに応答する事はありません。 設定は上記指定に 80 を足します。 例えば 93 を指定すると「ネットワーク層利用かつサイレントモード」となります。 |
b | UARTボーレート | 38400 | BPSピンを Lo (GND) レベルにして電源投入した場合に有効になります。Hi
レベルでは常に 115200 8N1 条件で
UART を初期化します。 9600、19200、38400、57600、115200、230400が設定可能です。 他の値も設定可能ですが、オシロスコープ等を用いて誤差を検証した上で使用してください。 ※ オプションビットの設定により、BPS ピンの状態を無視したり、UART1 に出力する事も可能です。 |
B | UARTパリティ | N | N: 無し、O: Odd(奇数)、E:
Even(偶数)を設定します。ストップビットは1で固定。ハードウェアフローは設定不可です。 v1.2以降では、8N1, 7E2 といったビット数、パリティ、ストップビットの設定が可能ですが、動作検証は 8N1 のみとなります。動作検証以外の設定で利用される場合は、オシロスコープなどで波形を観察し要求を満足するか確認の上利用してください。 |
m | UARTモード | E | TWELITEの通信方式を決定します。 C: チャットモード |
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 | 暗号化 | 0 | 0 は平文通信、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以下の間隔で送信するなど、短い間隔で送信する場合はこのオプションを有効にしてください。 |
00010000 | BPSピンの設定と関係なくBAUD設定を反映します。 ※ 外部から入出力できないボーレートに設定した場合、インタラクティブモード等の操作が出来なくなり、簡易な手段での回復は出来なくなります。セーブデータ領域を初期化する必要があります。 |
00020000 | UART1(副ポート)にも出力します。 ※ 副ポートには原則として入力しないことを前提としていますが、インタラクティブモード・書式モード・チャットモード・透過モードの入力は受けつけるように実装されています。 ※ UART入出力用に確保しているバッファ(入力4KB,出力4KB)は、主ポート・副ポートで半々(入力2KB,出力2KB)として利用します。 |
00040000 | UART0とUART1 を入れ替えます。 UART1 を主ポートとします。 |
00100000 | (ネットワーク層)中継器は1階層上位に限定して接続します。 ネットワーク層利用時のみ有効です。中継器が上位階層を探索する場合、通常はより上位の中で最大の電波強度を持つ中継器・親機に接続しますが、この設定では1段階上位に限定して接続します。 ※ 中継テストを行う場合などに利用します。 |
中継機の設定
通信距離が足りない場合や障害物があって通信できない場合に中継機を使用することで通信距離を延長したり通信範囲を拡張することが期待できます。
中継機能を持った端末は受信したパケットをそのまま送信します。
設定方法
中継機能を使用する場合はインタラクティブモードで”r”を入力し、set Roleの値を1~3に設定してください。初期値は0です。
r: set Role (0x0)
1~3は最大中継回数です。0を設定すると中継しません。中継機は受信したパケットをそのまま送信します。中継回数が指定数になるまで中継を繰り返します。
※ 設定は子機のみに有効です。 ※ 中継機の配置や数によっては多数の複製パケットが乱造され通信が不安定になる場合がありますのでご注意ください。
設定例
図のようなネットワーク構成にする場合は赤色の端末のRoleを0に青色の端末のRoleを3に設定してください。

青色の端末は最大3ホップの中継機能を持ちます。よって、赤色の端末の間に最大3台の中継端末を入れることができます。

中継機能を持つ端末の通信範囲内に他の端末がある場合は同様に中継します。
設定の初期化
設定内容によっては、操作が困難になる場合があります。(ボーレートを設定したが、ターミナルソフトが対応しないボーレートだった等)その場合は以下の方法で初期化してください。
- 別のアプリを改めて書き込み、そのアプリ上で初期化操作を行う 。(インタラクティブモードで ‘R’ キーを押して、次に ‘S’ キーを押すと初期化します)
1.2.1.6 - 使用上の注意
マイコンとの接続
UARTポートのTX,RX信号を使用します。電圧範囲(2.0~3.6V範囲)が合致すれば直接接続ができます。動作電圧が5Vのマイコンは直接接続できません。接続する場合は電圧のレベル変換(レベルシフト)をしてください。
RS232Cとの接続
動作電圧が違うため直接接続することはできません。RS232C-UART信号変換回路を使用して接続してください。
1.3 - キューアプリ マニュアル
1.3.1 - キューアプリ マニュアル
資料の取り扱いについて をご参照ください。 お気付きの点がありましたら、当サポート窓口にご連絡いただければ幸いです。
本資料の表示例(ボタン名や画面キャプチャ)は、資料作成時のバージョンのものとなっています。
一部、入手されたバージョンと差異がある場合があります。
TWELITE CUEは無線マイコンTWELITE、3軸加速度センサー、磁気センサー、コイン電池ホルダ、アンテナをワンパッケージにしたものです。専用のCUEアプリ(ソフトウエア)があらかじめ書き込まれており、コイン型電池(CR2032)を入れるとすぐに動作を開始します。省電力で年単位の連続稼働も可能です。
無線タグを活用するアイデアを持っているがハードウエアやソフトウエアは苦手、または開発リソースが限られているという場合に最適です。
TWELITE CUEはよく飛び、電池長持ち、小型な無線タグです。
1.3.1.1 - 概要
機能
- 複数の無線タグからのデータを親機で収集可能
- 複数の無線タグを親機で制御可能
- 16チャネルで複数システムを個別に運用可能
- グループ毎に異なるアプリケーションIDを設定することで、同一チャネルに複数システムを混在可能
- 暗号化と暗号化鍵の設定
1.3.1.2 - 各部の説明

1. TWELITE
TWELITE-トワイライトはセンサーの値を読み取ったり無線でデータを送受信する無線マイコンです。
2. LED
相手側の端末からLEDを点灯・消灯させることが出来ます。
3. 7Pインターフェイス
アプリの設定や書き込み時に使用するための標準インターフェイスです。
以下は信号ピンの対応表です。
名称 | 信号名 | TWELITE DIP | TWELITE(SMD) | 説明 |
---|---|---|---|---|
GND | GND | 1, 14 | 20, 28, 30, 31, 32 | 電源のマイナス側 |
TXD | DIO6 | 10 | 8 | シリアル通信線(PC側はRX端子に接続) |
PRG | SPIMISO | 7 | 2 | GNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移 |
RXD | DIO7 | 3 | 9 | シリアル通信線(PC側はTX端子に接続) |
RST | RESETN | 21 | 21 | GNDに接続するとリセット |
VCC | VCC | 28 | 5 | 電源のプラス側 |
SET | - | - | - | 拡張制御信号 |
4. 加速度センサー
XYZの3方向の加速度を検出するセンサーです。
5. I2C拡張端子
I2Cセンサーを拡張するための端子です。
6. 磁気センサー
磁石の近接を感知するセンサーです。磁石の極性がSかNかの判別もできます。
7. 電池ホルダー
CR2032用の電池ホルダーです。
8. 基板アンテナ
基板アンテナ(MW-A-P1934 )です。基板上に回路パターンで構成されたアンテナです。
1.3.1.3 - 動作モード
本アプリには、以下の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 | センサ固有パラメータの設定 | x3000yyy | x : TWELITE 2525Aモードフラグ yyy : 加速度センサープロパティ |
TWELITE2525Aモードフラグ
TWELITE 2525Aモードフラグを1(センサ固有パラメータを13000000)に設定すると、TWELITE 2525A のFIFO(通常)モード として動作します。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 - 設定方法
お好みの設定方法をお選びください。
1.3.1.4.1 - OTAによる設定
OTA設定はインタラクティブモード の設定をケーブル接続不要で行う機能です。
OTAによる設定手順
以下の手順でOTAによる設定を行います。
TWELITE STAGE APPを起動する。
パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。MONOSTICKにOTA設定用のアプリを書き込む。
TWELITE STAGE APPのトップメニューから
2: アプリ書換>3: TWELITE APPS ビルド&書換> 2: App_CUE_OTA
を選択する。インタラクティブモードで設定値を入力する。
TWELITE STAGE APPのトップメニューから3: インタラクティブモードを選択して値を変更し保存する。OTA設定を実行する。
MONOSTICKから約20cm以内の距離で、TWELITE CUEの磁気センサーに磁石を近づけたり遠ざけたりを5回以上繰り返し、TWELITECUEのLEDが点滅することを確認する。MONOSTICKの出力を確認する。
MONOSTICKより以下のようなメッセージが出力することを確認する。
出力されない場合は、こちら を確認する。
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 CUEの7PインターフェイスにTWELITE R を接続することで設定することもできます。

TWELITE R2を使用して設定する場合は以下の手順で設定してください。
- TWELITE STAGE APPを起動する。
パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。 - インタラクティブモードで設定値を入力する。
TWELITE STAGE APPのトップメニューから 3:インタラクティブモード を選択して値を変更し保存する。
1.3.1.4.3 - インタラクティブモード
本アプリでは、インタラクティブモードからアプリの詳細設定を行うことができます。
ここではTWELITE 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 | アプリケーションID | 0x67720102 | 同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。 |
i | 論理デバイスID | – | 子機の論理デバイスIDを設定します。1~100までの値を設定できます。 設定値が “–” の場合は、論理デバイスIDは内部で1に設定されます。 |
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段階弱める) |
b | UARTボーレートの設定 | 38400 | 入力値にかかわらず115200bps固定です。 |
B | UARTパリティの設定 | 8N1 | 入力値にかかわらず8N1で固定です。 |
k | 暗号化鍵の設定 | 0xA5A5A5A5 | 暗号化鍵を入力します。32bitの16進数を設定します。通信グループ内は全て同一の値に設定してください。 |
o | オプションビットの設定 | 0x00000001 | 各種詳細設定ができます。 |
t | 送信間隔の設定 | 5 | 定期送信パケットの送信間隔を秒単位で設定します。1〜4095の値で指定可能です。範囲外の設定をした場合の動作は不定です。 |
p | センサ固有パラメータの設定 | 0 | モードの切り替えやパラメータの設定をします。0以上の16進数で指定できます。詳細は、各種モード のページを参照ください。 |
S | 設定値の保存 | 設定を保存し、モジュールを再起動します。 | |
R | 初期値に設定を戻す | 設定を初期化します。他の操作を行わず、続けてS キーによる設定の保存を行うとセーブ領域のクリアを行います。 |
オプションビットの設定
オプションビット設定値を各ビットごとに解説します。
ビット(16進) | 説明 |
---|---|
0x00000001 | 各中継機または親機宛に送信し、受信した中継機すべての情報が親機に転送され、シリアル出力されます。 この場合、複数の受信パケットを分析する事で一番近くで受信したルータを特定することができます。 |
0x00000040 | OTAを無効にする。 |
0x00001000 | 暗号化通信を有効にします。(相手側の暗号化設定もしてください。) |
0x00010000 | UART通信でのメッセージ出力を有効にします。 |
1.3.1.5 - 使用上の注意
対応するハードウェア
キューアプリは、工場出荷時のTWELITE CUEに始めから書き込まれております。
キューアプリはTWELITE CUEで動作しますが、類似製品のTWELITE 2525Aとは互換性がありません。
1.4 - アリアアプリ マニュアル
1.4.1 - アリアアプリ マニュアル
TWELITE ARIAは無線マイコンTWELITE、温湿度センサー、磁気センサー、コイン電池ホルダ、アンテナをワンパッケージにしたものです。専用のCUEアプリ(ソフトウエア)があらかじめ書き込まれており、コイン型電池(CR2032)を入れるとすぐに動作を開始します。省電力で年単位の連続稼働も可能です。
無線タグを活用するアイデアを持っているがハードウエアやソフトウエアは苦手、または開発リソースが限られているという場合に最適です。
TWELITE ARIAは同時に複数台使用することができ、下図のように親機1台で複数の温湿度、扉の開閉状態のデータを受信することが可能です。

複数台の子機を使用可能
最大接続台数に物理的な制限はありませんが、良好な通信を行うためには通信間隔をある程度広く設定していただく必要があります。
詳しい説明はこちら をご確認ください。
親機・中継機アプリ(App_Wings)
を書き込んだMONOSTICK
やTWELITE UART
などを親機としてご使用いただけます。
親機のシリアル出力の書式は以下のページをご確認ください。
また、通信距離が足りない場合、親機・中継機アプリを書き込んだTWELITEで中継することで、通信距離を延長することが可能です。

中継機を使用可能
中継機の使用方法は以下のページをご確認ください。
TWELITE ARIAのデータシートは以下のページをご参照ください。
製品ページ
1.4.1.1 - 各部の説明

TWELITE ARIA
1. TWELITE
TWELITE-トワイライトはセンサーの値を読み取ったり無線でデータを送受信する無線マイコンです。
2. LED
相手側の端末からLEDを点灯・消灯させることが出来ます。
3. 7Pインターフェイス
アプリの設定や書き込み時に使用するための標準インターフェイスです。
以下は信号ピンの対応表です。
名称 | 信号名 | 説明 |
---|---|---|
GND | GND | 電源のマイナス側 |
TXD | DIO6 | シリアル通信線(PC側はRX端子に接続) |
PRG | SPIMISO | GNDに接続してリセットし、開放またはVCCに接続するとプログラムモードに遷移 |
RXD | DIO7 | シリアル通信線(PC側はTX端子に接続) |
RST | RESETN | GNDに接続するとリセット |
VCC | VCC | 電源のプラス側 |
SET | - | 拡張制御信号 |
4. 温湿度センサー
温湿度XYZの3方向の加速度を検出するセンサーです。
5. I2C拡張端子
I2Cセンサーを拡張するための端子です。
6. 磁気センサー
磁石の近接を感知するセンサーです。磁石の極性がSかNかの判別もできます。
7. 電池ホルダー
CR2032用の電池ホルダーです。
8. 基板アンテナ
基板アンテナ(MW-A-P1934 )です。基板上に回路パターンで構成されたアンテナです。
1.4.1.2 - 使用方法
1.4.1.2.1 - 動作確認
必要なもの
- TWELITE CUE
- 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を起動する
- MONOSTICKをパソコンのUSBポートに接続します。
- インストールしたTWELITE STAGE SDKのMWSTAGEフォルダ内の以下のファイルをダブルクリックしてください。
・TWELITE_stage.exe(Windows)
・TWELITE_stage.command(macOS)
・TWELITE_stage.run(Linux)
起動するとUSBに接続されたMONOSTICKが画面上に表示されます。 - シリアルポート選択画面から1: MONOSTICKを選択してください。
- デバイスを選択するとTWELITE STAGE APPのトップメニュー画面が表示されます。
親機の準備
通信相手として親機が必要です。親機にはMONOSTCK - モノスティック
を使用することができます。
以下の手順で親機・中継機アプリ Wings-ウイングス
をMONOSTICK - モノスティックに書き込んでください。
- トップメニューから 2:アプリの書換 > 1:BINから選択を選択してください。
- MONOSTICK BLUE を使用している場合はApp_Wings_MONOSTICK_BLUE_… を選択し、MONOSTICK RED を使用している場合はApp_Wings_MONOSTICK_RED_… を選択してください。
- 書き込み完了後はインタラクティブモードに入らずにESCキーを長押ししてトップメニューに戻ってください。
ビューアを選択する
- トップメニューから 1:ビューア > 4: CUE/ARIAビューア を選択します。
- TWELITE ARIA タブをクリックします。

TWELITE ARIAビューア
TWELITE ARIAの動作確認をする
温度、湿度を計測する
5秒ごとに温湿度の値が更新されます。
磁石を検出させる
- 磁石のN極を磁気センサーに近づけると「[N極]」と表示されます。
- 磁石のS極を磁気センサーに近づけると「[S極]」と表示されます。
- 磁石を磁気センサーから遠ざけると「 —- 」と表示されます。
モードを変更する
モードを変更することで、TWELITE ARIAの振る舞いを変更することができます。
詳しくは以下のページをご確認ください。
設定を変更する
グループ分けや送信頻度の変更などはインタラクティブモードで設定できます。
インタラクティブモードへの移行方法は以下のページをご確認ください。
また、設定できる項目については以下のページをご確認ください。
ログを出力する
パルスクリプトで温湿度などのデータをCSV形式でログに出力することができます。
詳しくは以下のページをご確認ください。
グラフを描画する
パルビューアで温湿度や磁気センサーの値をグラフで見ることができます。
詳しくは以下のページをご確認ください。
1.4.1.2.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 | 中継機シリアルID | 4 | 80000000 | |
2 | LQI | 1 | C9 | |
3 | 続き番号 | 2 | 0005 | |
4 | 送信元シリアルID | 4 | 810A07B7 | |
5 | 送信元LID | 1 | 01 | |
6 | センサー種別 | 1 | 80 | |
7 | PAL IDとPAL Ver | 1 | 06 | TWELITE ARIA |
8 | センサーデータ数 | 1 | 07 | 7 |
9 | センサーデータ0 | 7 | 00340003813500 | イベントデータあり タイマー起床 |
a | センサーデータ1 | 8 | 1205350401000000 | タイマー0で起床 |
b | センサーデータ2 (ヘッダ) | 4 | 11300802 | 2バイト、拡張ビット有 |
c | センサーデータ2 | 2 | 0D16 | 3350mV |
d | センサーデータ3 (ヘッダ) | 4 | 11300102 | 2バイト、拡張ビット有 |
e | センサーデータ3 | 2 | 055E | 1432mV |
f | センサーデータ4 (ヘッダ) | 4 | 00000001 | 1バイト、拡張ビットなし ホールIC |
g | センサーデータ4 | 1 | 80 | オープン(変化なし) |
h | センサーデータ5 (ヘッダ) | 4 | 05010002 | 符号あり2バイト 温度 |
i | センサーデータ5 | 2 | 0A3A | 26.18°C |
j | センサーデータ6 (ヘッダ) | 4 | 01020002 | 符号なし2バイト |
k | センサーデータ6 | 2 | 11B3 | 45.31% |
l | チェックサム1 | 1 | DF | 1~lのCRC8 |
m | チェックサム2 | 1 | 13 | 1~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を設定する方法は以下の2種類あります。
設定できる内容に関してはインタラクティブモードをご確認ください。
OTAによる設定
OTAとはOver the Airの略です。非接触での通信を意味します。OTA設定はインタラクティブモード での設定をケーブル接続不要で行う機能です。
OTAを実行するには MONOSTICK-モノスティック が必要です。
TWELITE R2を使用する設定
TWELITE CUEの7PインターフェイスにTWELITE R2 を接続してインタラクティブモードで設定を行うことも可能です。
1.4.1.3.1 - OTAによる設定
OTAによる設定手順
以下の手順でOTAによる設定を行います。
TWELITE STAGE APPを起動する。
パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。\MONOSTICKにOTA設定用のアプリを書き込む。
TWELITE STAGE APPのトップメニューから
2: アプリ書換>3: TWELITE APPS ビルド&書換> 2: App_ARIA_OTA
を選択する。\インタラクティブモードで設定値を入力する。
TWELITE STAGE APPのトップメニューから3: インタラクティブモードを選択して値を変更し保存する。\OTA設定を実行する。
MONOSTICKから約20cm以内の距離で、TWELITE ARIAの磁気センサーに磁石を近づけたり遠ざけたりを5回以上繰り返し、TWELITE ARIAのLEDが点滅することを確認する。\MONOSTICKの出力を確認する。
MONOSTICKより以下のようなメッセージが出力することを確認する。
出力されない場合は、こちら を確認する。
OTAがうまくいかなかった場合
OTAが何らかの原因でうまくいかなかった場合、MONOSTICKから以下のように出力されます。
エラー出力 | エラー内容 |
OTA FAILURE OTA request TS=20515[ms] 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 R2との接続
TWELITE R2を使用して設定する場合は以下の手順で設定してください。
- TWELITE STAGE APPを起動する。
パソコンにTWELITE STAGE SDK をインストールし、MWSTAGEフォルダ内のTWELITE_stageファイルをダブルクリックする。 - インタラクティブモードで設定値を入力する。
TWELITE STAGE APPのトップメニューから 3:インタラクティブモード を選択して値を変更し保存する。
1.4.1.4 - インタラクティブモード
ここでは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 | アプリケーションID | 0x67720102 | 同一の周波数チャネルを複数のグループで使用することが可能です。値は32ビットで設定します。 |
i | 論理デバイスID | – | 子機の論理デバイスIDを設定します。1~100までの値を設定できます。 |
c | 周波数チャネルの設定 | 18 | チャネル(11~26)を選択します。省電力動作を優先する観点から、複数チャネルの指定は無効としています。 |
x | 送信出力の設定 | 13 | 1桁、または2桁の数字を指定します。2桁目は省略可能です。 1桁目は、送信出力を設定します。3が最強で2,1,0と1段階小さくなるたびに -11.5db 出力が低下します。出力を制限し電波の有効伝達範囲を小さくしたい場合に使用します。ただし、伝達可能距離は環境(ノイズ・遮蔽物など)に影響を受けます。 |
b | UARTボーレートの設定 | 115200 | 入力値にかかわらず115200bps固定です。 |
B | UARTパリティの設定 | 8N1 | 入力値にかかわらず8N1で固定です。 |
k | 暗号化鍵の設定 | 0xA5A5A5A5 | 暗号化鍵を入力します。32bitの16進数を設定します。通信グループ内は全て同一の値に設定してください。 |
o | オプションビットの設定 | 0x00000001 | 各種詳細設定ができます。 |
t | 送信間隔の設定 | 5 | 定期送信パケットの送信間隔を秒単位で設定します。1〜4095の値で指定可能です。範囲外の設定をした場合の動作は不定です。 |
p | センサ固有パラメータの設定 | 0 | PALごとに決められたパラメータの設定をします。0以上の16進数で指定できます。 |
S | 設定値の保存 | 設定を保存し、モジュールを再起動します。 | |
R | 初期値に設定を戻す | 設定を初期化します。他の操作を行わず、続けてS キーによる設定の保存を行うとセーブ領域のクリアを行います。 |
オプションビットの設定
オプションビット設定値を各ビットごとに解説します。
ビット(16進) | 説明 |
---|---|
ビット(16進) | 説明 |
0x00000001 | 各中継機または親機宛に送信し、受信した中継機すべての情報が親機に転送され、シリアル出力されます。 |
0x00000040 | OTAを無効にする。 |
0x00001000 | 暗号化通信を有効にします。(相手側の暗号化設定もしてください。) |
0x00010000 | UART通信でのメッセージ出力を有効にします。 |
1.4.1.5 - 使用上の注意
ケースの防水性能について
TWELITE ARIAのケースは防水仕様ではありません。
屋外で使用する場合は、以下の対策などが考えられますが、防水方法についてはお客様が検討・評価いただきますようお願いいたします。
- ケースの合わせ目を防水テープなどで封をする
- 空気穴に通気テープを張り付ける
- ねじ止め穴にOリングをいれる
- ねじをしっかり締める
2 - TWELITE STAGE APP
2.1 - TWELITE STAGE APP マニュアル
資料の取り扱いについて をご参照ください。
お気付きの点がありましたら、当サポート窓口にご連絡いただければ幸いです。
Windows/macOS/Linux ではコンパイラ・サンプルコードなどを格納した MWSDK が含まれます。これらに関する詳細は、以下を参照ください。
- MWSDK全般 - https://sdk.twelite.info/
- MWXライブラリ - https://mwx.twelite.info/
様々なプラットフォームで動作します。
- 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 アプリは、以下のいずれかの方法で取得できます。
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 ライブラリは以下のページで公開しています。
TWELITE STAGE アプリのソースコードは、examples/TWELITE_Stageに配置しています。
2.1.2 - インストール
動作環境によっては、本アプリケーションの動作に各種設定が必要です。問題が生じた場合には、本資料の記述を参考にして環境を整備してください。
開発環境を構築するためには、ソフトウェア群のインストール、またこれらの利用許諾に同意する必要があります。また、セキュリティ設定等が必要になる場合があります。
- 配布時に十分注意しておりますが、お客さまの側でもウィルスやマルウェアが含まれていないことを確認いただくようお願いします。
- セキュリティの運用(外部アプリケーションのインストールの可否など)については、お客さまの環境の管理者にご確認ください。
「アプリケーションの配布と実行について」 も併せてご覧ください。以下の内容を含みます。
- 本来のファイルとダウンロードしたファイルの同一性の確認について
- macOS/Windowsにおけるコード署名の取り扱いについて
TWELITE STAGE SDK のインストール手順
① アーカイブを取得
各プラットフォーム (Windows / macOS / Linux) 用の TWELITE STAGE SDK を ダウンロード します。
macOS の場合は、Homebrew cask を使ってインストールすることもできます。
brew install twelite-stage
インストール先は
~/MWSTAGE
です。
② アーカイブを展開
ダウンロードしたZipアーカイブを展開します。
展開先のファイルパスには、半角数字 0..9、半角アルファベットa..zA..Z、一部の記号 -_. 以外の空白や漢字・ひらがな等を含めないでください。 Windows の場合の例
- NG :
C:\work\作業\
- NG :
C:\Users\user1\work dir\
- OK :
C:\Work\Work1
③ ファイルを確認
展開先のフォルダを確認します。
C:\Work
上に配置したアーカイブは C:\Work\MWSTAGE
に展開されますが、展開ソフトによってはフォルダ名が異なる可能性があります。 必要に応じて変更してください。C:\Work\MWSTAGE
) を {MWSTAGE インストール}
のように表記する場合があります。展開先のフォルダ {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対応版)
- Windows の場合:
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へインストールする際の注意事項
環境
以下の環境で開発・動作確認しています。
- 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インストールする際の注意事項
環境
以下の環境で開発・動作確認しています。
- 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へインストールする際の注意事項
Linux環境はディストリビューションやバージョンによって、用意されているパッケージの種類が異なります。個別にパッケージ等のインストールや設定が必要になる場合があります。
エラーメッセージ等を手がかりに一般の情報を参照いただくようお願いいたします。
環境
以下の環境で開発・動作確認しています。
- Ubuntu 16.04, 18.04, 20.04
- NNLinux Beta8 64bit
- CentOS 7
シリアルポートの取り扱い
TWELITE STAGE から MONOSTICK や TWELITE-R を認識するには、ftdi_sioモジュールをアンロードし、USBデバイスに対して読み書き権限を与える必要があります。
USBデバイスのIDを以下に示します。
- ベンダーID
0x0403
- プロダクトID
0x6001
(MONOSTICK,TWELITE R) または0x6015
(TWELITE R2)
なお、この設定を自動化するための 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'"
アプリケーションの登録
必要に応じて、お使いのデスクトップ環境に合った方法でアプリケーションを登録してください。
TWELITE_Stage.run
を実行形式として認識できない場合があるためです。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 で動作します。
- マウスとタッチスクリーンに対応します。
- ビルドツールチェインが付属しており、コンパイルもできます。
- 実行形式には、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デバイスに対する読み書き権限の付与が必要です。
USBデバイスのIDを以下に示します。
- ベンダーID
0x0403
- プロダクトID
0x6001
(MONOSTICK,TWELITE R) または0x6015
(TWELITE R2)
この設定を自動化するための 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 アプリを起動するには、{MWSTAGE インストール}
にある実行形式を実行します。
実行はプラットフォーム(Windows, macOS, Linux)によって方法が異なります。
システム | 拡張子 | 備考 |
---|---|---|
Windows | .exe | エクスプローラで実行形式をダブルクリック |
macOS | .command | Finder で実行形式をダブルクリック |
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 画面例
アプリの終了
いずれかの方法で終了してください。
- 実行画面上の右上にマウスポインタを移動し、画面内に表示された終了ボタンを押します。
- 実行画面のウインドウを閉じます(macOSの場合は
⌘Q
も使用できます)。
ごくまれに、終了操作をしても実行画面が残る場合があります。その場合には、以下をお試しください。
- TWELTIE STAGE APPのコマンドライン画面を閉じる。
- 強制終了を行う(強制終了の操作方法はお使いのシステムの解説を参照してください)。
2.1.3.1 - キーとマウスの操作
Windows macOS Linux RasPi
キー操作
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 , D | A, B, C ボタンを押します。 |
Shift +A , S , D | A, 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} です。※ 設定メニューで起動時設定にできます。 |
Q | TWELITE STAGE APPを終了します。 |
0 | シリアルポートを切断し、再度シリアルポートの一覧を表示します。 |
1 , 2 , … | シリアルポートを選択します。 |
L , Shift +L | シリアルポートの入出力のログを開始します。終了時にはログファイルが Windows であればメモ帳、macOS であれば ログビューア で開かれます。Shift +L でログ格納フォルダを開きます。 |
その他の操作
キー | 意味 |
---|---|
Alt(⌘) +Shift +Ctrl +m | MWX ライブラリコードのフォルダを開きます。 |
Alt(⌘) +Shift +l | log フォルダを開きます。 |
マウス操作
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 ]ボタンの表示例](../images/stage-app-abc-button.webp)
画面下部の仮想[ B ]ボタンの表示例
マウスによる画面操作
Windows macOS Linux RasPi
Windows/macOS/Linuxでは、TWELITE STAGE APP の画面を原則文字列のみで構成しますが、メニューやボタン、タブについてはマウスによる操作が可能です。

コマンダー画面例
画面はテキストのみの構成ですが、画面上部のタブや、反転表示の文字はマウスの左クリックで選択可能です。
2.1.3.2 - 画面の操作
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が接続されたシリアルポートを選択する画面を表示します。 ただし、シリアルポートは、あとから接続することもできます。

シリアルポート選択画面の例
TWELITE STAGEアプリでは、シリアルポートの選択と各画面の処理は連携しません。 例えば、シリアルポートの選択をしていない状態で、ビューアを起動しても表示は更新されません。この状態でシリアルポートを選択すると、ビューワの表示が更新されます。
なお、シリアルポートは Alt(⌘)
+0
, 1
, 2
, … のキー操作でいつでも切り替えできます。
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 ESC | ESC キーを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 ESC | ESC キーを入力することで、この画面を抜けます。 |
2.1.3.2.2.1.3 - グラフ
- 加速度リアルタイムグラフ:加速度センサーのパケットをリアルタイムで表示します。周波数領域の表示や CSV ファイルの保存ができます。
- センサーグラフ:TWELITE 各種センサーのデータを sqlite3 データベースに保存し、グラフを表示します。
2.1.3.2.2.1.3.1 - 加速度リアルタイムグラフ
Windows macOS Linux RasPi

デモデータの表示例
概要
TWELITE CUE や TWELITE 動作センサーPAL から受信したパケットを参照します。加速度データをリアルタイムで表示できるほか、周波数解析や CSV 出力の機能があります。
CUE モード、MOTモード、2525 FIFO モードの3種類に対応しています。
連続したサンプルが一定数(解析窓)以上になると、XYZ軸を周波数解析した表示を行います。ただし 2525 FIFO モードでは常に連続していると仮定します。
パケットの区切りが明示的である場合(直前のパケットから3秒以上経過したとき、CUEモードは1パケットごと、MOTモードはパケットのシーケンス番号が不連続になった場合)には、4サンプル分のダミーデータを挿入しピンク色の背景色を表示します。
先着順に最大4ノードまでのデータを格納します。
工場出荷時の TWELITE CUE は TWELITE CUE モード に設定されています。
連続したデータを計測する場合は動作センサーパルモード に変更してください。
加速度リアルタイムグラフを使用する場合における動作センサーパルモードの代表的な設定を以下に記します。
- 連続的に約 25Hz で計測したいとき
t: set Transmission Interval (0)
p: set Sensor Parameter (03000000)
- 連続的に約 50Hz で計測したいとき
t: set Transmission Interval (0)
p: set Sensor Parameter (03000100)
- 連続的に約 100Hz で計測したいとき
t: set Transmission Interval (0)
p: set Sensor Parameter (03000200)
- 約10秒おきに 約 100Hz で128サンプル分計測したいとき
t: set Transmission Interval (10)
p: set Sensor Parameter (03000208)
- 約10秒おきに 約 100Hz で256サンプル分計測したいとき
t: set Transmission Interval (10)
p: set Sensor Parameter (03000210)
- 約10秒おきに 約 50Hz で64サンプル分計測したいとき
t: set Transmission Interval (10)
p: set Sensor Parameter (03000104)
- 約10秒おきに 約 200Hz で128サンプル分計測したいとき
t: set Transmission Interval (10)
p: set Sensor Parameter (03000308)
操作
操作 | 説明 |
---|---|
右上部(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 のように計算しています。 |
X | X軸の周波数解析計算値 | |
Y | Y軸の周波数解析計算値 | |
Z | Z軸の周波数解析計算値 | |
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 データベースに記録し、画面上にグラフ形式で表示します。データベースファイルは外部のアプリケーションから参照することも可能です。
同一実行形式名の TWELITE STAGE APP を複数起動して、センサーグラフを同時に使用することはできません。
データベースファイルは {MWSTAGEインストール}/log
フォルダに格納され、TWELITE STAGE APP の実行形式名をもとにファイル名が決まります。同一の実行形式名である場合は、同じデータベースファイルを参照してしまいます。TWELITE STAGE APP の実装では、複数のアプリが同時に同一のデータベースにデータを追加することを想定していません。また、場合によってはデータベースファイルのアクセスエラーとなり、TWELITE STAGE APP がクラッシュすることもあります。
例えば、MONOSTICK を PC に2台接続して、同時に複数の「センサーグラフ」を動作させたい場合には、別の実行形式名 (TWELITE_Stage_a.exe
, TWELITE_Stage_b.exe
) とした TWELITE STAGE アプリを複数実行します。このときのデータベースファイル名はそれぞれ log/TWELITE_Stage_a_WSns.sqlite
, log/TWELITE_Stage_b_WSns.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 | 入力した文字列をデータベースに反映します。 |
IME入力時の操作方法は、システム環境に依存する場合があります。
また、IME入力時の操作によっては期待しない文字列が入力される場合があります。不要な文字列が入力エリアに表示された場合は BS
キーで不要部分を削除してください。
画面遷移
基本の画面は一覧、24時間、ライブの3種類に分けられます。
[一覧] <--> [24時間] <--> [ライブ]
↓↑
[年月日選択]
センサーグラフモードの起動時に開く
[STAGE 共通設定 → 起動アプリ指定] にて 32
を指定してください。
DBのテーブルについて
sensor_data
受信したデータを格納します。
カラム名 | 型 | 解説 |
---|---|---|
_uqid | INTEGER | データベースで使用する続き番号 |
sid | INTEGERint32_t | int32_t 型で格納しているシリアル番号です。例えば “8123abcd” というシリアル番号の場合は整数値で -2,128,368,691 の値が格納されます。 |
ts | INTEGERint64_t | システムがパケットを受信した時刻で、int64_t 型で格納されるタイムスタンプ値です。UNIX epoch (エポック、1970年からの経過秒) です。 |
ts_msec | INTEGER | タイムスタンプのミリ秒部分です。 |
year | INTEGER | タイムスタンプよりローカル時間の年部分です。 |
month | INTEGER | タイムスタンプよりローカル時間の月部分です。 |
day | INTEGER | タイムスタンプよりローカル時間の日部分です。 |
hour | INTEGER | タイムスタンプよりローカル時間の時部分です。 |
lid | INTEGER | ユーザにより割り当てられた LID などの識別値です。 |
lqi | INTEGER | 受信強度の目安値です (Link Quality Indicator) 。 |
pkt_seq | INTEGER | パケットの続き番号です。どのような値を取りうるのかはファームウェアによって異なります。 |
pkt_type | INTEGER | 無線パケットの種別です。2 PAL AMB 6 ARIA 1 PAL MAG *3 PAL MOT 5 CUE 0x101 App_Twelite *0x103 App_IO *現時点で非対応 |
value | REAL | 計測値です(パケット種別によって定義が異なります)。pkt_type-> 2,6: 温度[°C] 1: 磁石の判定有無 (00->磁石なし, 01->N極, 02->S極) 3,5: X軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G] 0x101,103: 入力IOのビットマップ(val_dioの下位8ビットと同値) |
value1 | REAL | 計測値です(パケット種別によって定義が異なります)。pkt_type-> 2,6: 湿度[%] 1: 未使用 3,5: Y軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G] 0x101: ADC1[V] 103: 未使用 |
value2 | REAL | 計測値です(パケット種別によって定義が異なります)。pkt_type-> 2: 照度[lx] 6: 未使用 1: 未使用 3,5: Z軸加速度(パケット中に複数サンプル含まれる場合は平均値)[G] 0x101: ADC2[V] 103: 未使用 |
value3 | REAL | 計測値です(パケット種別によって定義が異なります)。pkt_type-> 2: 未使用 6: 未使用 1: 未使用 3,5: 未使用 0x101: ADC3[V] 103: 未使用 |
val_vcc_mv | INTEGER | 電源電圧[mV] |
val_dio | INTEGERint32_t | b0..b7 : DI1..DI8 の値 (1 はLOW, 0 はHIGHレベル)b24..b25 : マグネット値 (b28 が1 の場合) 00 ->磁石なし, 01 ->N極, 10 ->S極b28 : 1 の場合マグネットデータがb24..b25 に格納されるb31 : 定期送信ビット(マグネットのみ) |
val_adc1_mv | INTEGER | pkt_type-> 1,2,3,0x101 : ADC1の計測値 |
val_adc2_mv | INTEGER | pkt_type-> 0x101 : ADC4の計測値 |
val_aux | INTEGER | その他データ格納目的 |
ev_src | INTEGER | イベント発生元 |
ev_id | INTEGER | イベントIDpal_type-> 5: サイコロ(1...6) 16→MOVE他 資料参照 |
ev_param | INTEGER | イベントパラメータ |
sensor_node
センサーノードにテキストメモ(付加情報)を格納します。
カラム名 | 型 | 解説 |
---|---|---|
sid | INTEGER | 上述のSID |
sid_text | TEXT | 可読性のためにSIDを16進数に変換した文字列 |
desc | TEXTUTF-8 | SIDに対応するメモ(補助情報)。一覧などで表示する |
sensor_last
最後に受信したタイムスタンプを管理します。
カラム名 | 型 | 解説 |
---|---|---|
sid | INTEGER | 上述のSID |
ts | INTEGER | 最後の受信したときのタイムスタンプ |
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 ビューア
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 ビューア
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 を指定します。自身が子機の場合は「親機:0」宛を指定してください。自身が親機の場合は「全子機=0x78」または特定の子機ID(1..8まで指定可能)を指定します。 |
DI1..DI4 | DI1からDI4までの設定状態です。■は選択(LOW=GNDレベル)、□は(HIGH=VCCレベル)を意味します。下項目のSELを指定してください。 |
SEL | 各DIの選択ビットです。(0ならDIの指定を無視し、1なら指定を有効化します。) |
PWM1..4 | PWMのデューティ比を設定します。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 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から選択
Windows macOS Linux RasPi
概要
ビルド済みのアプリ(.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ビルド&書換
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ビルド&書換
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
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 の画面にドラッグ&ドロップすることで、特定のプロジェクトを書き込むことができます。 ドロップした対象のビルドや書き込みを行うときに選択します。
.BIN
ファイルをドロップしたときは、そのファイルが格納されるフォルダをドロップした場合と同様に、そのフォルダにあるファームウェアの一覧を表示します。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 の入出力を使用するため、シリアル通信に文字化けなどが発生した場合など、期待通りにインタラクティブモードへの遷移や離脱ができない場合もあります。
- マウス操作には対応しておりません。キーボード(カーソル
↑
↓
での操作は可能)操作を行ってください。
ターミナル によるインタラクティブモードへの遷移と操作もできます。
- ターミナルでは、自動的にSETピンの操作を行いません。手動でSETピンをLOに設定する必要があります。
- ターミナルにおいても、
+ + +
入力Alt(⌘)+I
やモジュールリセットAlt(⌘)+R
を行う操作を定義しています。
インタラクティブモード画面の動作フロー
以下に大まかな処理の流れを記載します。
[画面黒背景にする]
↓
[TWELITEのリセット (制御可能ならSET=LO)]
↓
<間欠動作アプリのインタラクティブモードメッセージを検出?> --YES--> [操作画面]へ
↓タイムアウト
['+' を3回入力]
↓
<通常アプリのインタラクティブモードメッセージを検出?> --YES--> [操作画面]へ
↓タイムアウト
[操作画面へ] ※ この状態はインタラクティブモードではない
[操作画面]
↓
<インタラクティブモード脱出メッセージ?> --> [終了]
↓
<画面離脱操作 [ A ] 長押しなど> --> [終了]
↓
-> <入力中判定> --NO-> [終了]
↓ ↓
[入力文字列をTWELITEへ送信]
↓
[操作画面]へ戻る
[終了]
↓
[TWELITEのリセット]
↓
[画面離脱] インタラクティブモード画面を終了し前の画面へ戻る
2.1.3.2.2.4 - TWELITE STAGE の設定
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 :320x240Y 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 を入力すると、入力したセクタ番号のセクタの内容を表示します。 |
R | YES を入力すると全セクタの読み出しを行いますが、末尾の部分のみを表示します。 |
e | セクタを消去(0xFF )します。0..59 を入力すると、入力したセクタ番号のセクタが消去されます。 |
E | YES を入力すると全セクタを消去します。 |
{実行形式名}.sav
(デフォルトでは TWELITE_Stage.sav
ファイル)に保存されます。2.1.3.2.2.5 - シリアルポートの選択
Windows macOS Linux RasPi
概要
この画面では、シリアルポートを再選択できます。

シリアルポート選択画面の例
Alt(⌘)+0
, Alt(⌘)+1,2,..
でシリアルポートを切り替えることもできます。2.1.3.3 - ログ機能
Windows macOS Linux RasPi
操作
記録開始
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 - 詳細な仕様
2.1.4.1 - フォルダ構成
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
など) を検索します。
- TWELITE STAGE APP が起動したときのフォルダ
- TWELITE STAGE APP の実行形式があるフォルダ
{MWSDKフォルダ}/..
{MWSDKフォルダ}
Wks_Acts
Wks_Acts
フォルダを作成した場合には、Act_samples
フォルダの替わりに、このフォルダをメニューの[actビルド&書換]メニューから参照します。
Wks_Acts
は、自身で作成したプロジェクトを格納する用途を想定しています。2.1.4.2 - コマンドライン引数とiniファイルによる詳細設定
コマンドライン引数
コマンドライン引数は、TWELITE STAGE APPのいくつかの細かい設定を行います。
コマンドライン引数 | 内容 |
---|---|
-E 0 | フェードアウトのようなグラフィカルな効果を無効にする。 |
-R {type} | {type} 値でレンダリングタイプを設定します。0: デフォルト1: OpenGL2: 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
)。 - キーと値の文字列は行頭から始まる(キーの前に空白や他の文字は許されない)。
- キーと値の間にスペースを入れてはならない。
- コメント行は
;
または#
を行頭に追加する。
設定
キー | 値 |
---|---|
MWSDK | MWSDKのフォルダを変更する。デフォルトのフォルダは、TWELITE STAGE APPの実行ファイルが置かれているのと同じフォルダにある MWSDK です。古いMWSDKやカスタムMWSDKを使用する必要がある場合は、そのフォルダの名前を指定することができます。 |
LANG | LANG=en は、ユーザーインターフェースの言語をデフォルト(日本語)から英語に変更します。 |
GEOM_X, GEOM_Y | TWELITE 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 - 環境変数
内部的に設定される環境変数
環境変数 | 解説 |
---|---|
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 | ツールチェインのメッセージを規定の言語(英語)にするため、明示的に設定しています。 |
PATH | Windowsでは、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
を作成した場合には、TWELITE STAGE APP が、プロジェクトフォルダの一覧にその内容を表示します。

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 が適用されます。
ソースコードについてはMW-OSSLA-1J,1E が適用されます。概要はリンク先を参照ください。
お客様がソースコードからビルドした場合は、非商用目的でより制限の緩和されたMW-OSSLA-1J,1Eによる運用が可能です。
一部の配布パッケージ(2020/10/9現在では M5Stack用 0.8.9a パッケージのみ)ではMW-SLA-1J,1E と MW-OSSLA-1J,1E とのデュアルライセンスを適用しているものもあります。パッケージ内のライセンス記述を確認してください。
商用利用ではMW-SLA-1J,1Eを選択いただくことになりますのでご注意ください。
利用したオープンソース成果物
高品質なソースコードを提供いただいたオープンソースプロジェクトに感謝いたします。
名前 | 記述 |
---|---|
SDL2 | Simple DirectMedia Layer Copyright (C) 1997-2020 Sam Lantinga |
getopt | Copyright (c) 1987, 1993, 1994The Regents of the University of California. All rights reserved. |
regex | regex - Regular expression pattern matching and replacementBy: Ozan S. Yigit (oz) Dept. of Computer Science York University |
printf | Copyright (c) 2014 Marco Paland |
東雲フォント | 2001 The Electronic Font Open Laboratory http://openlab.ring.gr.jp/efont/ |
M+ BITMAP FONTS | Copyright 2002-2005 COZ coz@users.sourceforge.jp |
SQLiteC++ | Copyright (c) 2012-2021 Sebastien Rombauts (sebastien.rombauts@gmail.com ) |
sqlite3 | All of the code and documentation in SQLite has been dedicated to the public domain by the authors. |
2.1.6 - 改訂履歴
ソースコードの変更履歴は 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
3.1 - 導入済みアプリケーションの概要

動作イメージ
使用方法
TWELITE SPOT スタートガイド まずは使ってみる をご覧ください。
ビューア画面
それぞれのビューアを選択すると、対応した TWELITE 子機 から受信したデータを表示します。
Signal Viewer
TWELITE DIP (超簡単!標準アプリ) から受信したデータを表示します。 AI1-4 に入力した電圧や、DI1-4 の入力状態を確認できます。

Signal Viewer
CUE Viewer
TWELITE CUE (キューアプリ、TWELITE CUE モード) から受信したデータを表示します。 加速度センサや磁気センサのデータを確認できます。

CUE Viewer
ARIA Viewer
TWELITE ARIA (アリアアプリ、TWELITE ARIA モード) から受信したデータを表示します。 温湿度センサや磁気センサのデータを確認できます。

ARIA Viewer
Serial Viewer
TWELITE SPOT が受信したパケットの電文を表示します。

Serial Viewer
工場出荷時のアプリの詳細
ESP32
ESP32 に書き込んでいるスケッチは、spot-server
です。
TWELITE
TWELITE に書き込んでいるアプリは、App_Wings_SPOT_BLUE
です。
3.2 - 無線性能に配慮した設置方法
無線性能に配慮した設置
アンテナ方向マークを天地方向にする
TWELITE SPOT で使用しているアンテナは、アンテナ方向マークを天地方向に向けると、TWELITE SPOT を上面から見たときに、TWELITE SPOT を中心に円状に電波が放射されるため、広い範囲の電波を受信することができます。
TWELITE SPOT と TWELITE 子機のアンテナ方向マークを同じ方向にする
電波には波の振動方向があり、この方向を偏波と呼びます。 送信側と受信側の偏波が同一でない場合感度が低くなり、通信距離が短くなります。 TWELITE SPOT に表記されているアンテナ方向マークはこの偏波の向きを示しており、通信するアンテナ同士のアンテナ方向マークを合わせることにより通信感度が良くなります。
周辺に障害物がない場所に設置する
TWELITE SPOT の周辺に障害物があると電波が減衰するため、通信距離が短くなるため、この特性をご理解の上、設置場所を決めてください。 特に金属が TWELITE SPOT の周辺にあると著しく通信距離が短くなるため、TWELITE SPOT の周辺には金属を含む障害物を置かないようにしてください。 目安として TWELITE SPOT から半径 10cm 以内に金属を配置しないようにしてください。
壁面への設置
M3 ビスを 2 本使用しますが、金属製の部品は無線性能に影響を与える可能性があることに注意してください。
3.3 - ファームウェア開発環境の構築方法
3.3.1 - Arduino IDE 1.x による開発環境の構築方法
arduino-esp32fs-plugin
や EspExceptionDecoder
などの Java 製プラグインが動作しないため、Legacy IDE (1.x) を推奨しています。3.3.1.1 - Arduino IDE 1.x の導入
ダウンロード
Web ブラウザで Arduino 公式ダウンロードページ を開き、Legacy IDE (1.8.X) をダウンロードしてください。

Software | Arduino
インストール
ダウンロードしたファイルを実行して指示に従い、Arduino IDE 1.x をインストールしてください。
3.3.1.2 - Arduino core for the ESP32 の導入
ボード情報の追加
Arduino IDE 1.x を起動し、ツールバーの ファイル -> 環境設定 を開いてください。

環境設定の場所
追加のボードマネージャーのURL
に下記の URL を入力し、OKボタンを押してください。
https://espressif.github.io/arduino-esp32/package_esp32_index.json

環境設定ウィンドウ
インストール
ツールバーの ツール -> ボード: “Arduino Uno” -> ボードマネージャ を開いてください。

ボードマネージャの場所
検索ボックスに “ESP32” と入力して、esp32
ボード定義をインストールしてください。

ボードマネージャ
2.0.5
以降で動作確認しています。3.3.1.3 - Arduino core for the ESP32 の設定
ボード種別の選択
ツールバーの ツール ―> ボード -> ESP32 Arduino -> ESP32 Dev Module を選択してください。

ESP32 Dev Module の場所
ボード設定
以下の画像のように設定してください。

設定後の内容
デフォルトでは Flash size
が 4MB (32Mb)
となっています。
これを 16MB (128Mb)
に変更してください。
3.3.1.4 - MWings ライブラリの導入
インストール
スケッチ -> ライブラリをインクルード -> ライブラリを管理… を開いてください。

ライブラリマネージャの場所
検索ボックスに MWings
と入力し、MWings をインストールしてください。

ライブラリマネージャ
3.4 - ファームウェアの書き込み方法
3.4.1 - ESP32 へのファームウェアの書き込み方法
3.4.1.1 - ESP32 へのスケッチの書き込み方法
ホストとの接続
TWELITE R3 / R2 を接続
7P インターフェイス(ESP32
と記載のある側)に TWELITE R3 / R2 を接続してください。
電源を接続
側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (ESP32)
Arduino IDE の操作
スケッチを開く
Arduino IDE を起動して、書き込むスケッチを開いてください。
シリアルポートを選択
ツール -> シリアルポート メニューから、 TWELITE R3 / R2 のポートを選択してください。

シリアルポート選択
COM?
といった名称に、macOS / Linux では /dev/tty?
といった名称になります。ESP32 をプログラムモードで起動
TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
と ESP32 ブートスイッチ BOOT
を押し、EN(RST)
-> BOOT
の順で離してください。

ボタンの位置
BOOT
を押した状態でリセットすることで、ESP32 をプログラムモードに移行できます。書き込みを実行
Arduino IDEの マイコンボードに書き込む ボタンをクリックしてください。

マイコンボードに書き込む
Hard resetting via RTS pin...
と表示されます。書き込みに失敗し、下記のメッセージが表示された場合は、使用する USB ポートや USB ケーブルを変えてみてください。
A serial exception error occurred: Could not configure port: (6, 'Device not configured')
ESP32 をリセット
書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置

書き込み完了画面
3.4.1.2 - ESP32 へのファイルの書き込み方法
data/
フォルダ以下のファイル群)を書き込む方法をご案内します。本稿では、応用的な内容(TWELITE SPOT に搭載された ESP32 のフラッシュ領域をファイルシステムとして扱い、HTML などのファイルを書き込む方法)を紹介しております。
例えば TWELITE SPOT に HTML ファイルを書き込んでWebサーバとして振る舞わせたい(spot-server サンプルで実現しています)、TWELITE SPOT に暗号鍵ファイルを書き込んでおきたいといった要求がない場合には、本稿の内容を無視していただいて構いません。
本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
本稿で紹介する方法では、Arduino IDE 1.x を必要とします。Arduino IDE 2.x の技術的な制約により、2023年5月現在、Arduino IDE 2.x には対応していません。
本稿で使用するプラグインは Java で書かれているため、Arduino IDE 1.x とは異なり、Java ベースではない Arduino IDE 2.x では動作しないからです。問題の詳細については、Arduino IDE GitHub ページの Issue (Missing support for external tools / plugins · Issue #58 · arduino/arduino-ide ) をご覧ください(英語)。
プラグインの導入
ESP32 のフラッシュ領域へファイルを書き込むための Arduino プラグイン (arduino-esp32fs-plugin) をインストールします。
プラグインのダウンロード
以下のページから、esp32fs.zip
を入手します。
Release Update to support Big Sur · lorol/arduino-esp32fs-plugin
プラグインのインストール
ダウンロードした
esp32fs.zip
を展開してください。Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:
C:\Users\foo\Documents\Arduino
)にtools
フォルダがない場合は、これを作成してください。tools
フォルダにESP32FS/tool
フォルダを作成し、zipファイルから得たesp32ffs.jar
ファイルを配置してください。(配置例:C:\Users\foo\Documents\Arduino\tools\ESP32FS\tool\esp32fs.jar
)。Arduino IDE を次に起動した際にプラグインが使用できるようになります。
ホストとの接続
TWELITE R3 / R2 を接続
7P インターフェイス(ESP32
と記載のある側)に TWELITE R3 / R2 を接続してください。
電源を接続
側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (ESP32)
Arduino IDE の操作
スケッチを開く
Arduino IDE を起動して、スケッチを開いてください。
書き込むファイルの配置
スケッチ -> スケッチのフォルダを表示 から、スケッチのフォルダを開いてください。
スケッチファイル(
.ino
)と同じ階層に、data
フォルダを作成してください。data
フォルダ内に、書き込むファイルを配置してください。
data
フォルダ内の階層構造は維持されます。シリアルポートを選択
ツール -> シリアルポート メニューから、 TWELITE R3 / R2 のポートを選択してください。

シリアルポート選択
COM?
といった名称に、macOS / Linux では /dev/tty?
といった名称になります。ESP32 をプログラムモードで起動
TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
と ESP32 ブートスイッチ BOOT
を押し、EN(RST)
-> BOOT
の順で離してください。

ボタンの位置
BOOT
を押した状態でリセットすることで、ESP32 をプログラムモードに移行できます。書き込みを実行
ツール -> ESP32 Sketch Data Upload をクリックしてください。
Select FS for <スケッチ名> /data folder にて、LittleFS を選択してください。

ファイルシステムの選択画面
- OK を押してください。
Hard resetting via RTS pin...
と表示されます。環境によっては、以下のように表示されて書き込みに失敗することがあります(macOS で確認)。
`Error: esptool not found!`
その際には、esptool.py を Arduino15フォルダ
/packages/esp32/tools/esptool_py/<バージョン>/esptool.py
へ配置することで解決できるかもしれません。
例えば、macOS の場合には、下記のようにして esptool.py を取得し、シンボリックリンクを作成します。
/usr/bin/pip3 install esptool
ln -s ~/Library/Python/3.9/bin/esptool.py ~/Library/Arduino15/packages/esp32/tools/esptool_py/4.5.1/esptool.py
注:
/usr/bin/pip3
と指定しないと、Homebrew のディレクトリにインストールされてしまうことがあります
ESP32 をリセット
書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置
3.4.1.3 - ESP32 のパーティションテーブルを指定した書き込み方法
本稿では、応用的な内容(フラッシュ領域のパーティションテーブルを指定する方法)を紹介しております。
ESP32 Arduino Core に最初から含まれているパーティションテーブルの設定(例:Default 4MB with spiffs)を使用される場合は、本稿を無視していただいて構いません。
定義ファイルの作成
パーティションテーブルの定義は、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 を開き、追加したパーティションテーブルを選びます。
選択したパーティションテーブルが次回以降のファームウェアの書き込みやファイルシステムの書き込みに反映されます。
partitions.csv
という名前で設定ファイルを置くと、そちらが優先されます。ただし、Arduino IDE 上の表記は変わらないため、紛らわしい場合があります。3.4.2 - TWELITE へのファームウェアの書き込み方法
TWELITE SPOT に搭載される TWELITE では、インタラクティブモードによる設定変更ができません。
TWELITE の周波数チャネルやアプリケーションIDを設定するには、ESP32 からシリアル通信でコマンドを送信します。Arduino 環境では、Twelite.begin()
を使用してください。
TWELITE STAGE APP をインストール
TWELITE STAGE SDK をダウンロードし、ダウンロードしたファイルをCドライブ直下に展開してください。
ホストとの接続
TWELITE R3 / R2 を接続
7P インターフェイス(TWELITE
と記載のある側)に TWELITE R3 / R2 を接続してください。
電源を接続
側面の USB-C コネクタ に 5V 電源を供給してください。

接続例 (TWELITE)
TWELITE STAGE APP の操作
TWELITE STAGE APP (
TWELITE_Stage.exe
) を起動してください。シリアルポート選択画面で TWELITE R3 / TWELITE R2 を選択してください。
メインメニュー -> アプリ書換 を選択し、書換えたいアプリを選択してください。
3.4.3 - ファームウェアの初期化方法
3.4.3.1 - 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 電源を供給してください。

バイナリファイルの取得
下記のリンクから、spot-server-2023-05-bin.zip
をダウンロードしてください。
ダウンロードしたら、zipファイルを展開してください。
ESP32 をプログラムモードで起動
TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
と ESP32 ブートスイッチ BOOT
を押し、EN(RST)
-> BOOT
の順で離してください。

ボタンの位置
BOOT
を押した状態でリセットすることで、ESP32 をプログラムモードに移行できます。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
COM?
や /dev/tty?
といったポート名を入力します。もし失敗する場合は、下記をお試しください。
--flash_mode qio
を--flash_mode dio
に変更--flash_freq 80m
を--flash_freq 40m
に変更--baud 921600
を--baud 460800
に変更
ESP32 をリセット
書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
を押して離し、ESP32 をリセットしてください。

リセットスイッチの位置
3.4.3.2 - TWELITE のファームウェアの初期化方法
TWELITE SPOT に搭載される TWELITE では、インタラクティブモードによる設定変更ができません。
TWELITE の周波数チャネルやアプリケーションIDを設定するには、ESP32 からシリアル通信でコマンドを送信します。Arduino 環境では、Twelite.begin()
を使用してください。
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 STAGE APP の操作
TWELITE STAGE APP (
TWELITE_Stage.exe
) を起動してください。シリアルポート選択画面で TWELITE R3 / TWELITE R2 を選択してください。
メインメニュー -> アプリ書換 -> BIN から選択 を選び、先ほど入手したバイナリ(
App_Wings_TWELITESPOT_BLUE_L1305_V1-3-0.bin
)を書き込んでください。
3.5 - サンプルスケッチの解説
3.5.1 - TWELITE と通信するスケッチの解説
3.5.1.1 - 超簡単!標準アプリのデータを取得・操作
monitor_spot_app_twelite
の解説monitor_spot_app_twelite
の解説です。最後に、相手先の出力ポートを操作する改変を行います。3.5.1.1.1 - 超簡単!標準アプリのデータを取得・操作
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_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の 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_CHANNEL | TWELITE の 周波数チャネル |
TWE_APP_ID | TWELITE の アプリケーション 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()
でコマンドを送信しています。
ここでは、送信先の論理デバイス ID を設定し、出力ポート(DO1)の状態を指定しています。
データの詳細は AppTweliteCommand
のリファレンス
をご覧ください。
これでスケッチの改変は終了です。改変後のコードを示します。
// 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
の解説monitor_spot_app_cue
の解説です。3.5.1.2.1 - キューアプリのデータを取得
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_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の 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_CHANNEL | TWELITE の 周波数チャネル |
TWE_APP_ID | TWELITE の アプリケーション 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 Axis | X 軸加速度(1サンプル目) |
Accel Y Axis | Y 軸加速度(1サンプル目) |
Accel Z Axis | Z 軸加速度(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
の解説monitor_spot_app_aria
の解説です。3.5.1.3.1 - アリアアプリのデータを取得
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_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の 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_CHANNEL | TWELITE の 周波数チャネル |
TWE_APP_ID | TWELITE の アプリケーション 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 Temperature | TWELITE ARIA が計測した気温 (°C) |
Relative Humidity | TWELITE 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 を活用するスケッチの解説
3.5.2.1 - プリインストール済みスケッチ
spot-server
の解説です。3.5.2.1.1 - プリインストール済みスケッチ
spot-server
の解説です。本稿では、Arduino IDE 1.x を必要とします。Arduino IDE 2.x の技術的な制約により、2023年5月現在、Arduino IDE 2.x には対応していません。
本稿で使用するプラグインは Java で書かれているため、Arduino IDE 1.x とは異なり、Java ベースではない Arduino IDE 2.x では動作しないからです。問題の詳細については、Arduino IDE GitHub ページの Issue (Missing support for external tools / plugins · Issue #58 · arduino/arduino-ide ) をご覧ください(英語)。
本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
ソースコードの入手
GitHub (monowireless/spot-server ) から入手できます。
システムの概要
spot-server は、TWELITE からのデータ受信と転送を行う Arduino スケッチ (.ino
) と、スマホに配信する Web ページ (.html
/ .css
/ .js
) で構成しています。

イメージ図
TWELITE 子機が送信したデータは Arduino スケッチで受信され、Arduino スケッチは公開中の Web ページに対してイベントを発火します。公開された Web ページでは、発火されたイベントに応じて HTML の内容を動的に書き換えています。
開発に必要なもの
- 無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
- 加速度センサー無線タグ TWELITE CUE
などの子機 (お持ちでない場合はご購入ください 👉 販売店一覧
)
- CR2032 コイン電池 などの電源
- USBアダプター TWELITE R3
(お持ちでない場合はご購入ください 👉 販売店一覧
)
- 通信用 USB-C ケーブル
- Grove - OLED Display 1.12
(なくてもスケッチは動きます)
- Grove ケーブル
- 💻 コンピュータ
環境整備
IDE とツールチェインの導入
Arduino IDE 1.x による開発環境の構築方法 をご覧ください。
ライブラリの導入
はじめに、Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino
) に libraries
フォルダがない場合は、これを作成します。
非同期 TCP 通信ライブラリ
- GitHub (me-no-dev/AsyncTCP) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
AsyncTCP-master
からAsyncTCP
に変更します libraries
フォルダにAsyncTCP
フォルダを配置します
非同期 Web サーバライブラリ
- GitHub (me-no-dev/ESPAsyncWebServer) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
AsyncWebServer-master
からAsyncWebServer
に変更します libraries
フォルダにAsyncWebServer
フォルダを配置します
OLED ディスプレイライブラリ
- GitHub (Seeed-Studio/OLED_Display_96X96) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
OLED_Display_96X96-master
からOLED_Display_96X96
に変更します libraries
フォルダにOLED_Display_96X96
フォルダを配置します
JSON ライブラリ
ライブラリマネージャを開き、Arduino_JSON
をインストールします。
ArduinoJson
ではなく、公式の Arduino_JSON
を使用します。プラグインの導入
ファイルシステム書き込みプラグイン
HTML などのファイルを ESP32 のフラッシュ領域に書き込むには、Arduino プラグインが必要です。
ここでは、lorol/arduino-esp32fs-plugin: Arduino plugin for uploading files to ESP32 file system を利用します。
インストール方法は TWELITE SPOT マニュアル ESP32 へのファイルの書き込み方法 をご覧ください。
プロジェクトファイルの入手
- GitHub (monowireless/spot-server) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
spot-server-main
からspot-server
に変更します - 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.h | Arduino の基本ライブラリ | 省略できる場合もあるが念のため記載 |
Arduino_JSON.h | JSON 文字列を扱う | ArduinoJson とは異なる |
ESPmDNS.h | mDNS を使う | ホスト名を使うために必要 |
LittleFS.h | LittleFS ファイルシステムを扱う | ページ公開に必要 |
WiFi.h | ESP32 の WiFi を使う | |
Wire.h | I2C を使う | OLED ディスプレイ用 |
サードパーティのライブラリ
12-14行目では、サードパーティのライブラリをインクルードしています。
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <SeeedGrayOLED.h>
ヘッダファイル | 内容 | 備考 |
---|---|---|
AsyncTCP.h | 非同期 TCP 通信を行う | |
ESPAsyncWebServer.h | 非同期 Web サーバを立てる | AsyncTCP に依存 |
SeeedGrayOLED.h | OLED ディスプレイを使う |
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_RST | TWELITE の RST ピンが接続されているピンの番号 |
TWE_PRG | TWELITE の PRG ピンが接続されているピンの番号 |
LED | 基板上の ESP32 用 LED が接続されているピンの番号 |
ESP_RXD1 | TWELITE の TX ピンが接続されているピンの番号 |
ESP_TXD1 | TWELITE の 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_CH | TWELITE の 周波数チャネル |
TWE_APPID | TWELITE の アプリケーション ID |
TWE_RETRY | TWELITE の 再送回数(送信時) |
TWE_POWER | TWELITE の 送信出力 |
無線 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_BASE | SSID の共通部分の文字列 |
WIFI_PASSWORD | パスワード |
WIFI_CH | ESP32 の周波数チャネル |
WIFI_IP | IP アドレス |
WIFI_MASK | サブネットマスク |
HOSTNAME | ホスト名 |
グローバルオブジェクトの宣言
41-42行目では、グローバルオブジェクトを宣言しています。
AsyncWebServer server(80);
AsyncEventSource events("/events");
名称 | 内容 |
---|---|
server | 80番ポートで開く非同期 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 の |
createJsonFrom() <ParsedAppAriaPacket&> | App_ARIA の |
createJsonFrom() <ParsedAppCuePacket&> | App_CUE の |
createJsonFrom() <BarePacket&> | すべての |
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.");
}
引数 | 型 | 内容 |
---|---|---|
Serial2 | HardwareSerial& | TWELITE との通信に使うシリアルポート |
LED | int | ステータス LED を接続したピンの番号 |
TWE_RST | int | TWELITE の RST ピンを接続したピンの番号 |
TWE_PRG | int | TWELITE の PRG ピンを接続したピンの番号 |
TWE_CHANNEL | uint8_t | TWELITE の 周波数チャネル |
TWE_APP_ID | uint32_t | TWELITE の アプリケーション ID |
TWE_RETRY | uint8_t | TWELITE の 再送回数(送信時) |
TWE_POWER | uint8_t | TWELITE の 送信出力 |
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
です。
millis()
で取得した現在時刻を使用しています。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);
delay(100)
を省略すると初期化に失敗することがあります。ファイルシステムの設定
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バイトずつ読み出す関数です。
loop()
内で繰り返し Twelite.update()
を呼ぶことで、TWELITE 親機から送信されるパケットデータの解釈が進みます。パケットデータの解釈を終えた際に 上記
のようなイベントが呼ばれる仕組みです。delay()
などの処理でこの関数の呼び出しをブロックすると、パケットデータ文字列の読み出しが間に合わないことがあります。時間のかかる処理は必ず非同期の実装として、loop()
関数をできるだけ高速回転させるようにしてください。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行に分けて配置しています。
xs-
や sm-
などは画面の幅を指定します。レスポンシブデザインに活用できます。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:グローバル変数
ここからは各 HTML ファイルに対応したスクリプトの解説です。
例として、ここでは data/js/cue-viewer.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
- 公式サイト:Arduino - Home
ESP32
- 製品情報:ESP32 Wi-Fi & Bluetooth MCU I Espressif Systems
- データシート:esp32_datasheet_en.pdf
- Arduino 向けツールチェイン:espressif/arduino-esp32: Arduino core for the ESP32
- スタートガイド:Getting Started — Arduino-ESP32 documentation
- 導入方法:Installing — Arduino-ESP32 documentation
- API リファレンス:Libraries — Arduino-ESP32 documentation
- Wi-Fi API:Wi-Fi API — Arduino-ESP32 documentation
- チュートリアル:Tutorials — Arduino-ESP32 documentation
- トラブルシューティング:Troubleshooting — Arduino-ESP32 documentation
コミュニティ
ライブラリ
- 非同期 TCP:me-no-dev/AsyncTCP: Async TCP Library for ESP32
- 非同期 Web サーバ:me-no-dev/ESPAsyncWebServer: Async Web Server for ESP8266 and ESP32
- Seeed 96x96 / 128x128 OLED:Seeed-Studio/OLED_Display_96X96: Seeed OLED Display 96*96 library
プラグイン
- ファイル書き込み:me-no-dev/arduino-esp32fs-plugin: Arduino plugin for uploading files to ESP32 file system
- スタックトレース:me-no-dev/EspExceptionDecoder: Exception Stack Trace Decoder for ESP8266 and ESP32
Web関連
ECMAScript (JavaScript)
- API リファレンス:開発者向けのウェブ技術 | MDN
- ES2016以降のバージョン別互換性リスト:ECMAScript 2016+ compatibility table
コミュニティ
- CSS
- Web カラーとその配色例:世界の伝統色 洋色大辞典 - Traditional Colors of World
- Bootstrap のようなグリッドシステム:Flexbox Grid
- ニューモーフィズムな CSS ジェネレータ:Neumorphism/Soft UI CSS shadow generator
- ECMAScript
- グラフ描画:Chart.js | Chart.js
- リアルタイムストリーミングプラグイン:はじめに | chartjs-plugin-streaming
- 時計と時刻:Luxon Home
- グラフ描画:Chart.js | Chart.js
3.5.2.2 - WebSocketによる中継
spot-router
の解説です。3.5.2.2.1 - WebSocketによる中継
spot-router
の解説です。本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
ソースコードの入手
GitHub (monowireless/spot-router ) から入手できます。
システムの概要
spot-router は、TWELITE 親機が受信したデータに基づき出力した文字列(App_Wings の ModBus ASCII 形式)を WebSocket サーバへ転送します。
開発に必要なもの
- 無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
- 加速度センサー無線タグ TWELITE CUE
などの子機 (お持ちでない場合はご購入ください 👉 販売店一覧
)
- CR2032 コイン電池 などの電源
- USBアダプター TWELITE R3
(お持ちでない場合はご購入ください 👉 販売店一覧
)
- 通信用 USB-C ケーブル
- 💻 WebSocket サーバ
- 💻 開発用コンピュータ
環境整備
IDE とツールチェインの導入
Arduino IDE 1.x による開発環境の構築方法 をご覧ください。
ライブラリの導入
はじめに、Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:C:\Users\foo\Documents\Arduino
) に libraries
フォルダがない場合は、これを作成します。
WebSocket ライブラリ
- GitHub (Links2004/arduinoWebSockets) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、
libraries
フォルダにarduinoWebSockets-<バージョン>
フォルダを配置します
プロジェクトファイルの入手
- GitHub (monowireless/spot-router) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
spot-router-main
からspot-router
に変更します - 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.h | Arduino の基本ライブラリ | 省略できる場合もあるが念のため記載 |
WiFi.h | ESP32 の WiFi を使う |
サードパーティのライブラリ
8行目では、サードパーティのライブラリをインクルードしています。
#include <WebSocketsClient.h>
ヘッダファイル | 内容 | 備考 |
---|---|---|
WebSocketsClient.h | WebSocket クライアントになる |
MWings ライブラリ
11行目では、MWings ライブラリをインクルードしています。
#include <MWings.h>
ユーザ設定の定義
14行目では、config.h
をインクルードしています。
#include "config.h"
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_RST | TWELITE の RST ピンが接続されているピンの番号 |
TWE_PRG | TWELITE の PRG ピンが接続されているピンの番号 |
LED | 基板上の ESP32 用 LED が接続されているピンの番号 |
ESP_RXD1 | TWELITE の TX ピンが接続されているピンの番号 |
ESP_TXD1 | TWELITE の 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_CH | TWELITE の 周波数チャネル |
TWE_APPID | TWELITE の アプリケーション ID |
TWE_RETRY | TWELITE の 再送回数(送信時) |
TWE_POWER | TWELITE の 送信出力 |
グローバルオブジェクトの宣言
30行目では、グローバルオブジェクトを宣言しています。
WebSocketsClient webSocket;
名称 | 内容 |
---|---|
webSocket | WebSocket クライアントのインタフェース |
関数プロトタイプの宣言
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.");
}
引数 | 型 | 内容 |
---|---|---|
Serial2 | HardwareSerial& | TWELITE との通信に使うシリアルポート |
LED | int | ステータス LED を接続したピンの番号 |
TWE_RST | int | TWELITE の RST ピンを接続したピンの番号 |
TWE_PRG | int | TWELITE の PRG ピンを接続したピンの番号 |
TWE_CHANNEL | uint8_t | TWELITE の 周波数チャネル |
TWE_APP_ID | uint32_t | TWELITE の アプリケーション ID |
TWE_RETRY | uint8_t | TWELITE の 再送回数(送信時) |
TWE_POWER | uint8_t | TWELITE の 送信出力 |
イベントハンドラの登録
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 子機として設定したうえで、指定のネットワークへ接続しています。
while
文を出ません。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バイトずつ読み出す関数です。
loop()
内で繰り返し Twelite.update()
を呼ぶことで、TWELITE 親機から送信されるパケットデータの解釈が進みます。パケットデータの解釈を終えた際に 上記
のようなイベントが呼ばれる仕組みです。delay()
などの処理でこの関数の呼び出しをブロックすると、パケットデータ文字列の読み出しが間に合わないことがあります。時間のかかる処理は必ず非同期の実装として、loop()
関数をできるだけ高速回転させるようにしてください。WebSocket のデータの更新
103行目では、WebSocket のデータを更新する処理を呼び出しています。
webSocket.loop();
Twelite.update()
と同様に、delay()
などの処理でこの関数の呼び出しをブロックすると、データ更新が間に合わないことがあります。時間のかかる処理は必ず非同期の実装として、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
- 公式サイト:Arduino - Home
ESP32
- 製品情報:ESP32 Wi-Fi & Bluetooth MCU I Espressif Systems
- データシート:esp32_datasheet_en.pdf
- Arduino 向けツールチェイン:espressif/arduino-esp32: Arduino core for the ESP32
- スタートガイド:Getting Started — Arduino-ESP32 documentation
- 導入方法:Installing — Arduino-ESP32 documentation
- API リファレンス:Libraries — Arduino-ESP32 documentation
- Wi-Fi API:Wi-Fi API — Arduino-ESP32 documentation
- チュートリアル:Tutorials — Arduino-ESP32 documentation
- トラブルシューティング:Troubleshooting — Arduino-ESP32 documentation
コミュニティ
ライブラリ
プラグイン
ネットワーク関連
WebSocket
コミュニティ
3.5.2.3 - REST API の使用
spot-httpbin
の解説です。3.5.2.3.1 - REST API の使用
spot-httpbin
の解説です。本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
ソースコードの入手
GitHub リポジトリ monowireless/spot-httpbin から入手できます。
システムの概要
spot-httpbin は、TWELITE 親機が受信したデータの一部と NTP による現在時刻を HTTP GET リクエストとしてモックサーバへ送信し、そのレスポンスをシリアルモニタへ表示します。
開発に必要なもの
- 無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
- 磁気・温度・湿度センサー無線タグ TWELITE ARIA
などの子機 (お持ちでない場合はご購入ください 👉 販売店一覧
)
- CR2032 コイン電池 などの電源
- USBアダプター TWELITE R3
(お持ちでない場合はご購入ください 👉 販売店一覧
)
- 通信用 USB-C ケーブル
- 💻 開発用コンピュータ
環境整備
IDE とツールチェインの導入
Arduino IDE 1.x による開発環境の構築方法 をご覧ください。
ライブラリの導入
このサンプルでは、依存するライブラリをはじめから同梱しています。
src
フォルダの内容は IDE に表示されませんが、再帰的にビルドされます。プロジェクトファイルの入手
- GitHub (monowireless/spot-httpbin) から Zip ファイルをダウンロードします
- Zip ファイルを展開し、フォルダ名を
spot-httpbin-main
からspot-httpbin
に変更します - Arduino のスケッチブックの保存場所(Arduino IDE 環境設定に記載。例:
C:\Users\foo\Documents\Arduino
)にspot-httpbin
フォルダを配置します
ユーザ設定の変更
Arduino IDE 上部のタブから config.h
を開き、Wi-Fi の SSID と パスワードを設定してください。WPA2-PSK ネットワークを想定しています。また、ルート証明書も登録してください。ルート証明書は、Chrome などのウェブブラウザの各ページに対するセキュリティ画面から入手できます。
ルート証明書(拡張子.cer
)は、下記のような形式のテキストファイルです。
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
プロジェクトファイルの書き込み方法
ESP32 へのスケッチの書き込み方法 をご覧ください。
スケッチ
Arduino スケッチ spot-httpbin.ino
および config.h
の解説です。
ライブラリのインクルード
Arduino および ESP32 公式ライブラリ
4-6行目では、Arduino および ESP32 の公式ライブラリをインクルードしています。
#include <Arduino.h>
#include <WiFiClientSecure.h>
#include <WiFiUdp.h>
ヘッダファイル | 内容 | 備考 |
---|---|---|
Arduino.h | Arduino の基本ライブラリ | 省略できる場合もあるが念のため記載 |
WiFiClientSecure.h | ESP32 で SSL通信を行う | |
WiFiUdp.h | UDP 通信を行う | NTP に必要 |
サードパーティのライブラリ
9-10行目では、同梱されたサードパーティのライブラリをインクルードしています。
#include "src/NTPClient/NTPClient.h"
#include "src/Time/TimeLib.h"
ヘッダファイル | 内容 | 備考 |
---|---|---|
NTPClient.h | NTP サーバへアクセスする | |
TimeLib.h | エポック時間を変換する |
MWings ライブラリ
13行目では、MWings ライブラリをインクルードしています。
#include <MWings.h>
ユーザ設定の定義
16行目では、config.h
をインクルードしています。
#include "config.h"
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 | 電源電圧 |
linkQuality | LQI |
temp100x | 100倍された温度 |
humid100x | 100倍された湿度 |
ここでは、TWELITE ARIA を使用します。
config.h
再起動間隔の定義
config.h
の4行目では、ESP32 の再起動間隔を指定しています。
const uint32_t REBOOT_INTERVAL = 21600; // seconds
ここでは、21600秒=6時間としています。
長期間の運用では、メモリリークが累積して不具合を起こしてしまう場合があります。
そこで Wi-Fi ルータのように定期的な再起動を行うようにしています。
TWELITE 設定の定義
config.h
の7-8行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。
const uint8_t TWE_CH = 18;
const uint32_t TWE_APPID = 0x67720102;
名称 | 内容 |
---|---|
TWE_CH | TWELITE の 周波数チャネル |
TWE_APPID | TWELITE の アプリケーション 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_INTERVAL | NTP時刻の取得間隔 |
QUERIES_MAX_LENGTH | クエリ文字列の最大長(ヌル文字含まず) |
CONNECT_TIMEOUT | サーバへの接続時のタイムアウト |
RECONNECT_MIN_INTERVAL | Wi-Fiアクセスポイントへ再接続する際の最短間隔 |
SEND_MIN_INTERVAL | リクエスト間隔の最短間隔 |
REQUEST_TIMEOUT | リクエストからレスポンスまでのタイムアウト |
SEND_MIN_INTERVAL
は、NTP_UPDATE_INTERVAL
以上に設定しています。
リクエスト間隔が短いと、リクエスト間でタイムスタンプが重複してしまう可能性があるからです。
SEND_MIN_INTERVAL
を短くすると、連続してパケットを受信した場合にサーバへ負担をかけてしまいます。
必ず適度な間隔を空けてください。
ピン番号の定義
29-31行目では、ピン番号を定義しています。
static const int RST_PIN = 5;
static const int PRG_PIN = 4;
static const int LED_PIN = 18;
名称 | 内容 |
---|---|
RST_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の 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)
名称 | 内容 |
---|---|
client | HTTPS通信のインタフェース |
ntpUDP | NTP用のUDP通信のインタフェース |
timeClient | NTPのインタフェース |
グローバル変数の宣言
40-41行目では、グローバル変数を宣言しています。
static DataFromAria LatestDataFromAria;
static bool IsThereNewDataFromAria;
名称 | 内容 |
---|---|
LatestDataFromAria | TWELITE ARIA から受信した最新のデータ |
IsThereNewDataFromAria | TWELITE ARIA から新たなデータを受信したことを示すフラグ |
関数プロトタイプの宣言
44-56行目では、関数プロトタイプを宣言しています。
void anotherLoopForTWELITE();
void anotherLoopForNTP();
名称 | 内容 |
---|---|
anotherLoopForTWELITE | TWELITEのデータを処理するためのループ関数 |
anotherLoopForNTP | NTPで時刻を取得するためのループ関数 |
xTaskCreatePinnedToCore()
により、別のタスクとして登録しています。
void initTWELITE();
void initWiFi();
void initNTP();
名称 | 内容 |
---|---|
initTWELITE | TWELITEの初期化関数 |
initWiFi | Wi-Fiの初期化関数 |
initNTP | NTPの初期化関数 |
void onAppAriaPacket(const ParsedAppAriaPacket& packet);
名称 | 内容 |
---|---|
onAppAriaPacket | TWELITE ARIA からデータを受信した際のコールバック関数 |
void sendAriaData(const DataFromAria& data)
名称 | 内容 |
---|---|
sendAriaData | TWELITE 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
}
},
vTaskDelay()
を挿入しています。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);
}
下記リファレンスも合わせてご覧ください。
Twelite.begin()
mwings::MWings クラス | MWings API リファレンスTwelite.on()
mwings::MWings クラス | MWings API リファレンス
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 リクエストのクエリ文字列にセットして送信する関数です。
コードを簡潔とするために、HTTP GET を使用しています。
HTTP POST を使用される場合は、リクエストボディを追加してください。
サーバへの過度な負荷を防ぐため、高頻度でパケットが到着した際には送信をスキップしています。
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 スプレッドシートの利用
spot-google-sheets
の解説です。3.5.2.4.1 - Google スプレッドシートの利用
spot-google-sheets
の解説です。なお、このスケッチでは ESP32 の Arduino 環境から FreeRTOS の機能を利用しています。本稿では、サードパーティのオープンソースソフトウェアを使用します。
サードパーティのソフトウェアについて、その詳しい使用方法を弊社からご案内することはいたしかねます。また、サードパーティのソフトウェアを使用されたことによるいかなる損害についても、弊社は一切の責任を負いません。
ソースコードの入手
GitHub (monowireless/spot-google-sheets ) から入手できます。
システムの概要
TWELITE SPOT は、事前に作成したサービスアカウントを使って自動的にスプレッドシートを作成し、指定したユーザアカウントへ、そのファイルを共有します。
ユーザアカウントへログインすると、Google ドライブの「共有アイテム」ページから、TWELITE SPOT によって作成されたスプレッドシートを閲覧・編集できます。

作成されるスプレッドシートのイメージ
TWELITE SPOT は、作成したスプレッドシートへデータ行を次々と追加していきます。
2023年5月現在、Google Sheets / Drive API の利用に追加料金はかかりません。
ただし、クエリの数などを定めた使用量上限(Sheets API / Drive API )があります。
例えば Google Sheets API では、リクエストを毎分60回以内に押さえなくてはなりません。超過したリクエストはエラーとなります。
サービスアカウントは、アプリケーションが使用するための Google アカウントです。
詳しくは Google による解説 をご覧ください。
開発に必要なもの
- 無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
- 温湿度センサー無線タグ TWELITE ARIA
(お持ちでない場合はご購入ください 👉 販売店一覧
)
- CR2032 コイン電池
- USBアダプター TWELITE R3
(お持ちでない場合はご購入ください 👉 販売店一覧
)
- 通信用 USB-C ケーブル
- 💻 開発用コンピュータ
- Google アカウント
本稿では TWELITE ARIA を使用しますが、ソースコードを改変することで TWELITE CUE などの子機にも対応できます。
ただし、シートへ書き込むデータが増える場合は、API の 使用量上限 に気を配る必要があります。
環境整備
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の有効化を行う画面の例
Drive API の有効化
TWELITE SPOT からスプレッドシートを共有するために、Drive API を有効化します。
下記のリンクにアクセスし、API を有効化してください。
https://console.cloud.google.com/apis/library/drive.googleapis.com

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