- 低価格の アナログクォーツ時計 を ESP8266モジュール と Arduinoスケッチ で制御し、インターネット時刻に同期させるプロジェクト
- NTPサーバー から15分ごとに時刻を取得して精度を維持し、サマータイム自動調整 機能を含む
- 時計の Lavetステッピングモーターコイル を分離してESP8266が制御できるように改造し、EERAMチップ を使って電源断時でも時針・分針・秒針の位置を保存
- 初期設定時にはESP8266が提供する Webページインターフェース を通じて時計の針位置を指定し、その後はステータスページで SVGまたはHTML Canvas により時計の状態を可視化
- 低価格ハードウェアを活用して 高精度なネットワーク同期時計 を実現できるオープンソースの例であり、組み込みIoT制御技術 の実用的な応用を示している
プロジェクト概要
- ESP8266 WiFi Analog Clock は、WEMOS D1 Mini ESP8266モジュールとArduinoスケッチを使って NTP(Network Time Protocol) サーバーからローカル時刻を自動取得して表示するシステム
- 15分ごとにNTPサーバーへ再接続して時計の精度を維持
- サマータイム(Daylight Saving Time) の自動調整機能を搭載
- このプロジェクトは 低価格のアナログクォーツ時計 をベースに、ハードウェア改造とソフトウェア制御を組み合わせたもの
ハードウェア構成
- 使用された時計は ウォルマートで3.88ドルで購入したアナログクォーツ時計
- 時計の クォーツムーブメント を開け、内部の Lavetステッピングモーターコイル をクォーツオシレーターから分離し、各リード線にESP8266接続用のワイヤをはんだ付け
- 多くのムーブメントはネジなしのスナップ方式で組み立てられている
- コイルの線は髪の毛より細いため、取り扱いには特に注意が必要
- 完成した回路は EERAM IC とそのほかの部品を ユニバーサル基板(perfboard) 上に構成
ソフトウェア動作
- AnalogClock.ino スケッチでは、ESP8266が1秒間に10回、実時刻と時計の表示時刻を比較
- 時計が遅れている場合は秒針を速く進めて同期
- 時計が進んでいる場合は実時刻が追いつくまで待機
- 秒針の移動は、バイポーラパルス(bipolar pulse) をLavetモーターコイルに印加して行う
- モーター特性に応じて PULSETIME定数 を調整する必要があり、実験では30msが適切
- 低価格の時計には針位置のフィードバックがないため、電源断時に位置情報が失われる
- これを解決するために Microchip 47L04 Serial EERAM(4Kbit SRAM + EEPROMバックアップ) を使用
- 時針・分針・秒針の位置を毎秒保存し、再通電時に復元
初期設定とWebインターフェース
- スケッチの初回実行時、ESP8266が シンプルなWebページ を提供し、ユーザーが時計の針の初期位置を指定できる
- その後、ESP8266はEERAMに保存されたデータを使って針位置を記憶
- 動作中には ステータスページ(status page) を提供し、次の3つの表示モードをサポート
- SVGベースの文字盤グラフィック表示
- HTML Canvasベースの文字盤表示
- テキスト専用の状態表示
ライセンスと技術情報
- プロジェクトは MITライセンス で公開
- 主な言語構成は C++ 64.1% 、 C 35.9%
- GitHubリポジトリは 252スター と 2フォーク を保有
- 関連トピックタグ: arduino、 esp8266、 clock、 analog-clock、 ntp、 hardware-construction
意義
- 低価格の時計を Wi-Fi同期型スマート時計 に変換する実用例
- ESP8266とArduino環境 を活用した 高精度な時刻制御とWebベースインターフェース実装 の事例
- IoTハードウェア改造とファームウェア同期技術 を学ぶためのオープンソース参考資料
1件のコメント
Hacker Newsのコメント
特に興味深かったのは 「SRAM with EEPROM backup」 チップだった。
このチップは時計の針の位置を動かすたびに永続的に保存できるが、通常のEEPROMのように 書き込み寿命 を消費しない。
単価も1ドル未満なので、趣味や小規模プロジェクトに便利な部品だ。
SRAMとEEPROMがコントローラと一緒に1つのパッケージに入っていて、近くに小さな コンデンサ (4.7µF) がある。
SRAMは電源が維持されている間はデータを保持し、EEPROMは電源が切れてもデータを永続保存できるが、書き込み回数に制限がある。
コントローラは電圧低下を検知すると、SRAMの内容を即座にEEPROMへダンプする。
コンデンサはその瞬間にEEPROMへデータを書き込めるよう電力を供給する。
電源が復旧すると、EEPROMのデータを再びSRAMへコピーする。
欠点は容量が4キロビットと小さいことだが、1ドルでこうした問題を解決できるなら十分に価値がある。
特にデバッグログをリングバッファとして保存しておけば、開発用PCにつながっていなくても組み込みシステムの クラッシュログ を残せるので便利だ。
製品リンク
しかし今住んでいる場所では信号が弱すぎて、手動設定がとても面倒だ。
そこで ESP32とNTPサーバー を使って世界の電波時計信号をエミュレートする Arduinoコード を自作した。
各国の標準電波の歴史や違いを調べるのもかなり面白い。
赤い投影の明るさが夜にちょうどいいのに、Wi-Fi同期 がないのでNTPやGPSで時刻を合わせられない。
プロジェクタ部分がリボンケーブルで本体につながっているので、リバースエンジニアリングしたら面白そうだ。
理想を言えば、天井に LEDマトリクス で時刻以外の情報も表示できるといい。
そういう製品はあるが、buyfrixos.com のように非常に高価だ。
私の製作記リンク
私もこうした低価格の壁掛け時計をいくつか使っているが、時刻のずれがほとんどない。
NTPよりジッターが少ないかもしれないと思う。
一度も時刻合わせをする必要がなく、NTP時計とも1秒以内で一致する。
ただ、オーブンや電子レンジの時計は消してしまいたい。
1か月で1分ほど進むので、Wi-Fi同期機能があればよかったのにと思う。
最近の製品はどんどんクローズドになっていて、単純でハック可能な物を自分で作ることが恋しくなった。
いつか本業から離れたら、シンプルで信頼性が高く、ハッカー向けの家電 を自分で作ってみたい。
こういうプロジェクトを見ると本当に感心する。
娘のために買ったが、不規則なチクタク音 が勉強の邪魔になるので今は休ませている。
それでもかなり楽しい体験だった。
ただし家に時計が複数あるなら、1つだけ使うと決めないと効果がない。
Gents Turret Movementの紹介
私はこれを使って 音叉ベースの電磁時計 を作った。
高精度の時刻源の代わりに 音叉と74xxロジック で駆動している。
なぜAccutronがいまだにこういう時計を作らないのか不思議だ。
共振周波数を使う方式は クォーツ時計に似ているが、見た目にはもっと魅力的 だ。
そうしないとスパイクで誤動作したり、マイコンが損傷 する可能性がある。
フォトトランジスタ でゲート電圧を分離し、モーター電源は別に供給するのが理想的だ。
GitHubプロジェクト もある。
古いデッキやLANCコントローラがまだたくさん残っているので、活用価値が大きい。
時計が正確な時刻を知っていても、実際の駆動速度が少しずつずれると累積誤差が大きくなる可能性がある。
特にPULSETIME定数を1msでも誤って設定すると、1日で差が出るかもしれない。
もちろんLavetステッピングモーターは理論上、一定の 周波数ベースのステップ を維持するが、摩耗やノイズによる偏りが出る可能性もある。
ただし壁掛け時計レベルなら無視できる誤差かもしれない。
Wikipediaの説明 を参照すると理解しやすい。
ステップが欠落しない限り 累積誤差は発生しない。
つまり、ステップ数を正確に維持すれば十分だ。