前回は中間電位を含めた3値を1本の信号線に載せて多数個を数珠繋ぎ通信するLEDでした。今回は、1本の配線を信号と電源で共用できる1-Wireを使ったセンサです。その1本の線に多数のデバイスを並列に接続可能。配線一本だけれど「バス」です(流石に要GND。)元々はダラスの製品ですが買収の連鎖?により今ではアナデバ製品です。
※「部品屋根性」投稿順Indexはこちら
信号線1本で通信する方式はいくつかあるのですが、今回の1-Wireバスはその代表選手じゃないでしょうか。GND除き1線で、多数個のセンサを接続し、それぞれ固有の制御まで出来てしまうのですから。
DS18B20 デジタルサーモメータ
今回 1-Wireバスの通信の様子を観察するために以下のデバイスを購入。温度センサです。
GNDと配線1本の2線で引き回せます。電源線不要とな(デバイスには電源端子も一応存在しますが。)複数個のセンサを1対の線にぶら下げることができるので、複数個所の温度測定を最小限の配線で行うには便利な一品であります。ただし、1本の線で電源と信号をかねているだけに、そのインタフェースは電気的にも多少込み入っているだけでなく、論理的にはかなり複雑デス。今回は「そこんトコロ」をちょっと観察してみたいと思います。
実機動作確認
DS18B20は「人気もの」のセンサなので制御用のライブラリ、サンプルプログラム等に不自由はしません。その中でも「電子工作業界の標準機 Arduino Uno R3」を使えば何もコードを書かずに動作OK、1-Wireバスの様子も観察できるというものです。実機の様子が以下に。
Arduino用OneWireライブラリ
さて人気のデバイスだけにArduino用のライブラリも複数見つかります。その中で今回は以下のURLにホームページがあるライブラリを使用してみました。ぶっちゃけ「検索したら先頭にあった」ので。
ライブラリのインストールは以下のインストールボタンからです。ボタンを押せばあっという間にセットアップされます。
ライブラリのインストール後は、スケッチ例を開くとOneWireが増えておりその中にDS18x20_Temperatureが見つかります。今回はそのプログラムをそのまま使わせていただくことにいたします。
Arduino UnoのFlashに書き込み後、シリアルモニタを結合すると以下のように動作していることが分かります。指でDS18B20を「温めてやる」と温度が変わったので、動作はしているみたいです。ちょっと、温度高めに見えるケド。
1-Wire「バス」の観察
さて1-Wire「バス」は、デバイスのアドレスだけでもファミリ8ビット、デバイス48ビット、CRC8ビットで合計64ビットという長大さです。温度センサDS18B20から温度を読み出すときも総データ9バイト長というゴージャスさです。目で1ビットづつ追っていくようなことは最初から万歳状態。
しかしいつもの Digilent製Analog Discovery2のロジアナ機能(Analogといいつつロジックも充実)には1-Wireバスのプロトコルを解析する機能があるのです。ほれこのように。
なお、Analog Discovery2の制御ソフトWaveFormsにはプロトコル・アナライザ機能もあるのですが、そちらには1-Wireは入れてもらってないみたいです。残念。
ツールが1Wireバスのプロトコルを理解してくれているので、通常の信号エッジやレベルでトリガするだけでなく、以下のようにプロトコル上のResetでトリガとか「技」が使えます。こんな感じ。
さて、Arduino側からDS18B20(バス上に1個しかない)に向かってアドレスを指定しているところのアドレス指定部分が以下です。一番右の空白の箱はCRCデス。なお、空白の箱のところにマウスカーソルを持っていくと意味とか値とかを表示してくれます。また、赤字、オレンジ字のところは当方で書き加えた情報です。
以下は実際に温度データを読み取っているフレームの温度データが信号線にのっている部分。はるか以前(750ms以上前)に温度測れというコマンドがセンサに投げつけられているハズ。その遥か後に内部のレジスタに格納されている温度データを読み取ってます。
しかしな、1-Wire「バス」、プロトコル結構複雑。