obnizとGPS受信機を使ってスパイグッズ作ろうとしたら精度が悪すぎた(失敗談)


obnizを買いました。
obnizは小型のIoT機器で、ブラウザ上からJavaScriptでプログラムし、実行できるガジェットです。
ArduinoのOverTheAirを初期標準装備してるようなものですね、小型のディスプレイと小さなコントローラもついてるので、それ一つでゲームも出来ます。
今回買った目的は、この記事をみて、ネットワークに繋がってる限り定期的に位置情報を送信するイケナイグッズ作れるかなぁと思ったからなのですが、あまり上手く行かなかったので失敗談として載せておきます。
使ったGPS受信機は秋月電子さんのこちらです。
GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応

📡実際に受信してみる

プログラムは、先程リンクした記事に元々書いてあるので少しいじっただけのモノです。

<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/[email protected]/obniz.js" crossorigin="anonymous"></script>
</head>
<body>

<div id="obniz-debug"></div>
<textarea id="text" style="width:100%;font-size:13px;"></textarea>
<button id="clear">Clear</button>
<button id="stop">Stop</button>


<h2 id="founds"></h2>

<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async () => {
  obniz.io0.output(1);
  obniz.io1.output(0);
  const uart = obniz.getFreeUart();
  uart.start({tx: 2, rx: 3, baud:9600, drive:"3v"});

  var satellites = {};

  uart.onreceive = function(data, text) {
    $("#text").text($("#text").text() + text);
  }

  $("#clear").click(function(){
     $("#text").text("")
  })
  $("#stop").click(function(){
     uart.end();
  })
}


</script>
</body>
</html>

これで受信した結果がこちらです。

とても見づらいですね。全データをnmea.txtを作って、そこに流し込みgrep GPGGAで必要な情報だけ抜き出しましょう。

$GPGGA,042946.407,4300.3077,N,14422.1578,E,1,6,3.30,36.4,M,27.8,M,,*66
$GPGGA,042946.555,4300.3097,N,14422.1544,E,1,8,1.70,30.1,M,27.8,M,,*6A
$GPGGA,042948.000,4300.3100,N,14422.1512,E,1,8,1.70,24.3,M,27.8,M,,*6A
$GPGGA,042949.000,4300.3105,N,14422.1496,E,1,8,1.70,21.9,M,27.8,M,,*6C
$GPGGA,042950.000,4300.3127,N,14422.1475,E,1,8,1.70,19.8,M,27.8,M,,*63
$GPGGA,042951.000,4300.3130,N,14422.1474,E,1,8,1.70,23.1,M,27.8,M,,*65
$GPGGA,042952.000,4300.3128,N,14422.1479,E,1,8,1.70,24.0,M,27.8,M,,*64
$GPGGA,042953.000,4300.3123,N,14422.1477,E,1,8,1.70,24.6,M,27.8,M,,*66
$GPGGA,042954.000,4300.3101,N,14422.1502,E,1,7,1.84,30.4,M,27.8,M,,*61
$GPGGA,042955.000,4300.3118,N,14422.1500,E,1,8,1.70,27.6,M,27.8,M,,*6A
$GPGGA,042956.000,4300.3122,N,14422.1497,E,1,8,1.70,26.4,M,27.8,M,,*6C
$GPGGA,042957.000,4300.3137,N,14422.1487,E,1,8,1.70,21.9,M,27.8,M,,*62
$GPGGA,042958.000,4300.3133,N,14422.1488,E,1,8,1.70,23.0,M,27.8,M,,*6D
$GPGGA,042959.000,4300.3130,N,14422.1496,E,1,8,1.70,26.1,M,27.8,M,,*64
$GPGGA,043000.000,4300.3145,N,14422.1474,E,1,8,1.70,23.7,M,27.8,M,,*6D
$GPGGA,043001.000,4300.3133,N,14422.1474,E,1,8,1.70,21.7,M,27.8,M,,*6F
$GPGGA,043002.000,4300.3149,N,14422.1479,E,1,8,1.70,23.3,M,27.8,M,,*6A
$GPGGA,043003.000,4300.3144,N,14422.1475,E,1,8,1.70,23.7,M,27.8,M,,*6E
$GPGGA,043004.000,4300.3133,N,14422.1486,E,1,8,1.70,26.8,M,27.8,M,,*6F
$GPGGA,043005.000,4300.3146,N,14422.1459,E,1,8,1.70,21.0,M,27.8,M,,*61
$GPGGA,043006.000,4300.3134,N,14422.1480,E,1,8,1.70,25.6,M,27.8,M,,*61
$GPGGA,043007.000,4300.3125,N,14422.1490,E,1,8,1.70,26.0,M,27.8,M,,*64
$GPGGA,043008.000,4300.3135,N,14422.1472,E,1,8,1.70,21.3,M,27.8,M,,*62
$GPGGA,043009.000,4300.3121,N,14422.1496,E,1,8,1.70,27.4,M,27.8,M,,*6D
$GPGGA,043010.000,4300.3135,N,14422.1467,E,1,8,1.70,21.7,M,27.8,M,,*6B
$GPGGA,043011.000,4300.3135,N,14422.1470,E,1,8,1.70,22.9,M,27.8,M,,*61
$GPGGA,043012.000,4300.3131,N,14422.1467,E,1,8,1.70,20.9,M,27.8,M,,*62
$GPGGA,043013.000,4300.3129,N,14422.1463,E,1,8,1.70,20.6,M,27.8,M,,*61

ここで簡単にNMEAフォーマットについて説明しておきましょう。
簡単になので、詳しくはここ(日本語)ここ(英語)、それかWikipediaを見てください。
まずこの1行をセンテンスと呼び、$マークから始まります。
カンマで区切られて、最初の5文字はトーカ(2文字)とメッセージ(3文字)で構成されています。
今回GPGGAのみ取得したのが、位置情報や取得した衛星などの基本情報を見れるのがGGAメッセージだったからです。
メッセージの次はUTCタイム、緯度、北緯南緯、経度、東経西経、測位状態、捕捉数、その他標高や基地局番号など、最後にチェックサムという形式になっています。

これを見て分かるのは、04時29分46秒(UTC)から04時30分13秒の間にかけてデータを取得していたということが分かります。
位置情報としては北緯43°00.3077東経144°22.1578から北緯43°00.3129東経144°22.1463の辺りをウロチョロしてる事も分かります。

ちなみに本来取れてほしい位置は弊社オフィスのある北緯43°00.5115東経144°36.9004です。
ん〜〜微妙にズレてる!

屋外でも受信してみたんですが、あまり結果は変わりませんでした。
惜しいところまでは来てるので受信機をすこしイジったりするとなんとか良くなるかもしれないので、また追記があればこちらに書きこんでいきます。