iizukakの作業ログ

忘れる前にメモしよう

UNIX 時間時計(物理)を作る

UNIX 時間を表示する時計(物理)があったら面白いのではなかろうか、と思い作ってみました。

f:id:iizukak:20160911220021p:plain

f:id:iizukak:20160911220128p:plain

物理世界の UNIX 時間時計というアイディアは僕が一番最初に考えたものではなく、 MobileHackerzさん などが、よりスマートに作った例があります。今回は、汎用的なパーツで作ってみました。秋月電子で買えるものしか使ってません。

使用したパーツはつぎの通りです。

  • Arduino Pro Mini 互換機 x1
    • 5V, 16Mhz のものです
    • 今回のメイン
  • SainSmart の RTC モジュール x1
    • Arduino には基本的に RTC モジュールがついていないので、電源を切っても時刻を保持したいといった場合、充電池付きの RTC モジュールを使います。RTC モジュールはなにを使ってもいいと思うのですが、今回は秋月で売っている電池付きのものを選んだらこれになりました。
    • DS1307RTC というライブラリを使ったのですが、すこぶる便利でした。ライブラリの使い方については、以前の記事で書きました。
  • 横長のユニバーサル基板 x2
    • 制御用のパーツ( Arduino と RTC モジュール等)を乗せるものと、7セグ表示器をのせるものの2枚使っています。
    • ちょうどよく横長のユニバーサル基盤が秋月に売っていてラッキーでした。
  • 74HC595 x1
    • シフトレジスタです
    • 今回は、7セグ4桁の表示器を3つ使ったのですが、Arduino Pro Mini のポート数を節約する必要があったので、シフトレジスタを使うことにしました。
  • 12V AC アダプタ x1
    • Arduino を駆動できるものならなんでもよかったですが、手元にあった 12V 1A のものを使いました。
  • ブレッドボード用DCジャックDIP化キット x1
    • AC アダプタをユニバーサル基板に繋げられればなんでもいいのですが、DIP 接続できるこれはけっこう便利でした。
  • アクリルパネル 15cm x 4cm
    • 今回は、秋月のアクリルパネル をPカッターで切って、ドリルで穴を開けて使いました。2mm くらいなら、Pカッターで切れますね。切断中にメガネ屋三みたいなにおいがします。
    • だめだったらプロの加工屋さんに依頼しようと思ったのですが、手でいけてラッキーでした。
  • 7セグ3桁表示器 x3
  • 220Ωの抵抗 x8
  • 3mm のスペーサーとナット、ネジ x適量
    • 個人的な好みで樹脂製のものを使っています。
  • ピンヘッダ x適量

作り方は、基本的に Arduinoで遊ぶ さんのページと、ブログの前の記事 を合体させるだけです。Arduino ピンのコンフリクトはしないようになっています。参考までに、組み上げ前の基板の写真をあげておきます。

f:id:iizukak:20160911232809p:plain

f:id:iizukak:20160911232840p:plain

時刻合わせについては、DS1307RTC の Github リポジトリ をそのまま Arduino IDE から書き込む形で行っています。なので、時刻合わせは PC がないとできないのですが、RTC もあるし、頻繁に時刻合わせはしないよなぁと思いこれでよいことにしました。

本体のスクリプトGist にあげてあります。デバッグ出力など残したままになっているので、参考程度にどうぞ。

いやはや、こんなシンプルなものでも、いざ作るとなるといろいろ考えなければいけないことが多発して面白いですね。例えば、Arduino では UNIX 時間を保持しようとすると long 型を使わなければいけないんですが、long 型を使うと動作が著しく遅くなる現象が発生してしまったりしたので、4 桁ごとの int 型に分けて処理したりしています。