1-Wire

1-Wire はマキシム・インテグレーテッドの登録商標であり、接地線と一本の信号線（兼電力供給線）だけで低速なデータ転送を行うバス規格である。マキシムに吸収されたダラス・セミコンダクタが開発した。I²C に似ているが、データ転送レートがより低く、より長い距離で通信可能である。小さい安価なデバイス（例えばデジタル温度計など）の通信に使われる。 このバスの長所は2本の線だけで接続できる点である。このため、集積回路には800pFのコンデンサが集積されていて、データ線から電力を得ている。デバイスは非常に小型化でき、単なるコンデンサや腕時計用のボタン電池のように見えるものもある。これを iButton と呼ぶ。 プリント基板に実装されることもあるが、ノートパソコンや携帯電話のバッテリーパックなど、様々な部品の一部として使われている。 実験用機器やデータ収集機器と制御システムの接続に 1-Wire を使うこともあり、その場合のコードには電話用のモジュラーコネクタのコードやカテゴリー5ケーブルなどを使い（RJ-11が最も多い）、ソケットに 1-Wire デバイスが内蔵されていたりする。 センサ群を 1-Wire で接続したネットワークを MicroLan と呼ぶ（登録商標）。例えば、温度センサ、タイマー、電圧センサ、電流センサ、バッテリーモニタ、メモリなどを接続する。これらはバスコンバータ経由でPCに接続できる。PC側インタフェースとしては、USB、シリアルポート、パラレルポートなどから、1-wireへ変換するマスターチップを搭載することで接続が可能である。MicroLan にマイクロコントローラを接続することもできる、この場合は汎用のマイクロコントロラーのオープンドレインのI/Oポートからプルアップして簡単に接続が可能である。Parallax BASIC Stamp、Microchip PIC ファミリー　また、オープンドレインのI/Oを持っているマイコンならばどれでも対応可能である。 iButton はボタン電池状のステンレス製のパッケージに 1-Wire 部品を詰め込んだものである。ソケットにタッチさせて 1-Wire バスに接続する。接続は一瞬でよく、クレジットカードをリーダーに通すような感覚で使える。より長時間の接続をする場合は、異なる形状のソケットを使う（はめ込む形状）。 JavaOne 1998 では、iButton をリング上にマウントした JavaRing が紹介された。これは、Java仮想マシン（Javaカード 2.0互換）を内蔵したものである。 それぞれの 1-Wire チップには一意のコードがあり、それぞれ異なる番号を付与されている。これを利用して iButton を鍵として使うことができる。単なる鍵以外にも、警報装置の設定/解除に使うなどの用途がある。 MicroLan には、全体を制御するマスターが1つだけ存在する。通常、PCやマイクロコントローラがその役目を果たす。マスターは1度に1つのスレーブだけが通信するよう調停する。 物理層の通信プロトコルは、バスマスターデバイス上の特製ソフトウェアで制御されることが多い。バスマスターデバイスは、1-Wire にプルアップ抵抗を付加することで5Vの電圧を印加し、ネットワークに電力を供給する。専用のドライバ回路やブリッジも用意されている。 マスターはまず、リセットパルスを送る（480µ秒のローパルス）。これによってバス上の全スレーブ機器がリセットされる（1-Wireからの電力供給で動作するので、これで完全に放電する）。その後、任意のスレーブデバイスが存在を知らせる "presense" パルス（60µ秒以上のローパルス）を送る。 マスターから二進法の "1" を送る場合、短い（1 - 15µ秒）ローパルスを送る。"0" を送る場合、60µ秒のローパルスを送る。パルスの立下りエッジで、スレーブデバイスの単安定マルチバイブレータをスタートさせる。スレーブのマルチバイブレータがクロックとなり、立下りエッジから約30µ秒間、データ線を読む。スレーブのマルチバイブレータのアナログ的誤差があるため、パルスの長さがこのように設定されている。 パラレルポートがないマシンでは、オペレーティングシステムによってはこのようなタイミングを制御できないため、100kbit/sのUARTに専用ソフトウェアを組み合わせて 1-Wire のマスター機能を実現する。USBブリッジチップも同様の波形やタイミングの制御を行う。 マスターがデータを受信する際は、1-15µ秒のローパルスを各ビットを受信する前に送る。送信側スレーブが "1" を送る場合は何もしない。"0" を送る場合はデータ線を60µ秒間0ボルトにする。 基本的シーケンスは、リセットパルスの後に8ビットのコマンドを送り、データを8ビット単位で送受信する。一連のデータが転送された後に、誤り検出は8ビットCRCで行う。CRCは16bitの計算も対応している。 多数のデバイスが1つのバスを共有できる。各デバイスには一意な64ビットのシリアル番号が付与されている。シリアル番号の最上位バイト（8ビット）はデバイスの種類を表している。最下位バイトは8ビットCRCである。デバイスに共通なコマンドと特定のデバイス対応のコマンドがある。マスターが選択コマンドとデバイスのシリアル番号を送ると、次のコマンドは選択されたデバイスのみが実行する。バスには、バス上の全デバイスのシリアル番号を収集するアルゴリズムがある。これによって、どういうデバイスがバス上に接続されているかを知ることができる。デバイスを探す場合、enumerationコマンドをブロードキャストし、アドレス（シリアル番号）を送信して、アドレスを1ビット送信する度に応答を待つ。スレーブは、そこまでのアドレスが一致していれば 0 を返す。マスターは、この単純な方式で正しいアドレスビットの並びを得る。これは64ビットの空間の力まかせ探索よりもずっと速い（あるビットで応答が返ってこなければ、そこから先の探索を打ち切ることができるため）。バス上のデバイスの位置も重要となることがある。そのような場合に対応するため、バスをパススルーしたり切断する特殊デバイスも用意されている。 ^ 1-Wire Products ^ An introduction to the Java Ring, by Stephen M. Curry, JavaWorld.com, April 1st, 1998. ウィキメディア・コモンズには、1-Wireに関するメディアがあります。 1-Wire デバイス iButton 1-Wire Weather Station Construction (Book) 1-Wire Weather Instrument Kit OWFS - 1-wire filesystem for Linux OWFS - 1-wire filesystem for Linux (Old Site) OPNODE project (opn-one : 1-Wire home automation controller) Guides to working with 1-Wire, for programmers and engineers jHomeNet - 1-Wire home automation program 1-Wire ON/OFF temperature controller with RS-232C communications interface to a personal computer 1-Wire LANによる気象観測l ナチュラル研究所