[Japanese|English]

DS1620を使ったUSBデジタル温度計

概要

モルフィー企画のUSB-IOの先に、ダラスセミコンのデジタル温度センサDS1620を繋いで、パソコンで気温がわかる温度計を作りました。

DS1620は3-wire (SPI) プロトコルをサポートし、タイミングもルーズでいいので、非常に簡単に温度計を作ることができます。測定精度も、常温では誤差の最悪値が±0.5度なので、一般的な室温測定には十分です。

なお、この手のハードの場合、本来は、マイコン (CY7C63001A) にDS1620を制御するファームを載せて、HIDのINPUT REPORTで温度を返すようにするべきなのでしょうが、本機では、手抜きでUSB-IOの標準ファームをそのまま使っています。このため、ホスト (PC) から「手取り足取り」という感じで制御しなければなりません。

開発の動機

以前、別の構成のPC接続温度計を作りました。それは、電圧出力温度センサ (LM35) + A/Dコンバータ (MPC3204) をパラレルポートで駆動するという構成でした。これは今でも現役で稼働していますが、以下のような問題がありました。

最初の2つの問題は、LM35 + MPC3204に変えてDS1620を採用すれば解決されます。残りの問題は、ホストとの接続をUSBにすれば解決されます。そういうわけで、USB-IOのことを知ったとき、これだと思ったのです。

回路構成

要するにUSB-IOの先にDS1620を繋いだだけです。回路図を見るとわかりますが、何の工夫もありません。(U2 (DS1620) の部分を塗りつぶせば、USB-IOの回路図としても使えます。:-)

強いて言えば、SPIのCLK信号をPort #2に繋ぎ、SPIのDATAをPort #1に繋いでいる点が、工夫と言えば工夫です。このことで、USB-IOのVer. 2ファームウェアの「ストローブ付き I/O コマンド」が活用できるようになっています。

工夫の無い点としては、DS1620のCS信号がアクティブ・ハイなのに、USB-IOのPort #1の信号 (パワーオンでハイレベルに初期化される) を直結している点です。本当は、インバーターでも挟むべきなのでしょうが、まぁ、このためにロジックICを追加するのもおおげさなので、いいことにしています。専用にファームを作るならば、ここは、初期化でロウに落とせばいいだけなのですが。

ホストソフトウェア

すべてホストで面倒を見るというアーキテクチャなので、制御ソフトにはそれなりに負担がかかります。USB-IO制御クラスライブラリの上に積み上げて、これまたJavaのクラスで作りました。ありきたりのサンプルアプリケーョン (Thermo.java)も作りました。画面はこんな感じです。

このクラスは、初期化のあと、「温度を教えて」と要求する (getTemperature() メソッド) と測定して結果を返すというものです。USB-IOを通してSPIプロトコルを制御するため、通信動作はかなり低速 (1バイトの送信又は受信に約70ms、通信速度で言うと、実に約110bps) なのですが、DS1620自身の温度計測に約1秒かかりますので、USB-IOの動作のオーバーヘッドも (幸か不幸か) あまり気になりません。

このクラスには、標準の分解能 (0.5度刻み) の他に、高分解能 (刻み不定; 常温で約 0.05 度程度) の測定値を返すメソッド (getHiResTemperature()) もあります。詳しくはJavadocを見てください。