Arduinoで温度測定 (DS18B20センサー)

突然ですが、Arduinoというマイクロコントローラーを使って温度測定をしたいと思います。 家に昔ネット通販で買ったArduino Nano (ナノ) というボードとDS18B20というデジタル温度計センサーがあったのでそれを使いました。


Arduino Nano

Arduino NanoはAVR社のATmega328Pというマイクロコントローラーが付いているPCBボードです。 ボードの寸法は18mm×45mmのサイズと割と小さめで、mini-USBのケーブルでコンピュータにつなげてプログラミングが出来ます。

本家のArduino cc社製からこのボードを買うとU$22 (USドル) とかするのですが、オープンソースの商品なのでネットにはもっと安い値段の同等品が出回っています。 節約をしたかったので私はオリジナルではない安い同等品をネットで買いましたが、香港から送料込みで5個でU$15ほどでした。

Arduino Nano
ネット通販で買ったArduino Nanoの同等品

オリジナルとの違いは、安い同等品だと、時々『Bootloader』と呼ばれるマイクロコントローラーが起動時に必要なコードがボードに書き込まれていない場合のあったりするそうで、その様なボードだとArduino用のISP (In-Circuit Serial Programmer)という物を使ってBootloaderを書き込まないと使えません。

Arduinoを使うのが初めてな人がそんな商品にあたったりするとハードルがグンと高くなると思います。 (ISRもネットで安く手に入るのと、手元に使えるArduinoが一つ予備であればそれをISPとして使う事も出来るので、慣れた人なら面倒くさいだけでそこまでハードルは高くないかと…)


DS18B20 (温度計センサー)

DS18B20の温度計センサーはMaximのデータシートによると『Programmable Resolution 1-wire Digital Thermometer』という名前で、

  • Programmable Resolution 👉 9~12ビットの精度で-55℃~+125℃の温度が測れる
  • 1-wire 👉 1本の配線にいくつものDS18B20センサーを[数珠繋ぎして]並列繋ぎで使用も可能 (Parasite-Powered)

といった特徴があるそうです。


DS18B20の使い方

使い方をおおざっぱに説明すると、Arduino Nano (コントローラー)のデジタルI/Oポートの1つにDS18B20センサーのDQ端子を接続して、コントローラーがI/Oポートの電圧をON/OFFして制御コマンドをデジタル信号としてセンサー側に送った後、同じポートの電圧の変化をセンサーからのデジタル信号としてコントローラーが読み込むというデータ用に1本の配線を使ったコントローラ⇔センサー通信で、コントロラーがセンサーから温度を読み込みます。

DS18B20センサーは9、10、11、12ビットの精度がコマンドで設定できて、その設定ごとに0.5℃、0.25℃、0.125℃、0.0625℃の精度で温度が測れるそうですが、データシートによると温度計の誤差は-10℃~+85℃の温度で±0.5℃らしいので0.5℃よりも高い精度がどう有効か実際に使ってみて検証する必要があるかもしれません 。

それと、Maximのデータシートにはセンサーごとに48ビットのシリアル番号が振り当ててあるので繋げられるセンサーの数は「ほぼ上限なし」と書いてありましたが、センサーが測った温度を内蔵の「EEPROMに書き込むのに通常1.5mA位の電流を必要」とするとも書いてあったので、全部のセンサーが同じタイミングで1.5mAの電流を消費してもケーブルが溶けない程度の電流の合計になるようにセンサーの数を抑えないと危険だと思いますw。

シリアル番号が48ビットのである理由はたぶん、248(=約281.5兆個)の違う番号があるのでいくつかのDS18B20を組み合わせた場合でも偶然に同じシリアル番号がかち合いにくいという事だと思うのですが。。。でも絶対に起こらないとは言えないのと、実際にそんな事が起きた場合、沢山センサーがあると、どのセンサーがかち合っているかを見つけるのはすごく面倒そうです。
後、センサーの数が多過ぎると一つ一つのセンサーから温度を読み取るだけでも時間がかかるというのも問題になります。

DS18B20センサーにはVCC (電源)とGND (接地)、DQ (データ)の3端子がありますがデータシートにある『Parasite-Powered (寄生虫パワーw)』という方法(MOSETが1つ必要)で繋げれば1本のワイヤーとしっかりとした接地があれば『1-wire』という方法で配線の数を減らせるのですが、データーシートによると100度以上の場合での使用を推奨していないので実用には少し限られている感があります。


今回使った DS18B20

TO-92タイプのDS18B20センサーだとネットで1個U$1.50とかでありますがまとめて10個とかでU$9とかにもなるようです()。

手元にあったDS18B20はチップ単体のむき出しのものではなく、金属の筒に収まって90cmほどのケーブルがすでに繋がっていました。 しかも『DS18B20 Adapter』というプルアップ用の4.7kΩ抵抗と高周波バイパスキャパシターが載った小さなPCBボードも付属していました。 これだとブレッドボードに差し込むだけ使えます。

DS18B20 1-wire Temperature Sensor
DS18B20 デジタル温度計センサー

でも、このセンサーの金属とケーブルのつなぎ目の部分なのですが、普通のシュリンクラップが被さっているだけに思えて(中がどうなっているかは見えないので)防水にはちょっと心細いです。

センサー自体も防水らしいのでこのまま使ってもすぐに問題は出ないとは思いますが、シュリンクラップの隙間から金属の筒やケーブルの中に水が入って金属の部分が腐食したり。。 食品に触れる様な使い方の場合には衛生面にもよろしくないかと。。 とても、中がエポキシ樹脂なりシリコンで固められているようには思えないのです。 (いずれ開けて中を確認してみたいかと)


実行プログラム

Arduinoのプログラムですが、DS18B20は『OneWire』と『DallasTemperature』というライブラリがすでにあって、それらを組み合わせれば良いとの事で、今回は温度計が動くかを確認したかっただけなのでググって出てきたサイトにあったコードを借りて試してみました。


テスト回路

Arduino NanoとDS18B20の接続は『1-wire』ではなく、3本で繋げて、以下の様になりました。

Arduino Nano
DS18B20
D2DQ
5VVCC
GNDGND

DS18B20 & Arduino Nano
DS18B20 と Arduino Nano

結果と結論

コードをコンパイルしてArduino Nanoにアップロードしたところ結果として:

Sketch uses 5408 bytes (17%) of program storage space. Maximum is 30720 bytes.
Global variables use 310 bytes (15%) of dynamic memory, leaving 1738 bytes for local variables. Maximum is 2048 bytes.
D:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CD:\Program Files (x86)\Arduino\hardware\tools\avr/etc/ ....(以下省略)

30Kあるフラッシュメモリは17%使用、2KあるSRAMは15%グローバル変数によって使われているだけな様です。なのでもっと他の機能を付け加えるために必要なメモリの空き領域は十分あります。

因みに試したコードはDS18B20から温度を読み込んでシリアルモニターに読み込んだ温度をprintで出力し続けるシンプルなもので、次の様な出力結果が確認出来ました。

Seial Monitor Output
シリアルモニターへの出力結果

実際の温度は別の温度計で確認はしていませんが、Arduino NanoとDS18B20センサーで温度測定が出来ました。


BOM (Bill of Material)

  • DS18B20 1-wire Temperature Sensor
  • Arduino Nano Micro-controller
  • Beadboard
  • Mini USB cable
  • Dupont Cables

ぼやきPS

Arduino』ってカタカナだと『アルドゥイーノ』とか『アルデュイーノ』になるのですね。英語で聞く分には『アーデュイーノ』みたいな音なのですが、元々開発したのがイタリア人の5人みたいのでローマ字読みで舌を巻きながら『アルドゥイーノ』辺りが正しい発音なのでしょうか? (でも、英語圏ではそれだと通じないと思いますが)



コメント