1wireデバイスDS18B20の紹介と水温測定デモ@前編

Arduino

はじめに

最近、低温調理にトライしてみたのですが中々うまくいかずにぱさぱさになってしまいました。というのも目分量での温度管理は結構難しくて火を入れすぎてしまった事が一番の原因のようで、何かいい温調器的なのないかなーとアマゾンをうろうろしていたら良さそうな物がありました!!

DS18B20というチップが使用されているデジタルサーマルプローブというものだったのですが、これは何かというと防水加工されているプローブの中に温度測定用のチップが埋め込まれたデバイスのようです。

1線通信という通信方式を採用していて、100℃以下であれば通信線より電源供給が可能で外部電源がいらないというユニークなデバイスです。

ということで今回はDS18B20を使用した水温計測器を作っていきたいのですが、新しいデバイスという事で説明、実装、応用の3編構成で行こうと思います。今回は説明編です。できる限り掘り下げていきたいと思いますのでよろしくお願いいたします。

DS18B20仕様説明

全体概要

*********************************

・通信方式:1Wire通信(シリアルは製品ごとに内部ROMに64bitで割当)

・電源供給:3.0V~5.5V(通信線よりも電源供給可能)

・測定温度:-55℃~+125℃

・分解能:9bit~12bit(0.5℃、0.25℃、0.125℃、0.0625℃)で選択可能

・温度アラームが設定可能

データシート:DS18B20データシート

*********************************

メモリ/レジスタ

■DS18B20のメモリーマップ

■温度レジスタ構成(0byte目, 1byte目)

下に温度レジスタを載せます。また温度とデータの関係性の表については12bit(0.0625℃)の分解能で表しています。仮に11bit(0.125℃)の分解能を使用した場合は下位byteの0bitが不定で、9bit(0.5℃)分解能を使用した場合には下位byteの0,1,2が不定となります。

補足(12bit分解能の少数)

そして、分解能の設定なのですが4byte目のCONFIGURATION REGISTER(設定レジスタ)のR1とR2を使用して設定します。初期はR1, R2ともに1です。表を見てわかるかと思いますが、分解能が上がるごとに変換時間(応答時間)が長くなります。温度検知を使用したゲームなどに使う場合は分解能を落として変換時間を短くする等工夫が必要ですが今回は水温を図るだけなので12bit分解能でも問題ありません。

■温度アラームレジスタ構成(2byte目, 3byte目)

上下限のアラーム設定レジスタは8bitで構成されていますが、8ビット目は符号bitになるので値は0bit~7bitに格納されます。そして、温度測定ごとに温度レジスタ4bit~11bitと比較される(2の補数)ことでアラームフラグがセットされます。アラームフラグの検出方法はコマンド【Alarm Search [ECh] 】を使用することで同じバスラインに接続されているスレーブデバイスのアラームフラグを確認することができます。

補足(2の補数)

2の補数とは2進数の引き算をする時に真価を発揮します。というのも2の補数表記を使用すれば2進数の引き算を足し算として表す事が可能となります。例として8bitで2進数の50-30を計算してみます。

*********************************

① 30(00011110) :の0/1を反転させます。

② 11100001:1を加えます

③ 11100010:これが30の2の補数となり-30と表します。

これで計算すると

50(00110010) + 30の2の補数(11100010) = 00010100

00010100は10進数で20を表します。

*********************************

■個体シリアルコード

DS18B20はそれぞれの製品ごとに64bitのシリアルコードをROM内に持っています。実際のユニークシリアルコードは真ん中の48bitであり、下位8bitはファミリーコードで上位8bitはCRC(冗長性チェック)と呼ばれるbyteになります。

■CRC

マスター側でROMメモリのCRC値と下記多項式で計算した値を比較することでデータの読み取りが正しく行われたかの確認を行っているようです。

CRC = X8 + X5 + X4 + 1

ここら辺の計算は後述のOneWireライブラリのOneWire::crc8(const uint8_t *addr, uint8_t len)でステキに計算していると思うので私自身あまり理解をしてないです。。。(理解している方がいらっしゃったらご教授お願いいたします)

回路接続構成

接続は単純で約5kΩの抵抗でプルアップして通信線(DQ)をバス接続します。通信線で電源供給を行う場合はVccをGNDに接続しましょう。気をつけたいのは温度変換やROM書き込みの間はプルアップが必要なのでほかの1線通信を行うことができません。

処理手順

  • Step1 初期化
  • Step2 ROMコマンド
  • Step3 DS18B20のファンクションコマンド

DS18B20のアクセスには常にこの順序を取り、 Search ROM [F0h] とAlarm Search [ECh]が行われた場合はStep1に戻ります。

*Arduinoでの使用を前提としているのでOneWireライブラリの説明も要所要所で入ってきます。事前にインポートをお勧めします。

Github_OneWireライブラリ

Step1 初期化

  1. マスター側からのリセットパルス(480us以上バスラインをLOW)
  2. マスター側はバスを開放してバスラインはプルアップされる
  3. スレーブ側のDS18B20が立ち上がりパルスを検知し15us~60us待機
  4. スレーブ側のDS18B20が60us~240usの間バスラインをLOWにする

ちなみにOneWireライブラリでの処理は<<OneWire::reset(void)>>になります。

ROMコマンド

このコマンドは前述した64bitのROMコードに対応します。バスラインに複数のスレーブが存在するときに個々のデバイスを特定することが可能となります。コマンドは5種存在します。これらコマンドに関してはOneWireライブラリを使用した場合、ライブラリ側がやってくれますのでOneWriteライブラリを絡めた説明が出来ればと思います。

  • Search Rom [F0h]  <<OneWire::search(uint8_t, bool)>>

バスラインに複数のスレーブが存在しているときに使用する。接続されているスレーブの数だけ繰り返してサーチを行う。ライブラリ使用の場合はbool=1とするとF0hコマンドとなると思われる。

  • Read Rom [33h] OneWireライブラリには存在しない、、、と思う 

バスラインにスレーブが一つの時にのみに使用する。複数のスレーブが存在する場合はデータの干渉が起こる。

  • Match Rom [55H]  <<OneWire::select(const uint8_t rom[8])>>

特定のスレーブアドレスとの通信を可能とするコマンド。

  • Skip Rom [CCh]  <<OneWire::skip()>>

マスターからROMコードを送らずにバス上のすべてのスレーブにコマンドを送るようにする為のコマンド。このコマンドに続いてファンクションコマンド44hを送信するれば同時に複数のスレーブの温度変換ができる。

  • Alarm Search [ECh]  <<OneWire::search(uint8_t, bool)>>

このコマンドはアラームフラグがセットされたスレーブのみが反応する以外はF0hと同じ。ライブラリ使用の場合はbool=0とするとこのコマンドになるような気がする。まず4EコマンドでTh, Tlを設定する必要あり。

 

DS18B20ファンクションコマンド

ROMコマンド送信後に使用することができる。コマンドは計6種存在する。使用のフローチャートについてはデータシートの14ページを参照してもらいたいです。コマンドについては簡単に説明します。

  • Convert T [44h]

温度変換を一回行うコマンドです。温度格納メモリの上下2byteにデータを格納します。変換後はアイドル状態に移行します。通信線で電源供給を行う場合は温度変換中は通信線をプルアップしなくてはいけないので他の1線通信を行うことはできません。

  • Write Scratchpad [4Eh]

DS18B20の上下アラーム設定TH, TLと分解能の設定(byte2~byte4)の書き込みを行うことが出来ます。書き込みはbyte2から始まります。

  • Read Scratchpad [BEh]

DS18B20のメモリ0byte~9byteのデータを読み取る。データの読み取りは0byteから始まりForループなどを用いて読み取るのが一般的。

  • Copy Scratchpad [48h]

温度上下限設定、分解能設定の2byte~4byteをEEROMにコピーする。この時通信線での電源供給を行っている場合はプルアップしていなければならない。

  • Recall E2 [B8h]

48hコマンドEEROMに書き込んだデータを読みだしてDS18B20のメモリ2byte~4byteにコピーする。

  • Read Power Supply [B4h]

通信線で電源供給しているスレーブを確認するコマンド。方法はROMコマンドCChを行った後にB4hを送る。この時外部電源に繋がっているスレーブはHiになるが通信線での電源供給を行っている場合はLowとなる。

 

はい、説明だけでちょっと疲れましたね。今回はいったんここまでとしたいと思います。基本的な仕様と使い方は以上となりますが実際に使っていくときはデータシート内のフローチャート(P13, 14)が非常に重要となりますので目を通して頂けると幸いです。

では次回は実装編になります~

コメント

タイトルとURLをコピーしました