Arduinoで時計。(1)2010/06/15 00:00

もともとArduinoは、アートな人でも道具として使えちゃう、ラクな電子工作環境を作るところが目的であった(と記憶している)。アートな電子作品と言って思いつくのは時計。時計機能自体は家に沢山あるし、携帯があるのでハッキリ言って不要だが、IDEAインターナショナルの作る時計とか、Village/Vanguardのお店に置かれてる時計とか、Franc francに置いてある時計とか、皆カッコイイor面白い感じがする。

という事で、(なるべくアートな)時計を作ってみたい。

…と言いながら、時計である以上、最低限、時を刻む機能が必要だ。Arduinoには時間を測る機能があるからそれでええやん!と思いたいが、時計機能としての正確性はあまり期待してはマズいかもしれない。どの程度のものか、まずは実験で確認したい。

   ★    ★    ★

普通にArduinoの機能のみで時間を測った場合の結果と、既成のデジタルクロックの結果を比較してみたい。1日あたりのズレが、例えば1秒程度なのであれば、植木の自動水やり機など、あまり正確な時間管理を必要としないようなケースの場合にはそのまま使っちゃえば良いと思うので。そして、本当に「正しい」時刻が欲しければ、電波時計か、もしくはネットワーク経由で時刻を取得した方が良いと思うため。

ここで、時刻を表示するための機構が必要になる。時・分・秒の表示のため、6桁が必要になる。以下の感じでArduino(手近にJapaninoしかないのでJapaninoを使用)、7セグを6個、シフトレジスタを1個、あと抵抗やらコンデンサやらを用意して、表示機を作成した。

Japanino 7セグ時計
                          Japanino 7セグ時計。ワイヤーが編み物みたいになった…

■7セグJapanino時計の材料
・7セグ(TLR363T) ×6
・Shiftレジスタ(74HC595) ×1
・1uf コンデンサ ×1
・Japanino ×1
・ワイヤー ×たくさん

■回路構成
6個の7セグを操作するには、7セグ1個あたり8信号なので、単純に考えると6個×8信号で48本のpinが必要になる。シフトレジスタを使えば、7セグ1個を3本のpinで操作できる。この3本中、データを流すのは1本なので、6個の7セグを表示したいのなら6本+2本で出来る計算になるが、シフトレジスタも6個必要な状態になってしまう。マジメに7セグを全て点灯させようとすると、pin数やシフトレジスタ数が多くなるので、それっぽく見えるように残像を使う。
1番目の7セグから6番目の7セグまで、それぞれ順番に光らせて、また1番目に戻るという事を60回/1秒やれば、チラつきなくすべての7セグが点灯している(ように見える)。これはテレビと同じ考え方。
作成にあたって、以下を参考にさせて頂いた。まいど、ためになります。ただ今回はトランジスタアレイは使用せず、Shift レジスタと6つのPIN制御だけで作りました。

■【武蔵野電波のプロトタイパーズ】
 第5回「LEDディスプレイをPCにつないでみよう」
http://pc.watch.impress.co.jp/docs/column/musashino_proto/20090709_300483.html

■回路図
 (7セグ1個を表示させる場合とほとんど同じなので、後日記載…)

■実験(1)
Japanino時計はスイッチOnで00:00:00 からスタートする。デジタル時計側の時刻も合わせておいて、よーいドンでスタートさせる。使用スケッチはこちら。まずはdelay 1000(1秒)おきにカウントを進めるというやり方にした。本来は表示するための処理時間を考慮しないといけないので、いかにも遅延が発生しそうな感じだが、とりあえずこれで様子を見てみる。

■実験(1)結果
左上が家にあったデジタル時計、右下が今回作ったJapanino時計。ワールドカップの試合を見ながらスタートして、途中の段階でこの状態。ハーフ前で既に3秒遅れであり、やはりマズい感じ。あと、Japaninoだからなのか、あるいは回路のつくりが悪いのか、7segの光り具合が非常に暗い。
Japanino 7セグ時計 比較
         38:17と38:14 で約3秒差ついてしまった

■対策案(1)
現状、Delay間隔を1000にしてるので、1回の表示に要する平均的な時間をms単位で求めて、Delay間隔を調整すれば、ほぼ1秒間隔に調整出来ると思う。
■対策案(2)
前回の時刻表示処理の開始時からの時刻を計測して、1000ms経過したらカウントアップ→表示する方式とする。

など。今後もう少し手を入れてまともな時計機能として使えるようにしたい。

   ★    ★    ★

【2010/6/16 追記】
ほぼ1日経過後。1分40秒のズレが起きた。
1日24時間=86400秒なので、1秒あたり1.15msの処理時間を要すると考えられる。delay間隔を1000から999にすれば、このズレはほとんど解消されると推測できる。delay間隔を999にして、再度テストしてみる。
Japanino時計(1日後)
         デジタル時計00:01:41に対してJapanino時計は00:00:01


   ★    ★    ★

【2010/6/17 追記】
実は上記の設定で10分ほど放置した所、既にはげしくズレてしまっていた。今度はJapanino時計の方が早くなってしまった。実験(1)の時は、公開したスケッチ通りではなく、デバック用に時刻をSerial.printしていて、それを再テストの時に除外したのが原因と思われた。調整のため delay 1000 に戻しても、ズレ具合にあまり差はなく、Japanino時計の方がどんどん先行してしまう結果となった。

Japanino時計が内部の処理で時間を食い、時間が遅くなるのであれば理由は分かるが、delay 1000であってもJapanino時計の方が早く進んでしまうという事は、内部の時刻カウントの精度が低いためだと思われる。この場合は、上で書いた対策案(1)でも(2)でも効果は同じなので、delay時間を調整する対応で妥協するしかないと考えた。

いろいろdelayを変えながら、だいたい1時間で±1秒程度の差になるように調整した結果は delay 1007ms だった。さらにμsレベルでdelay時間を調整すれば、おそらく市販時計とほぼ同じになると思う。ただ、このdelay時間はあくまでこの構成のJapanino時計の場合のみ有効であり、おそらく別のArduinoを使用したり、若干処理の異なるロジックの場合ではズレてしまうと思われる。

コメント

_ kazukun ― 2011/03/25 19:44

なぜ時計の精度が悪いか調べてみました
外部発振子ではなく内部CR発振になっているらしいのですが…
ちょっと特別な機械やもう一台Arduino(または互換機)賀いりますが直すことが出来ます

直し方やなぜかはこちら↓
http://www35.atwiki.jp/japanino/pages/24.html#rc

_ aki ― 2011/04/02 01:53

そうなのですか!情報ありがとうございます。勉強になります。
FT232RLは自作のためにそのうち買おうと思っていたので、買ったら試してみたいですね。
(7セグ表示のためにのワイヤー編み物を再度する気力起きるか自信が無いので、試すとすれば時計は液晶表示ですが。。。)

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://isa.asablo.jp/blog/2010/06/08/5145815/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。