自作IoTデバイスをつくろう--.NET Micro Frameworkと.NET Gadgeterを使いこなす技術者ルポ

builder by ZDNet Japan Ad Special
2014-03-05 11:00:00
  • このエントリーをはてなブックマークに追加

加速度センサからの入力

 次に加速度センサを使ってみよう。

(1)ディスプレイと同様に、配線の画面にて、ツールボックスから加速度センサー(Accelerometer)を画面上に配置し、コンテキストメニューから「Connect all modules」を選択。また、画面に表示された通りに、実際のハードウェアも配線しよう。

screen09
※クリックすると拡大画像が見られます

(2) 加速度センサからの入力を画面に表示してみよう。上述のコードを以下のように修正する。ContinuousMeasurementIntervalプロパティでイベント間隔を設定し、StartContinuousMeasurementsメソッドで計測を開始する。加速度センサからの各軸の入力は、MeasurementCompleteデリゲートで呼び出されたイベントの中で、AccelerationオブジェクトのX、Y、Zプロパティから取得することができる。

// This method is run when  the mainboard is powered up or reset.   
void ProgramStarted()
{
        // Use Debug.Print to show  messages in Visual Studio's "Output" window during debugging. 
        Debug.Print("Program Started");

         // Ziddyちゃんを描画 
        DrawZiddy();

        // メッセージ表示 
        Msg("Hello! I'm  Ziddy!");

        accelerometer.MeasurementComplete  += accelerometer_MeasurementComplete;

        // 1秒に1回イベント呼び出し 
        accelerometer.ContinuousMeasurementInterval = new TimeSpan(0, 0, 1); 

        // 計測開始 
        accelerometer.StartContinuousMeasurements();
}
        void accelerometer_MeasurementComplete(Accelerometer sender, Accelerometer.Acceleration acceleration)
                {
                // 計測結果を表示 
                Msg("X: " + acceleration.X.ToString("F2") + " " 
                + "Y: " + acceleration.Y.ToString("F2") + " " 
                + "Z: " + acceleration.Z.ToString("F2")
                );
                //  Msg(acceleration.ToString()); //こちらでも同様の結果が得られる 
        }

実行結果:加速度センサを揺らすと、数字が大きく変化するのがわかる

加速度センサを使って、洗濯機の振動を感知するガジェットを作ってみよう

 さて今回は、洗濯機の終了を検知して、洗濯が終わると、メールで知らせてくれるガジェットを作ろう。加速度センサで洗濯機の振動を検知して、開始と終了をチェックする仕組みにする。

 1分間に30秒以上、加速度センサから得た各軸の数字に閾値を超えた変化がある場合に、洗濯機が動き出したと見なし、また、変化が1分間に10秒以下になった場合に、洗濯機が止まったと見なすことにする。

 本来なら洗濯機のコントローラーに組み込んで行うのがスマートである。.NET Micro Frameworkをコントローラーに移植すればもちろん可能だ。

public partial class Program
{ 
        private static int START_THRESHOLD = 30; // 1分間に30秒以上の揺れになったら起動 
        private static int END_THRESHOLD = 10; // 1分間に10秒以下の揺れになったら停止 

        private Accelerometer.Acceleration _prev_acc;
        private bool[] _count = new bool[60];
        private bool _is_washing = false;   // 洗濯中か
        // This method is run when  the mainboard is powered up or reset.   
        void ProgramStarted()
        {
        // Use Debug.Print to show  messages in Visual Studio's "Output" window during debugging. 
        Debug.Print("Program Started");

        // Ziddyちゃんを描画 
        DrawZiddy();

         // メッセージ表示 
        Msg("Hello, I'm Ziddy!\nI  have to do the laundry... ");

        accelerometer.MeasurementComplete  += accelerometer_MeasurementComplete;

          // 1秒に1回イベント呼び出し 
        accelerometer.ContinuousMeasurementInterval = new TimeSpan(0, 0, 1); 

        // 計測開始 
        accelerometer.StartContinuousMeasurements();
  } 

        void accelerometer_MeasurementComplete(Accelerometer sender, Accelerometer.Acceleration acceleration)
        {
        double th = 0.2; // 閾値。環境によって変えること 

         Array.Copy(_count, 1, _count, 0,  _count.Length - 1);

         if (_prev_acc == null)
        {
        _prev_acc = acceleration;
        }

         bool result = false;
        if ((System.Math.Abs(_prev_acc.X -  acceleration.X) > th)
                || (System.Math.Abs(_prev_acc.Y -  acceleration.Y) > th)
                || (System.Math.Abs(_prev_acc.Z - acceleration.Z)  > th)
                )
        {
        result = true;
        }
        _count[_count.Length - 1] = result; 

        _prev_acc = acceleration; 

        int count = 0;
        bool is_finished = false;
        for (int i = 0; i < _count.Length; i++)
        {
        count += (_count[i] ? 1 : 0);
        } 
        string msg = "";
        if (_is_washing == false && count >=  START_THRESHOLD)
        {
                _is_washing = true;
                msg = "Start Washing.";
        }
        else if (_is_washing == true && count <=  END_THRESHOLD)
        {
                _is_washing = false;
                msg = "Finished! Sending a  Mail... ";
                is_finished = true;
                }
                else if (_is_washing)
                {
                msg = "WASHING NOW.";
                }
                else 
                {
                msg = "Waiting.";
                } 
                Msg(msg + "\n" + count.ToString() + " " + (count == 1 ? "shake" : "shakes"));
        }
(以下省略)
(1)待ち状態
(1)待ち状態
(2)洗濯開始検知
(2)洗濯開始検知
(3)洗濯中
(3)洗濯中
(4)洗濯終了検知
(4)洗濯終了検知
  • コメント(1件)
#1 ZDちゃんファン   2014-07-07 22:05:05
Ziddyちゃんは楕円描画でできてるとは!
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]