Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
加速度センサ

概要

加速度センサの特性を測る実験です。

KXM52-1050を利用したという加速度センサモジュールを使いました。

目的

衝動買いをしてしまったので、今のところ特に目的はありません。単に特性を調べるだけです。

データシート

KMX52-1050モジュールのデータシートを参照して、どのようなものかを調べました。

概要

KXM52-1050という加速度センサデバイスを使いやすくモジュール化したものです。

仕様の概要は以下の通りです。

項目 内容
電源電圧(Vdd) 2.7V~5.5V(標準3.3V)
測定レンジ ±2g
感度 (Vdd/5) V/g
0G出力 (Vdd/2) V

標準電圧は3.3Vとなっていますが、仕様の範囲内なので5Vで使いました。

出力電圧と加速度の関係

上記のデータより、出力電圧をv(V)、加速度をa(単位はg)とすると、出力電圧と加速度の関係は以下の数式であらわされます。

v = a * Vdd/5 + Vdd/2

例えば、Vddが5V、加速度が1gのときは、aに1を代入して、3.5Vの電圧が出力されることになります。

実験

加速度センサを傾けていき、角度を変化させ、出力される電圧を測定しました。角度を変えるのは結構厄介だったので、三角定規で測れる、±30度、±45度、±60度と、0度、±90度での値を測定しました。0度のときに、0gとなるようにしました。下の図の赤矢印の方向の加速度です。また、加速度センサそのものは静止した状態で測定しました。

測定結果は以下の通りでした。

-90度 -60度 -45度 -30度 0度 30度 45度 60度 90度
電圧(理論値) 1.50 1.63 1.78 2.00 2.50 3.00 3.21 3.37 3.50
 電圧(analogRead()より計算) 1.41 1.55 1.72 1.95 2.50 3.05 3.28 3.43 3.58
analogRead()の出力(理論値) 307 335 367 410 512 614 657 689 717
analogRead()の出力(実測値) 289 318 353 399 511 624 672 702 733

比較的理論値に近い値が出ました。

電圧から角度への変換

加速度センサが静止した状態で、電圧(v)と角度(加速度センサの傾き)(θ)の関係は、以下のようになっています(入力電圧が5Vのとき)。

v = sinθ + 2.5

また、analogRead()の出力vと、角度(加速度センサの傾き)(θ)の関係は、以下のようになっています(入力電圧が5Vのとき)。

v = 204.8*sinθ + 512

このことから、analogRead()の出力から、角度を求めるためには、上の式を変形して、以下で求めることができます。

204.8*sinθ = v - 512 → sinθ = (v - 512) / 204.8 → θ = arcsin((v - 512) / 204.8)

おまけ

Flashを使って、加速度センサの傾きを画面上に反映させるプログラムを書きました。X軸の傾きを、Arduinoのアナログの2番ピンにつなげました。FlashとArduinoとを連携させる方法は、「Flashから使う」のページを見てください。

package {
        import flash.display.Sprite;
        import flash.events.Event;
        import net.eriksjodin.arduino.Arduino;
        
        [SWF(backgroundColor="0xffffff", width="480", height="480", frameRate="10")]
        
        public class Main extends Sprite { 
                private var arduino:Arduino;
                private var pinX:int, pinY:int, pinZ:int;       // pinY, pinZ は未使用
                
                private var base:Sprite;
                private var board:Sprite;
                
                public function Main() {
                        //図形の中心を中心に回転させるためのダミーの図形
                        base = new Sprite();
                        base.x = 240;
                        base.y = 240;
                        addChild(base);

                        //実際に表示させる図形
                        board = new Sprite();
                        board.graphics.beginFill(0xaaaaaa);
                        board.graphics.drawRect(0, 0, 300, 10);
                        board.graphics.endFill();
                        board.x = -150;
                        board.y = 0;
                        base.addChild(board);

                        //Arduinoのアナログの2番ピンを利用
                        pinX = 2;
                        arduino = new Arduino("127.0.0.1", 5335);
                        arduino.setAnalogPinReporting(pinX, Arduino.ON);
                        
                        //タイマイベントを発生させる
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
                
                //タイマイベントのイベントハンドラ
                private function onEnterFrame(event:Event):void {
                        var accX:int;
                        var degX:Number;
                        var sinX:Number;
                        
                        accX = arduino.getAnalogData(pinX);
                        sinX = ((accX - 511) / 204.8);
                        if (sinX > 1) {
                                sinX = 1;
                        } else if (sinX<  -1) {
                                sinX = -1;
                        }
                        
                        degX = Math.asin(sinX) * 180 / Math.PI;
                        
                        //求めた角度だけ図形を回転させる
                        base.rotation = degX;
                } 
        }
}

バージョン

Arduino 0022



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2011 garretlab all rights reserved.
inserted by FC2 system