uchikawa-yです。 前回、前々回に引き続き温度測定システムまわりの話をします。 今回はまあ、ハード屋さんです。 個人的にはオシロスコープはテクトロニクス製のアナログオシロが好きなのですが、たとえ買えたとしても普通の家庭では置き場所に困りますよねぇ。今回使ったオシロスコープはUSBでPCに接続して使うタイプのものでした。 DS18B20, DS2480Bを実際使うにあたってはMAXIM社の提供しているデータシート、アプリケーションノート、サンプルプログラムを見るのが最も確実でしょう。特にデータシートなどに記載の実例、サンプルプログラムを真似するだけでもかなりのことができるはずです。 MAXIM社の製品ページDS18B20 MAXIM社の製品ページDS2480B さて、今回の温度測定システムを作り、使うためにはどういう知識が必要だったのでしょうか?
  • ICのデータシートを読む能力
  • 配線材、コネクタ、配線方法、加工方法などの知識(いわゆる工作についての知識)
あたりは置いておくとして課題と解決方法をまとめると以下のようになります。 意図的にネットワーク階層と対応つきやすいように下位のレイヤから書いてみました。完全にきれいに対応するわけではありませんが、DS2480Bはレイヤ1~レイヤ2あたりを担当してくれるデバイスです。これを使用すれば下回りのかなりの部分は知らなくてもある程度はなんとかなります。
1-Wireの電気的特性 DS2480Bが概ね適切に対応してくれる。DS2480Bを使わないならひたすらデータシートを読む
1-Wireのデータ転送条件(タイミングなど) DS2480Bが概ね適切に対応してくれる。DS2480Bを使わないならひたすらデータシートを読む
1-WireのROM Search(スレーブアドレス検出) DS2480Bが半分ぐらい処理。データシートとサンプルプログラムを熟読する
1-Wireシリアル変換器 DS2480Bの制御方法 DS2480Bのデータシート、実例、サンプルプログラムを読む(コピペも可)
温度センサDS18B20の制御方法 DS18B20のデータシート、実例、サンプルプログラムを読む(コピペも可)
シリアルポートの制御方法 perlのモジュール使って逃げた


ただし、数10mの配線を使ったり、センサを20個以上1つの1-Wireに接続するような物理的に厳しい使い方をする場合は結局ドキュメントを熟読する必要が出てくるように思います。

1-Wireのデータ転送

DS2480Bを使うなら「あまり」気にしなくてもいい部分ですが、1-Wireの話をするのにこれがまったく無いのも片手落ちなので書いておきます。なので今回は以降の部分は興味のない人は読まなくてもかまわない内容です。また、網羅した内容ではないので詳細についてはMAXIM社の資料を参照してください。
  • 信号線が1本の双方向非同期シリアルバス
  • 信号線(DQ)はlowレベル:0V, highレベル:ハイ・インピーダンス。外部1箇所で5kΩ程度のプルアップ抵抗を介して3V~5.5Vに接続する(オープンドレイン出力)。
    • マスタ・スレーブすべてのデバイスの出力がAND接続されたものが最終的な出力DQになるとみなせる
    • DS2480Bを使用する場合、DS2480B内でプログラマブルなアクティブ・プルアップ回路が内蔵されているため外部でプルアップは行わない
  • 半二重通信
  • 転送レート 16kbps(標準モード)
  • 100m程度のバス総延長で使用可能
  • スレーブデバイスは実質56bitのアドレス空間を持つ
  • 各デバイスのアドレスは出荷時に決定され変更不可能
通常、バス接続の場合は各デバイスは3-stateの入出力回路を持ち、バスから切り離す(high='1',low='0',ハイインピーダンス状態)ことができるようにしています。1-Wireの場合はハイ・インピーダンス状態と'0'のみを使い、外部でプルアップしています。この回路は、
  • すべての端子がハイ・インピーダンス状態→出力は'1'
  • 一つでも'0'状態の端子があった場合→出力は'0'
ハイ・インピーダンス状態を'1'とみなせば等価的にAND接続されたとみなせます(ワイヤードAND)。このような回路は電気的に高速なスイッチングに不向きですが1-Wireは低速用途に特化して積極的に利用しています。 各デバイスが'1'を出力している場合、他のデバイスから見たり、出力端子を見ている限りはバスから切り離されている状態と区別がつきません。 1-Wireではデバイスの検出(ROM Searchコマンド)など特殊な場合以外は複数のデバイスが同時に出力を行いません。出力をしないデバイスはすべてDQ端子を'1'にします。 ここでは便宜上、マスタからスレーブへデータを送る場合をWrite, スレーブからマスタへデータを送る場合をReadとして1ビットのデータ転送動作を示します。データ転送スロットは必ずマスタから開始されます。マスタがDQを1→0として1μs以上0を続けるとスロットが開始されます。
Fig.1 Writeタイミング


Writeでは全てのスレーブが出力をおこないませんので各スレーブのDQ端子は'1'の状態のままです。従って1-Wire上の最終的な出力結果はマスタの出力状態を反映したものになります。スロット開始から15μs以内にマスタの出力が確定する必要があり、その後45μs以内のどこかの時点でスレーブデバイスがデータを読み込みます。
Fig.2 Readタイミング


Readでは事情が異なります。スロットの開始はマスタ側から行いますが、マスタは1μs以上'0'を出力した後'1'を出力してバスを明け渡します。スロットの後半では出力デバイスが入れ替わり、出力を行うことになっているスレーブデバイスの出力が1-Wireの出力結果になります。マスタはスロット開始15μs以内にデータを読み込むのでこの間はスレーブはデータを保持する必要があります。 以下は実際の8bitのWrite, Read動作を行ったときの1-Wireの波形です。WriteとReadでは動作の違いから波形が異なることがわかります。
Fig.3 8bit Write動作


Fig.3 8bit Read動作


続く!

次はDS2480Bの主要な機能の一つであるROM Searchアクセラレータ(スレーブデバイスの認識、アドレス取得の支援機能)の説明をしようと思います。これは1-Wireデバイスを使う場合に避けられない話題なので今回書くつもりでしたが、続けて書くとかなり長くなりそうなので分けることにします。ではまた次回で。