自作電子小物/置き時計/デジタル自発光USB V0.2
自作電子小物/置き時計/デジタル自発光USB V0.2
Desk clock V0.2
2011年2月10日木曜日
USBコネクタに接続する机上用の小型デジタルクロックです。デジタルらしくない「ぼんやり」した表示が特徴です。USB-ACアダプタも使えますのでPCが無くとも動きます。PCに接続すれば時刻設定等のコントロールも楽しめます。
製作費は1500円ぐらい、マイクロチップ社のマイコン PIC18F26J50 を使用し、ソフトウエアは C言語 にてコーディングしています。
<機能/特徴>
■見た目も動きも「ぼんやり」
■USB-AC電源アダプタを使い単独で動かせる
■短い時間なら時計は止まらない
■PC側から多少の制御が可能で、数値表示機能を使えばCPU利用率を常に出しておくといった応用も可能
<仕様>
名称: 机上デジタル時計
分類: USB給電デジタル自発光置き時計
表示:
種別:4桁×1行 7セグメントLED(発光色:緑)
項目:通常は「時.分」、モードボタンを押すたびに「分.秒」「月.日」と順次切り替わる
分の変わり目は「ぼんやり」変化(動画:R0013861.AVI、写りが悪くてすいません)
付加機能:
減光機能:キー操作もしくは時刻で低輝度、通常輝度を自動切換え
微調整機能:1秒のカウント精度を変更可能
任意数値表示機能:PCからの制御で0〜9999までの数値を表示したり、時刻表示に戻したり出来る
PCがスリープした場合、連動して消灯します
電源:USBから給電(USB-ACアダプタも可)消費電力0.15W以下(年間50円ぐらい)
外形:幅:78mm、奥行き:26mm、高さ:29mm(突起部を除く)
キー操作:
モードボタン(左):表示項目切換え
上ボタン(右上):高輝度
下ボタン(右下):低輝度
上ボタン(右上)長押し:その時間に高輝度になるように設定
下ボタン(右下)長押し:その時間に低輝度になるように設定
時刻表示時にモードボタン長押し:時刻設定(時が点滅)
上ボタン:時カウントアップ
下ボタン:時カウントダウン
モードボタン:時確定(分が点滅)
上ボタン:分カウントアップ
下ボタン:分カウントダウン
モードボタン:分確定(通常表示に戻る)
日付表示時にモードボタン長押し:日付設定(年が点滅)
上ボタン:年カウントアップ
下ボタン:年カウントダウン
モードボタン:年確定(月が点滅)
上ボタン:月カウントアップ
下ボタン:月カウントダウン
モードボタン:月確定(日が点滅)
上ボタン:日カウントアップ
下ボタン:日カウントダウン
モードボタン:日確定(通常表示に戻る)
PCからの操作:
仮想シリアルポートとして認識され、コマンド文字列を送信する事により操作できます。
詳しくは、本ページ最後に記述していますが、簡単に使う方法も用意しています。
Windowsの場合
バッチファイルを実行する事により、PCの時刻と同期される
Macintoshの場合
専用アプリケーションを実行する事により、時刻の同期と幾つかの設定を行える
時刻を設定するだけのアプリケーション(Automator)も用意しています(おまけでCPU使用率を表示しておける物も添付しました)
<技術的なポイント>
■ハードウエア
・Microchip Technology社のPIC18FxxJ50マイクロコントローラ
・7セグメントLEDを直結でダイナミック表示(ダイナミック点灯)
・USBデバイス接続
・電気二重層コンデンサを使用したバックアップ電源
・50μA以下のスタンバイ電流
■ソフトウエア
・プログラミング言語はC、開発環境はMPLAB、C18のペリフェラルライブラリを使用
・タイマ割込での7セグメントLEDダイナミック表示と減光制御
・Microchipt提供のUSBスタックを使用したCDC(通信デバイスクラス→仮想シリアルポート)接続
・内蔵RTCC機能をペリフェラルライブラリ経由で利用
・HLVD(電源電圧監視)をトリガにDeep Sleepへの遷移と、INT0割込での復帰
■開発法
・プログラム開発は、無料で利用出来るMicrochip社の標準的なIDEを使用
・プログラム書込みは、USBからダウンロード
・回路とプリント基板設計は、無料で利用出来るCadSoft Computer社のEAGLEを使用。
<おおまかな設計>
前作の以下の点が不満として残りましたので改善を行います。
・やはり時計合わせが面倒
・メモリ不足で改良する余裕が残されていない
■時計合わせを簡単に・回数を減らす
時刻合わせの手間が、やはり大きいと感じます。PCにつなげば時刻合わせはダブルクリック一発でできるのですが、シャットダウンさせると電源が切れるPCの場合、毎朝設定し直さなければならないので使ってられない。USBポート位置によって電源が切れないケースもあったり、スリープでは問題ない場合もあるので、さほど重要な事ではなかもしれませんが気にはなります。
過去、小物の設計時にダブルクリックさえも手間だと考え、USBを差し込んだり電源が入った自動的に時刻同期出来ないものかと思案を重ねてきました。Windowsならマスストレージクラス(MSD, MSC)でマウント時の自動再生機能を利用してストレージ(マイコン内のFlashの一部を割り当てる)内の同期プログラムを動かす手もあります。これは、どのWindows環境でも動くとは限らないのが難点です。ウイルス対策で自動再生機能をオフにしている場合や、XPより過去の場合はCDC+MSDのコンポジットデバイスは未サポートなので使えない手でした。Mac OS Xも残念ながらCDC+MSDはサポートしていないようです。思案は続きます。
とにかく、電源が切れると時計を設定し直さなくてはいけない事が一番の不満の種と思い、プラグを抜いても時計の計時が止まらない様にするのが解決策だと考えました。長期間電源が繋がれなくとも良いという状況を考えている訳ではなく、2〜3日程度の間だけでもカウント維持ができれば良いのです。本体が大きくなるバッテリを使いたくなかったので、電気二重層コンデンサを使って実現できないか考えてみました。
時計をカウントするのに必要な電力から静電容量を試算してみます。
PIC18F14K50の場合
最小電力で動かすにはSleepを使用してほとんどの時間を眠らす様にする方法を使うとして、その時の電流は
LDO Regulator:30μA
Power-down Base Current (IPD):8μA
Supply Current (IDD):2.3mA!(データシートにズバリの値がないのでECオシレータのもの)
合計 2.338mA
mA級の電流が出てしまうのでは、とても3日は持たせられません。USBを使う為に、プライマリクロックに12MHz×PLLを使用する構成で、このクロックを使って時計のカウントを行う方法ではこうなってしまいます。別のクリスタルを付け低電力オシレータを使う構成にしないと要求には到達出来ませんが、やっぱり4桁7セグとの組み合わせではピンが足りないのでK50では追加部品が必要という結果に。メモリ問題もあるので検討中断です。
PIC18FxxJ50での場合
RTCC(Real-Time Clock/Calendar)を内蔵していますので、これを使いCPUは完全Sleep状態に出来ます。
Power-Down Current (IPD):3.2μA
High/Low-Voltage Detect:4.1μA
RTCC with Low-Power Timer1 Oscillator:1.1μA
外付け3.3VLDOレギュレータでの漏流:10μA(セイコーインスツルS-812C33の実測値)
合計 18.4μA
3日分の電力は 18.4μA×3.3V×3日×24時間=4.4mWh ちょっと実感湧かないですね。
必要な静電容量C[F]を計算すると
C=Q/V Q=I*t C=I*t/V Q:電荷[C] I:電流[A] t:時間[秒] V:電圧[V] 詳しくはwikipedia等で
C=(18.4*10^-6)*(3*24*60*60)/3.3=1.45[F]
実際は、3.3Vから2.0VまでがCPUが動作する範囲になるので、1.3倍して1.87[F]の電気二重層コンデンサが必要という事になってしまいました。でもこの位なら、何とか部品入手可能な範囲です。
外付けのRTC(セイコーインスツルS-35390A)の場合
計時消費電流:0.25μA
必要な静電容量C[F]は
C=(0.25*10^-6)*(3*24*60*60)/3.3=19.6[mF] ...0.02[F]
さすが、専用ICは次元が違いますね。簡単に一ヶ月も持たせる事も、電源設計もラクちんです。あとは、入手性が良い品種が出てくる事と、部品が増える事に対する抵抗を無くせば良いだけです。
それで、結局どうするのか決めなければなりませんが、私はPIC18xxJ50に傾いてしまいました。また、1Fのものなら入手が比較的良いので、ここは仕様を縮小し1日半程度の保持能力に変更します。
■プログラムメモリに空きを
コードをコンパクトにする
プログラムを見直して大量に消費するprintfの使用を止める等の対策で節約するのは既に実施済み。がんばっても数パーセントしか空かないと思います。
コンパイラが出力するコードを眺めていると、しょうがないと解っていてもムダがありすぎる。最適化が入った有償版にすれば、2倍まで詰め込める様になるようだけど、投資を回収するのにどれだけのデバイスを購入しなければならないかを考えたら全くペイしません。(HI-TECH Cに移行するような予感もしますし)
先日気がついたのですが、拡張命令モードでコンパイルすると2〜3割減ります。何故かacademic版でも出来てしまいましたし、static属性もエラーになりません。動作も問題ないようです。使っても良いものか思案している最中です。
メモリを拡大する
素直に上位デバイスを探します。PIC18FxxK50ファミリでは上位のものがないため、USB装備の安いPICマイコンの中で探すと、PIC18F4550ファミリか、PIC18F46J50ファミリで選ぶ事になります。値段的には、PIC18F2550(32kB)は¥400円@秋月、PIC18F25J50(32kB)は¥342円@Digi-keyです。PIC18F2550は過去に使った事のあるデバイスですが設計に古さを感じており(PIC歴5年位で分るのか?)先のRTCの選択と相まって、安い方のJ50を使ってみたいと思います。今回は、オーバスペックではありますが4倍容量のPIC18F26J50を使ってみます。(40円違いでしたので)
<詳しい設計>
基本的には前回同様です。
■電源部
USBから供給される電圧は5V前後で、PIC18F26J50は3V前後の電圧が必要なので何らかの調整回路が必要です。安定化しなければならない条件はありませんが、光量の変化が出てしまうLEDの駆動を、マイコンで直接行う事も有り安定化させる事に越した事はありません。そう大きな費用でもないので、ボルテージレギュレータを使い3.3Vに減圧して与えるようにします。5V電源でLED駆動すれば、エネルギー効率が良くなるのではとも考えましたが、トランジスタ等の追加部品が必要ですし、そもそも抵抗器で熱になるかレギュレータで熱になるかの違いで、エネルギー効率が良くなる訳でもないですしね。
一時的な電力保存を行う為の電気二重層コンデンサの充放電回路は、レギュレータの入力側に付ける方法が良いと考えました。5V1F程度の部品が入手しやすいですし、3.3Vで蓄電するより量を稼げます。今回は、手持ち部品の関係で3V耐圧のものしかなかったので、出力側に付ける様にしました。レギュレータの「入力電圧<出力電圧」条件による素子破壊が懸念されるのですが、破壊要因は駆動素子への逆電流条件によるようなので(物による)、電流が流れていかないのであれば大丈夫なのではないかと勝手に判断しました。とりあえず動いている様ですが、たまたま動いているだけかもしれません。
電気二重層コンデンサの充放電回路は単純なもので、充電方向は100Ωの抵抗を通過する様にし、放電方向はダイオードで素通りする用にします。充電電流は3.3V/100Ω=33mA(満充電まで2〜3分)に設定し、LED分と加えUSBのVBUS電流を50mA位になるようにします。ダイオードはVf値の小さなショットキバリア型にして電圧を食われる量を減らします。ショットキバリアダイオードは逆方向電流が多めなのが一般的ですが、今回の使い方としては多くても問題なく、逆に、これを充電電流に利用できないかとも考えましたが丁度良い品種は見つけられませんでした。
■表示部
電源電圧が変わりましたので、LEDの電流制限抵抗は計算し直しです。
このLEDは20mA時のVf(順方向電圧)値が約3.3Vなので、電源が3.3Vではギリギリの設計になります。本来なら、やはり5V側からトランジスタで駆動する形にして、電流制限抵抗が大きめになるようにする事でLEDのVf値の個体差を緩和させるようにするのが筋だと思いますが、部品数を増やしたくないのであくまでも直結でいきます。
2mA(全体20mA/8セグメント余裕込み)とし、Vfは実測値を使い
(電源電圧ーLEDのVf)/目的電流=(3.3V-3.1V)/2.0mA=100Ω
となりました。
PIC18FxxJ50のポートAのほとんどは20mA級の電流がとれませんので、直接接続では4桁が限界です。並びもきれいにならず、ソフトウエアの対応が必要でした。
<回路図>
実はこの回路、電圧/電流/温度のパネルメータの回路を流用し、これに電気二重層コンデンサの充放電回路を追加したものです。
PIC18F2xJ50のシンボルがでかい。Microchip社が無料提供しているファイルと変換ツールでEagleのライブラリに取込んだのですが、何故かかなり大きくてビックリ。
R14,15は、USBの電源供給状態をモニタするための物です。このような部分を付けたくはありませんが、HLVDではディープスリープを復帰させられませんし、やはりレギュレータから先の電圧監視だけでは正確にUSB電源投入/断を検出する事が出来ないので、仕方なく付加しました。
<部品>
緑色の品種の7セグメントLED(OSL-40562)を選択しましたが、同じ特性Vf=3.3Vを持つ白色、青色はそのまま差し替えが出来る可能性があります。ただ、少ない電流時の発光量が緑と同じかどうか確認した訳ではないので断定は出来ませんが。赤色、黄色は特性が異なりますので、R4〜11の値を計算しなおす必要が出て来ます。
電気二重層コンデンサに出物を使ったので、設計値の1/5の容量となっています。実測で8時間程持ちました。最初の設計値は大体合っていたようです。
合計1000〜1500円ぐらい。これにユニバーサル基板(蛇の目基板)が100円、ケースに1000円と言った感じです。PIC18F25J50に変更し圧電スピーカを付けなければ80円減らせます。また、壊れた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ブートローダが書込み済のPIC18F26J50を入手出来れば、プログラム書込み器は不要
■ソースコード
●メイン
・main.c : アプリケーションプログラム本体。ローカルなサブルーチンや割込ルーチン等、全てのアプリケーションコードが記述されています。
●USB関連
基本的にデモプログラム(\Microchip Solutions\USB Device - CDC - Basic Demo\usb_config.h)をベースに、本小物に合う様に若干の修正を加えたものです。
・usb_config.h : USB動作定義。割込を有効になるように修正。
・usb_descriptors.c : USBデバイス定義。デバイス名、製造元名等を修正。
・HardwareProfile.h : USBライブラリ及びアプリケーションで参照される、入出力ポート等のハードウエア関係定数を定義。
●その他
独自開発した汎用サブルーチンです。
led7seg.c : 7セグLED制御サブルーチン本体
led7seg.h : 7セグLED制御サブルーチン定義体
itoanm.c: 整数文字列変換サブルーチン本体
itoanm.h: 整数文字列変換サブルーチン定義体
rm18f26j50_g.lkr: リンカースクリプト(リンクパラメタ)、PIC18F46J50用の物を使い、名称だけ変更。PIC18F46J50はメモリ構成がほぼ同じなので問題ないはずです。
●メインでの処理概要
Microchip社の提供しているUSBデバイスのアプリケーションサンプルプログラムでは、メインが単純で、最初に初期化サブルーチンをコールした後、小さな無限ループ処理からユーザサブルーチンが定期的に呼ばれる構造です。このユーザサブルーチン内で、アプリケーションの処理を行い、すぐリターンする形にしておけば良い訳で、これならUSBの通信処理を意識する必要がありません。私の場合これに反したスタイルになっています。USB周りはUSBDeviceTasks()を定期的にコールすれば、この中で全部やってくれるだけのようなので、ハードウエア割込みに仕込んでしまえばUSB通信処理を意識する必要がなくなるからです。
同様に、7セグメントLEDのダイナミック表示の更新(リフレッシュ)もTimer1を使い定期的にハードウエア割込みを発生させ、この割込処理内にリフレッシュを行う様にする事で、LEDの事を考えなくて済む様にしています。もし、アプリケーション処理内でリフレッシュさせる場合は、どうしてもリフレッシュ間隔がまちまちになってしまうので、チラツキが気になる場合もあります。なお、割込頻度は、一般的なリフレッシュ処理は100Hz×桁数位の頻度で行うのが効率的のようですが、減光機能を使った場合のチラツキを減らす為に、数倍の頻度1/1600秒(約0.6ms)にしています。
この小物のメインプログラムは、純粋にアプリケーション処理を行っていますの。全てシーケンシャルに行っていますので、ソースコードを見てもらえれば、すぐ解ると思います。
使用したプログラムメモリ量は約20kBでしたので、やはりPIC18F25J50が最適だと思います。
出来上がったオブジェクトを、PIC18F26J50に書込みます。PICkit等のプログラム書込み器を使っても良いですが、私はUSBブートローダが楽なので、もっぱらこちらの方法を使っています。小物のモードボタンを押しながらUSBケーブルを差し込むとブートローダが書込まれているデバイスであれば、待機状態になります。PC側で、Microchip社が提供しているHIDBootLoader.exe(ブートローダ用プログラム書込みツール)を起動させ、オブジェクト(.HEX)ファイルを指定した後、書込みボタンを押せば完了。リセットでアプリケーションプログラムが動きだし、LEDに何らかの表示が出るはずです。
通常売られているデバイスはまっさらでしょうから、一番最初にブートローダ本体を書込む必要が有ります。この時だけ、PICkit等のプログラム書込み器が必要です。ブートローダ本体のオブジェクトは、Microchip社の提供しているコンパイル済みファイルが無いので、自分で作らなければなりません。難しくはないのですが、面倒な方は「自作電子小物/TIPS/ブートローダ使用例/PIC18F26J50」のオブジェクトを使う手もあります。
<ダウンロード>
ライセンス: フリーソフトウエア(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 academic
Microchip Application Libraries v2010-10-19
PICkit 2 v2.60
<基板>
蛇の目基板(ユニバーサル基板)でも十分に作れる様な簡単な回路ですが、何故か専用プリント基板を作ってしまいました。実は、電圧・電流・温度パネルメータのための回路ですが、時計も同じです。
2層目(赤)はジャンパ線を使います。
穴開け後の基板(写真は全て初版のもので、最終版とは若干違います)
右側の写真の電気二重層コンデンサ周りの部品は、基板上に空中配線となります。
動作確認と、表示窓にどのような素材が良いか見ている所です。
明るさ比較。上がV0.2で、ちょっと暗めですね。
<ケース>
ぴったり合う様な、都合のいいサイズのケースは市販されていないので、いつもの様に、アクリル板でケースを作りました。
寸法図
正面パネルが奥の部分を支点に開閉するような形です。
使用した材料3枚。黒は保護紙がついています。結局、窓材を決め切れずクリアと乳白色を用意しました。
ハッキリした表示も良いのですが、ぼんやりしたのも良いかも。プッシュボタンは出したくなかったので、直径5mmのアクリル棒を使って、目立たないようにしたつもりでした。
V0.1との比較です。左の写真は逆光での見え方で下がV0. 2。右が明るい部屋での見え方です。V0.1は視認性が良いのですが、意外な事に明るい部屋は苦手な様です
白色LED版OSL40562-IWが特性が似ていたので差し替えてみました。これはこれで良いですね。
<使用法>
USBコネクタを挿すと、LEDがゆっくり点滅(2Hz)し0:00からカウントを開始します。
ボタン操作に関しては、仕様をご覧下さい。
コネクタを抜くと表示は消えますが、時計のカウントは動いています。数時間は保持されていますので、この間に再度コネクタにつなぐと正しい時刻が表示されます。
PCからのコントロール法
・Windowsの場合
初めての場合、ドライバのインストール画面が表示されますので、プロジェクトディレクトリのinfディレクトリを指定して下さい。
COMポート番号が自動付与されているはずなので、デバイスマネージャの「ポート(LPTとCOM)」でMicrochipのデバイスを探して下さい。コマンドプロンプトを起動し、次のコマンドを打つ事によって、動作指示できます。
“st”は時刻を設定する指示を示します。例では12時34分56秒に設定しています。
うまく動かない場合、ハイパーターミナルを使って対話的に指令を送る方法もあります。指令が正常に受け付けられた場合「ok」、誤っている場合「ng」が返されます。
他に、次の指令があります。
sdYYMMDD YY年MM月DD日に設定
stHHMMSS HH時MM分SS秒に設定
ad-99 基準クロック値をプラスまたはマイナスして微調整する
nm9999 指定した数字を表示する(小数点指定可)
tm 数字表示状態になっていた場合、時刻表時に戻す
dhHH HH時に表示を明るくする
dlHH HH時に表示を暗くする
dm9 表示の明るさレベルを設定する
? ヘルプ表示
次のバッチファイルで時刻を自動設定できます。(ダウンロードファイルに入っています)
・Mac OS Xの場合
特にデバイスドライバのインストールは不要です。ただし、10.6の場合、モデムのセットアップするかどうか聞いて来ますのでキャンセル(*1)して下さい。ユーティリティのターミナルを開き、 次のコマンドを打つ事によって、動作指示できます。
最初のlsコマンドは、デバイス名を確認するためのものです。名前は、必ず/dev/cu.usbmodem#DC02001で始まります。
指令はWindowsの場合と同じです。
うまく動かない場合、screenコマンドを使って対話的に指令を送る方法もあります。
*1: キャンセルせず、モデム設定をしてしまえば一々聞いてこなくなります。モデムとして使う訳ではないので、機種は何でも構わないと思います。”NULL MODEM”で問題ありませんでした。
簡単に使える様に、GUIでコントロールできる単純なアプリケーションプログラムと、日時設定するだけのものと、CPU利用率を常に表示させるプログラムを用意しました。詳しくは直接ダウンロードファイルを見て下さい。
<関連>
「 自作電子小物/TIPS/ブートローダ使用例/PIC18F26J50」
<あとがき>
前回使用したPIC18F14K50は良く出来た設計だと思うのですが、4桁7セグLEDは荷が重かった感じでした。今回は単純に製品ファミリを移行しただけの設計でしたが、当然あると思っていた機能がなかったり、微妙に機能が違っていたり、PICは型番が変わるとデータシートを一通りチェックしないといけません。開発チーム間の交流が薄いのでしょうか?統括が弱いのでしょうか?わざと変えているのでしょうか?
富樫 豊彦 tog001@nifty.com
This is a desk clock that numeric emit light and USB power.