自作電子小物/置き時計/デジタル自発光USB V0.1
自作電子小物/置き時計/デジタル自発光USB V0.1
Desk clock V0.1
2011年1月22日土曜日
USBに接続する机上用の小型デジタルクロックです。USBコネクタがあれば動きます。アラーム機能もない何も特別な事はないすごく単純な小物で、実用半分・電子工作を楽しむのが半分といった所です。マイコンを使いわずかな部品で済みますし、PCに接続すれば時刻設定等のコントロールを楽しめます。
製作費は1000円ぐらい、マイクロチップ社のマイコン PIC18F14K50 を使用し、ソフトウエアは C言語 にてコーディングしています。
<機能/特徴>
■とにかく少ない部品で配線が楽
■USB-AC電源アダプタを使い単独で動かせる
■PC側から多少の制御が可能で、数値表示機能を使えばCPU利用率を常に出しておくといった応用も可能
<仕様>
名称: 机上デジタル時計
分類: USB給電デジタル自発光置き時計
表示:
種別:4桁×1行 7セグメントLED(発光色:緑)
項目:通常は「時.分」、モードボタンを押すたびに「分.秒」と相互に切り替わる
付加機能:
減光機能:キー操作もしくは時刻で低輝度、通常輝度を自動切換え
12時間制対応:12/24時間制表示が選択可能
微調整機能:1秒のカウント精度を変更可能
任意数値表示機能:PCからの制御で0〜9999までの数値を表示したり、時刻表示に戻したり出来る
電源:USBから給電(USB-ACアダプタも可)消費電力0.15W以下。
外形:幅:78mm、奥行き:26mm、高さ:28mm(突起部を除く)
キー操作:
モードボタン(左):表示項目切換え
上ボタン(右上):高輝度
下ボタン(右下):低輝度
モードボタン長押し:時刻設定(時が点滅)
上ボタン:時カウントアップ
下ボタン:時カウントダウン
モードボタン:時確定(分が点滅)
上ボタン:分カウントアップ
下ボタン:分カウントダウン
モードボタン:分確定(通常表示に戻る)
PCからの操作:
仮想シリアルポートとして認識され、コマンド文字列を送信する事により操作できます。
詳しくは、本ページ最後に記述していますが、簡単に使う方法も用意しています。
Windowsの場合
バッチファイルを実行する事により、PCの時刻と同期される
Macintoshの場合
専用アプリケーションを実行する事により、時刻の同期と幾つかの設定を行える
時刻を設定するだけのアプリケーションも用意しています
<技術的なポイント>
■ハードウエア
・Microchip Technology社のPIC18F14K50マイクロコントローラ
・7セグメントLEDを直結でダイナミック表示
・USBデバイス
■ソフトウエア
・プログラミング言語はC、開発環境はMPLAB、C18のペリフェラルライブラリを使用
・タイマ割込でのダイナミック表示、ソフトウエアで減光制御
・タイマ割込で時計の実装
・USBデバイスCDC(通信デバイスクラス→仮想シリアルポート接続)
■開発法
・プログラム開発は、無料で利用出来るMicrochip社の標準的なIDEを使用
・プログラム書込みは、USBからダウンロード
・回路とプリント基板設計は、無料で利用出来るCadSoft Computer社のEAGLEを使用。
<おおまかな設計>
■目標とする物
今回は、気軽に作れる物にしたいので、実用的な物を求めるより、電子工作のし易さを優先する事にしました。
具体的には、
・部品は、出来る限り種類を減らして入手し易い物を選択する
・配線量を少なく
・半田付けしにくいSMD部品は不可
とは言え、作った後に使われずにしまい込まれていくようなものでは寂しいので、無理なく使えるような仕様にまとめる必要があると考えます。
■全体構成
時計で一番悩ましいのが時刻設定の問題で、何度も設定し直ししなければならないようでは使われなくなってしまう事と思います。これに対しては次の様に考えました。
・自動設定される様にする:
もちろんこれが一番良い方法なのですが、
電波時計のようなものは機構が複雑になるので却下
・設定の手間を少なく:
手近にある別の機器から時刻を供給してもらう。
PCから、USB接続がコスト的な現実。
携帯電話から、赤外線通信か→携帯側のソフトが必要だが、小物側は単純なのでいけそうな気がする。
ボタン操作方法が簡単ならば、面倒だとは思わない。
一般的に売られている製品のボタン操作程度でも別に不満は無いと思う。
特に改善の余地無しか。
・設定の回数を減らす:
時刻がずれる量(誤差)を少なくする→クリスタルを使うか、AC電源周波数を取込む
電源周波数は日本の電力会社の場合、かなり厳密に制御しているらしく時計に使えるレベル
バッテリ駆動で計時を止めない→部品数的に不利
結果として、
・時計用のICが、入手しにくい部品になっていた
・マイコンで簡単に実現出来るしUSB対応も可能
・USBの場合、電力を切り詰める必要がなくなり表示器にLEDを選択出来る
(視認性良好/室内、入手し易い、安い)
なので、USBマイコン+7セグLEDの構成で考えます。
<詳しい設計>
■表示部
文字高20mm程度の大きさの7セグメントLEDの中からの選択で、配線数を考えると出来るだけ複数桁が一体になった物が良いですが、桁数が増えると割高になりますし、入手性の面で不利です。専用プリント基板を作る事を前提にすれば、このような事を考える必要も無いのですが、手配線する大変さをを考えれば重要です。また、物によっては駆動回路を省略出来るような輝度を持ったものもありますので、バランスも重要です。
今回、一番良いと思われる物として次の物をチェックしました。
・BQ-N51xRD/YellowStone? 4連7LED ¥472〜945@マルツ 2〜4mcd/10mA
・OSL40562-Ix/OptoSupply 4連7LED ¥200〜250@秋月 30〜200mcd/20mA
・YSD-439Axx-35/ChinaYoungSunLedTechnology 4連7LED ¥210〜263@千石(Sparkfun) 55〜200mcd/20mA
何といっても、駆動回路を省略出来る程の輝度を持った100mcd級に注目です。OptoSupplyとCYSLTの青・緑系のものがそれです。赤・黄系は数値的には低いのですが、体感輝度は良好かも知れません。(未確認)
YSD-439は時計用として作られており、コロン表示も可能なので正に適材なので、入手出来る場合はこちらを購入した方が良いでしょう。
通常は、マイコンが入出力出来る電流値制限がありますので、トランジスタ等を使用した駆動回路が必要となります。今回目を付けた部品では、数ミリアンペアでも十分視認出来る輝度を持っているので、駆動回路を省略出来る可能性があります。実際、試してみた所、2.5mA/seg(コモン側の電流を20mAとし、8セグメント同時点灯とした場合の条件)でも室内で使う分には問題ないレベルである事を確認できましたので、マイコン直結の方法を取る事にします。また、棚ぼたになりますが、これによりアノードコモンでもカソードコモンタイプでもどちらでもソフトウエアで対応出来る事になります。
電流制限抵抗は単純な計算((電源電圧ーLEDのVf(順方向電圧))/目的電流=(5V-3.3V)/2.5mA=680Ω)で抵抗値を決めましたが、実際はマイコンの最大定格に近い電流吐き出し・吸い込み時は、幾分電源電圧・GNDから離れるようなので、もう少し小さい抵抗値になると思います。マイコンのデータシートを詳しく読み込めば、より計算値と実態値を近づける事もできるでしょう。またVf値は電流によって変わるのですが、データシートに記載されていないので想像するか実測する必要があります。今回はパスしました。
もう少し入出力ピンがあれば、ブザーを追加して目覚まし機能を持たせる事もできるのですが、残念です。
■入力部
本体の大きさから、プッシュボタンを数個ぐらいしか付けられません。多い程、操作が煩雑にならないで済みますが、部品代もかさばりますので。
値変更時のプラス、マイナスさせる為にそれぞれ1個、確定ボタンに1つとして合計3個は必要です。
■制御部
やはり安く入手し易い部品で、USB接続するにはPIC18F14K50以上の選択はないようです。一つ気がかりなのは、プログラムメモリ容量が不足しないかどうかです。
■電源部
USBから供給される電圧は5V前後で、PIC18F14K50ではそのまま使えます。特に安定化しなければならない条件もありませんので、直結する事とします。
ただし、USB電源アダプタによっては、5.8V出力の物とかあったり、実際測定するとかなり外れていたりしますので、マイコンの最大5.5Vの制限を越えてしまう可能性があります。自作品として楽しむ分は良しとしましょう。
<回路図>
ほとんどLEDにピンを取られてしまいますので、プッシュスイッチに振り分ける事ができません。その対応として、LEDのダイナミック点灯(ダイナミック表示)方式を見直しました。
・カラム方向のピンに汎用ロジックICの2-4デコーダを追加してにしてピン数を減らす→部品追加+50~100円
・特殊なダイナミック表示を行う(LEDのダイオードとしての整流特性を利用する)→部品追加、ソフト負担大
・ダイナミック表示時のスキャンにスイッチ入力を重畳させる→ ソフト負担やや有り
やはり、一番安く済む最後の方法を使う事にしました。複数のスイッチを同時に押された場合、検出できないのですが、全部プッシュスイッチなら、実用上は問題ないと考えました。
クリスタルはUSB接続する上で必須となっていますので、このクロックを利用して計時を行います。低電力動作させる必要が無いのでこれで問題なしです。
<部品>
合計800〜1700円ぐらい。これにユニバーサル基板(蛇の目基板)が100円、ケースに1000円と言った感じです。
壊れたUSBキーボードやマウスを持っているなら、USBケーブルを流用して基板にケーブルを直づけすれば、コネクタ分の50〜200円節約出来ます。
<ソフトウエア>
■開発に必要な物
Windows PC(パソコン)
Microchip MPLAB IDE 8 (*1)
Microchip C Compiler for PIC18 MCUs v3 (*1)
Microchip Application Libraries (*1)
PICkit等のプログラム書込み器(*2)
*1: Microchip社のサイトからダウンロード可能
*2: USBブートローダが書込み済のPIC18F14K50を入手出来れば、プログラム書込み器は不要
■ソースコード
●メイン
・main.c : アプリケーションプログラム本体。ローカルなサブルーチンや割込ルーチン等、全てのアプリケーションコードが記述されています。
●USB関連
・usb_config.h : USB動作定義。デモプログラム(\Microchip Solutions\USB Device - CDC - Basic Demo\usb_config.h)をベースに、割込を有効になるように修正。
・usb_descriptors.c : USBデバイス定義。デモプログラム(\Microchip Solutions\USB Device - CDC - Basic Demo\CDC - Basic Demo - Firmware\usb_descriptors.c)をベースに、デバイス名、製造元名を修正したのみ。
・HardwareProfile.h : USBライブラリ及びアプリケーションで参照される、入出力ポート等のハードウエア関係定数を定義。
●その他
独自開発した汎用サブルーチンです。
led7seg.c : 7セグLED制御サブルーチン本体
led7seg.h : 7セグLED制御サブルーチン定義体
utoanm.c: 符号無し整数文字列変換サブルーチン本体
utoanm.h: 符号無し整数文字列変換サブルーチン定義体
時刻はTimer0を使い、1秒毎に割込が掛かる様にして時分秒を更新しています。
7セグメントLEDのダイナミック表示の更新はTimer1を使い、1/1600秒(約0.6ms)毎にカラムの表示切換え処理を行っています。一般的に、このリフレッシュ処理は100Hz×桁数位の頻度で行うのが効率的ですが、減光機能を使った場合のチラツキを減らす為に、数倍の頻度にしています。また、このタイミングでキー入力もチェックしています。
その他の処理は、全てmain()でシーケンシャルに行っていますので、ソースコードを見てもらえれば、すぐ解ると思います。
当初懸念していた通り、プログラムメモリが厳しくなってしまいました。
メモリゲージを表示させると、まだ余っているように見えますが、ブートローダ本体に4kB取られますので、既にいっぱい一杯です。機能を追加したければ、別の機能を削るか、有償版のコンパイラでのコード最適化に期待するか、メモリ量の多い上位のデバイスに切り替えるしかありません。
出来上がったオブジェクトを、PIC18F14K50に書込みます。小物のモードボタンを押しながらUSBケーブルを差し込むとブートローダが書込まれているデバイスであれば、待機状態になります。Microchip社が提供しているHIDBootLoader.exe(ブートローダ用プログラム書込みツール)を起動し、オブジェクト(.HEX)ファイルを指定した後、書込みボタンを押せば完了。リセットでアプリケーションプログラムが動きだし、LEDに何らかの表示が出るはずです。
通常売られているデバイスはまっさらでしょうから、一番最初にブートローダ本体を書込む必要が有ります。この時だけ、PICkit等のプログラム書込み器が必要です。ブートローダ本体のオブジェクトはMicrochip社が提供しているコンパイル済みファイルがそのまま使えますので難しくはありません。使用事例をTIPSに載せています。
<ダウンロード>
ライセンス: フリーソフトウエア(GPL v3)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
Windows2000 SP6 / VMware Fusion 3.0.2 / Mac OS X 10.5
CadSoft Computer EAGLE 5.11 Light Edition for Mac
Microchip MPLAB IDE 8.36
Microchip C Compiler for PIC18 MCUs v3.33
Microchip Application Libraries v2009-11-18
PICkit 2 v2.60
<基板>
蛇の目基板(ユニバーサル基板)でも十分に作れる様な簡単な回路ですが、何故か専用プリント基板を作ってしまいました。実は、電圧・電流・温度パネルメータのための回路ですが、時計も同じです。
2層目(赤)にパターンを引いてありますが、この小物では使いませんので片面でいけます。
出来上がった穴開け前の基板。寒い日が続いていたせいか、感光〜現像が十分に出来ず1枚ムダにしました。思っている以上に温度の影響があるようです。
穴開け後、各部品の噛み合わせを確認している所です。PIC18F14K50に7セグLEDが重なるレイアウトですが、高さは丁度良い感じです。プッシュスイッチは背の高いものが良さそうです。
半田付けは、背の低い部品から。
一部の部品はPIC18F14K50の下、ICソケットに囲まれた所に入るので、ソケットの真ん中の部分が邪魔になります。これを避けて部品配置設計するべきなのでしょうが、配置し切れなかったので、泣く泣くこのような配置になってしまったのです。小さいノコギリでこれを切り取ります。ニッパを使うと真っ二つになってしまいます。面倒なら、シングルのソケットを使う手もあります。
クリスタルは形が合う物が入手出来れば一番良いのですが、このように表面実装用の部品でも、実は足を曲げると普通に使えるものもあります。
全部取付が終わり、試運転した所です。結局、パターン修正が必要な所が2カ所程有りました。ダウンロードできるものは改善しています。
<ケース>
ぴったり合う様な、都合のいいサイズのケースは市販されていないので、いつもの様に、アクリル板でケースを作りました。
寸法図
正面パネルが奥の部分を支点に開閉するような形です。
切り出した板は4枚。スモークを用意しましたが、透過率が低く表示が大分暗くなるので結局クリアを使いました。
棒ヒータを当てて曲げ作業を行いますが、正確に曲げないと、合わせ目が大変な事になってしまいます。直角を確認しながら曲げ、慎重に作業を進めます。それでも、よほど調子よくないとピッタリ合う事はないです。
合わせ目を紙ヤスリで調整しながら、何とか合わせた所で各部品を接着してケース完成。左の写真は正面パネルを開けた所で、右は閉じて点灯した状態です。基板は寸法上ピッタリにしてあるので、特に固定はしません。正面パネルがクリアだと中の部品まで見えて恥ずかしい。
素だとオフのセグメントが目立つのでチョット嫌かな。付箋紙を貼付け見やすさを改善。何も無い所に浮き出る感じがいいのです。背後の小物は使用したUSB-ACアダプタです。
保険の約款等に使われている薄手の紙が丁度良い。手に入れ易い紙ではないようです。
デスクトップカレンダーを差し込んだら、あら良い感じ。でも、写真では良く写っていますが、よほど暗い部屋でないと実用にはならず、人間の目には暗く感じます。この手の紙を透過するには発光量は足りないので、本格的なLEDドライバが必要ですね。
暗い方は、丁度良いです。携帯電話の減光時の発光量と同じ位で、まぶし過ぎません。
<使用法>
USBコネクタを挿すと、LEDがゆっくり点滅(2Hz)し0:00からカウントを開始します。
ボタン操作に関しては、仕様をご覧下さい。
PCからのコントロール法
・Windowsの場合
初めての場合、ドライバのインストール画面が表示されますので、プロジェクトディレクトリのinfディレクトリを指定して下さい。
COMポート番号が自動付与されているはずなので、デバイスマネージャの「ポート(LPTとCOM)」で確認して下さい。コマンドプロンプトを起動し、次のコマンドを打つ事によって、動作指示できます。
“st”は時刻を設定する指示を示します。例では12時34分に設定しています。
うまく動かない場合、ハイパーターミナルを使って対話的に指令を送る方法もあります。指令が正常に受け付けられた場合「ok」、誤っている場合「ng」が返されます。
他に、次の指令があります。
stHHMM HH時MM分に設定
hh12 12時間制表示にする
hh24 24時間制表示にする
dhHH HH時に表示を明るくする
dlHH HH時に表示を暗くする
aj-99 基準クロック値をプラスまたはマイナスして微調整する
nm9999 指定した数字を表示する(小数点指定可)
tm 数字表示状態になっていた場合、時刻表時に戻す
? ヘルプ表示
・Mac OS Xの場合
特にデバイスドライバのインストールは不要です。ただし、10.6の場合、モデムのセットアップするかどうか聞いて来ますのでキャンセル(*1)して下さい。ユーティリティのターミナルを開き、 次のコマンドを打つ事によって、動作指示できます。
最初のlsコマンドは、デバイス名を確認するためのものです。名前は、必ず/dev/cu.usbmodem#DC01001で始まります。
指令はWindowsの場合と同じです。
うまく動かない場合、screenコマンドを使って対話的に指令を送る方法もあります。
*1: キャンセルせず、モデム設定をしてしまえば一々聞いてこなくなります。モデムとして使う訳ではないので、機種は何でも構わないと思います。”NULL MODEM”で問題ありませんでした。
<関連>
「自作電子小物/TIPS/ブートローダ使用例/PIC18F14K50」
<あとがき>
正月休み中、軽く考えたものを作ってみただけです。プラモデルやキットのように、お膳立てされ組立てれば動くというのを無性にやってみたくなる時があります。
Mac側のプログラム開発の方に時間がかかってしまいました。2年ぶりのxcode/cocoaだったので全部忘れていたのでした。
富樫 豊彦 tog001@nifty.com
This is a desk clock that numeric emit light and USB power.