2019年5月6日月曜日

ESP32で古時計の精度改善

これまではCPUとしてESP8266を使っていましたが、今回はその上位バージョンであるESP32とOLEDディスプレイが合体したボードを使って、機能と性能の向上を図りました。
モジュールの写真です。


時計と組み合わせた写真です。左が普通の振り子時計(以下重力振り子時計と呼びます)、右は回転振り子時計です。



動作原理を説明します。
振り子に取り付けられた磁石の磁力線を磁気センサーが検出して振り子のタイミングを認識し、時計のギヤ比を使って時計が指している時刻を算出します。一方正確な時刻は、WiFiを通してNTPサーバーから取得します。これらを比較して、時計が遅れている場合は振り子の周期が短くなるように、進んでいる場合は振り子の周期が長くなるように、調整します。

重力振り子の場合は、振り子に取り付けた磁石に対して、電磁コイルで上下方向の力を加えます。これは重力加速度が変化したのと同等の効果があるので、振り子の周期が変化します。下の写真の黒い楕円がコイル、振り子の下端についている円柱状のものが磁石、その直下にホールセンサーが黄色いワイヤーでコイルに固定されています。


回転振り子の場合は、振り子に取り付けた磁石に対して、電磁コイルで水平方向の力を加えます。これは振り子を吊っているワイヤの捻じりばね係数が変化したのと同等の効果があるので、回転振り子の周期が変化します。下の写真は回転振り子に取り付けた正方形の磁石。
下の写真は、ベースプレートの裏に取り付けた、コイルとデジタルコンパスです。



ディスプレイには、現在時刻、誤差、コイル電流に加え、誤差とコイル電流のグラフも表示されます。下は回転振り子時計の例です。2行目の-0000.04が0.04秒の遅れを示しており、113はコイル電流です(範囲は-1023から1023で、最大電流は100mA程度)。
グラフのX軸の範囲は約5時間、Y軸の誤差は+/-0.5秒の範囲を表示しています。


Webサーバーの機能も備えているので、WiFi経由でブラウザからアクセスできます。下の例はパラメータの設定画面です。


重力振り子時計の実験結果です。青が誤差で縦軸は左側、赤がコイル電流で縦軸は右側です。約1週間の測定でほぼ+/-0.1秒以内に収まっています。左の大きな変動は、時計を動かしたためのもの、右側の変動は周囲に置いたものによる影響と思われます。


重力振り子時計用の回路図です。
磁気センサーはデジタル出力のホール素子です。


回転振り子時計用の回路図です。
磁気センサーはi2c接続のデジタルコンパスです。

以下2020年5月17日追記

ソースコードはこちらです

ハードウェアをブログにアップしてから1年近くが経ってしまい、その間にソフトはだいぶ変更されたので、Web画面の構成など写真とは一部異なります。かなり強引なコーディングなので、より良い書き方がありましたら、教えていただけるとありがたいです。