|
角速度を計算する方法を説明します。以下手順で計算します。
①センサ特性
先ずはセンサ特性を把握する必要があります。センサの特性は以下のとおり。
・電源電圧 : 2.7~5.25V
・検出範囲 : ±300deg/sec
・静止時 : 1.35V
・感度 : 0.67mV/deg/sec
・リニアリティ: ±5%
・応答性 : 50Hz
・使用温度範囲: -5~75℃
②送信情報の整数値を電圧に変換
パソコンに送信している情報は10bitの分解能になっています(Arduinoのスペックによる)。
つまり5Vを2^10 = 1024(0~1023)の刻みで分割していることになります。例えばこの入力値が1023ならば5V、0ならば0Vを意味します。
以上を踏まえ電圧値を求める一般式は以下となります。
電圧値(V) = 入力値 / (1024-1) x 5V ・・①
今回、センサ静止時の入力値は"288"となっていますが、電圧値に変換すると1.41Vになり、センサ特性に示されている1.35Vと異なっております。
これは部品のばらつきであると考えます。
③電圧値を角速度に変換
電圧値から角速度を求めるためには、センサ特性である0.67mV/deg/secを用います。
この特性は、1秒間あたり1deg回転したら0.67mv出力するという意味合いのものです。例えば1秒あたり2deg回転したら出力は1.34mVとなります。
では静止時に出力が1.408Vだったのが、回転させることで1.5Vを示したら角速度は、(1.5 - 1.408)/0.00067 = 138deg/secとなります。
以上を踏まえ角速度を求める一般式は以下となります。
角速度(deg/sec) = (電圧値(V) - 静止時の電圧値(V)) / 0.00067 ・・②
①を②に代入すると以下になります。
角速度(deg/sec) = (入力値 - 静止時の入力値) /1023 x 5 / 0.00067
④スケッチ内容
以上を踏まえたスケッチの内容は以下になります。
==================================================
unsigned long time, time_old, time3, time4;
float               deg_g1, deg_g2, g1, g2;
void setup()
{
Serial.begin(9600) ; // シリアルモニターの初期化
}
void loop()
{
// delay時間算出
    time       = millis();
    time3     = time - time_old - time4; // 前回の遅れ時間
    time_old = time;                            // 次回計算用として、今回までの演算時間を格納
    time4     = 100 - time3;                  // 今回のdelay時間を決定
// 角速度算出
    g1        = analogRead(1);
    g2        = analogRead(2);
    deg_g1 = (g1 - 288) / 1023 * 5 / 0.00067; // G1角速度
    deg_g2 = (g2 - 289) / 1023 * 5 / 0.00067; // G2角速度
// PCに送信
    Serial.print(time);
    Serial.print(" ");
    Serial.print(deg_g1) ; // G1
    Serial.print(" ") ;
    Serial.println(deg_g2) ; // G2
delay(time4) ;
}
==================================================
⑤作動確認結果
縦軸は角速度(deg/sec)となります。それらしい波形が得ることが出来ましたが、まだ以下が気になります。
(1) 静止時においても値が細かく変動する
(2) 一方向にしか動かしていなくても、逆方向に動いたような値を示す。
これらの問題を解決しなければ、正しく傾斜角を求めることが出来ないので、何とかしたいと思います。

②へ続く
サブチャンネルあります。⇒ 何かのお役に立てればと
|
|