ひとつまえの記事で、Spresenseの初期設定を終えてLチカができるようになりました。
その後の公式チュートリアルでは、まず音楽データを再生したり録音したりする例が最初にありましたが、いやもう私はGPSに直行です!
GPSのチュートリアルはこちら:
https://developer.sony.com/spresense/development-guides/arduino_tutorials_ja#_tutorial_gps
まずはそのまま動かしてみる
チュートリアルに従って、メインボード1枚だけでGPS機能を動かしてみます。
この項は基本的にチュートリアルページと同じことを(自分がやったメモとして)書いているだけなので、本家をご覧いただければ。
- Arduino IDEを起動
- ファイル - スケッチ例 - (Spresenseのスケッチ例の下にある)GNSS - gnss
- プログラムが読み込まれるので、左上の「→」を押してコンパイル&ボードに書き込み
- ツール - シリアルモニタ でシリアルに出力されている内容を確認する。1秒ごとにGPSの測位情報が表示されます。
- 文字化けしている場合は、ボーレートを115200に設定
- 衛星から時刻情報を受け取ってから正しい時刻表示になります。それまでは 1980/01/01で。
- Fix解が求まると、移動経度が表示され始めます。
- ときどき、衛星情報が表示されます(1分おきらしい)。
衛星情報の例(これは後ほど記述予定の改造を行ったあとのログ)
numSatellites:17 2025/05/15 06:10:00.000674, [ 0] Type:GPS, Id: 4, Elv:25, Azm: 45, CN0:27.879999 2025/05/15 06:10:00.000674, [ 1] Type:GPS, Id: 5, Elv: 6, Azm:252, CN0:17.660000 2025/05/15 06:10:00.000674, [ 2] Type:GPS, Id: 6, Elv:69, Azm: 22, CN0:39.989998 2025/05/15 06:10:00.000674, [ 3] Type:GPS, Id: 7, Elv: 8, Azm:122, CN0:24.320000 2025/05/15 06:10:00.000674, [ 4] Type:GPS, Id: 9, Elv:55, Azm: 71, CN0:30.029999 2025/05/15 06:10:00.000674, [ 5] Type:GPS, Id:11, Elv:47, Azm:317, CN0:35.049999 2025/05/15 06:10:00.000674, [ 6] Type:GPS, Id:12, Elv:12, Azm:284, CN0:30.799999 2025/05/15 06:10:00.000674, [ 7] Type:GPS, Id:17, Elv:29, Azm:165, CN0:43.189999 2025/05/15 06:10:00.000674, [ 8] Type:GPS, Id:19, Elv:53, Azm:179, CN0:36.969997 2025/05/15 06:10:00.000674, [ 9] Type:GPS, Id:20, Elv:35, Azm:272, CN0:32.910000 2025/05/15 06:10:00.000674, [10] Type:GPS, Id:25, Elv: 1, Azm:313, CN0:0.000000 2025/05/15 06:10:00.000674, [11] Type:GPS, Id:30, Elv: 0, Azm:154, CN0:0.000000 2025/05/15 06:10:00.000674, [12] Type:Q1S, Id:186, Elv:65, Azm:180, CN0:40.739998 2025/05/15 06:10:00.000674, [13] Type:QCA, Id:194, Elv:26, Azm:196, CN0:32.680000 2025/05/15 06:10:00.000674, [14] Type:QCA, Id:195, Elv:88, Azm: 53, CN0:34.290001 2025/05/15 06:10:00.000674, [15] Type:QCA, Id:196, Elv:65, Azm:180, CN0:38.419998 2025/05/15 06:10:00.000674, [16] Type:QCA, Id:199, Elv:46, Azm:201, CN0:31.459999
位置情報ログの例(同)
2025/05/15 05:54:22.000689, numSat:14, Fix, Lat=36.135497, Lon=140.079514 2025/05/15 05:54:23.000699, numSat:14, Fix, Lat=36.135367, Lon=140.079458 2025/05/15 05:54:24.000678, numSat:14, Fix, Lat=36.135235, Lon=140.079401 2025/05/15 05:54:25.000690, numSat:14, Fix, Lat=36.135104, Lon=140.079348 2025/05/15 05:54:26.000698, numSat:14, Fix, Lat=36.134973, Lon=140.079294 2025/05/15 05:54:27.000678, numSat:14, Fix, Lat=36.134839, Lon=140.079239 2025/05/15 05:54:28.000687, numSat:14, Fix, Lat=36.134703, Lon=140.079181 2025/05/15 05:54:29.000697, numSat:14, Fix, Lat=36.134565, Lon=140.079124 2025/05/15 05:54:30.000678, numSat:14, Fix, Lat=36.134429, Lon=140.079065
改造
改造1: QZSSも受信するようにする
もとのプログラムではGPSの電波のみを受信して測位に使っているので、我々日本にいる身としてはみちびき(QZSS)も活用したい。そのための修正です。
enum ParamSat {
eSatGps, /**< GPS World wide coverage */
eSatGlonass, /**< GLONASS World wide coverage */
eSatGpsSbas, /**< GPS+SBAS North America */
eSatGpsGlonass, /**< GPS+Glonass World wide coverage */
eSatGpsBeidou, /**< GPS+BeiDou World wide coverage */
eSatGpsGalileo, /**< GPS+Galileo World wide coverage */
eSatGpsQz1c, /**< GPS+QZSS_L1CA East Asia & Oceania */
eSatGpsGlonassQz1c, /**< GPS+Glonass+QZSS_L1CA East Asia & Oceania */
eSatGpsBeidouQz1c, /**< GPS+BeiDou+QZSS_L1CA East Asia & Oceania */
eSatGpsGalileoQz1c, /**< GPS+Galileo+QZSS_L1CA East Asia & Oceania */
eSatGpsQz1cQz1S, /**< GPS+QZSS_L1CA+QZSS_L1S Japan */
};という定義があり、その下の部分で何を使うかを指定しているようだったので、ここを書き換え。
static enum ParamSat satType = eSatGpsQz1cQz1S;
この結果が、上で示した衛星情報や位置情報のログです。
Q1Sは みちびきの L1 S を、QCAは L1 C/Aをあらわしているそうです。
ログを取ってみる
指定したCOMポートを監視しているだけでログが流れてくるので、まずはこの状態でログをいくつか取ってみました。
Poderosaというツールでシリアル通信機能があるので、これでノートPCからSpresenseのポートに接続(ボーレートは115200)すると画面表示しつつログファイルに記録してくれるので、この状態で、自宅の窓際(南と東に開けている。西はすぐ壁)に一晩置いておいた記録がこの図。

結構暴れていますね。中心から各方向に30mくらいといったところか。
この後、毎秒のログにも実際に捕まえている衛星のIDを羅列するように改造しました。出力(print_pos())の最後に
int cnt;
for (cnt = 0; cnt < pNavData->numSatellites; cnt++){
Serial.print(" ");
Serial.print(pNavData->getSatelliteId(cnt));
} を加えただけ。
ログサンプル:
2025/05/15 05:54:22.000689, numSat:14, Fix, Lat=36.135497, Lon=140.079514 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:23.000699, numSat:14, Fix, Lat=36.135367, Lon=140.079458 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:24.000678, numSat:14, Fix, Lat=36.135235, Lon=140.079401 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:25.000690, numSat:14, Fix, Lat=36.135104, Lon=140.079348 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:26.000698, numSat:14, Fix, Lat=36.134973, Lon=140.079294 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:27.000678, numSat:14, Fix, Lat=36.134839, Lon=140.079239 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:28.000687, numSat:14, Fix, Lat=36.134703, Lon=140.079181 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:29.000697, numSat:14, Fix, Lat=36.134565, Lon=140.079124 4 6 9 11 12 17 19 20 22 185 194 195 196 199 2025/05/15 05:54:30.000678, numSat:14, Fix, Lat=36.134429, Lon=140.079065 4 6 9 11 12 17 19 20 22 185 194 195 196 199
移動ログを取ってみる
ちょうどでかける予定があったので、助手席にノートPCを拡げて Spresenseをダッシュボードに置いて(ケーブルを養生テーブルで固定)測定してみました。
ログを加工してCSVにし、kepler.glに描いてもらったのがこれ。

動いていると結構良い感じに連続性を持ったデータが取れました。左下は駐車場でくるんと回っているのですが、かなり正確です。
一方、この図ではところどころ1点飛び出しているように見えるのは、信号待ちなどの停止状態のとき。停止時に誤差が大きくなる事象のように見えます。GPSの原理をそこまで詳しくしらないのだけど、「動いている間は正確で、停まると誤差が出る」みたいなことってあるんですかね。傾向としては
- 停まると誤差が見えてくる
- 右折左折などの際に、位置が実際よりも膨らんで曲がったように見える=今までの進行方向を元にした補正のようなものが行われているのでは?と感じる挙動
- 動いている間は、進行方向に対して点が横にブレたりすることは一切なく、きれいに連続性を持った線を形成している
1秒に1回のロギング(今回はシリアルポートに出力しているだけだけど)というのは私が普段使っているGPSロガーと比べて各段に高頻度なのですが、これでバッテリーどれくらい持つのだろうか。Spresenseを使った自作ロガーでも十分というか、バッテリーが持つならこのほうが良いかも、と思ってしまいました。乾電池3本使うんですよねぇ。。モバイルバッテリーで動かすのがいいのかな。
今後
- とりあえずファイルに落とすようにしたいですねぇ。ファイルはどうやってPCに転送するんだろうとか、調べることはたくさんありそう
- サンプルプログラムが他にもいくつかあるので試してみたい
- 拡張ボードも買ってあるので、そちらをつながて、SDカードの利用や音出し関連のサンプルを動かしてみたい
- まとめることができそうなら、いったん「自作ロガー」として何度か試験運用してみたい。
- GPSの拡張ボードも買ってあるので、L1のほかL5も使った測位の精度を見てみたい
- おはなし相手がほしい


