トップ «前の日記(2008年08月30日) 最新 次の日記(2008年09月02日)» 編集

のろのろのろ雑記


2008年08月31日 [ColdFire] ColdFire×P2P地震情報(4) オフセット(基準点)を求める

_ [ColdFire] ColdFire×P2P地震情報(4) オフセット(基準点)を求める

 Interface 9月号付録基板を使い,P2P地震情報のサービスを作ってしまう勝手な企画です.過去の記事は,タイトルのColdFireカテゴリからどうぞ.

前回・前々回のおさらい

  • 地震計として使うためには,「ズレ」「ノイズ」「サンプリング間隔」の3点を考える必要があるようです.
    • タイマを使うことで,サンプリング回数を保つことがそれなりにできました.

"設置の傾き"と"0 gの電圧差"の問題をまとめてクリアする

 前々回,『加速度センサによる0 gの電圧差は約±200 Galの差として現れることがあります.』と記しました.これは,オフセットを求めればすぐ解決します.電圧差が短時間で変化しないことが前提になりますが,「ここが0 gなんだよ」と教えてやれば良いのです.

 しかし,もうちょっとひねりましょう.基板が傾いて設置されているかもしれませんし,時間の経過とともに傾きが変わるかもしれません.さらに,求めたいのは「重力を取り除いた地震による加速度」です.

 つまり,傾きがどうであれ「"各軸に重力が掛かって静止している状態"が"地震計にとっての0 g"」,求めるべきは静止状態のオフセット,ということです.そうすれば,0 gの電圧差や傾いた設置の問題をまとめてクリアできます.

静止状態のオフセット

 静止状態のオフセットを出来るだけ正確に求めるには,静止したまま何サンプルか取って平均値を求めるのが良いでしょう.

calibration() {
  int i; long *avg;
  avg = MemoryAlloc(12);
  avg[0]=0;avg[1]=0;avg[2]=0;
  InitAd(0x70);
  for (i = 0; i < 30; i++) {
    avg[0] += GetAd(4); avg[1] += GetAd(5); avg[2] += GetAd(6);
    Sleep(10);
  }

  for (i = 0; i < 3; i++) {
    avg[i] = avg[i] / 30;
    PrNum(avg[i]); PrStr(",");
  }
  MemoryFree(avg);
}
2018,2058,2825,
OK

 ポインタ配列が登場していますが,その話はここではしません.30サンプルを足して30で割ることで平均値を求めました.地震による加速度の変化を調べるには,"最新サンプルの値 - 平均値"を計算することで実現できます。

 しかし,時間の経過によって基板の傾きが変わったり,地震によって傾いたまま戻らないケースも考えられます.これに対応するには、オフセットとなる平均値をサンプリング毎に再計算すると良いでしょう.

main(){
  int i,index;
  int *sample=MemoryAlloc(60); long *offset=MemoryAlloc(12);
  // init
  InitAd(0x70); index=0;
  for(i=0;i<3;i++)offset[i]=0;
  for(i=0;i<30;i++)sample[i]=0;
  // loop
  #stop 0
  for(;;) {
    if(Getc(0)!=0)break;
    index=(index+1)%10;
    for(i=0;i<3;i++){
      offset[i]-=sample[i*10+index];
      sample[i*10+index]=GetAd(i+4);
      offset[i]+=sample[i*10+index];
      PrNum(sample[i*10+index]-offset[i]/10);PrStr("(avg:");
      PrNum(offset[i]/10);PrStr("), ");
    }
    PrStr("\r\n");
  }
  MemoryFree(sample);MemoryFree(offset);
}
4(avg:2006), 19(avg:2072), 8(avg:2812),
0(avg:2006), 18(avg:2075), -17(avg:2811),
6(avg:2007), 5(avg:2075), -1(avg:2808),
-2(avg:2007), -18(avg:2076), 9(avg:2810),
7(avg:2008), 4(avg:2076), 8(avg:2810),

OK

 例として,最新10サンプルの平均値をオフセットにしました.シェイクすればきちんと変動しますし,傾きを変えても適応していきます.このような平均値の求め方を『移動平均』と呼びます.

 移動平均をオフセットにすると,副作用として「非常にゆっくりとした加速度の変化は,オフセットが追従するために値として現れなくなる」ということがあります.一種のフィルタとして作用するわけです.

080831_filter.png

 数パターンの特性と,気象庁が計測震度の計算に用いているフィルタの特性を上記に示します.凡例は "サンプリング周波数 / オフセットに使う移動平均サンプル数" を表しています.

 これを見ると,"10Hz / 10Samples"や"20Hz / 20Samples"の低周波数帯(1Hz以下)の特性が気象庁フィルタの特性とほぼ一致していることが分かります.なかなか面白いことになってきました.

 特性はノイズ対策の辺りに回すとして,これで"0 gの電圧差"問題は解決としましょう.

今回のまとめ

  • "0 gの電圧差""傾いた設置"の問題は,静止した状態を"地震計にとっての0 g"と考えることでクリアしました.
  • 時間の経過による傾きの変化などは,移動平均を用いることでクリアしました.

参考