第5回

温度センサーを使おう




はじめに

前回までは、BLE Nanoを使用して、アナログ電圧の計測を行いました。今回は、アナログ・デバイセズ社製のADT7410という温度センサーICを使用して温度計を作ってみます。温度センサーICは、計測した温度をデジタル値として出力することができるICです。今回は、このようなデジタル出力のICのデータ取得の方法をご紹介します。


ADT7410 温度センサーIC

アナログ・デバイセズ社の温度センサーICです。ICの内部にセンサーが内蔵されており、主に基板上の温度を計測するために使用されます。今回は、秋月電子で購入が可能な、モジュールキットを使用します。モジュールキットを完成させるためには、半田付けが必要になり、はんだごてを購入する必要があります。次回以降で紹介する予定のADXL362という加速度センサーを使用する際も、同様にモジュールキットを完成させるために、半田ごてが必要になりますので、持っていない方は、購入を検討ください。

ADT7410は、温度計測の結果をデジタル値で出力します。マイコンからデータを読み込む際には、このADT7410が対応している規格に沿った形式でデータを読み出す必要があります。また、温度センサーは、内部回路に設定を変更できる機能を持っており、マイコンから書き込みを行うことで、温度センサーの設定を変更することも可能です。

 


デバイス同士で通信する通信規格I2Cについて

ADT7410は、I2C(アイスクエアシーと読みます。)という規格に対応しており、この規格に沿った形式でデータを読み書きができます。市場のマイコンのほとんどはこの規格に対応しているので、非常に一般的な規格になります。以下、I2Cについて、非常に簡単に説明をします。詳細な規格などは興味に応じて、Webや書籍にて確認ください。

I2Cのデータは、8ビットのデータを組み合わせて送受信を行います。8ビットのデータとは、”10101010”などの、0か1の連続した8個の数字の塊をさします。
16ビットのデータは、”1010101010101010”のように16個の0か1の信号が連続したものになります。
実際には、0=電圧が低い状態、1=電圧が高い状態として送受信ができます。前回のデジタル入出力では、ブラウザから操作する事で、LEDをON、OFFさせましたが、デバイス同士のデータの通信は、このONとOFFを高速に切り替える事で、1度にたくさんのデータを送受信して通信をする事になります。

図1、デジタル信号の例

データが交互に来る場合は、0と1を区別できますが、1や0が連続すると分からなくなってしまうので、デジタル通信の規格には、クロック信号という0と1が交互に出力する信号と一緒にデータを送受信します。このクロック信号に合わせてデータを読み込むことで、連続したデータを読み込むことできます。I2Cでは、データの信号をSDAと呼び、クロック信号をSCLと呼びます。この8ビットのデータを組み合わせて、送信、受信を行います。

図2、 I2C通信信号の例

I2Cは、このSDAとSCLの2線を使って、通信を行います。I2Cでは、たくさんのセンサーを接続したい場合は、同じ配線上に別のセンサーも接続することが可能です。

図3、 複数のI2Cの接続

このままだと、どのデバイスからどのデバイスへ信号が送られているのかが分かりません。そのため、まずMasterとSlaveにデバイスを区別します。今回の場合は、Masterはマイコンになり、Slaveはセンサーになります。さらに、Slave側は、デバイスアドレスという固有のアドレスを持つことで、データがセンサー1に送られたのかセンサー2に送られた物なのかを区別することができます。
デバイスアドレスは、7bitのデバイスが持つアドレスに加え、Read(データの読み込み)とWrite(データの書き込み)を区別するための1ビット加えた、合計8bitの信号で構成されています。Readの時は1、Writeの時は0を最後の1bitに書き込みます。

図4、I2Cのデバイスアドレスについて

図5、I2C通信のMasterとSlave

今回使用するADT7410は、ADT7410のピンの設定をHigh(電源電圧に接続)にするか、Low(0Vに接続)するかで、デバイスアドレスを変更することが可能な仕様になっています。これによって、同じデバイスを複数同時に接続することが可能です。

図6、ADT7410のデバイスアドレスの設定について


図6で0x48などという数字は、16進数での表示となっており、これを2進数に置き換えると”1001000”という7bitの数字になります。データシートなどでは、このように16進数に置き換えて記載し、実際の信号は0と1の2進数で通信します。

デバイスアドレスの仕組みによって、マイコンからデバイスを区別できるようになりました。センサー側は、このデバイスアドレスに加え、取得したデータを記録する領域(レジスタと呼ぶ)や、設定を変更するための領域を持っています。今回使うADT7410では、温度のデータに加えて、設定を変更するためのConfigurationなどを含めて13個のレジスタを持っています。このようなセンサーのデータシートには各レジスタの説明などが記載されており、必要に応じて設定を変更して使用することが可能です。

図7、ADT7410のレジスタとその詳細

マイコンからセンサーのデータを読み込む際は、このデバイスアドレスとWriteのための1bitを加えたデータを送った後に、読み込みたいレジスタアドレスを送ります。その後、もう一度デバイスアドレスを送る際にReadのための1bitを加えたデータを送付すると対象のセンサーが、指定されたレジスタアドレスのデータをマイコンに送信し、マイコンはデータを読むことができます。

図8、デバイスアドレスの送付

 

図9、レジスタアドレスの送付

図10、もう一度デバイスアドレスを送付

図11、センサーがデータを送付


このように、データの受信が可能になります。送信も同様に、デバイスアドレスを指定した直後に、書き込みたいデータを送信することで、センサーにデータが書き込まれます。

I2Cを使用してマイコンとセンサーを接続する際には、デバイス同士を線で接続するだけでは無く、SCL、SDAの線それぞれに抵抗を使ってデバイスの電源電圧に接続する必要があります。これは、I2Cの仕様で規定されており、必ず必要になります。マイコンとセンサーとつなぐ時に忘れやすい部分の一つです。

図12、プルアップ抵抗の接続例

上記の例では、電池の3Vにマイコン、センサー、そしてI2Cの線全てを同じ電源電圧に接続しています。設計によって、この電圧を変えることが可能ですが、デバイスによっては、電圧の仕様に制限があるケースがあるので注意が必要です。

このように、配線に抵抗を介して任意の電圧に接続することをプルアップ(Pull up)と言います。


ADT7410の準備


ADT7410を前回までで使用しているブレッドボードに接続するには、半田ごてを使用してモジュールを完成させる必要があります。今回使用する製品は、小型の基板上にデバイスがすでに半田付けされているものを使用しますが、ブレッドボードに差し込むためのピンが半田付けされていませんので、自分で完成させる必要があります。
半田付けの方法については、別途コラムを制作予定です。

半田付けを行ったADT7410が完成したら、前回までと同様に、ブレッドボード上でADT7410とBLE Nanoを接続します。回路図は、以下のようになります。

図13、ADT7410のモジュールとBLE Nanoの回路図


温度計測のプログラム


BLE Nanoのプログラムは、前回のプログラムにADT7410のデータの読み込みを追加したものです。ARM®社が提供するmbed™で公開されているライブラリを流用して、プログラムを書き加えています。


変更箇所としては、ADT7410とI2C通信をするためのPin設定を付け加えました。

図14、I2Cのピン設定

さらに、ADT7410で取得した温度データを小数点以下まで表示させるために、データを整数部分と小数点以下の部分に分けます。

図15、ADT7410から取得した温度データを整数部と少数部に分ける

Web Bluetooth APIのプログラムは前回のプログラムに加えて温度のデータを小数点以下でも表示できるように改善しています。

図16、温度データを表示させる部分のコード


図17、温度表示のサンプル

ADT7410で計測した、温度が計測されます。


Web Bluetooth APIを改良してみる


データが数字で表示されるだけでは、味気ないので、グラフにして、温度データを計測するUIを作ってみます。
JavaScriptのSmoothie ChartsというAPIを使用して、グラフ化したものがこちらです。

図18、グラフ表示のAPIを使用した例


ソースコードは、こちらです。

 


改良したソースコードの解説

BLE Nanoのプログラムには変更を加えず、Web Bluetooth APIのソースコードにグラフィック表示のためのAPIを追加しました。今回使用したSmoothie Chartsは、グラフィック表示ができるAPIとなっています。
まず、Smoothie Chartsを使うために、Webからsmoothie.jsファイルをダウンロードし、HTMLファイルがあるフォルダに置きます。(用意したファイルにはあらかじめsmoothie.jsが含まれています。)

HTMLファイルに、smoothie.jsを追加します。

図19、smoothie.jsの追加

次に、表示するためのcanvasを用意します。

図20、canvasの追加

Global変数としてSmoothie Chartsを設定します。

図21、Smoothie Chartsの関数を追加

グラフの詳細を設定します。グラフ表示の設定変更は、Smoothie ChartsのHP上でソースコードを表示する機能があり、そちらを使用してカスタマイズが可能です。

図22、Smoothie Chartsの設定

ロード時の処理にsmoothie.jsの関数を追加します。

図23、ロード時の処理にsmoothie.jsの関数を追加


最後に、ADT7410から取得したデータをグラフへ反映させグラフを表示させます。

図24、データをグラフへの反映


Smoothie Chartsの詳細な解説は、コンテンツ制作の協力会社のJellyWareのBlogにて説明が掲載されていますので、参考ください。

 


まとめ

今回は、温度を計測して、ブラウザ上に温度のグラフを時系列で表示することができました。また、I2Cを理解することで、規格に対応した様々なICが使用可能になりました。
次回は、別の通信仕様を持ったSPIのデバイスを使用してセンサーの幅を広げていきます。