近頃の電子工作 本文へジャンプ
USB接続の時計を作る


 PIC16E1455のブレークアウト基板が出来たので、USB接続の時計を作ってみます。
                  回路図 ↓

 「U_BASE」がブレークアウト基板です。ピンの位置も基板と同じです。
 
 秋月電子のRTCモジュール「RTC−8564NB」とLEDを1ヶ接続しています。
 
 モジュールとPIC16F1455間の接続は、I2Cです。RTCはクロックとアラームを出力可能です。

 LED1ヶが表示部です。輝度はあまり明るくしません。

 I2CのプルアップはRTCモジュール内のプルアップ抵抗を使用します。


☆☆☆ ユニバーサル基板で組み付け ☆☆☆

できあがり↓





※ソフトウェア

仕様:
 PCに対して、仮想シリアルデバイスとして動作
 (Windows側のドライバは、マイクロチップのデモを無加工で使用)
 ターミナル(teraterm等)を使用し、時刻の設定、読み出しを行う
 周期的にRTCを読み出し、時刻得る。
 取得した時刻をモールスコードに変換し、LEDを点滅させる。


開発環境
コンパイラ XC8 V1.2
統合開発環境 MPLAB XIDE V1.51
フレームワーク Microchip Application Libraries v2012-06-15
書き込み器 PICKIT3



 USB絡みのソフトウェアはマイクロチップの「Microchip Libraries for Applications」を元にして作っていきます。

 CDCデバイスを作りたいので、「Device - CDC - Serial Emulator」を使います。

 このサンプルプログラムは、USB−UARTブリッジとして動作するので、このプログラムを移植すると、ブレークアウト基板がUSB−非同期シリアル変換基板になります。

○ 移植について
 16F1459用の雛形があるので、これを使います。
 
 
○ LVPについて
 USBのD+、D−信号をICSPに使っている都合上、コンフィグレーションレジスタのLVP設定はONにする必要があります。
 「#pragma config LVP = ON 」

○ ACTCONについて
 水晶振動子を付けずに、USBコントローラを使用する場合、アクティブクロックチューニングをイネーブルにする必要があります。

 普通は、OSCCON = 0xFC;ACTCON = 0x90、と設定するだけで問題無いと思いますが、USBハブを挟んでいる場合、運が悪いとクロックがロックしません。
(ハブが悪いのかもしれませんが、そのようなハブが普通に市販されています)

 クロックのロックに失敗した場合、PC側は「不正なデバイスを検出した」と判断し、対象となるUSBポートへのアクセスを停止します。(わりと簡単にあきらめてしまいます)

 アクセスが停止するとUSBバスのD+、D−に有意な波形を送出しなくなるため、以後クロックがロックすることはありえません。

 その様なケースを回避するため、一定期間の間にクロックがロック出来なかった場合、USBのプルアップを中止し、少し待ってから再度プルアップする仕掛けを付けています。

 このアクションは、PCからは、USBデバイスがいったん外され、再度プラグインされた様に見えます。

 待ち時間が少し必要なので、起動が遅くなるキライがありますが、まあ仕方が無いでしょう。


 出来上がり  usb2uart.zip

RC4がTxD、RC5がRxDなので、基板のピンは↓の様になっています。





 USB→UARTの動作が確認出来たので、その他の部分を作り込んでいきます。

☆☆☆ i2c部分

 RTCはI2Cで接続されています。
 I2Cのライブラリが、何故かXC8に付いていないので、関数をソースからコンパイルする必要があります。(何故かソースはある。何故かヘッダ”i2c.h”もある)

I2C関係のソースは「C:\Program Files\Microchip\xc8\v1.12\sources\pic18\plib\i2c」にインストールされています。

 面倒なので、必要な関数だけを拾って、main.cにコピーしました。

 RTCアクセスに必要なi2cの関数は、以下の9つです
unsigned char ReadI2C( void );
signed char WriteI2C( unsigned char );
void IdleI2C( void );
void OpenI2C( unsigned char , unsigned char );
void StopI2C( void );
void AckI2C( void );
void NotAckI2C( void );
void StartI2C( void );
void RestartI2C(void);

☆☆☆ 仮想シリアルポート部分

 シリアルエミュレータでは、USBからデータを受信すると、そのデータをEUSARTの送信バッファに書き込んでいます。
 また、EUSARTの受信バッファに有意なデータが有れば、そのデータを読み出して、PCに向けて送出しています。

 今回は、送信と受信のリングバッファを作り、リングバッファを仲介してデータを送受信します。

☆☆☆ コマンド パーサ

 簡単なパーサで、ターミナルからの入力処理をします。

 PCのターミナルから送られたコマンドに応答して、アクションを起こします。
 最初に入力された1文字がコマンド、続く文字列をパラメータとして扱います。
 リターンキーを検出すると、コマンドとパラメータの解析を行い、コマンドに従ってアクションを起こします。

○時刻をセットするコマンド 「s」
ex.. 
2013年7月26日午前9時14分00秒 (時間は24時間制、曜日は未使用)
s 130726091400 (enter)

○時刻を表示するコマンド 「t」
ex.
t (enter)

○入力した文字列を表示するコマンド「e」 (送受信確認用)
ex.
e 12345678 (enter)

○モールス信号で時刻表示を開始するコマンド 「d」
ex.
d (enter)

☆☆☆ LED表示

 一定間隔でRTCを読み出し、時刻をモールス信号で表示します。

 モールス信号自体は可変長ですが、数字に限れば5音の固定長です。
 下記のパターンでテーブルを作り、数字をビットパターンに変換します。

0= 長長長長長
1= 短長長長長
2= 短短長長長
3= 短短短長長
4= 短短短短長
5= 短短短短短
6= 長短短短短
7= 長長短短短
8= 長長長短短
9= 長長長長短

 RTCから読み出した時刻に対応するビットパターンをテーブルから拾って、左シフトしながら、長点と短点を送出します。
 ビット4が1であれば長点、0であれば短点です。



 ソースファイル↓
USB_CLOCK.zip

 書き込みツール

 ICSPで書き込みを行うために、PICKIT3とモジュールを接続するケーブルが必要です。
-----------------------
部品
 6ピンヘッダ
 usbミニbコネクタ オス (ハンダ付けタイプ)
 配線材 少々

-----------------------
 結線表

6ピンヘッダ(pickit側)       USBミニBコネクタ
1 VPP                 4
2 VDD                1
3 GND                5
4 ICSP_DAT           3
5 ICSP_CLK           2
6 NC

------------------------
↓ こんな風。ケーブルは短めに。

------------------------

 USBミニBコネクタは、共立エレショップで扱っている「USB−32BP」です。
 千石電商やオヤイデ電気で販売されている物も、たぶん同じ物だと思います。
 中国製というだけで、メーカ−は不明、かつ、データシート無しというとても怪しい部品です。

 プラスチックのカバーは、一度付けると、外すことが出来ないので、結線して動作確認が済むまでカバーを付けない方が良いでしょう。

※書き込み時の注意
 LVPモードで書き込みます。書き込みツールもLVPをイネーブルに設定する必要があります。
 書き込み時はPICKIT3からパワーを供給します。供給する電圧は3.3V程度とします。


☆☆☆ 感想

 USBから給電するので、ACアダプタ不要なのがいいですね。
 セルフパワーのハブを使えば、PCの電源を落としても給電が継続します。

 モールス信号の光表示は、最初はたぶん読めません。
  3日程度すると、目が慣れて読める様になります。

 暗闇で時間を知る手段としては、実用性が無いこともありません。

 私は乱視が強いので、メガネ無しでは時計の文字盤が読めないのですが、この時計ならば離れていても読むことができます。
( 因みに7segLEDの時計は、乱視があると暗闇ではボケボケになって全く判読できません。)