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)というのが確認できる(*´ェ`)自分で作ったのだから当たり前だけど…

二酸化炭素濃度を表示させてみる

突然部屋の二酸化炭素濃度が気になってきて表示させてみたかったので作ってみた(*゚ェ゚*)
使用した部品は
・コネクター S4B-XH-A 2つ
・コネクタハウジング XHP-4 2つ
・抵抗10kΩ 2つ
・XIAO RP2350 1つ
・5V出力昇圧DCDCコンバーター CC3-0305SF-E 1つ
・温湿度センサー AHT25 1つ
・二酸化炭素センサー MH-Z19E 1つ

表示部分は気圧計を作ったときにできたものを使用して今回は今回は測定の基盤のみを作成
回路図はこんな感じで

配線はこんな感じにして

さくさくっと部品を実装して

動作している時の温度はどうなっているのだろうと気になってHIKMICROのE02というサーモグラフィーカメラを購入して見てみた(*゚ェ゚*)

表示部分と組み合わせて2階建て

何日か様子をみていると朝方に数値は3桁の700ぐらいで夜になると2000近くの値になっていた(*´ェ`)

続・気圧計に温湿度計をくっつける

7セグメント側の基板から「ジー」というノイズが出ていた問題が解決した(゚ェ゚)

LEDドライバーのTM1640が3.3Vのままでも動作したので5V出力昇圧DCDCコンバーターを外してみたところ「ジー」というノイズが無くなった(*´ェ`)

というわけで回路図からDCDCコンバータを削除

基板の配線もこのように引き直し(*´ェ`)

基板を発注して作り直し

5Vから3.3Vに変更するとほんの少し暗くなったかなという感じ(*´ェ`)

気圧計に温湿度計をくっつける

以前作成した気圧計に温度と湿度が分かると良いと聞きまして作ってみました(*´ェ`)

使用した部品は
・4桁7セグメントLEDカソードコモン OSL40562 1つ
・1桁7セグメントLEDカソードコモン OSL10326 4つ
・LEDドライバー TM1640 1つ
・抵抗10kΩ 4つ
・キャパシタ0.1μF 1つ
・キャパシタ100μF 1つ
・コネクター S4B-XH-A 3つ
・コネクタハウジング XHP-4 3つ
・XIAO RP2350 1つ
・5V出力昇圧DCDCコンバーター AE-XCL102D503CR-G 1つ
・気圧センサー AE-LPS25HB 1つ
・温湿度センサー AHT25 1つ

ただ追加するだけではなく表示部分と計測デバイスを切り離してみようと思い別々の基板に実装してみた∑(゚ェ゚)

まず数値の表示部分はこんな感じで

計測デバイスの方はこんな感じ(*´ェ`)

表示部分から先に作って届いた基板はこんな感じ

ソルダーペーストを塗り塗り

綺麗に盛れた(*´ェ`)

部品を載せて

ヒーターで半田を溶かして表面実装部品は終わり(*´ェ`)ラクチン

後の部品は手半田付けして動作テストを行う(*´ェ`)
「ジー」というノイズが出てる。。。これはなんとかしたい(*゚ェ゚*)

計測デバイスの方は表面実装部品はキャパシタが2つだけなので手半田付けした(*´ェ`)

二階建て構成でなかなか良い感じ(*゚ェ゚*)

続々・Raspberry Pi Pico と気圧センサーで気圧計を作る

修正した基板とステンシルが届いたので実装していく(*´ェ`)

基板の上にステンシルを載せて(*´ェ`)

はんだペーストをヘラで刷り込んで。。。(*゚ェ゚*)

はい簡単(*゚ェ゚*)

ステンシルの押さえ方が弱かったのか少し滲んでいる(*´ェ`)
まあいいか(*´ェ`)

今回も二つの基板で進める(*´ェ`)
表面実装部品を載せて。。。(*´ェ`)

これまた便利なヒーターの出番(*゚ェ゚*)

あ、はんだが繋がっている箇所がある。。。はんだ吸い取り線で余分なはんだを取っちゃおう(*´ェ`)

二つ目は綺麗に出来た(*゚ェ゚*)

今回は問題なく動作した(*´ェ`)

続・Raspberry Pi Pico と気圧センサーで気圧計を作る

小型化&表面実装部品に変更した基板が届いたので

ミニホットプレートプリヒーターなるMHP50を使用してSMD部品を実装してみる(*´ェ`)

試しに2枚の基板ではんだはソルダーペーストを爪楊枝に乗せて銅箔部分に付けていく・・・
初めてのホットプレート&ソルダーペーストなので適量が分からない
結構はんだの量が偏っている・・・

チップ部品の実装も初めてでこんなに小さいとは・・・(キャパシタが1個どこかに転がり落ちて無くしてしまった)

上手くいくかな、いくといいな(*゚ェ゚*)

はんだペーストが溶ける様子は見ていて気持ちがいい(*´ェ`)

一つ目の基板、上手く行っているところもあれば・・・はんだの量が多いようで繋がってしまっているところも∑(*゚ェ゚*)



続いて二つ目の基板、一つ目の基板と比べてはんだの量を気持ち少なめにして・・・

SMD部品を載せて・・・

むぐぐ、一つ目の基板の時より残念な感じになっている・・・

はんだが多いところははんだ吸取り線で取り除く(*´ェ`)

7セグメントLED と Raspberry Pi Pico、気圧センサーを取り付けて動作確認をしてみる(*゚ェ゚*)
あらら、7セグメントLEDは点灯しているけれど気圧センサーの値が取得できていない?∑(*゚ェ゚*)

二つ目も確認してみるとこちらは点灯すらしていない・・・(*´ェ`)

調べてみよう・・・
一つ目の基板、症状としてはディスプレイに0000は表示される。
センサーと通信できていない、もしくは値が取得できていない。
テスターで調べてみると4番PINと8番PINはGNDで繋がっているはずなのに導通していない。
基板設計図を見直してみると4番PINのGNDが孤立している・・・DRC(デザインルールチェック)したはずなのに、もう一度DRCを走らせるとGNDが繋がっていないエラーが出ていた・・・(*´ェ`)

二つ目の基板、症状としてはディスプレイに何も表示されていない。7セグメントLED周りが怪しい。
ソースICの9番PINがはんだ不良で(はんだが少なく)導通していない。
こっちも基板設計がおかしいのでセンサー部分の4番PINと8番PINをジャンプさせる。

ピンクの四角同士(一つ目と二つ目の基板)と青い四角同士(二つ目の基板)が導通していない。

というわけで基板設計の修正を行う(*゚ェ゚*)

原因はセンサーの4番PINのGNDが浮いている孤島のようになっているので4番と8番PINをジャンプさせればとりあえずは動きそう(*´ェ`)

これで1つ目と2つ目の基板で動作することを確認できた。

修正した基板とステンシル(はんだペーストを載せるのが楽になる)を発注して待つ。。。(*´ェ`)

Raspberry Pi Pico と気圧センサーで気圧計を作る

気圧を知りたくて作ってみた(*´ェ`)

使用した部品は
・TBD62783APG 1つ
・TBD62083APG 1つ
・4桁7セグメントLEDアノードコモン OSL40562 1つ
・抵抗47Ω 8つ
・キャパシタ0.1μF 1つ
・Raspberry Pi Pico 1つ
・気圧センサー AE-LPS25HB 1つ

まずはブレッドボードで動作確認(*´ェ`)

Raspberry Pi PicoはCoreを2つ持っているので片方を気圧センサーの値を読み取り、もう片方を読み取った値を7セグLEDに表示する処理に分けた(*´ェ`)

回路図やフットプリントを用意して(*´ェ`)

基板設計(*´ェ`)

基板を発注して届いた(*´ェ`)

DIP部品を実装(*´ェ`)

ICやRaspberry Pi Pico、気圧センサーはソケットを使い再利用できるようにした(*゚ェ゚*)

ブレッドボードとPCBを比較(*´ェ`)

ICや抵抗、キャパシタをDIP部品からSMD部品に変える計画が進行中…(*´ェ`)

温度をLEDの色で表示する

部屋の温度をLEDの色で表示する機器を作ってみたくなった(*´ェ`)

使用した部品は
・マイコン内蔵RGBLED WS2812B 7つ
・温湿度センサー モジュール AHT25 7つ
・TCA9548A I2C Multiplexer 2717 1つ

温度の取得や色の設定は Arduino UNO R4 Minima で行う(*´ェ`)

温度と色の関係は色相環の赤(0°)を40℃上限として、青(255°)を下限(0℃)で表すことにした(*゚ェ゚*)

25℃くらいなので緑色になっている(*´ェ`)

温湿度センサーを手で覆って温めると黄色く変化した(*´ェ`)

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を使用(*゚ェ゚*)

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

各空港のアップ