TWELITEのAppTag OTAを使ってみる

AppTag OTAを使ってみる

無線タグをリモートで設定できます。纏まっているドキュメントがないのでメモ書きです。TWELITEは低消費電力、安価、使いやすい無線マイコンです。センサネットワークの構築がとても楽です。過去に Sun Microsystems の SunSPOTを触ってましたけど、それぐらい簡単です。センサネットワークのアプリもスマホのアプリのように用意されているので、いろいろ遊ぶことができます。もちろん、C言語で実装もできます。見た感じデータリンク層まで触れそうです。なので、メッシュネットワークや新たなNWトポロジ構成方式を評価できるかもしれません。JavaやC#では組めなさそうですが、アクト act というコードを簡素化するできるソリューションが用意されます。IEEE802.15.4に準拠しています。 enjoy it!

デバイス
・TWELITE BLUE USBタイプ (MONOSTICK)
・TWELITE 2525A

一般的にセンサネットワークはOver the Air(OTA)機能があり、遠隔地からリモート設定できるよう設計されています。MonoWirelessさんからOTA用のファームウェアをここからダウンロードします。
→ App_Tag_bin_2_1_5.zip

圧縮ファイルを展開した後にOTAのファームウェアを TWELITE Stage で書き込みます。
OTAのファームウェアをMONO STICK(以下MS)へ書き込みします。
対象は下記のファームウェアです。H/Wに合わせてどちらか選択します。
ファームウェアの配置場所は <インストール場所>\MWSTAGE\BIN\*.bin です。
・App_Tag-Parent-BLUE-OTA.bin
・App_Tag-Parent-RED-OTA.bin

ファームウェアを書き込むときは、パソコンのUSBポートへMSをさして、TWELITE Stage を起動するだけです。基本、特別な設定は不要でした。(COMポート選択など手動設定も可能です)
パソコンにUSB-Serialデバイスが追加されます。

ファムウェアの書き込みが終わったら、パソコンからMSを取り外します。
再び、パソコンへMSをさすと赤いLEDが点灯します。
シリアルコンソールを開いてCOMポートに接続します。
データ:8bit
データレート:115200 bps
パリティ: None
ストップ: 1bit
フロー制御: なし

エンターキーを押します。
----
--- CONFIG/App_Tag V2-01-5/SID=0x810b5c57/LID=0x00/RC=10000/ST=0 ---
 a: set Application ID (0x67726305)
 i: set Device ID (--)
 c: set Channels (15)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0xA5A5A5A5)
 o: set Option Bits (0x00000011)
 d: set Sleep Dur (500)
 w: set Sensor Wait Dur (0)
 m: set Sensor Mode (0x35)
 p: set Sensor Parameter (15)
 P: set Sensor Parameter2 ( )
---
 S: save Configuration
 R: reset to Defaults
 *** POWER ON END DEVICE NEAR THIS CONFIGURATOR ***
----

さて設定していきましょう。
()はTWELITE2525Aのデフォルト設定値です。

■o: set Option Bits (0x00000011)
各種詳細設定ができます。 センサーの動きを変更する。

注)AppTagを使うときは 10 のフラグを立ててはいけません。
  簡単アプリ用に工場出荷時では10になってますでの、ハマりました...
  ほかのパラメータが悪さしていると思ったらここでした。   

■w: set Sensor Wait Dur (0)
起床後センサ情報が安定するまでの待ち時間の設定
温度センサやアナログセンサが安定するまでの時間をミリ秒で設定します。

■m: set Sensor Mode (0x35)
センサ種別の設定、センサを16進数で設定できます。
センサ種別の定義一覧があります。
今回は ADXL34x 加速度センサーなので 0x35 を使います。
さらに、ADXL34x専用の動作モードを選択できます。
初期値は 下記の通り 15 です。
15: Tap[1] + Double Tap[2] + Free Fall[4] + Active/Inactive[8] モードです。
→ 15 = 1 + 2+ 4 + 8 ということですね。

■p: set Sensor Parameter (15)
センサ固有パラメータの設定
センサごとに決められたパラメータの設定をします。0以上の10進数で指定できます。
今回は Active/Inactive[8] を使いたいので8へ変更します。
各種定義一覧はここを見てください。
----
--- CONFIG/App_Tag V2-01-5/SID=0x810b5c57/LID=0x00/RC=10000/ST=0 ---
 a: set Application ID (0x67726305)
 i: set Device ID (--)
 c: set Channels (15)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0xA5A5A5A5)
 o: set Option Bits (0x00000011)
 d: set Sleep Dur (500)
 w: set Sensor Wait Dur (0)
 m: set Sensor Mode (0x35)
 p: set Sensor Parameter (8)*
 P: set Sensor Parameter2 ( )
Ss---
 S: save Configuration
 R: reset to Defaults
 *** POWER ON END DEVICE NEAR THIS CONFIGURATOR ***

Input Sensor Parameter(-32767 - 32767): 8
->8

!INF FlashWrite Success
!INF RESET SYSTEM...

*** App_Tag (ED_Inp) 2.01-5 ***
* App ID:6772405 Long Addr:81f5f57 Short Addr 0f0f LID 00 Calb=10000

*** Entering Config Mode ***
----

[p] キー →  [8] キー で設定します。

MSの近くで無線タグの電源を入れると、MSの黄と赤のLEDが点灯します。
接続に成功すると下記のメッセージが表示されると思います。
----
!INF REQUEST CONF FROM 810AD92B FW_VER:2.1.5
>>> TxCmp Ok(tick=50390,req=#1) <<<
!INF ACK CONF FROM 999FF99F
SUCCESS 999FF99F
----
このとき、設定が保存されます。

(おわり)

何かモノができたらメモを書きたいと思います。



PowerShellでプログラムを実行して、優先度を上げるときのやり方

こんな書き方があります

arma3server_x64.exeの一例になります。
# プログラムの起動引数を定義
[string]$_arguments = "-config=server.config -cfg=basic.cfg"

# プロセスの設定を定義
$_startInfo = New-Object System.Diagnostics.ProcessStartInfo
$_startInfo.FileName = "arma3server_x64.exe"

# プログラムの起動引数を設定
$_startInfo.Arguments = $_arguments
$_startInfo.WorkingDirectory = "C:\arma3"

# プロセスのインスタンスを生成
$_process = New-Object System.Diagnostics.Process

# プロセスの設定を格納
$_process.StartInfo = $_startInfo

# プログラムを実行する
$_process.Start()

# 優先度の設定を「高」にする(注1)
$_process.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::High

# プログラムが終了するまで待機(注2)
$_process.WaitForExit()
注1:プログラムを実行したあとに優先度の設定を行ってください。例外が発生した後、通常の優先度でプログラムを実行します。
注2:プログラムが4KB以上の標準出力を行う場合は、フリーズするため内部バッファをクリアしないと「応答なし」になります。 arma3server_x64.exe は標準出力がないので問題ありません。

ミッションスクリプトからローカルのテキストファイルを読み込みたい

まとめ

loadFile 関数で読み込める
-filePatching 引数をつけてArma3を起動する必要がある
UTF-8も読み込めるので日本語も読めます

概要

手軽に News を表示したいので、ローカルのテキストファイルを読み込みます。ローカルのテキストファイルを読み込むにはFilePatching を有効にします。テキストファイルは、Arma 3インストールフォルダの配下の任意の場所へ配置します。
ちなみに、loadFile はサーバーサイドのSQFファイルを読込み、実行/プリコンパイルするために良く利用されている関数です。クライアントに見せたくないスクリプトをサーバーだけに配置できる利点があります。

事前準備

引数を指定して、arma3server_x64.exe を起動しましょう(例: arma3server_x64.exe -filePatching)。基本はサーバーで読み込んで、 publicVariable で各クライアントで配信すればよいですね。
Arma 3インストールフォルダの配下に、「news」というフォルダを作成し、「docs」フォルダの中へ、news.txt を置いておきます。

コード

コードはシンプルです。

// グローバル変数を初期化する
if (isNil "TSAN_NEWS_STRING") then {
TSAN_NEWS_STRING = "";
};

// サーバーのローカルに存在するテキストファイルを読み込む
TSAN_NEWS_STRING = loadFile "docs\news.txt";

// サーバーのログファイル(RPTファイル)に news.txt のテキストを表示する
diag_log [TSAN_NEWS_STRING];

// JIPを考慮してクイアントにテキストを配信(配信したいなら)
publicVariable "TSAN_NEWS_STRING";


今回はテキストファイルを読み込んでプレーン状態で利用していますが、 htmlファイルを読み込みしてブリーフィング画面に表示すると、更にリッチなドキュメントを表示できます。htmlLoad 関数で http経由で html ファイルを開けますが、制限事項が多いので試しませんでした。

留意点

原則、Arma 3のインストールフォルダより上位の階層は参照できません。
UTF-8ファイルを読み込むとき、127文字以上の文字列を渡すとテキストファイルを正しく読み込まれません。

こんなやり方も

更新頻度が高いときは、extDB or Intercept Database + MariaDB もありです。最終的に私はこの方式を採用しました。これから構築するなら、APIがフレンドリーなIntercept Databaseがおすすめです。私は最終的にこの方式を採用しました。楽しい Arma 3 スクリプティングを!

https://community.bistudio.com/wiki/loadFile
https://github.com/intercept/intercept-database

ARMA3のラグを軽減するテクニック

まとめ

WindowsOS向けの設定になります
Arma3のネットワークに関するラグを軽減できます
サーバーおよびクライアントの両方で設定できます

概要

Windowsは、データグラムのサイズに応じて、高速I/Oまたは送信バッファを経由して送信されます。高速I/Oは、メモリをマッピングしてI/Oサブシステムを経由せず、データをコピーしてI/Oサブシステムを経由することを意味します。少量のデータ送信に有利です。

Arma3の既定の設定は、最大パケットサイズを1400バイトで送出するため、1024バイト以上のパケットサイズでも高速I/Oを利用するようにします。

設定内容

1. Windows Registryを下記の様に変更します。[HKLM\System\CurrentControlSet\Services\AFD\Parameters]

2. DWORD (32ビット)値を新規作成します。

3. 名前を FastSendDatagramThreshold にして、値データを1500 (10進数) 以下にします。

4. 最後にWindowsを再起動します。

LogicoolのハンコンがPCゲームで動作しない

いろいろつまづいて

Logicool G Driving Force Racing Wheel (例えば G29)がPCゲームで動作しないとき、Steam Input が影響して正しく動作しないことがわかりました。私が影響を受けたゲームは下記のゲームでした。もちろんですが、DRIVING FORCE SHIFTERも同様に動作しません。

Assetto Corsa Series
Project Car Series

具体的な症状としては、ゲームアプリケーション上ではデバイスを認識していますが、キーが無反応になります。

解決方法

Steam Input (Steam 入力) を強制オフにすることで正しく動作します。

Logicool G HUB を入れても正しく動作します。

旧ドライバーソフトウェアの Logicool® ゲームソフトウェア でも正しく動作すると思います。もし、当該問題により、わざわざインストールした人は Logicool® ゲームソフトウェア をアンインストールして、Logicool G HUB をインストールすると良いですね。

下記の通り、Steam 入力を強制オフにします。

TWELITEのAppTag OTAを使ってみる

AppTag OTAを使ってみる 無線タグをリモートで設定できます。纏まっているドキュメントがないのでメモ書きです。TWELITEは低消費電力、安価、使いやすい無線マイコンです。センサネットワークの構築がとても楽です。過去に Sun Microsystems の SunSPOTを...