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

Prototyping Lab: Recipe 10.3

Get Adobe Flash player
by kotobuki 14 Apr 2010
/**
 * Copyright kotobuki ( http://wonderfl.net/user/kotobuki )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/7N9g
 */

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.utils.getTimer;
  import funnel.*;
  import funnel.ui.LED;

  [SWF(backgroundColor="0xCCCCCC")]

  public class DetectMovement extends Sprite {
    // 動きがあったと判断する閾値
    private const THRESHOLD:Number = 0.1;

    // Arduino
    private var arduino:Arduino;

    // センサからの入力を表示するスコープ
    private var scopeForInputSignal:SignalScope;

    // センサからの入力とスムージングした結果の差を表示するスコープ
    private var scopeForDiff:SignalScope;

    // 加速度センサのx軸に接続したピン
    private var sensorPin:Pin;

    // LED
    private var led:LED;

    // 前回LEDをトリガした時刻
    private var lastTrigger:int = 0;

    public function DetectMovement() {
      // LEDに接続したピンのモードをPWMにセット
      var config:Configuration = Arduino.FIRMATA;
      config.setDigitalPinMode(9, PWM);
      arduino = new Arduino(config);

      // LEDを初期化
      led = new LED(arduino.digitalPin(9));

      // センサに接続したピンに移動平均フィルタとイベントリスナをセット
      sensorPin = arduino.analogPin(0);
      sensorPin.addFilter(new Convolution(
                          Convolution.MOVING_AVERAGE));
      sensorPin.addEventListener(PinEvent.CHANGE, onChange);

      // センサからの入力を表示するスコープを生成
      scopeForInputSignal = new SignalScope(10, 10, 200, 
                                            "X axis");
      addChild(scopeForInputSignal);

      // センサからの入力とスムージングした結果の差を表示するスコープを生成
      scopeForDiff = new SignalScope(10, 70, 200, 
                                     "Diff (raw - smoothed)", 
                                     -1, 1);
      addChild(scopeForDiff);

      // 毎フレームごとに発生するイベントにイベントリスナをセット
      addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    // 毎フレームごとに以下を実行
    private function onEnterFrame(e:Event):void {
      // センサからの入力を表示
      scopeForInputSignal.update(sensorPin);

      // センサからの入力とスムージングした値の差を表示
      var diff:Number = sensorPin.preFilterValue 
                        - sensorPin.value;
      scopeForDiff.update(diff);
    }

    // センサに接続したピンに変化があれば呼ばれる
    private function onChange(e:PinEvent):void {
      // センサからの入力とスムージングした値の差を求める
      var diff:Number = sensorPin.preFilterValue 
                        - sensorPin.value;

      // 現在の時刻を読み取る
      var now:int = getTimer();

      // 差の絶対値が閾値より大きく、前回トリガしてから一定時間が経過していたら
      if ((Math.abs(diff) > THRESHOLD) 
          && ((now - lastTrigger) > 500)) {
        // LEDをノコギリ波でブリンクさせる
        led.blink(300, 1, Osc.SAW);

        // 前回トリガした時刻として現在の時刻を記録
        lastTrigger = now;
      }
    }
  }
}