*******  このページは旧版です。現行ページは こちら  *******

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

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

ADXL355を制御して加速度データを収集するプログラムです。root権限で実行する必要があります。 使用方法は次の通りです。

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

オプション
-d LEDを点滅させない。このLEDは筐体内上部にあり、w355が約30サンプル/chをADXL355から 取り込む毎に青色点滅するもので、w355の動作を示します。
-f サンプリングレートを固定する(fixedモード)。
-t サンプリングレートをなるべく一定にする(trackモード)。
-h ハイパスフィルタを有効にする。カットオフ周波数(-3dB)は、サンプリングレート100, 125, 500 Hzのとき 0.02 Hz、200, 250, 1000 Hzのとき0.04Hzです。
-r range 測定範囲モードをrangeで指定する。rangeの値は、2G, 4G, 8G モードに対応して それぞれ2, 4, 8のいずれか。このオプションを指定しないと2Gモードになる。
-u 使用法を表示する。
-v プログラムのバージョンを表示する。
-w ウォッチドッグタイマ―を有効にする。

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

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

サンプリングレートについて

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

ADXL355は内部クロックでサンプリングしたデータを、最終段階で外部サンプリングレートクロックに 合わせて出力するためにディジタル内挿フィルタを使います。なお、出力サンプリングレート125, 250, 500, 1000 Hz のデータはそれぞれ内部で(ほぼ同じ周波数である)125, 250, 500, 1000 Hzサンプリングのデータから内挿補間により 生成されますが、出力サンプリングレート100, 200 Hzのデータは、それぞれ内部で(やや異なる)125, 250 Hz サンプリングのデータから、やはり内挿補間により生成されます。

Raspberry Piのシステムクロックの周波数はADXL355の 内部クロックよりも正確ですが、NTPで較正されているシステム時計によりデータに毎秒の タイムスタンプをつける際、たまに(1%以下の頻度で)1秒間のサンプル数が指定したサンプリングレートと±1だけ ずれることがあります。これは、サンプリングレートのクロックの立ち上がりがシステム時計の秒刻みとは 必ずしも合っていないためです。Telemetra-1のタイムスタンプ誤差が「サンプリング間隔以下」 であるのも同じ理由です。デフォルトでw355は特に何もせず、その1秒間のデータ数が 指定されたサンプリングレートよりも±1だけ違い、その秒のチャネルヘッダーにもサンプリングレート としてその値が書かれます(WINフォーマット のサンプリングレートは形式的に毎秒可変で、以降の処理でも 通常特に不都合はありません)。これがもっとも素直な対応です。それに対し、オプション-f を指定すると、w355は常に指定されたサンプリングレートでデータを出力しますが、そのために、 余分になった1サンプルを廃棄したり、足りなくなった1サンプルを1サンプル前の値で代用します。 この操作は時間軸上での歪となりますからお勧めしませんが、サンプリングレートが必ず一定でないと後処理に不都合な場合には 利用できます。オプション-tはデフォルト動作よりもやや許容範囲を拡げるのでサンプリングレート 増減の頻度は減りますが、基本的にはデフォルト動作と同じですのでやや中途半端な処理です。

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

チャネル番号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で初期化時に 止まる事例が見られたためです。

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

設定ファイルと実行

設定ファイル/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等で確実に終了させておくことをお勧めします。
ページのトップへ戻る