In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Gainer勉強3回目:加速度センサ誤差修正

A very basic example on how to use an accelerometer
(without a smoothing filter)
ain 0: X
ain 1: Y
ain 2: Z
Reference
http://funnel.cc/Software/ActionScript3
加速度センサって誤差があって、デフォルトでは水平になってくれない・・・
ってことでどうにかまっすぐにしたい!
いろいろわかんなかったけどなんとかできました!
実行した0.5s後に傾きを設定。
モジュールのボタンを押しても傾きを設定できるようにしてみました。
GainerはAS2の説明はあるけどAS3はないですよね。
なんで、自分は1行ずつ自分なりの解釈で勉強します。
ちなみにAS3も初心者です(笑)
こういうことだよ!って突っ込みあったらご指導お願いします。
Get Adobe Flash player
by umi_kappa 22 Feb 2010
/**
 * Copyright umi_kappa ( http://wonderfl.net/user/umi_kappa )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/xCKt
 */

// forked from kotobuki's Gainer Basic Example: Accelerometer
// forked from kotobuki's Gainer Basic Example: Analog Input
// forked from kotobuki's Gainer Basic Example: SignalScope
// A very basic example on how to use an accelerometer
// (without a smoothing filter)
// 
// ain 0: X
// ain 1: Y
// ain 2: Z
// 
// Reference
// http://funnel.cc/Software/ActionScript3

//加速度センサって誤差があって、デフォルトでは水平になってくれない・・・
//ってことでどうにかまっすぐにしたい!

//いろいろわかんなかったけどなんとかできました!
//実行した0.5s後に傾きを設定。
//モジュールのボタンを押しても傾きを設定できるようにしてみました。

//GainerはAS2の説明はあるけどAS3はないですよね。
//なんで、自分は1行ずつ自分なりの解釈で勉強します。
//ちなみにAS3も初心者です(笑)
//こういうことだよ!って突っ込みあったらご指導お願いします。


package {
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
	import flash.utils.*;
    
    import funnel.*;
    import funnel.gui.*;
    import funnel.ui.*;

    [SWF(width="600", height="500",backgroundColor="0x808080")]
    
    public class GainerTest extends Sprite {

        private var gio:Gainer;
        private var scope:SignalScope;
        //入力の状態を表示させるためのスコープクラス
        private var yAxisPin:Pin;
        //入出力ピン
        
        private var board:Shape;
        
        private var aa:Number = 0;
        //調節用
        
        private var myTextField:TextField;
		//角度表示用

		private var intervalId:uint = setTimeout(syoki_set, 5000);
		//0.5s後に実行 wonderflでは速度遅いから5sにしました。 調節してください。

        public function GainerTest() {
            gio = new Gainer();

            scope = new SignalScope(0, 5, 200, "ain 1 (y-axis)", -180, 180);
            //signalScope(x,y,width,名前,最小値、最大値)
            addChild(scope);

            var gui:GainerGUI = new GainerGUI();
            addChild(gui);
            gio.gui = gui;
            gui.setPosition(IOModuleGUI.LEFT_BOTTOM);
            //スライダーのまとまりを左下に配置

            board = new Shape();
            board.graphics.lineStyle(5, 0xFFFFFF);
            board.graphics.moveTo(-100, 0);
            board.graphics.lineTo(100, 0);
            board.x = 100;
            board.y = 210;
            this.addChild(board);
            //ラインを表示させる
            
            myTextField = new TextField();
            this.addChild(myTextField);
            myTextField.x = 220;
            myTextField.y = 200;
            myTextField.textColor = 0xffffff;
            //テキストフィールド表示

            yAxisPin = gio.analogInput(1);
            //ain1を使う
            yAxisPin.addFilter(new Scaler(0, 1, -180, 180, Scaler.LINEAR, true));
            //addFilter フィルターを追加
            //Scalerってなんよ??
            //Scaler(入力の最小値,入力の最大値,出力の最小値,出力の最大値,
            //			マッピングに使用する曲線を表す関数,指定した範囲を超えた入力値を制限するか否か)
			//0		~	1
			//↑			↑
			//	対	応
			//↓			↓
			//-180	~	180
			
			//水平時0.5 垂直時2.5,7.5
			//2.5	~	0.5		~	7.5
			//↑			↑			↑
			//	対				応
			//↓			↓			↓
			//-90	~	0		~	90
            
            yAxisPin.addFilter(new Convolution(Convolution.MOVING_AVERAGE));
            //Convolution.MOVING_AVERAGE 移動平均フィルタのカーネル なにそれ??
            //ブレが少なくなるみたい
            
            addEventListener(Event.ENTER_FRAME, loop);
			
			gio.button.addEventListener(ButtonEvent.PRESS, btn_press);
			//モジュールのボタンを押すと傾きを再設定する。
        }
		
		private function btn_press(e:ButtonEvent):void 
		{
			syoki_set();
		}

		private function syoki_set():void{
            aa = Math.floor(yAxisPin.value);
			//trace(aa);
		}
		//0.5s後に実行される wonderflでは速度遅いから5sにしました。
		//PCが信号を感知するのに時間がかかるみたいだから。ちょっと待って。

        private function loop(event:Event):void {
            scope.update(gio.analogInput(1));
            //スコープの更新 ain1について
            board.rotation = Math.floor(yAxisPin.value - aa);
			//もともとの角度をaaに入れておいて、その後は角度からaaを引いてあげれば水平に。
            
            myTextField.text = "角度 " + board.rotation + "°";
        }
    }
}