ここではtelemetra-1の構成と設定方法について説明します。

プログラム w355 (/home/pi/telemetra/w355)

ADXL355を制御して加速度データを収集するプログラムです。root権限で実行する必要があります。 標準仕様では、サンプリングレート1KHzの段階でFIRディジタルフィルタをかける、FIR LPF版です。 使用方法は次の通りです。

sudo /home/pi/telemetra/w355 (-dhuvwz) (-r range) [sr] [ch] [key] [size]

オプション
-d LEDを点滅させない。このLEDは筐体内上部にあり、w355が約30サンプル/chをADXL355から 取り込む毎に青色点滅するもので、w355の動作を示します。FIR LPF版では常に1KHzでデータの取り込みが 行われるので、LEDは毎秒30回以上点滅するため薄く連続点灯に見え、また1秒毎の処理のために毎秒1回明るくなります。
-h ハイパスフィルタを有効にする。カットオフ周波数(-3dB)は 0.04Hz です。
-r range 測定範囲モードをrangeで指定する。rangeの値は、2G, 4G, 8G モードに対応して それぞれ2, 4, 8のいずれか。このオプションを指定しないと2Gモードになる。
-u 使用法を表示する。
-v プログラムのバージョンを表示する。バージョン番号の末尾に 'f' がついているのがFIR LPF版です。
-w ウォッチドッグタイマ―を有効にする。
-z アンチエリアシング・ローパスフィルタを直線位相特性にする。このオプションを指定しないと 最小位相特性になる。

w355は加速度データをサンプリングレートsr(Hz)で取り込み、X, Y, Zの3成分データを chから始まる3チャネルの WINフォーマット データとして、大きさsize(KB)でキーkeyをもつ共有メモリに、巡回的に書き込みます。 srとして指定できるのは 100, 200, 500, 1000 のいずれか、chは 16進数 (0000-FFFD)です。keyは32ビット整数値です。

なお、w355が共有メモリに書き込む形式は、時間順に整列された 「order出力側の形式」ですので、 直接wdiskプログラムで1分ファイルに出力できます。

サンプリングレートとローパスフィルタについて

サンプリングレートとしては 100, 200, 500, 1000 (Hz)が指定できます。 ADXL355は内部クロックで動作し、この内部クロック周波数は1%程度のばらつき(個体差)をもちます。 ADXL355には、アナログローパスフィルタ、AD変換器、2段のディジタルローパス間引きフィルタ、 ディジタルハイパスフィルタ(オプションで使用)、ディジタル内挿フィルタが内蔵されています。 ADXL355はRaspberry Piのシステムクロックから生成したサンプリングレートのクロックを外から与えられ、 それに同期してデータを出力します。すなわちADXL355は、内部クロックでサンプリングしたデータを、 最終段階(1000Hz)で外部サンプリングレートクロックに合わせて出力するためにディジタル内挿フィルタを使います。 Telemetra-1のタイムスタンプはサンプリングレート1000Hzの段階で付加されるため、その付加誤差は1ms以内です。

w355はADXL355から1000Hzのレートで出力されたデータに、FIR型のアンチエリアシング・ローパスフィルタを かけてから、所要のサンプリングレートになるよう間引いて出力します。デフォルトでこのフィルタは 最小位相特性です。

このフィルタの特性は下記の通りです。上段の図はインパルスレスポンス(横軸はSR=1KHzのサンプル数)、 下段の図は振幅周波数特性(横軸Hz)で、線の色は緑が最小位相特性、青が直線位相特性です (振幅特性は同じなので重なっている)。 直線位相特性の場合、タイムスタンプは係数長の半分だけずらしてピーク位置をゼロにしてあります。 いずれのサンプリングレートでも、振幅特性はサンプリングレートの40%で約-6dB、50%(ナイキスト周波数)で約-120dB (≒1/220)です。

なお、共有メモリに書き込まれたデータを WINシステム の既存プログラムで利用する場合、500Hz以上のサンプリングレートでは 正常に扱えない場合があるので注意が必要です。UDPパケットサイズをMTU(1400~1500バイト程度) の許す範囲に収めるためには、 send_raw 等による伝送はサンプリングレート200Hz以下が無難です。

チャネル番号chについて
16進数で指定します。X, Y, Z 成分のデータがそれぞれ ch, ch+1, ch+2のチャネル番号 で出力されます。
共有メモリについて
共有メモリはプロセス間でデータをやりとりするために使われる、名前(すなわちキー番号key)と大きさ (size)をもつメモリ領域です。keyは32ビットの整数値、sizeはKB単位で指定します。 もし既存ならそれが使用され、なければ新たに生成されますが、既存でも指定した大きさが既存のそれより大きければ エラーになります。その場合は一旦既存の共有メモリを削除する必要があります。共有メモリのリストは ipcs -m(キー番号は16進数で表示されることがあるので注意)、共有メモリの削除はipcrm -M keyで 行えます。sizeは、少なくとも10秒分のデータが入る大きさが必要です。たとえばサンプリングレート100Hz の場合、4バイト×3チャネル×100Hz×10秒で12KBですが、余裕を見て100KB程度を指定しておけばよく、 サンプリングレート1000Hzだとその10倍になります。
実行例

sudo /home/pi/telemetra/w355 100 9700 11 100

サンプリングレート100Hz、チャネル番号 9700,9701,9702のデータを大きさ 100KBの共有メモリ (キー 11番)に巡回的に書き込みます。

動作確認
shmdumpコマンドを使って 共有メモリにデータが書き込まれていることを確認できます。例えば、

shmdump 11

ウォッチドッグタイマ―について

ウォッチドッグタイマ―はRaspberry Piに備わった機能で、使用開始設定後は、定期的なリセット操作が 行われないと10数秒後にRaspberry Pi自体が再起動します。w355はオプション-w付きで起動すると ウォッチドッグタイマ―を使用開始設定し、以降1秒分のデータを出力するたびにリセット操作を 行います。w355が何らかの原因でデータを出力しなくなるとリセット操作が行われなくなり、 10数秒後にRaspberry Piが再起動します。ただし、w355プログラムが動作中に止まることは ほとんどないと思われ、またウォッチドッグタイマー使用中はリセット操作が行われるたびに (つまり毎秒)/var/log/syslog/kern.log と /var/log/syslog/syslogに1行のメッセージ ("watchdog0: watchdog did not stop!")が書き込まれてログファイルが膨らむために、初期設定では -wオプションを付けていません。

なお、オプション-wの有無にかかわらず、w355は起動時してから最初のデータを 出力するまでの間、ウォッチドッグタイマーを使用しています。これは一部のADXL355で初期化時に 止まる事例が見られたためです。

プログラムの更新について(2020.6.15追記)
w355プログラムの新しいバージョンが発行されたときは、 そのバイナリファイルが

https://telemetra.jp/support/raspi/CPUシリアル番号

という名前のディレクトリ(webサイト)に置かれます。 このサイトを閲覧するにはユーザー名とパスワードによる認証が必要ですが、 ここは下記の「設定ファイルと実行」の項の webサーバーからの読み込み(getconf.sh) で使われるダウンロード用ディレクトリと同じものですので、 ユーザー名とパスワードは/home/pi/telemetra/getconf.sh内に 書いてあるものをお使いください。

w355プログラムのファイル名は「w355_20200219f」のようにバージョン名が 付加されたものです。 ここから最新版プログラムをダウンロードし、w355という名前にコピーして お使いください。なお、バージョン名の最後に「f」が付くのが 標準仕様のFIR LPF版、付かないのがFIR LPFを持たない版です。 周波数特性が明確でエリアシングを回避できるFIR LPF版の使用をお勧めします。

プログラムのソースについて
w355プログラムのソースは(公開したほうが得策と判断できるまでは)非公開として います。現在のところ、w355プログラムは別のRaspberry Pi個体では実行できません。 ←20220327版以降にこの制約はありません。

設定ファイルと実行

設定ファイル/home/pi/_win
/home/pi/_winには常時実行するべきプログラムのコマンドラインが書かれています。 コマンドラインの行末には "&" が必須です。行頭に"#"を書くとコメントになります。 この中にw355は必須です。例えば次のような内容です。

# _win
#
sudo /home/pi/telemetra/w355 100 9700 11 100 &
/usr/local/win/bin/send_raw -1b 1400 11 telemetra.jp 9000 &

ここでは前述の例と同じプログラムw355と、サーバー telemetra.jp のUDPポート 9000へデータを送信するプログラム send_rawが設定されています。

シェルスクリプト/home/pi/monitor_procs
/home/pi/_winに設定されたプログラムを起動し、実行状態を監視するのが/home/pi/monitor_procsです。 /home/pi/monitor_procsは ユーザー pi の crontab で毎分実行するように設定されており、/home/pi/_winに書かれているプログラムのうち 実行されてないものがあれば、それを起動します。
なお、WINシステムにもmonitor_procs(/usr/local/win/bin/monitor_procs)が含まれており、同じ名前ですが /home/pi/monitor_procsのほうがRaspberry Pi環境用に改変したものですからこちらを使ってください。

ユーザー pi の crontab

定期的(または定時)に実行される2つのスクリプトが設定されています。 例えば、

* * * * * $HOME/monitor_procs > /dev/null 2>&1
6 * * * * $HOME/telemetra/getconf.sh > /dev/null 2>&1

このうち、毎分実行される/home/pi/monitor_procsについては上記の通りです。 システム起動後最初のプログラム実行もこれによって行われますので、Raspberry Piが起動したと 思ってもw355の実行開始(LED点滅で確認できる)はその1分近く後になることもあります。

1時間に1回(上の例では毎時6分)に実行される/home/pi/telemetra/getconf.shについては 次項で説明します。このスクリプトは毎時1~9分(個体による)に設定されています。

設定ファイルの設定(読み込み)

USBメモリからの読み込み
「Raspberry Piの設定」で説明した通り、ボリュームラベルが"TELEMETRA"である USBメモリを挿して起動すると、そのUSBメモリのCPUシリアル番号名ディレクトリがあればその中から、 なければルートディレクトリから、プログラム/home/pi/telemetra/w355と設定ファイル /home/pi/_winが、他の2つのネットワーク関係のファイルと共に読み込まれます。 ただし/home/pi/telemetra/w355については タイムスタンプが既存のファイルよりも新しい場合のみです。 OverlayFS化されている場合もmicroSDドライブを一時的にRWマウントして保存します。 1つのUSBメモリで複数のTelemetra-1を管理設定する場合には「CPUシリアル番号名ディレクトリ」が便利です。
webサーバーからの読み込み(getconf.sh)
ユーザー pi の crontab に毎時実行が設定されているスクリプト/home/pi/telemetra/getconf.sh では、初期設定でテレメトラのwebサーバー telemetra.jp を利用するように設定されています。 telemetra.jp のダウンロード用ディレクトリには、各Telemetra-1のCPUシリアル番号名ディレクトリが 置かれていて、/home/pi/telemetra/getconf.shはここを読みに行きます。このディレクトリは 出荷前の製品試験用に用意しているもので、しばらくの間は存在しますが継続的な運用は保証しません。 利用者の皆さんは必要に応じて/home/pi/telemetra/getconf.shを参考に自前のサーバー用に 改変されるようお願いします。

現在の/home/pi/telemetra/getconf.shの機能は次の通りです。

  • command.shという名前のファイルがあればダウンロードして実行する。
  • 既存の/home/pi/_winより新しいタイムスタンプの_winがあればダウンロードして更新する。
  • 既存の/home/pi/telemetra/w355より新しいタイムスタンプのw355があればダウンロードして更新する。
/home/pi/_win/home/pi/telemetra/w355の更新の場合、OverlayFS化されていれば microSDドライブを一時的にRWマウントして保存します。

設定されたファイル、ダウンロード用のディレクトリ、サーバーが見つからないときは /home/pi/telemetra/getconf.shは何もしません。

この機能を利用しないときはcrontabから削除してください。

端末からのコマンドラインによる設定
HDMIモニタ、USBキーボード/マウスを接続したり、ssh接続すれば、もちろんコマンドライン での設定操作が可能です。その際、OverlayFS化モードだと再起動で設定が前回起動状態に 戻ることに注意してください。
端末からいろんな設定を試してみる場合は、次のことにご注意ください。
/home/pi/_winに設定されたプロセスの実行状態は/home/pi/monitor_procs listで表示されます。 /home/pi/_winに設定されたプロセスの終了は、/home/pi/monitor_procs killで行えます。 ただし、/home/pi/monitor_procs/home/pi/_winの中での設定と違う引数で起動された同名の プロセスを検知しませんので、/home/pi/_winを変更後に自動起動されたプロセスは、旧設定によるそれと 2重起動になっている可能性があります。操作の際は、一時的にcrontabによる毎分の/home/pi/monitor_procs 実行を止めること、変更前の旧プロセスはsudo killall w355, killall send_raw等で確実に終了させておくことをお勧めします。
ページのトップへ戻る