uchikawa-yです。前回に引き続いて温度測定システムの話をします。 忘れていたのですが温度センサDS18B20のスペック等とDS2480Bの機能について何も書いていなかったですね。構成/回路図には名前だけ出ていました。 今回はMAXIM社のデバイスを使用しています。このMAXIM社はアナログ/アナログ・デジダル混在のICに比較的強いメーカーです。他の会社の互換品をオリジナルより高性能にして出したり、他ではなかなか見られないようなユニークなオリジナル製品を作るメーカーです。 まず簡単に動かす方法を紹介して、後は下のレイヤから書いていきましょうかね。

温度測定システムの利用方法

今回作成した測定システムはホストからはUSBシリアルとして見えます。USBシリアル変換チップにはFDTI社のFT232RLを使用しています。FT232用のUSBシリアルドライバが使える環境であれば他にドライバは必要ありません。Perlで測定プログラムを作成してみました。こちらはgithubで公開しています。 https://github.com/uchikawa-y/temper_1w このプログラムではシリアルポートの操作を簡単に行うためにDevice::SerialPortというPerlモジュールを使用しています。 使い方やインストールの方法は上記のURLに置いてあるドキュメントを参考にしてください。 基本的にはperl 5.xとFT232のドライバがあれば動作するはずです。Debian Linux 5.0, FreeBSD 8.1R, NetBSD 5.1(玄箱HG PowerPC), Windows XP(Cygwin上のperl), Windows7(Cygwin上のperl)では動作実績があります。

温度センサDS18B20と1-Wireシリアル変換DS2480B

DS18B20

温度センサDS18B20の主な仕様は以下のようなものです。詳細についてはMAXIM社よりデータシートやアプリケーションノートなど豊富な資料が公開されています。 MAXIM社の製品ページDS18B20
電源電圧 3.0~5.5V
待機電流 750nA TYP(70℃)
動作電流 1 mA TYP(温度測定, EEPROM書き込み時)
温度測定範囲 -55~+125℃
温度測定誤差 ±0.5℃ MAX(-10~85℃)
±2℃ MAX(-55~+125℃)
分解能 9bit~12bit
入出力 双方向非同期シリアル(1-Wire)
パッケージ TO-92 3pin, SOP(1.27mmピッチ) 8pin, μSOP(0.65mmピッチ) 8pin
±0.5℃ MAX(-10~85℃)というのは一般的な半導体温度センサとしては高精度なほうです。サーバ信頼性のための温度測定目的なら無調整で使用できるでしょう。 温度測定時の消費電流が1mAというのは頭に入れておいたほうがいい値かもしれません。

DS2480B

DS2480Bは1-WireをRS-232Cへ変換するICです。ホスト側からはRS-232C経由で各種のコマンドを送り、1-Wireデバイスを制御することができます。1-Wireはバス内に1つのマスタ、複数のスレーブを持つマスタ・スレーブ型の非同期双方向バスですが、DS2480Bは1-Wireのマスタとして動作します。 MAXIM社の製品ページDS2480B データシートに"Serial to 1-Wire Line Driver"とあり、"Line Driver" と言っているところがDS2480Bの本質とメーカーのスタンスなのでしょう。
  • 通信速度:9600bps (default), 19200bps, 57600bps, 115200bps
  • Search ROM(スレーブデバイスのアドレスサーチ)を半自動で行う検索アクセラレータ機能
  • 1-W端子はドライブ能力の高いアクティブプルアップ
  • 2線接続用にstrong pullupに対応
  • 30m以上の長い1-Wireバスに対応するためのスルーレート制御, タイミング制御機能
  • 1-Wireのオーバードライブ(高速モード)に対応
1-Wireの配線総延長が100m程度となるような重い負荷状態への対応として電気的な部分を設定する項目が多数ありますが、今回は電気的な特性にかかわる部分はほとんどデフォルト設定値のままにしてあります。 ソフトウェア側から考えたDS2480Bを使うメリットのうち大きなものは以下の2点です。
  1. 直接1-Wireのバス制御を行う必要がなくなり、1-Wire上のデバイスをRS-232C上のデバイスとして扱うことができる
  2. 1-Wireデバイス(スレーブデバイス)のアドレスサーチ(ROM Search)の処理の一部を2480Bが半自動で行ってくれる
いずれもソフトウェアの負担を低減してくれます。

DS2480Bを使った本当の理由 (1-Wireを使う方法は他にもあるだろう)

前述1.のメリットがあまりに大きいというのがDS2480Bを使用した理由なのですが、少々説明する必要があります。

Linux の1-Wireドライバ

LinuxではGPIO(汎用の入出力端子)を利用して1-Wireバスのマスタ動作をさせるドライバが存在します。これは一般のPC用ではなく組み込み機器用のドライバです。カーネルの構築をするとmenu configの項目に出てくるので知っている人もいるでしょう。しかし、このドライバを使う場合、動作可能なホスト機器(の入手性にやや問題があります。たとえばFonera+OpenWRTでは利用可能でしたが実質的に2100E以外では満足に動作しないようでした(要改造)。

パラレルポートの双方向データ線を使う

一般のPCでも、たとえばパラレルポートの双方向データ線があればそれを利用して直接1-Wireのマスタ動作をさせることは可能です。こちらも試してはみましたが、一般的なPCのハードウェア+Unix/Linux系のOSでは10数μsのレベルの正確なタイミングを発生させる確実な方法が見当たらなかったため、1-Wireのエラーがかなりの頻度で発生したり、使用するPCの機種、OSなどによりパラメータの調整を行う必要があったりしました。 1-Wireのプロトコルは「DQ線をhighレベルにしてから『○○μs以内に必ず』lowレベルにする」というようなハードリアルタイム処理が必要なものであるのでなかなか厳しいです。こういうのはむしろ「H8などの組み込み用CPUボードとITRON」なら楽勝なんですけどね。

結論

測定用のホスト機種や条件で調整する必要があるというのはなかなか使い勝手が悪いので、それならいっその事ハードウェアに任せてしまえ、というのがDS2480Bを採用するに至った理由です。おかげでUSB-シリアル変換器に使ったFT232RLのドライバさえあればハードウェア/OSを問わず動作する汎用性の高い温度測定器になりました。

続く!

今回は測定ソフトウェアと使ったデバイスの紹介をしました。 1-Wireの動作や制御ソフトを作る場合の留意点、そのほか諸々のことにはまだ触れていませんので次はそのあたりを書いてみたいと考えています。 次もやっぱり低レイヤな話が多めになると思います。