屋根裏部屋SE > 大型壁掛けデジタル時計の製作

<トップページに戻る>



大型壁掛けデジタル時計の製作
Wrote:2011/01/02 Update:2012/10/01  K2000


製作のきっかけ

 1990年頃――秋葉原がまだオタク街に変貌する以前の話ですが、ラジオセンター2Fの山長通商で電子工作キット「大文字デジタル時計」を発見。 これが年間誤差0秒というとんでもない正確さで時を刻むため、今でもバリバリ現役です。 停電するとリセットしてしまうのが難点。
 

 たしかこれ、交流電源(100V)の周波数(50Hz/60Hz)を監視して超正確なクロックを実現してるはず。 だから時刻修正もぜんぜんいらない。 電波時計みたいな似非精密とは大違いです。 ただ、たまに東電が周波数を調整しているらしく、朝起きたら2分キッカリ遅れていたり、帰ってきたら元の時刻に戻っていたりと――原因を知るまでは本気で心霊現象かと思っていたくらいのことが稀に起きます。
 この時計ではありませんが、子供の頃は多くが周波数検知型の時計だったので、家中の時計がキッカリ1時間遅れてて遅刻しかけたことがありました。テレビを点けて顔真っ青。 しかし、そんなに遅れることなんてあるんだろうか・・・これは本当に心霊現象だったりして、親父が亡くなって、まだそれほど経っていない頃でしたから・・・。

 とにかく、この時計は視認性もよく、視力が弱い私も毎日世話になっている時計なので、
 もう一個、(これとは別の)こんな時計が欲しいと思っていました。
 しかし、既製品を色々と見てまわりましたが、これと思える品には出会えていません。

 はい、自作いきます。



 時計を自作する場合、クロック機能まで自力で作ろうと思うと、非常に面倒くさいのですが、
 (私は、そういう作業で快感を得られる性分ではないので)
 世の中には非常に便利なICが存在するものです。

 セイコーの32,768Hz水晶発振器と時計機能、アラーム機能を搭載した
 I2Cインターフェース型(400kHz)リアルタイムクロックモジュール「RTC-8564NB」というチップICです。
 本家の発振器なので、クロック精度は申し分ありません。

 で、私が使用したのは、このチップICを素人が扱いやすいよう8ピンDIP化して販売している、
 秋月電子通商「リアルタイムクロックモジュール(RTC-8564NB)」です。(以下RTC)
 



設計開始

 というわけで、面倒な時計機能はすべてRTCに任せちゃいます。
 私がやるのは、このRTCからI2Cで日時情報を取得して、大量の7segに表示してやるだけです。

 表示するのは、大文字デジタル時計と同じく「時分(HH:MI)」――だけではものたりないので、
 年月日時分秒(YYYY-MM-DD HH:MI:SS)、14桁+αまでフルに表示します。



 まずは、RTCから時刻を取得できなければ話にならないのでテストしてみます。
 RTCは「I2C」というインターフェースを採用しています。

 

 上の写真は、PIC16F648AをI2Cマスターにして、RTCから年月日時分秒を取得、7seg表示制御に使用するPIC16F877(40pin)に同じくI2Cでデータを送信して7segに表示――ということをやっています。

 いっけん複雑に見えますが、I2Cは、SCL(クロック)とSDA(データ)のたった2本の線でマスターモジュール1コと、無数のスレーブモジュールのバス接続を可能にした通信規格なので、非常にシンプルな回路が組めます。
 つまり、全モジュールのSCL同士、SDA同士を単純接続すれば、通信回路は完成なのです。
 (ちなみに、I2Cはオープンコレクタなのでプルアップ抵抗を入れてやる必要があります)

 「秒」を出力している端子に接続すると、7segが1秒毎にカウントアップされる様子が確認できました。



 ちなみに、大文字デジタル時計では停電時にリセットされてしまう点で悩んでいたので、
 バッテリーバックアップ機能を付けました。 1.5Fの大容量キャパシタを使ってます。
 試したところでは、丸一日電源を繋がずに放置していても、問題なく時を刻み続けていました。



 今回は、RTCがI2Cを採用しているので、全体でI2C通信に統一します。
 それぞれの機能と、スレーブデバイスIDは以下の構成にします。

 ▼I2Cマスター
 ・PIC16F648A(18pin)
    RTCから日時を取得して、7seg表示モジュール(年月日/時分秒)に表示情報を送信する。
    時刻設定機能なども当然搭載する予定。

 ▼I2Cスレーブ
 ・RTC (リアルタイムクロックモジュール) デバイスID = 0xA2
    クロック機能はすべて彼におまかせ。
 ・PIC16F877(40pin) デバイスID = 0xA4
    I2Cで受信したビット情報通りに、10桁の7segを表示する。(年月日・用)
 ・PIC16F88(18pin) デバイスID = 0xA6
    I2Cで受信したビット情報通りに、6桁の7segを表示する。(時分秒・用)



 I2CマスターとなるPIC16F648A(18pin)は、ハードウェア的にはI2Cには対応していません。
 しかしI2Cは非常にシンプルなシリアル通信規格であるため、ソフトウェア的に実現可能です。
 私は、mikroCのSoftware I2Cライブラリを使っています。これで超簡単にI2C通信ができます。

 mikroCを使ったI2Cマスターの初期化、及びRTCの初期化は以下のような感じです。 簡単ですね。
 タイマーを使う場合など設定が変わりますので、詳細はRTCのデータシートを参照して下さい。


#define M_RTC8564        0xA2
#define M_I2CWRITE       0
#define M_I2CREAD        1
#define M_CTRL1          0x00    // 機能設定
#define M_CTRL2          0x01    // アラーム/タイマー設定
#define M_SEC            0x02    // 値(秒)
#define M_MIN            0x03    // 値(分)
#define M_HOUR           0x04    // 値(時)
#define M_DAY            0x05    // 値(日)
#define M_WDAY           0x06    // 値(曜日0=日〜6=土)
#define M_MONTH          0x07    // 値(月)
#define M_YEAR           0x08    // 値(年)
#define M_ALARM_MINUTE   0x09    // アラームレジスタ(分桁)
#define M_ALARM_HOUR     0x0a    // アラームレジスタ(時桁)
#define M_ALARM_DAY      0x0b    // アラームレジスタ(日桁)
#define M_ALARM_WEEKDAY  0x0c    // アラームレジスタ(曜日)
#define M_CKOUT          0x0d    // CLKOUT周波数
#define M_CTRLT          0x0e    // タイマーコントロール
#define M_TIMER          0x0f    // タイマーレジスタ

void writeI2C(unsigned short nModule, unsigned short nAddress, unsigned short nData)
{
    Soft_I2C_Start();
    Soft_I2C_Write(nModule|M_I2CWRITE);
    Soft_I2C_Write(nAddress);
    Soft_I2C_Write(nData);
    Soft_I2C_Stop();
}

void main()
{
        :
        :
    Soft_I2C_Init();
    Delay_ms(500);

    // ▼RTC8564初期化
    writeI2C(M_RTC8564, M_CTRL1, 0x20);  // [00] 停止状態初期化
    writeI2C(M_RTC8564, M_CTRL2, 0x00);  // [01] TI/TP=OFF AF=0 TF=0 AIE=OFF TIE=OFF
    writeI2C(M_RTC8564, M_CKOUT, 0x00);  // [0D] FE=ON  FD1=1 FD0=0 (CLKOUT ON/32Hz)
    writeI2C(M_RTC8564, M_CTRLT, 0x00);  // [0E] TE=OFF TD1=0 TD0=0 (タイマーOFF)
    writeI2C(M_RTC8564, M_CTRL1, 0x00);  // [00] 機能開始




 次は「年月日」を表示する7seg表示用のI2Cスレーブですが、
 本当はもっとピン数の少ないPICを使う予定でした。

 しかし、困ったことに、I2Cスレーブは「ハードウェアが対応していないと使えない」のです。
 そこで、手持ちのPICで唯一I2Cスレーブに対応した「PIC16F877(40pin)」を使うことにしました。
 (18pin最強PICとも言えるPIC16F88も持っていましたが、7seg10桁表示は不可能なのでパス)

 7seg10桁表示用I2Cスレーブの主なプログラムは、二つの割り込みがメインとなります。
 1.7segのダイナミック点灯制御
 2.I2C割り込み

 mikroCを使ったI2Cスレーブの初期化、及び受信方法は、以下のような感じです。

#define M_I2CADDR 0xA4

void i2cHandler()
{
    unsigned short nST = SSPSTAT & 0b00101001;

    // ▼WRITE要求
    if(nST==0b00001001){
        nST = SSPBUF;
        return;
    }
    // ▼WRITEデータ受信
    if(nST==0b00101001){
        nST = SSPBUF;
        return;
    }
}

void interrupt()
{
    if(PIR1.SSPIF==1){
        PIR1.SSPIF = 0;
        i2cHandler();
    }
}

void main()
{
        :
        :
    TRISC   = 0b00011000;    // RC3/4=I2C BUS
    PORTC   = 0b00000000;
    // ▼I2C設定
    SSPADD  = M_I2CADDR;
    SSPCON  = 0x36;
    SSPSTAT = 0;
    // ▼I2C割り込み設定
    INTCON.GIE = 1;
    PIE1.SSPIE = 1;
    PIR1.SSPIF = 0;

 I2CのスレーブデバイスIDは、RTCが0xA2なので、0xA4にしています。
 I2CのデバイスIDは、7bit規格と10bit規格の2種類が存在しますが、
 10bit規格はほとんど使われていません。 7bit規格で全然問題ありません。

 デバイスIDは、SSPADDに設定しますが、上位7bitがID、最後の1bitはREAD/WRITEフラグとなります。
 READ=1、WRITE=0です。

 RTCは0xA2(0b10100010)なので、READを追加した0xA3(0b10100011)もRTCで予約されています。
 なので、今回のスレーブは0xA4(0b10100100)と0xA5(0b10100101)を使うことになります。
 もっとも、今回はWRITEの一方通行でしか使う予定はありませんのでREADは考慮していません。



 最後に「時分秒」を表示する7seg表示用のI2Cスレーブですが、
 問題が起きました。

 たかが6桁の7seg制御なら18pinPICでも問題ないと判断し、
 I2Cスレーブに対応したPIC16F88を使う予定だったのですが、うまく動かないのです。

 ピンの設計としては、RA0〜RA7(RA5は除く)はLEDのセグメント制御、
 RB0/2/3/5/6/7をダイナミック点灯用端子として使い、RB1とRB4はI2C接続となります。
 当然、これでは外部オシレータを接続する余裕などありませんが、幸いPIC16F88には
 最大で8MHzという高速オシレータが内蔵されていますので、それを利用します。

 いざ、プログラムも組み終わって表示テスト・・・。
 ところが、うまく受信できないのです。 ダイナミック点灯の方はまったく問題ありません。
 I2Cの受信が、うまくいったり失敗したりと、全然安定しないのです。

 こりゃダイナミック点灯にパワー取られすぎて、I2Cが追いついてないな、ということで
 ダイナミック点灯の周期を、点滅が判るくらい落としてテスト。
 先程よりは安定しましたが、でもまだ不安定な時がある――。

 先に作成したPIC16F877は10MHzの外部オシレータを使用していますが、
 あちらは10桁ものダイナミック制御をしています。
 それよりも周期を落とした6桁制御でI2C通信がうまく行かないのは納得いきません。

 なんにせよ、これじゃ使えないので急遽PIC16F877の利用に切り替えました。
 こんなことで丸1日潰してしまった・・・。
 



製作開始 / 10桁7seg表示モジュール

 各部テストとプログラミングが終わったので、ハードウェア構築開始です。
 まずは、10桁7seg表示モジュールを製作します。
 それぞれのパーツをどう配置しようか思案中。
 

 40pinのPICはデカイですねー。
 ICソケットがすれすれ入らなくて、禁断の「PIC直付け」をやるしかなさそうです。
 まあプログラムを書き換えることは無いだろうし、必要ならICSP接続すれば済むことです。

 てことで、I2C通信型の10桁7seg表示汎用モジュールが完成。 何にでも使えて便利。
 電源線2本と、通信線2本のたった4本で、80個のLEDの点灯制御が自由自在です。
 

 しかし、10桁もの7segともなると、やはり配線がクソ面倒くさいです。
 よって、今回もポリウレタン導線が大活躍。 裏汚いw

 

 




製作開始 / 大型時計文字盤の製作

 次は、今回の一番の難関、巨大文字盤の製作です。

 どうやって、大文字デジタル時計のような表示を実現しようか、散々悩みました。
 大きさ的には、横幅30cm、高さ15cmくらいになる予定ですが、そんな巨大なベーク板は高額だしミスったら痛すぎる、だいたいエッチング設備もありませんので端子接続も困難。 プリント基板も個人で発注できる代物じゃない。(後述しますが、後に個人でも安価にプリント基板が作れるようになりました)

 よって今回はLEDの端子穴を空けるのではなく、LEDの砲弾部を突き抜けさせることに決定。
 5mmの穴を空けようとしているので、ベーク板では強度上の不安も残ります。
 あちこちのダイソーやセリア、ホームセンターなどを歩き回り、使えそうな「板」を探しました。
 以下は、ダイソーで仕入れたもの達。
 左からキャンバス、クリップボード、PPシート。

 

 キャンバスは、穴を空けてみたところ、中身が「紙」で穴を空けるとボロボロになるのでペケ。
 クリップボードも似たようなものだろう、ということで触らずぺけ。 そのまま実用します。
 PPシートはA4でサイズも微妙に足りないし、ハンダゴテの接近で変形しそうなのでペケ。

 その他、ベニヤなども、周りに干渉することなく綺麗に穴が空けられるか不安なのでパス。
 アルミ板は硬すぎて色々大変そう・・・絶縁処理も必要だろうし。
 (これらは卓上ボール盤でもあれば解決しそうな問題ですけど、そんなハイカラなもん持ってません)



 諦めかけていたその時、思いつきました。
 樹脂製の「まな板」です。
 それも、あまりブ厚くなく、薄すぎないやつ。 できれば2〜3mm程度がベスト。

 割と小さいサイズならば100円ショップでもありますが、少し大きめになるとありません。
 今回は妥協して、ホームセンターを探します。

 ありました。 カインズホームに298円で。
 厚さは3mmほど。 大きさは割とスレスレですが、
 この上のサイズになると498円になるのでパス。

 早速、穿孔イメージをA4用紙に印刷して、まな板に貼り付け、
 穿孔ポイントにキリを押しつけて印を付けたら、電動ドリルでズボズボやります。
 (穿孔イメージは、デジタル時計っぽく、微妙にナナメにしています)

 

 全部で160個・・・大変な作業です。

 まずは1mmの細いドリルで穴を貫通させ、5mmのドリルを使います。
 樹脂製のまな板は、粘性が強いので、穿孔後もしつこくクズが残ります。
 それらは小さなニッパーで地道に取り除き、細かい山はヤスリで削り取ります。

 そして、いよいよLEDを通すのですが、一度通したら抜くのは困難なので、
 その前に黒スプレーで塗装してしまいます。(白いままでは光が乱反射するので)

 で、乾いたら、今度こそLEDを通します。

 

 おおー、サマになってきました。

 ちなみにLEDは黄色を採用しました。 自作モノだと青LED(しかも超高輝度)とか選びがちなのですが、昼間はともかく夜間の青LEDの眩しさは異常なのでペケ。

 あと、LEDを穴に通す時は全部通さず、配線を行いながらやった方がいいです。
 裏側はこんな感じです。 歯並びの矯正ですねまるで。

 

 各部配線は、もちろんポリウレタン導線。

 入力電圧は5Vなので、LEDは全て並列に接続し、1灯あたり10mAを流す予定。
 ダイナミック点灯なので、1桁あたり最大35個点灯で350mAが流れる。
 各部ICや、10桁7segモジュールの最大消費電力を合わせても400mAちょっと。
 (これは瞬間最大消費電流なので、実際は平均すると250mA程度、
 更に常時点灯ではなくダイナミック点灯によって点灯時間をセーブしていますから
 消費電力は1W程度かな? 機会があれば今度実測してみます>忘れてた)

 よって、USB程度の電源でも稼働可能です。
 (実際、工作中はずっとUSB電源を利用)

 ちなみに、1セグメントあたり5灯、同時点灯35灯ともなるとPIC単体では電流不足なので、
 セグメント毎にトランジスタを経由しています。

 「時分」間のドット、及び「分秒」間のドットは、「時」の未使用上位桁のセグを使います。
 基本的に12時間表記なので、上位は「1」しか表示しません。
 つまり残りの5セグメントが未使用なので、そこに割り当てます。



 最後に、クロック機能まわりの回路もユニバーサル基板に起こして、LEDと回路を接続。
 電子回路の部分はほぼ完成しました。

 

 表示も問題なし。
 結構サマになっています。
 ――大晦日に何してるんでしょう。

 

 裏はこんな感じ。(↓)  はい、気にしない。

 

 ここまで来たら、まな板の四隅を、適度なサイズにカットします。
 これが3mm厚とは思えないくらい硬いので、プラ板カッターで地道にこすってから、
 薄くなったところをハサミで切ります。

 作業中に黒塗装が剥げてしまった部分などは、黒ペイントで丁寧に補正します。



 あ。 もう一つ機能を付けないといけませんね。
 時計の設定機能です。 (この機能いれたら、mikroCの試用制限2KBスレスレでした・・・)

 年月日時分秒をそれぞれ個別に設定できる作りにしたいです。
 ということで、ボタン4つで実現。
 1.日時編集モードのON/OFFスイッチ。(赤)
 2.編集対象(年→月→日→時→分→秒→・・・)を順次切り替えるスイッチ。(青)
 3.数値をアップするスイッチ(黄)
 4.数値をダウンするスイッチ(黄)

 下の写真の、右上にある4つのタクトスイッチがそれです。

 



 最後は、3mm厚のアクリサンデー板を、アクリル曲げヒーターで曲げて筐体を作ります。
 回路全体の厚さは約12mm、3mm厚のアクリル板を曲げて+6mm、+余裕2mmで、計20mm。
 自分で作って言うのもなんですが、かなり薄っぺらくて、スタイリッシュに仕上がりました。

 アクリルの内側には13%のスモークを貼って、視認性を上げています。
 ――お正月に何してるんでしょうね。

 

 それと、壁掛け時計なのですから、釘にひっかける穴を作らなくてはいけません。

 生憎、厚さがスレスレで、釘を引っ掛ける穴を筐体に空ける余裕がありませんので
 釘穴引っ掛け用のタブを付けました。 穿孔中に誤って1カ所割れましたが、
 実用上は問題ないので、とりあえず放置。 やばいと思ったら補強します。

 




 ▼[YouTube] 時計の電源ON、時刻設定、電源OFF、再び電源ONを試した動画
 

 なんだかエヴァの外部電源っぽい絵になってしまいました。

 電源を入れた時に、全体がテラテラッと何か映りますが、あれは点灯・通信テストです。
 以下の手順で表示してます。 早すぎて一瞬で終わっちゃいますけどw

 電源ON→全灯点灯→ランダム点灯(通信テスト)→全灯点灯→全灯消灯→時計表示。

 バッテリーバックアップ機能が搭載されているので、電源を抜いても時計は生きています。
 (まる一日抜いておいても平気。試してはいないけど、数日は保つのかな・・・?)

 はあ・・・。
 これで、目を細めて時計を見る必要がなくなりました。
 




専用プリント基板を作ってみたり - 2012/10/01追記

 すっごい実用的なので、贅沢にプリント基板化してみたり。
 (前作で購入した砲弾型LEDも大量に余ってたし)

 

 2年前、まな板で作った時はプリント基板を個人で作るには高額すぎて敷居が高すぎたのですが、個人でも気軽に発注できるくらい安価に作れるようになりまして、良い世の中になりました。

 やっぱり、まな板使うのとでは仕上がりが雲泥の差です。

 手作りのより回路をギッシリ詰め込める分、若干コンパクトになっています。 といっても、手作りの方もポリウレタン銅線で、ユニバーサル基板では有り得ない高密度化してますけど(^_^;

 他にも省ける部品はとことん省いて単純化。
 10桁7セグモジュールも専用基板化して、チップ部品を使ってます。

 

 ただ一つ、砲弾型LEDの実装は、プリント基板化しても大変なことは変わりませんでした。 ハンダで固定していないLEDは裏返すと穴からスッポ抜けるので、いかに固定しながら半田付けするか。セロテープも気を付けないとLEDが少し傾いたまま半田付け、なんてことにも。

 モジュールのドッキング設計とかも初めてやってみたけど、結構面白い。
 そんなこんなで、横幅270mm、縦幅111mm、厚さ12mm(DCジャック部のみ14.5mm)に収まりました。

 

 もちろん、このままだと見にくいので、前作同様にアクリサンデー板で外装を作ります。

 

 基板厚は14mm。 アクリサンデー板は3mm厚。 いつもの曲げ加工で、
 横幅270mm×高さ112mm×最厚20mmで仕上がりました。



 ――実は1カ所設計ミスがあったり(^_^;
 とあるICの上下を完全に間違えて配線してしまったので、要するにICを裏返して実装(+若干の工夫)すれば良いのですが・・・それ以外は問題なし。 あと特に問題というわけではないけど改良したい箇所が4点ほどあるので(DCジャックの薄型化とか、スイッチモジュールの改良とか、日付モジュールの位置調整とか、穴のサイズを全体的に再調整とか)、また改めて基板を発注するつもり。

 こういう非売品で完全自作の時計とか。
 実用性もあるし、適度に制作費や手間もかかるし、意外とプレゼントとかに良さそうだ。
 



<トップページに戻る>

データの無断転載/無断使用を禁じます