えるまろぐ

風車めぐり時々レビュー

DX'er 夢の時計をM5 Paperでつくったはなし 【アマチュア無線】【M5 Paper】

 こんな時計があったらいいな、というような時計を、アマチュア無線でDXを始めてからずっと探していた。
 理想の時計を、M5 Paperで自作(?)したおはなし。

 ソースコードの配布はこの記事にはありません。
 今のところ予定していません。
 (人様のコード寄せ集めて作ったもので、オリジナル部分がほとんどないため)

◆完成したもの

◆どうしてこんなものがほしいのか

 "DX"とは、アマチュア無線用語で、海外交信のことを指す。
日本の無線局である自分と、日本以外の国の無線局が交信することだ。
そこには当然、時差がある。
アマチュア無線の交信のときは、交信の記録をとることが一般的で、そこには交信成立時刻も記録する。
日本の無線局同士が交信したときは、当然日本標準時で記録を取るが、海外の無線局と交信したときは、協定世界時(UTC)で時刻の記録をとる。
日本標準時協定世界時の時差は9時間で、日本が9時間早い。
日本標準時協定世界時が同時に確認できる時計がほしいな、と思っていた。

 そんなことは、世界中にアマチュア無線局がいるので誰かは考えることであり、当然そういう製品もある。
ただ、少なくとも私が探した限りでは、日本の電波またはNTPで時刻校正できるものはなかった。
アメリカの電波時計に対応したものや、時刻校正機能を持たないもの、業務用の高価なものはあったが、日本で、個人が入手しやすいものは見つけられなかった。
 例えば市販のアナログ電波時計を買って針を増やす改造しようかとか、トラベル(ワールドタイム)機能がある置き時計を2つ並べようかとかも考えたが、どうも納得いくものがない。
 また、そんなものアプリでいいじゃないかと思われるかもしれないが、時計というものは、机の上に鎮座していて、ふとした瞬間に即座に確認できるからいいのである。
アマチュア無線周辺機器メーカーさん、つくってくれないかなぁ。

◆M5 Paperとは

 M5 Paperとは、"いいかげん"な説明をすると、自分でプログラミングできる、タッチスクリーン付きの電子ペーパーマイコンである。
本体に、WiFiBluetoothなどの通信モジュール、外部入出力端子がついていて、プログラミング次第で何でもできちゃう素晴らしいデバイスなのである。

◆機能と実装 (それとポンコツな点)

・NTP時計

 M5 PaperはRTC(リアルタイムクロック:内蔵時計)を持っているので、基本的にはRTCの時刻を画面に表示する。
また、M5 PaperはWiFi接続が可能でなので、NICTのNTPサーバーである"ntp.nict.jp"と同期を取るようにした。
念の為オフラインでも時計としては動作するように、NTPからシステムクロックを直接設定するのではなく、NTPで取得した時刻をRTCに設定することとした。
 RTCを内蔵しているといっても、M5 Paperは電子ペーパーなので画面の書き換えが必要。故に、秒のカウントはきっかり1秒ではなく、プログラムの実行速度次第となってしまう。
1秒ずつ同期する方法があるかもしれないが、私の能力ではできず... なので、+delayでそれっぽく合わせこんだ。また、NTPで同期した時刻をRTCに設定する処理に時間がかかり、RTCが1~2秒遅い問題がある。補正方法がわからず、秒は参考程度と思うことにした。

JST / UTC同時表示

 UTC側の表示は、RTC時刻を-9 * 3600秒して表示している。
 システムクロックからtime_tでUNIX時間を取出して-9 * 3600秒すればいいじゃんと考えたが、M5 PaperはRTCを持っているものの、内部のシステムクロックとは同期しておらず、システムクロックはプログラムの実行開始時が 1970年1月1日 0:00として動作開始する。
 どうやら、システムクロック→RTCは簡単に設定できるようだが、RTC→システムクロックの設定は一筋縄ではいかないらしく、-9時間の実現は、RTCから取得した日付と時刻それぞれ(一体で取り出せないっぽい)を、一つのtm構造体に入れ、UNIX時刻に変換し、-9 * 3600秒した後、再度tm構造体に変換しなおして表示している。
きっともっと簡単なやり方があるはず...。秒に差はないので、両方とも同じ変数で表示している。

・SFI, Kインデックス, Aインデックスの表示

 アマチュア無線において、海外との交信のような長距離交信では、電波の飛び方は地球環境、宇宙環境によって日ごと、時間ごとに刻々と変わり、これらの値を参考にしている。
 SFIとは、Solar Flux Indexの略で、うまく日本語に直せないが、f=10.7cm(2800MHz)電波望遠鏡で太陽からの電波強度を観測したもの。電波望遠鏡での観測でいえば、"明るさ"のように映るらしい。
海外との交信のような短波帯の長距離通信では、電波は大地(海面)と、電離層の間を何回も反射しながら飛んでいく。
そのため、電離層の状態によって全く通信できなかったり、とんでもない遠距離と通信できたりと、状況が変わる。
電離層の状態は太陽の影響を受けるため、この数値を観測すると、電離層への影響の度合いが間接的に観測でき、電波の伝わりやすさの指標になる。
 K値は、地球磁気の乱れ具合を示す指数。数値が5以上になると地磁気嵐を示し、通信に悪影響が出る。
 A値は、勉強不足なところもあるが、宇宙磁気に関係する指数のよう。こちらも通信状況の指標になっているが、「3時間ごとの8つのK値の等価振幅である」とのことなので、計算により算出するようにした。

K-index - Wikipedia

しかしこれらの数値を掲載している有名サイトと若干差があるようで、計算又は値のサンプルが正しくないっぽいものの、当たらずとも遠からずの値であり、私のはとりあえず、取得時刻からそれぞれ180, 360, 540...個(分)前の値から計算するようにした。おそらく、Aインデックスは日毎の指標であるから、3,6,9...正時の値かもしくは平均かなにかで計算しているのかもしれないが、それを突き止める手間が面倒だったのと、そもそも時刻狙い撃ちで値を取り出す技能が私になかったのだ。
 通常これらの値は、DX交信向けのサイトにアクセスして確認するが、これが時計としていつでも見れたら最高かなと思い。

 前置きが長くなったが、SFI, K値は、NOAA(アメリカ海洋大気庁)のSWPC(宇宙天気予報センター)がDATA ACCESSとしてjsonを公開しているので、このjsonをhttpアクセスで取得して表示している。
SFIのjsonは、最新のものが0番のキーにいるので取得が簡単だが、K値のjsonはなぜか古い順になっており、毎分更新されるのだが、要素数が変わることがあるので、最大要素数を取得して最大のものをK値として取得、そこから180, 360, 540...個(分)前の8つの値をA値の計算用に取得することとした。
 取得間隔は、毎時20分とした。NOAAのjsonがだいたい毎時10~15分頃に更新されているようなので、処理を一本化するために、SFI, K値ともにこの時間で取得している。
 画面右下に小さくK値のタイムスタンプから時刻のみを抜き出して表示させた。

・インジケータと処理メッセージ

 データが正しく取得できたかと、自分のプログラミングが全く信用ならないので、WLAN, NTP, PROP(プロパゲーション)のインジケータと、画面下部に処理メッセージを表示させた。
 WLANは、WiFi に isConnected という検査値があるので、それで判定している。NTPにも sntp_get_sync_status というものがあるが、こちらは一度この関数を叩くとリセットされてしまうようで、使い方に悩んだものの、一応判定できる。PROPの表示は、取得した値を格納する変数が初期化したものから変わったかどうかという古典的なやり方で判定している。
 おまけで、M5 Paperは気温・湿度センサーを持っているので、表示させた。値は結構"いいかげん"であった。充電しながら使っているので本体の放熱のせいかもしれない。めんどくさいので、隣に別の温湿度計をおいて、差分を単純に補正した。参考なのでこれでいいや。コールサインは趣味で表示しているだけでなんの意味もない。
 バッテリー残量は、電圧から%に換算している。公式のFactory Testと同じ計算式なのだが、こちらもかなり"いいかげん"である。充電中はだいたい90%前後、バッテリー切れ直前は-28であった。全然参考にもならない。ちなみに、毎秒画面を書き換え続けてWiFiも接続しっぱなし、だと、バッテリーライフは5時間程度だった。時計としてはぜんぜんダメ笑
 処理メッセージは、処理の要所要所で目印として表示させている。最後のメッセージが残り続ける仕様。一定時間でクリアする処理は面倒で盛り込まなかっただけ。言うまでもなく、NOAAを買収したわけではない。

◆つくろうとおもったきっかけ

 M5シリーズに、M5 StickCというものがあり、実は以前に開発に挑戦したことがある。
残念ながら私のプログラミングスキルは、学校で少し習った程度、であり、仕事でプログラミングをしたりということは一切ない。
M5 StickCで遊んだときは、見事にうまくいかずに挫折し、人様が作ったコードをそのまま書き込んで、今も部屋の片隅で二酸化炭素濃度測定器として活躍している。
 今回、とある事情によりしばらく仕事を休むことになった。休むといっても、自宅に居て、優先度緊急でいつ飛び込んで来るかもわからないオンコール対応をしている。
待機時間は趣味のアマチュア無線でもやっていればいいじゃないかと思うが、平日の昼間には相手もみつからないし、CQを出そうにも、呼ばれている最中にオンコールが発生したら、交信相手に大変な迷惑がかかる。(その節は大変失礼いたしました。)
 そうなると待機時間には結局スマホで延々と広告だらけの動画を眺めてしまい、なんだか嫌になってきた。
そんなときに、M5 Paperを再び目にして、開発に挑戦してみることにしたのだ。