縫って作るコンピュータの最近のブログ記事

Arduinoで作る「車の運転優しさセンサ」(4)
二つの電源電圧

  Arduinoの電源電圧は5Vでこの電源電圧がアナログ入力のA-D変換の基準電圧となります。アナログ入力の入力値から電圧に変換するときに必要になります。
 3.3Vの電源は、三軸加速度センサの電源電圧となります。またこの加速度センサの各軸の±の変換点である原点の電圧が加速度センサの電源電圧の1/2 となります。この原点の電圧値を基に加速度を計算します。
 これらの実測値をスケッチで反映できるように、変数として定義します。
         
                   float VD=4.9;   // 電源電圧
                   float VDa=3.3;   // 加速度センサへの電源


 実際の電圧を測定し初期値として設定します。

Arduinoで作る「車の運転優しさセンサ」(2)
加速度センサの電源電圧

   LilyPad三軸加速度センサはアナログデバイセズ社のADXL335が搭載されています。この電源電圧は1.8V~3.6Vの範囲で3.0Vが標準となっています。この電源はArduinoの標準ボードに用意されている3.3Vの電源を接続します。このセンサの各軸の出力は、加速度が加わっていない場合には電源電圧の1/2の電圧がセンサの出力となります。加わる加速度に対して、次の係数で決められた電圧が出力となります。
                        ± 0.3V/g (電源電圧が3Vの場合)
 また、出力電圧はセンサに加わった電圧以上になりません。センサの各軸の出力はArduinoのアナログ入力ポートに接続します。

                    センサのX軸出力   アナログ入力 0
                               Y軸出力   アナログ入力 1
                               Z軸出力   アナログ入力 2

 加速度センサの出力から傾きを求める方法について、連載41回のコメントで読者の方から、逆正接関数2(atan2)を利用する方が適切であるとのご指摘をいただきました。Arduino IDEのリファレンスには3角関数はsin、cos、tanしかありませんでしたが、atan2も利用することができました。

tan、atan
 atan()は、次に示すように直角三角形の直角を挟む2辺a、bの値から角度θを求めます。

lilypad430010.jpg

加速度センサの出力から傾きを求める場合の精度
 横軸を重力加速度g、縦軸をセンサの傾きとして「°」としてその関係をグラフ化すると次のようになります。

lilypad420010.jpg

X、Y、Zの各軸の傾きを確認する
 各軸の傾きを、asin()またはacos()関数を利用して求めてみます。まず、もう一度連載37回で使用したスケッチで出力の状態を確認します。

lilypad410010.jpg

LilyPad Arduino用加速度センサ(9)
多項式でセンサの出力から傾きを求める
 前回、0°から360°について
      1) 傾きは 0°から90°、  X軸の重力加速度     0<x
      2) 傾きは90°から270°、X軸の重力加速度 -1<x<1
    3) 傾きは270°から360°、X軸の重力加速度     x<0
 の3区分にわけ、各区分ごとに多項式を用意しました。
 加速度センサのX軸からの出力をxとして、xの値に応じてそれぞれの範囲に適合する多項式を選択して計算します。
      1)0 <   0°~ 90°
        angx=2275.3*x*x*x*x*x*x-6018*x*x*x*x*x+5927.9*x*x*x*x-2642.2*x*x*x
                  +524.19*x*x+21.571*x+0.1264
      2)-1=<x=< 1  90°~270°
         angx=5E-08*x*x*x*x*x*x-75.784*x*x*x*x*x-1E-7*x*x*x*x+57.219*x*x*x
         +1E-07*x*x+71.062*x+180
   3)x< 0 270°~ 360°
    angx=-2012.1*x*x*x*x*x*x-5271.4*x*x*x*x*x-5122.1*x*x*x*x+2232.7*x*x*x
         +428.69*x*x+29.105*x+359.91

X軸にかかる加速度から傾きを求める場合
 傾きをX軸の重力加速度のみで決める場合、0°~ 360°までの間で二つの角度があります。センサを回転させたとき加速度の値はサイン・カーブを描き、1回転のうちに2回同じ値になります。X軸の加速度だけでは、二つのうちどちらの値かは決まりません。

 そのため今回は 正の値のとき0°~90°が与えられるように次のようにしました。次の関数に示すように、センサからの加速度の値が正のときは(1)式を、負のときは(3)式、0のときは(2)式を使用します。X軸のセンサの出力の重力加速度を xxとして、次のような関数を作りました。

  float fasin(float xx){
     float angx;
 if (0<xx){   // 重力加速度が正の値のとき
       Angx =(1)式で計算          }
  else
   {
   if (0>xx){      // 重力加速度が負の値のとき
      angx =(3)式で計算          }
   else{   // 上記以外のとき 重力加速度がゼロのとき
      angx =(2) 式で計算                    }
   }
 return angx;
}

 テストのためのスケッチは、今までのスケッチに上記の関数を追加して次のように作りました。

lilypad400010.jpg

LilyPad Arduino用加速度センサ(7)
    以後、センサが静止しているか等速運動をしていて重力加速度しか加わっていない場合について考えることにします。

X軸が水平の場合
   X軸が水平の場合はX軸に加わる重力加速度は0となります。Xが傾いた場合は傾いた角度とX軸センサに加わる重力加速度の値は、次に示すような関係になります。

 

 X軸方向加速度=重力加速度×SIN(X軸の傾き)


 Arduinoのスケッチの命令にも、SIN、COS、TANの三角関数は用意されています。この関数を使用して、傾いた角度がわかれば、そのときのX軸方向の重力加速度の成分は簡単に導けます。一方ARCSIN関数などが用意されていませんので、X軸方向の加速度の値から傾きを計算するのは少々厄介なことになります。

前回の測定結果と重力加速度×SIN(傾きの角度)

lilypad380015.jpg

 

LilyPad Arduino用加速度センサ(6)
   LilyPadの配線を、クリップによる配線から単芯リード線に替えて配線しました。そのため、次に示すように動かして配線が外れなくなりました。

 加速度センサをスタンドに固定して、X軸の傾きに応じて出力がどのように変わるか確認しました。

lilypad370010.jpg

LilyPad Arduino用加速度センサ(5)
  LilyPad Arduinoのテスト回路の配線を、クリップ・コードから潤工社のジュンフロン線で次のように配線し、テストでセンサを動かしてもコードが外れないようにしました。 

lilypad360010.jpg

LilyPad Arduino用加速度センサ(4)
  加速度センサの動作を確認します。前回作成したスケッチは、X、Y、Zの各軸のセンサの出力電圧、0点から変位の電圧、加速度gの値を0.3m秒ごとに測定し、PCへシリアル通信で送信しています。Arduino IDEのシリアル・モニタで確認することができます。

テストは次に示すようにクリップ・コードで始める
 センサの動作テストは、次に示すようにセンサの端子をクリップ・コードでクリップしてLilyPad Arduinoに接続します。

lilypad350010.jpg







newハイパー・マイコンmbedでインターネット電子工作


マイコンと電子工作 No.6


マイコンと電子工作 No.4


マイコンと電子工作No.1
サポート・ページはこちら