Raspberry piを利用した
世界和時計の製作

「めくるめくインチキ家電」というテーマで、過去作のマイコン炊飯器に加えて新規に2つ製作することにした。
そのひとつが、この「raspberry piを利用した世界和時計」である。

和時計の動作方法には2種類あり、
a)文字盤が動作して針は一定速度で作動する
b)文字盤固定で昼夜の針の動作速度を変更する(二挺テンプ)
の方式がある。
今回はb)とした。理由としてはa)では文字盤が動作するが、これを世界時計とすると高緯度地方で文字盤の可動範囲を超える可能性があるため。

要求仕様としては:

1.    raspberry piのシステム時計との同期。これができればNTP時計になる。

2.    世界複数地域に対応する。このため、今回は内部にいくつかの都市の緯度経度情報を保存する(webから緯度経度情報あるいは日の出日の入り情報をスクレイピングしてくる方法もあるが、展示環境で無線LANが輻輳している可能性が高い)。また、展示するにあたり、時計の初期化動作がスムーズに行われる必要がある。

3.    画面表示でなく、アナログ時計を利用する。raspberry piGPIOの利用が必要

4.    和時計なので、定期的な昼時間/夜時間の更新。もともとの和時計では、15(24節気)ごとにテンプのおもり位置を手動で変更していたようだが、自動で行う。

5.    C++で開発する。まあpythonでもいいのだけれども。


A4の紙にメモ書きを書いてから、開発作業に入った。開発期間はとりあえず動くようになるまででおおむね3日程度。 

ハードウェア。

今回は保管されていたシチズンのアナログ時計を利用する。理由は外装のメープル材がかっこいいから。

これ、なんでも祖父が何かの接待のときにうっかり勝ってきてしまったときの賞品らしい。

ばらした。

ムーブメントを分解し(ばらすときに歯車をぶちまける可能性があるので注意する)、ムーブメントのコイルの線から外部に配線を引き出す。
それから、本来のムーブメントを動作させて、オシロスコープで波形を確認する。
1.2-1.5V(電池電圧そのまま?)30ms幅のパルスが、正負交互に出力されていることを確認した。
ほぼパルスモータそのもの。

raspberry pi
内容的にはzeroでも動作可能と思うが、開発時に画面表示がトロいと時間がかかるので、pi4Bを使用した。
今回がraspberry pi での初の開発のため、GPIOの入出力の様子を時計の接続なしに把握するため、LED付きのブレークアウトボードを追加した。

時計への出力はGPIOの中から2ピンを利用し、交互に出力することで正負パルスとする。配線には直列に300Ωくらい入れておく。

IO入力は、ソフトの終了、時計針位置の初期化センサ、地域選択スイッチを用意する。

ソフトウェア。

実はC++での開発も初めてのため、あちこちを調べた。

業務縛りではないので、C++11の機能も利用していく。

Cより多少複雑なもののstd::chronoなど高機能で便利。

一番のネックとなる日の出/日の入りの計算は、時間をかけて泣きながらやればできそうではあったものの、幸いなことにライブラリを公開している方が何人かおり、その中でも使い勝手のよさそうなdaylightライブラリ(作者:adonmo )から、Sunclock.cppSunclock.hppを使用した。time_t型で出力されるため、それに応じて操作する。

プログラムの流れ。

まずraspberry piの初期設定を行う。

時計の初期化は、時計を最高速度(ただし、このムーブメントでは最高速度で動作させると逆回りになる)で回しつつ、フォトインタラプタが拾ったところを基準とする。

その後、地域選択スイッチの入力をとる。

地域選択スイッチに応じた緯度経度とタイムゾーン情報を手に入れ、日の出日の入りをライブラリで計算する。また、昼時間/夜時間の長さを計算する。

時計を現在時刻まで動作させる。プログラムは針の初期化位置と現在時刻、日の出日の入りの時刻によって場合分けが発生する。

あとは周期に応じて針を進めていく。15日たつか、時計リセットボタンの入力をもらうと時計をリセットする。

5/2現在、基本的な動作が可能であることを確認した。


今後:

・プログラムの割り込みが機能していないので何とかする

・当初、分針で表現しようとしていたが、ムーブメントの最高速度が思ったより遅いので、秒針に変更する。

・時計の文字盤は江戸時代の和時計の盤面を借りてきているので、できれば新たにデザインする。

・とりあえず東京モードで動作したので、地域選択が正しくできているかの確認をしていく。

・地域選択インターフェース作成。地図上にボタンを配置して、押せるようにする。

・最終組立