0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Andorid のブラウザで加速度の値を取得してグラフ表示したりローカルなファイルにセーブしたりする

Last updated at Posted at 2020-02-04

やること

タイトルそのままです。Chrome でしか動作は確認していません。多分 iOS + Safari でも動きます。下記サイトで動作を見れます。

image

正常に動くと上のような感じになります。加速度センサがついてない PC などでは、加速度の値やグラフは表示されません。

ソースコード

全体のコードは下記に置いてます。

要点

加速度データの取得

下記のコードで、加速度を取得するたびに arr に加速度データを記録していきます、

acc.js
     var aX = 0, aY = 0, aZ = 0; // 加速度データの記録用
     var startTime = Date.now(); // 開始時間の記録
     var arr = []; // セーブする用

     // 加速度データを取得する
     window.addEventListener("devicemotion", (dat) => {
         aX = dat.accelerationIncludingGravity.x;
         aY = dat.accelerationIncludingGravity.y;
         aZ = dat.accelerationIncludingGravity.z;
        
          arr.push( {"t": Date.now() - startTime, "x": aX, "y": aY, "z": aZ }); 
     }); 

データをローカルなファイルにセーブする

arr を json に変換して、Blob を使ってダウンロードできるようにします。

アンカーではなく、ボタンを押したらセーブするようにするには、少し複雑なコードを書く必要あり。

save.js
    function handleDownload() {
        
        var blob = new Blob([ JSON.stringify(arr) ], { "type" : "application/json" });

        if (window.navigator.msSaveBlob) {
            window.navigator.msSaveBlob(blob, "acc.json");
            window.navigator.msSaveOrOpenBlob(blob, "acc.json");
        } else {
            document.getElementById("download").href = window.URL.createObjectURL(blob);
        }

        // セーブしたらデータをリセットする。リセットしたくなければ下記2行をコメントアウトする。
        arr = [];
        startTime = Date.now();
    }

グラフを表示する

arr の末尾から canvas の幅と同じ pixel 分だけデータを取りだして、頭から順に線をつないで引いていっているだけです。縦方向の座標値は適当なので、端末によっては縦幅を越えて描画されるかもしれません。

graph.js
    var canvas;
    var ctx;
    var preX = 0, preY = 0, preZ = 0; // 描画用
    // 加速度データをグラフ表示する displayData
    function displayData() {
        
        // 加速度の値を文字で表示する
        var txt = document.getElementById("txt");
        txt.innerHTML = "x: " + aX + "<br/>" + "y: " + aY + "<br/>" + "z: " + aZ;

        // canvas の背景をグレーで塗る
        if ( ! canvas || ! canvas.getContext ) { return false; }
        ctx.fillStyle = "gray";
        ctx.fillRect( 0, 0, canvas.clientWidth, canvas.clientHeight );
        ctx.lineWidth = 1 ;

        // 最新から 300px 分のデータを取りだす。
        var varr = [];
        if ( arr.length > canvas.clientWidth){
            varr = arr.slice(-canvas.clientWidth,-1);
        }else{
            varr = arr;
        }

        for ( idx in varr ){
            if ( idx > canvas.clientWidth ) break;
            var dat = varr[idx];

            // X 軸加速度を赤の線で表示する
            var dy1 = canvas.clientHeight/2 + dat.x * 10.0;
            var dx = idx;
            ctx.strokeStyle = "red";
            ctx.beginPath();
            ctx.moveTo(dx,dy1);
            ctx.lineTo(dx-1,preX);
            ctx.stroke();

            // Y 軸加速度を青の線で表示する
            var dy2 = 50 + dat.y * 10.0;
            ctx.strokeStyle = "blue";
            ctx.beginPath();
            ctx.moveTo(dx,dy2);
            ctx.lineTo(dx-1,preY);
            ctx.stroke();
            
            // Z 軸加速度を緑の線で表示する
            var dy3 = 50 + dat.z * 10.0;
            ctx.strokeStyle = "green";
            ctx.beginPath();
            ctx.moveTo(dx,dy3);
            ctx.lineTo(dx-1,preZ);
            ctx.stroke();

            // 次のデータを表示するときに前のデータから線を描く用
            preX = dy1;
            preY = dy2;
            preZ = dy3;
        }
    }

端末にもよりますが、それなりに高速にデータ取りつつ描画ができるので、最近のスマフォはすごいなーと思ったり。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?