温度測定システムの利用方法
今回作成した測定システムはホストからは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 |
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のバス制御を行う必要がなくなり、1-Wire上のデバイスをRS-232C上のデバイスとして扱うことができる
- 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の動作や制御ソフトを作る場合の留意点、そのほか諸々のことにはまだ触れていませんので次はそのあたりを書いてみたいと考えています。 次もやっぱり低レイヤな話が多めになると思います。