PIC16F887・秋月電波時計用外付けカレンダーの製作 (2010/12/21〜2011/01/14)

(Last update:2011/05/09)


ブレッドボード上でデバッグ中 電波時計から線を引き出す。
(+5V, GND, RX, TX, 日更新信号の 5本)
 
トランジスタアレイ追加前の基板表 トランジスタアレイ追加前の基板裏
デバッグ用 LCD を
接続して最終調整
トランジスタアレイ追加後基板表
7年前に製作した
初代秋月電波時計。
バーアンテナはなるべく
隠さないようにケーシング。

月が一桁ならより読み取り易いように
表示位置を修正(v1.2〜)
電波校正前は「?」表示 最終回路図
電波時計側のファームウエアを書き換えて
手動で時刻を設定できるように改変。
(詳細はこちら
それに伴ないスイッチを表面に引き出した

I 様より製作レポートをいただきました!! (2011/03/02)
↓↓↓
管理人コメント:
部品レイアウトが最適化され、
小型に実装されていて感動しました ^^
管理人コメント:
青 LED で日付が見易く
仕上がっていますね ^^

F 様より製作レポートをいただきました!! (2011/03/13)
↓↓↓
管理人コメント:
基板をおこして製作されていて
美しい仕上がりに @o@ しました ^^;

製作の動機・仕様:

 珍しくカミさんから製作命令要請が ^^;  義父母宅用に「日めくりカレンダー」が欲しいという。

 要求仕様は、

 ・月日と曜日を表示。曜日は漢字で表示(必須)
 ・時刻表示は不要(既に別の時計があるので)
 ・LED 表示。液晶表示は不可
 ・LED 色は、高齢者が見易い赤
 ・LED の文字サイズは大きめ

 要するに「高齢者が見易い日めくりカレンダー」を所望とのこと。確かに LED 表示で、しかも曜日を漢字表示してくれるものなど市販品ではまず見かけない。(液晶表示なら結構あるが)

 で実現方法を考えてみる。「時刻表示は不要」と言われても実質は時計を作れ、ということと同じなわけで(汗)、ゼロから作ると曜日計算が結構面倒(特にアセンブラでは)。そこでお手軽に秋月の電波時計から日付と曜日を RS-232C 経由で取得して表示する外付けユニットを製作することにした。


回路、部品、設計時の考慮点等:

 秋月で入手可能な一般的な部品を使用し、なるべく部品数を減らす方向で設計。

 秋月で入手できないのは 7 セグデコーダーの 74LS247 とトランジスタアレイ TD62783APG。74LS247 は一般的なパーツ屋で比較的容易に手に入ると思うが、TD62783APG はポピュラーなシンクドライブではなくソースドライブ。マルツや共立で入手可能だが、入手できない場合は下記代替方法を御参照。TD62783APG は Vce(sat) が -100mA 時 1.8V とちと高めだが、H 入力 Active だし Vce が 50V と高いので扱い易い。

 マトリクス LED は秋月で 100円(!)のTOM-1588BH を使用。ピンが 2.54mm ピッチでユニバーサル基板への実装も楽だし、表示サイズが大きめなので今回の用途にピッタリ。ピンアサインはこちらを参考にさせていただいた(ブログ主様に感謝)。このピン配置は表示面から見た番号である点に注意。

 また今回は RS-232C 通信を行う都合上、クロックをなるべく正確にする必要があるので外付けのクリスタルオシレーター (X'tal OSC) を投入。電波時計との通信ボーレートは 9600bps なので、クロック周波数はエラーレートが小さくなるよう(参考)16MHz とした。

 なお RS-232C のハンドリングは今回が初めてなので、デバッグ用に LCD を接続できるようにしておく。このデバッグ用 LCD には秋月電波時計から送られてくる生の値や各種ステータスが表示されるが、通常は接続する必要は無い。


ソフトウエア:

 RS-232C データの送受信はハードウエア USART 機能を使用する。LED のダイナミック点灯も含めて割り込みは一切使用しない。

 今回はファイルレジスタ Bank 1 をデバッグ LCD 用の表示データバッファに、Bank 2 を RS-232C の送信バッファ・受信バッファに使用しているため FSR を使った間接アドレッシングを多用している。直接アドレッシングの場合はバンク 2,3 上のメモリへは STATUS レジスタの RP1 ビットを操作してアクセスするが、FSR を使う場合は RP1 ビットではなく IRP ビットを操作してアクセスする点に注意が必要。


【日付・曜日取得】

 初代電波時計(ファームウエアバージョン 1.01)に DATE コマンドを送信し、戻ってきた文字列を解析する。受信処理は、本来なら割込みで受信を検知して受信文字をバッファに溜め込んでいくのが定石だが、今回はソフトウエア簡略化のため割り込みは使用しない。

 日付は 2011/01/04 TUE(CR)(LF) の書式で送られてくるので、ポーリングで受信文字列をバッファに溜めていき、LF (&H0A) が来たら受信完了とみなす。ただし電波時計の電源投入直後〜電波校正完了までの間は電波時計からは「2000/01/01 SUN」が戻ってくるので年の 3桁目をチェックし、0 なら 校正済みの年月日が送られてくるまで一定時間毎に DATE コマンドを再発行する(この間、DP 点滅)。

 また受信開始から約 25秒以内に &H0A を受信できなかった場合も DATE コマンドを再発行する(この間、DP 連続点灯)。またさらに受信データが異常(月上位が2以上等)の場合も再度 DATA コマンドを発行する。

 一方、電波時計からの日付更新信号(100ms のパルス)とキー操作はポーリングで監視して日付更新処理を行う。

 なお正常な日付・曜日が取得できるまではマトリクス LED には「?」が表示される。

【LED ドライブ】

 今回はドットマトリクスが 8 x 8 と小規模のため、なまじシフトレジスタや BCD デコーダを使うとデメリット(ソフトの複雑化、IC 数増加)の方が大きい。そこで単純にピン数の多い PIC16F887 でドライブする。

 具体的には、列方向はスタティック点灯し、行方向はダイナミックドライブしている。当初は PIC から直接マトリクス LED をドライブしていたのだが、1ドットあたり 3mA しか流せず(PIC の各 I/O の最大許容電流が 25mA なので、桁を制御する I/O ポートには 3mA x 8ドット = 24mA 流れ、規格ギリギリ)、直射日光の入る昼間は輝度不足(爆)。そこでソースドライブのトランジスタアレイ TD62783APG を後付けし、各ドット 8mA で点灯することにした。これなら PIC 全体に同時に流れるのは 8mA x 8 = 64mA なので、PIC16F887 の全 I/O 合計 90mA 以内に余裕で収まる。

 したがってさらに輝度を上げたい場合は行方向にもトランジスタアレイを追加するか、超高輝度のマトリクス LED が必要(ダイナミック点灯時間をこれ以上増やすとチラつきが目立つので不可)。

 一方 7 セグ LED は、桁内表示は 74LS247 でデコードしてスタティック点灯、桁間は通常どおりダイナミックドライブにした。超高輝度の OSL40562-IR を使用したため、こちらの輝度は十分。

【日付表示】

 当初は月日を通常通りの桁位置で表示していたのだが、カミさんから「判り辛い」との罵声指摘が ^^;

 そこで DP(小数点)セグメントを月日の区切りとして点灯させるとともに(v1.1〜)、月が一桁の場合は月の表示位置を一桁目に修正した(v1.2〜)。これによって月と日が物理的に離れてだいぶ読み取り易くなった(写真参照)。


実装:

 初代電波時計は 7年前に製作してケーシングしてあった(写真参照)。これをなるべく活かす方向で実装を考えてみる。幸い前面パネルはアクリル板でシースルーのため、内部レイアウトの変更だけで済ますことができそう。

 ただ基本的にデジタル回路はノイズ源であり、下手にレイアウトすると感度低下を招く可能性が高い。(実際、ダイナミック点灯周波数次第では受信感度の低下が見られた)。感度確保のためには完全外付けにしてしまうのが最も望ましいのだが、今回はなるべくバーアンテナが隠れないよう基板を配置することで感度低下をなるべく防いだ・・・つもり。管理人宅が茨城で木造住宅、という好条件もあるとは思うが、一応このレイアウトで電波は受信できている。

 なお装置全体の消費電流は最大 90mA 程度。電波時計側も 50mA ほど消費するので、入力電圧差によっては三端子レギュレーターにソコソコのヒートシンクが必要になる。今回はヒートシンクの実装スペースが確保できなかったので、電波時計に付いていた三端子レギュレータは取り払い、AC アダプタから 5.1V を入力し、逆接続防止も兼ねた SBD を介して若干電圧を降下させた 4.8V を電波時計とカレンダーユニットに供給している。


その他:

 完全外付け動作が可能なように設計しているため、今回のように電波時計と一体化して実装する場合には不要な部分がある。例えば RS-232C 回りは電波時計側 PIC と外付けカレンダー側 PIC の RX, TX をクロス直結してしまうことで RS-232C ドライバ IC を省略できるし、日付更新信号もフォトカプラが不要になるのでさらに部品点数を減らせる。

 逆に完全外付けユニットで使用する場合、日付更新信号は電波時計キットで使用していない RS-232C の空きピン(1番ピンとか4番ピン)に割り当てるとケーブル 1本で接続できて便利。ただし市販の RS-232C ケーブルは「間引き結線」されたものが多いので要注意。

 なお管理人は旧版・電波時計を使用しているが、複数の方から新版(Ver.2)電波時計での動作報告をいただいている。


今回の失敗:

 部品点数をなるべく減らす、という設計コンセプトがアダになり、結局トランジスタアレイを後から追加して配線がゴチャゴチャになってしまった。最初からトランジスタアレイを使う前提で設計しておけば格段にシンプルに配線レイアウトできたものを・・・ orz


TD62783APG が入手できない場合の代替方法:

 (1) ソフトウエアを変更しないでハードウエアだけで代替する方法・・・選択肢は1つ。

  回路図の代替回路を参照。デジタルトランジスタ DTC123 とRN2205 はそれぞれ一般的な NPN, PNP トランジスタ+ベース抵抗(1〜10KΩ)にしても良い。

 (2) ソフトウエアを自力で変更できる場合・・・選択肢は2つ。

  1. TD62783AGP を RN2205 x 8 にし、ソフトウエアの桁制御部分を L active に変更する。(難易度低)
  2. 行方向をスタティック点灯にしてマトリクス LED をカソードコモン的に使用することで一般的なシンクドライブのトランジスタアレイを使用する。ソフト的には行方向の LED ドライブを H active にするよう修正するとともに、マトリクス LED を 90度回転させて実装する。(難易度高)


今回学んだこと:

 ・PIC での非同期シリアル通信(RS-232C 等)
 ・ドットマトリクス LED の使い方
 ・Bank 2, 3 に対する FSR 間接アドレッシング(STATUS レジスタ IRP ビット)


改良案:

 ・シフトレジスタや BCD デコーダを使って PIC のピン数を減らす
 ・列方向スタティック点灯にして一般的なシンクドライブのトランジスタアレイを使用する(前述、難易度高)
 ・列方向もトランジスタアレイをかまして輝度 UP
 ・7 セグ LED を追加して時刻も表示させる
 ・本物の日めくりカレンダーのように日付を大型 LED でひときわ目立たせる


プログラム:

 改変自由だが商用利用は厳禁

ソースファイル (asm) & HEX ファイル
v2.1 (2011/01/14)
Calender_v2.1.zip


謝辞:

 RS-232C 回りのコードはこちらを参考にさせていただきました。開発者にお礼申し上げます。


2011/03/06 追記:

 回路図の間違い ( RS232C D-sub 2, 3 ピンの結線が逆) を訂正しました。ご指摘ありがとうございました > 静岡県 F 様


2011/03/13 追記:

 福島原発事故に伴う避難指示により、福島の 40KHz 標準電波が停波 @o@

 秋月の電波時計キット(新版、旧版とも)は標準電波でしか時刻が合わせられないので、管理人宅の秋月電波時計は停電で時刻がリセットされたまま時刻が合わせられない状態。当然、外付けカレンダーは虚しく「?」を表示している(逝)

 60KHz 用に改造しても茨城での受信状態はイマイチだし、この際、秋月電波時計側のファームウエアを改変するしか・・・ orz


2011/03/27 追記:

 秋月電波時計のファームウエアを改変し、手動で時刻合わせができるようにして外付けカレンダーが見事復活。詳細はこちら


2011/04/21 追記:

 福島 40KHz 局が無人運転を開始。東日本の標準電波がようやく復活した。


2011/04/25 追記:

 ↑とか言ってたら落雷で機器故障 → 停波 orz ・・・・ たった4日で・・・ 次回復活はあるのか ?

2011/05/09 追記:

 福島局が無事復活。今後も安定して稼動して欲しい・・・


 [電子工作のページへ]