• Stratum1のなんちゃってNTPサーバーを作る

    インターネットに繋がらない環境でもPCやMac、マイコンなどで正確な時刻合わせを行いたい(*´ェ`)

    GPSから時刻を取得してNTPサーバを作れば良さそう(*゚ェ゚*) ということで作ってみた(*゚ェ゚*)

    使用部品は
    ・GPS受信機 GT-505GGBL5-DR-N 1つ
    ・マイコンボード W55RP20-EVB-Pico 1つ

    GT-505GGBL5-DR-Nは1PPS出力も付いていてUARTで通信する(*゚ェ゚*)
    1PPS出力を使用して精度を上げて信号確認用にLEDも付けてみると1Hzでピカピカしている(*´ェ`)

    W55RP20-EVB-Pico は Raspberry Pi Pico互換のマイコンボードでRP2040とTCP/IPコントローラーW5500を統合したSoC「W55RP20」を搭載している(*゚ェ゚*)

    Raspberry Pi Picoにイーサネット接続機能も使えて便利(*゚ェ゚*)

    Raspberry Pi Pico側でNTPサーバを稼働させて各端末からはNTPクライアントで接続してもらえば良い(*´ェ`)

    GPS/GNSSやNTPサーバの情報が見られたら良いなと思ったので簡易HTTPサーバも搭載してみた(*゚ェ゚*)

    こうなるとネットワーク周りの設定値も変えられると便利かもと思い実装してみた(*´ェ`)

    sntpコマンドで確認すると

    $ sntp -d 192.168.11.88
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.5F37 (0.371932983)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
                t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
                t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
                t3: EDCE4F6E.E2A76510 (3989720942.885366741)
                t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
            offset: 0000000000000000.666D5CD700000000 (0.400106242)
             delay: 0000000000000000.02FAE79200000000 (0.011641000)
              mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
             error: 0000000000000000.5F37000000000000 (0.371932983)
              addr: 192.168.11.88
    }
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.695F (0.411605835)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.ECF55EB4 (3989720942.925619048)
                t1: EDCE4F6E.7DC810A5 (3989720942.491333999)
                t2: EDCE4F6E.ECF55EB4 (3989720942.925619048)
                t3: EDCE4F6E.ECF5B297 (3989720942.925624048)
                t4: EDCE4F6E.88432CA5 (3989720942.532274999)
            offset: 0000000000000000.69EFEA0080000000 (0.413817048)
             delay: 0000000000000000.0A7AC81D00000000 (0.040936000)
              mean: 00000000EDCE4F6E.ECF588A580000000 (3989720942.925621510)
             error: 0000000000000000.695F000000000000 (0.411605835)
              addr: 192.168.11.88
    }
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.7387 (0.451278687)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.F7429FCB (3989720942.965860354)
                t1: EDCE4F6E.885F394B (3989720942.532702999)
                t2: EDCE4F6E.F7429FCB (3989720942.965860354)
                t3: EDCE4F6E.F7430475 (3989720942.965866354)
                t4: EDCE4F6E.928900C5 (3989720942.572402999)
            offset: 0000000000000000.69CEB51800000000 (0.413310355)
             delay: 0000000000000000.0A2962D000000000 (0.039694000)
              mean: 00000000EDCE4F6E.F742D22000000000 (3989720942.965863228)
             error: 0000000000000000.7387000000000000 (0.451278687)
              addr: 192.168.11.88
    }
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.7DF0 (0.491943359)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.01911558 (3989720942.006120046)
                t1: EDCE4F6E.92B4FA48 (3989720942.573073999)
                t2: EDCE4F6E.01911558 (3989720942.006120046)
                t3: EDCE4F6E.01917A02 (3989720942.006126046)
                t4: EDCE4F6E.9D425F20 (3989720942.614293999)
            offset: FFFFFFFFFFFFFFFF.69959AF900000000 (-0.587560953)
             delay: 0000000000000000.0A8D002E00000000 (0.041214000)
              mean: 00000000EDCE4F6E.019147AD00000000 (3989720942.006123066)
             error: 0000000000000000.7DF0000000000000 (0.491943359)
              addr: 192.168.11.88
    }
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.8818 (0.531616211)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.0BDEAA52 (3989720942.046366353)
                t1: EDCE4F6E.9D5A187A (3989720942.614655999)
                t2: EDCE4F6E.0BDEAA52 (3989720942.046366353)
                t3: EDCE4F6E.0BDEED6E (3989720942.046370353)
                t4: EDCE4F6E.A723FEE2 (3989720942.652892999)
            offset: FFFFFFFFFFFFFFFF.699FC03200000000 (-0.587406147)
             delay: 0000000000000000.09C9A34C00000000 (0.038233000)
              mean: 00000000EDCE4F6E.0BDECBE000000000 (3989720942.046368122)
             error: 0000000000000000.8818000000000000 (0.531616211)
              addr: 192.168.11.88
    }
    selected:
    sntp_exchange {
            result: 0 (Success)
            header: 24 (li:0 vn:4 mode:4)
           stratum: 01 (1)
              poll: 00 (1)
         precision: FFFFFFEC (9.536743e-07)
             delay: 0000.0000 (0.000000000)
        dispersion: 0000.5F37 (0.371932983)
               ref: 47505373 ("GPSs")
             t_ref: EDCE4F6E.E2A6DED8 (3989720942.885358741)
                t1: EDCE4F6E.7ABC0E38 (3989720942.479431999)
                t2: EDCE4F6E.E2A6DED8 (3989720942.885358741)
                t3: EDCE4F6E.E2A76510 (3989720942.885366741)
                t4: EDCE4F6E.7DB77C02 (3989720942.491080999)
            offset: 0000000000000000.666D5CD700000000 (0.400106242)
             delay: 0000000000000000.02FAE79200000000 (0.011641000)
              mean: 00000000EDCE4F6E.E2A721F400000000 (3989720942.885362625)
             error: 0000000000000000.5F37000000000000 (0.371932983)
              addr: 192.168.11.88
    }
    +0.400106 +/- 0.383574 192.168.11.88 192.168.11.88
    

    stratum: 01 (1)というのが確認できる(*´ェ`)自分で作ったのだから当たり前だけど…

  • GNSSロガーで飛行機の軌道を追ってみた

    先月と先々月に北海道に行く機会が会ったので以前作ったGNSSロガーを持っていくことにした(*´ェ`)

    最初に持って行った時は行きだけ使用して帰りは窓際に座れなかったので使用しなかった…(*´ェ`)

    2回目に行った時は行きと帰り窓際に座れたので使用してみた(゚ェ゚)

    SPRESENSEを使用して作成したGNSSロガーを加工したケースに入れて絶縁テープで止めた(*´ェ`)

    設定は5秒に1回、以下のようにSDカード追記されていく(*´ェ`)

    $GPGGA,092305.00,3943.3526,N,14004.1925,E,0,00,25.5,13347.0,M,0.0,M,,*61
    $GNGLL,3943.3526,N,14004.1925,E,092305.00,V,N*63
    $GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,*30
    $GPGSV,3,1,10,05,15,146,,10,22,316,,12,21,161,,13,22,78,,1*5B
    $GPGSV,3,2,10,14,5,34,,15,55,77,,18,26,231,40,22,19,49,,1*6B
    $GPGSV,3,3,10,23,58,306,,24,86,306,26,,,,,,,,,1*65
    $GPGSV,3,1,10,05,15,146,,10,22,316,27,12,21,161,,13,22,78,,7*58
    $GPGSV,3,2,10,14,5,34,,15,55,77,,18,26,231,43,22,19,49,,7*6E
    $GPGSV,3,3,10,23,58,306,31,24,86,306,36,,,,,,,,,7*60
    $GLGSV,3,1,9,65,63,6,,66,24,314,,72,33,96,,74,24,33,,1*4C
    $GLGSV,3,2,9,75,68,94,,76,30,184,,81,16,295,,82,7,339,,1*4A
    $GLGSV,3,3,9,88,8,244,29,,,,,,,,,,,,,1*40
    $GQGSV,1,1,4,02,22,163,16,03,19,197,,04,80,219,,07,42,200,29,1*5A
    $GQGSV,1,1,1,61,,,35,,,,,,,,,,,,,4*50
    $GQGSV,1,1,4,02,22,163,25,03,19,197,,04,80,219,,07,42,200,38,7*5C
    $GBGSV,5,1,17,02,19,249,33,03,37,223,35,06,40,241,40,08,76,278,,1*76
    $GBGSV,5,2,17,09,23,236,,13,66,294,,16,41,241,42,23,47,189,35,1*72
    $GBGSV,5,3,17,24,16,43,,25,64,79,,32,38,311,,33,29,115,,1*7C
    $GBGSV,5,4,17,38,72,212,,39,52,250,42,41,77,67,,59,47,180,27,1*45
    $GBGSV,5,5,17,60,16,251,38,,,,,,,,,,,,,1*4C
    $GBGSV,4,1,13,06,40,241,,08,76,278,,09,23,236,,13,66,294,,3*70
    $GBGSV,4,2,13,16,41,241,,23,47,189,35,24,16,43,,25,64,79,,3*7C
    $GBGSV,4,3,13,32,38,311,,33,29,115,,38,72,212,,39,52,250,,3*73
    $GBGSV,4,4,13,41,77,67,,,,,,,,,,,,,,3*72
    $GBGSV,4,1,13,06,40,241,,08,76,278,,09,23,236,,13,66,294,,5*76
    $GBGSV,4,2,13,16,41,241,,23,47,189,38,24,16,43,,25,64,79,,5*77
    $GBGSV,4,3,13,32,38,311,,33,29,115,,38,72,212,,39,52,250,41,5*70
    $GBGSV,4,4,13,41,77,67,,,,,,,,,,,,,,5*74
    $GAGSV,2,1,8,02,25,159,,03,66,41,,05,21,84,,08,45,297,41,7*4C
    $GAGSV,2,2,8,13,31,287,43,15,28,226,,24,18,44,,25,41,98,,7*45
    $GAGSV,2,1,8,02,25,159,,03,66,41,,05,21,84,,08,45,297,36,1*4A
    $GAGSV,2,2,8,13,31,287,42,15,28,226,41,24,18,44,,25,41,98,,1*47
    $GIGSV,2,1,5,01,,,35,03,,,42,05,,,33,07,,,36,1*4E
    $GIGSV,2,2,5,10,39,195,29,,,,,,,,,,,,,1*75
    $GNGNS,092305.00,3943.3526,N,14004.1925,E,NNNNNN,00,25.5,13347.0,0.0,,,V*2E
    $GNRMC,092305.00,V,3943.3526,N,14004.1925,E,38.8,321.4,160724,,,N,V*1F
    $GNVTG,321.4,T,,M,38.8,N,71.9,K,N*14
    $GNZDA,092305.00,16,07,2024,,*71
    

    プロットにはQGISでOpenStreetMapを使用(*゚ェ゚*)

    中部国際空港セントレアから新千歳空港までの軌道(青が行きで赤が帰り)

    各空港のアップ

  • SONY SPRESENSE で取得したNMEAセンテンスをシリアル通信で他の端末へ流す

    やってみたかった事ができた(*゚ェ゚*)

    先日作った SONY SPRESENSE で取得したNMEAセンテンスのデータをシリアル通信で Arduino に繋いだディスプレイに表示させるから発展させて複数のArduino端末へデータを送り各端末でデータを加工し表示させたかったのだ(*´ェ`)

    SONY SPRESENSE はNMEAセンテンスをシリアル接続で送るだけ(*゚ェ゚*)
    受け取る側のArduinoはそれぞれ表示に必要NMEAセンテンスを取捨選択する(*´ェ`)

    一つ目のArduinoは$xxGSV をフォーマットして衛星の位置を表示させて、二つ目のArduinoは$xxZDA をフォーマットして日時の表示をさせている(*´ェ`)

  • Arduino と LCD  の AE-ATOM0130B3

    Arduino R4 Minima を追加で1つ買ってしまった(*´ェ`)

    今日は先日買った3つのLCDのAE-ATM0130B3を繋いでみる(*゚ェ゚*)

    解像度が240pixel × 240pixel なので図が表示できそうだなと触っているとGNSSロガーで取得したNMEAセンテンスのうちGSVのビューアーに使えるのでは思ったので作ってみることにした(*´ェ`)

    なんだかいい感じに作れそう(*゚ェ゚*)

    なんだかいい感じに作れそう(*゚ェ゚*)

    NMEAセンテンス(GSV)に含まれる1番目の要素 $xxGSV のxx部分で色分けをしたり、衛星番号と組み合わせて辞書のキーにしてみたりした(*´ェ`)

    シリアル通信でGSVデータが送られてくる度にデータと表示を更新しているのでデータだけは更新して表示は5秒に1回再描画するくらいがいいのかもしれない(*゚ェ゚*)

    SONY SPRESENSE で作成したGNSSロガーからシリアル通信でNMEAセンテンスを垂れ流しにして各センテンスごとのビューアにデータを表示させることができそう(*´ェ`)

  • SONY SPRESENSE の拡張ボードに付いているSDカードの書き込み速度

    SONY SPRESENSE の拡張ボードに付いているSDカードにGNSSアドオンで取得可能(ライブラリを使用)なデータ(NMEAフォーマット)を漏れなく書き込めるのかどうか試してみた(*´ェ`)

    なぜなら最初にSDカードの書き込みを試していた時(1秒に1回データ取得して書き込みを行うと)1分もしないうちにデータが書き込めていなかったので先日は書き込むNMEAセンテンスを絞っていたのだ..(*゚ェ゚*)本当は残せるものは全部残したい気持ち(*´ェ`)

    まず毎秒1回データの取得からSDに書き込み完了するまで何秒かかるか調べてみた(*´ェ`)

    測定に使用する衛星は GPS+QZSS_L1CA+QZSS_L1S で取得するデータは

    • GGA
    • GLL
    • GSA
    • GSV
    • GNS
    • RMC
    • VTG
    • ZDA
    にした(*´ェ`)
     
    衛星を捉えてから1分間(60回)の平均データ取得からSDカードへの書き込み時間は平均約0.33秒、最大約0.37秒
    平均 335166.213114754 μs
      335.166213114754 ms
      0.335166213114754 S
    最大 377636 μs

    あら大丈夫そう∑(*゚ェ゚*)

    1回分のデータでそれぞれのNMEAセンテンスを書き込み完了するまでの時間も調べてみた(*´ェ`)

    NMEAセンテンス SDに書き込みに掛かる時間(μs)
    $GPGGA 13153
    $GNGLL 14068
    $GNGSA 14221
    $GNGSA 14374
    $GNGSA 17059
    $GPGSV 10742
    $GPGSV 10345
    $GPGSV 10437
    $GPGSV 13946
    $GLGSV 12908
    $GQGSV 12939
    $GQGSV 13091
    $GQGSV 13611
    $GBGSV 14190
    $GBGSV 14221
    $GBGSV 14374
    $GBGSV 15045
    $GBGSV 9827
    $GBGSV 10315
    $GBGSV 10468
    $GBGSV 11535
    $GBGSV 12786
    $GBGSV 12817
    $GAGSV 13001
    $GAGSV 17596
    $GIGSV 14282
    $GNGNS 14282
    $GNRMC 17486
    $GNVTG 10650
    $GNZDA 10345

    捉えた衛星で上下はあるけれども約0.4秒..(*´ェ`)

    合計 394114 μs
    平均 13137.1333333333  
    最大 17596  
    最小 9827  
    合計 394.114 ms
      0.394114 S

    やはりNMEAセンテンスごとに書き込む(fileのopen,closeする)よりいくつかまとめて書き込むようにするともっと速くなるのかな(*´ェ`)

    最初に試したSDカードが今回調べている途中で認識しなくなってしまったのでもしかしたら壊れかけていたのかもしれない、それで書き込みができなくてデータが保存されていなかったのかもしれない..(*´ェ`)

  • SONY SPRESENSE でGNSSロガーを作ってみた

    SONY SPRESENSE の GNSSアドオンボードと外部アンテナを使用して動作確認が出来たので、これをPCに接続しないで使えるようにしたい(*´ェ`)

    何が必要になるか考えると、まず電源とデータを保存するSDカード(これは拡張ボードを買ったので手元にある)、そしてよーく考えるとボタンが必要(SDカードに書き込み途中で電源を落とすとファイルが破損する可能性があるのでは)ということに気がついた∑(*゚ェ゚*)

    電源に接続してから即座に位置情報を取得しないでボタンを押したら取得開始するようにする(*´ェ`)

    ボタンが押されたら位置情報を取得開始する

    もう一度ボタンが押されたら位置情報を取得停止する → 待機状態へ

    という仕様にした(*゚ェ゚*)

    ということで電源やボタンを買って取り付けてみた(*´ェ`)

    電源は敢えて自動パワーOFF機能が付いていないと謳っているサンワサプライの700-BTL049を買ってまずはこのモバイルバッテリーで動作するのかを確認(*´ェ`)OK

    拡張ボードを取り付けSDカードの書き込み確認(*´ェ`)OK


    SDカードが認識しないこともあったので待機状態に入る前にSDカードの認識(挿入)待ちをする処理を追加することにした(*´ェ`)

    ボタンをこんな感じ(Spresense 拡張ボードは、1kΩのプルアップ抵抗がマウントされています。と書かれていたのでこれを利用する)で繋げてボタンを押すたびに状態が切り替わるようにした(*´ェ`)

    これをそのまま外で持ち歩くのは恥ずかしいので会社近くのメイホクバーガーさんでハンバーガーをテイクアウトした際にセットで頼んだ辛口ジンジャーエールの容器に入れることにした(*´ェ`)すごくチョウドイイ、でも透明でまだちょっと恥ずかしいのでスタバのスリーブを付けてカモフラージュする(*゚ェ゚*)

    これを持って白川公園を歩いてみよう(*´ェ`)

    一人で持ち歩くと難易度が高い(見た目)ので同僚に付いてきてもらいました…(*´ェ`)
    NMEAフォーマットで記録されているのでgeoJsonに変換してQGIS上でOpenStreetMapに重ねてプロットしたのがこちら∑(*゚ェ゚*)

    Aの箇所がジグザクに歩いてみようとしたところでBが木の周りをぐるっと回ってみたところ(*´ェ`)

    Bを拡大するとしっかり確認できる∑(*゚ェ゚*)

    設定は1秒に1回GPS+QZSS_L1CA+QZSS_L1Sから位置情報を取得してGNSとRMCの2つに絞りSDカードに逐次書き込みするようにした(*´ェ`)

    最終的にはこんなシーケンスになった(*゚ェ゚*)

    電源ON
    ↓ LED全部点灯
    SDカードチェック
    ↓ LED1→2→3という順に点灯を繰り返す
    待機状態
    ↓ ボタンを押す(クリック)
    指定時間毎に位置情報取得SDカードに書き込み これがloopする
    ↓ ボタンを押す(クリック)
    待機状態
    ↓
    電源OFF   

    こんなに簡単にGNSSロガーが作れるなんて思ってもみなかった(*゚ェ゚*)とても楽しい₍₍ (ง ˘ω˘ )ว ⁾⁾

     

    おまけメイホクバーガーさんのテリヤキバーガー(エッグトッピング)+サラダ+辛口ジンジャーエール(*´ェ`)とてもオイシイ(*゚ェ゚*)

  • SONY SPRESENSE を買ってみた

    Raspbery Pi と GPSモジュールを組み合わせてGPSロガーを作ろうと思い調べていたら
    SONYが開発したSPRESENSEというIoT用ボードコンピュータが目に入りこれは良さそうと思い買ってしまった ワク₍₍ (ง ˘ω˘ )ว ⁾⁾ワク
    今回購入したのは

    SONY SPRESENSE メインボード 1個
    SONY SPRESENSE 拡張ボード 1個
    SONY SPRESENSE GNSSアドオンボード 1個
    SMA-J⇔IPEX(IPX/U.FL)変換ケーブル(120mm) テフロン同軸ケーブル 1本
    GPS(L1/L5)/GLONASS アクティブアンテナ LNA内蔵 DC3V~5V対応 1個


    拡張ボードは使わずまた次回..

    SPRESENSEのドキュメントが日本語で用意されていて画像も豊富なのでとてもわかりやすい(*´ェ`)

    開発環境は Mac Book Air(M1 Apple Silicon) に Arduino IDE を選択した(*´ェ`)

    まずはサンプルスケッチのLチカからのgnss.inoでメインボードの測位衛星システムの動作確認(*´ェ`)
    あっさり動いたー∑(*゚ェ゚*)
    それからGNSSアドオンボード+外部アンテナを取り付けてサンプルスケッチのgnss_addon.inoで動作確認して今日はおしまい(*´ェ`)
    メインボードの時は受信した衛星の数が12で外部アンテナを取り付けると24になった(*゚ェ゚*)
    初めてでも開発環境のインストール含め外部アンテナを使用した位置取得まで僅か1〜2時間で出来てしまうま∑(*゚ェ゚*)カンタン

    拡張ボードはSDカードに書き込みしたりネットワークで位置情報などを送信したりする時に使用する予定..(*´ェ`)
    あとは外部電源を用意してPCやMBAが無くても使えるになったら持ち歩いてみたい(*´ェ`)