ArduinoにLCDキャラクタ・ディスプレイ・モジュールを接続する(7)K型熱電対で温度を測定
■小型LCDキャラクタ・ディスプレイ・モジュールをArduinoで使う(4)SPIインターフェースのK型熱電対で温度を測定する(その1)
150℃くらいまではLM35DZの半導体温度センサで温度の測定ができます。それ以上の温度を測定するためには、熱電対が便利です。今までも、スイッチサイエンスから販売されている熱電対センサ・モジュールとArduinoでろうそくの炎の温度やパン焼きやロースト・ビーフを焼くオーブンの温度を測定しました。今回から、数回にわたってSPIインターフェースの熱電対モジュールによる温度測定を行います。
●利用するK型熱電対モジュール
現在、スイッチサイエンスからは、2種類のチップで電源電圧の違いも含めて次のような3種類のモジュールが販売されています。
使用チップ | 測定範囲[℃] | 分解能[℃] | 電源電圧[V] | |
(1) | MAX6675 | 0~1023 | 0.25 | 5 |
(2) | MAX31855 | -200~1023 | 0.25 | 3.3 |
(3) | MAX31855 | -200~1023 | 0.25 | 5 |
現在は、小さな部品は実装されているので、コネクタやピンヘッダをはんだ付けするだけで利用できます。(1)MAX6675のチップのモジュールは、発売当初はICチップとコンデンサははんだ付けしなければなりませんでした。ピン間1.27mmのハーフ・ピッチのはんだ付けを気合を入れてやってみたら、案外すんなりできてしまいました。今回は(1)のMAX6675を利用したモジュールで話を進めていきます。
●データの受け渡しをするインターフェースはSPI
このモジュールのインターフェースはSPIで、Arduinoの標準ライブラリで熱電対モジュールから温度を読み取ることができます。
SPIインターフェースはArduinoがマスタになり、センサなどのスレーブとの間で、4本のラインがあります。
- マスタ主導でマスタからスレーブへの信号線(MOSI)
- スレーブからマスタへの信号線(MISO)
- 送受信データのタイミングを制御するマスタから送出されるクロック信号(SCK)
- スレーブを選択する信号線(/SS)
これらの信号線が送受信の基本となる信号線です。
Arduino Uno のSPIインタフェースは、次のディジタル・ポートに割り当てられています。複数のスレーブがある場合、個別にそれぞれのスレーブをイネーブルにするSS(Slave Select)がスレーブの数だけ必要になります。
ディジタル・ポート | 信号名 |
D13 | SCK(Serial Clock) |
D12 | MISO(Master In Slave Out) |
D11 | MOSI(Master Out Slave In) |
D10 | /SS(Slave Select) |
Arduino Uno以後のボードはこれらと異なった接続になります。SPIの詳しい説明は別の機会に行います。拙著の「Arduinoで計る,測る,量る: 測定したデータをLCDに表示,SDカードに記録、無線/インターネットに送る方法を解説 (マイコン活用シリーズ) 」(CQ出版)の第7章でこのMAX6675のモジュールの説明を行っています。
●モジュールMAX6675の電源供給
このモジュールの電源の供給は少しトリッキで、ディジタル・ポート9にLOWを出力してGNDとしディジタル・ポート8番をHIGHにして5Vの電源の供給を行っています。
そのため、次に示すようにモジュールのピンヘッダは、Arduinoのディジタル・ポート13から8に挿し込むように6ピン分をはんだ付けします。
11番ピンはMOSIでマスタ(Arduino)からスレーブ(MAX6675モジュール)への信号線です。今回はMAX6675はMOSIの端子がなくマスタからスレーブへはデータ送信は行いませんから、信号線も省略されて接続されてません。
このモジュールは、5V電源ですのでArduino Uno、Arduino Leonardoなどの5V電源のArduinoにはそのまま直接、ピンソケットに挿し込んで利用できます。
●MAX6675を利用するプログラム
今回は、書籍「Arduinoで計る、測る、量る」の第7章で利用したard70101.insをそのまま前回のLM35DZの温度をLCDモジュールに表示したプログラムに追加し、LCDキャラクタ・ディスプレイにLM35DZの温度とMAX6675から読み取った温度を共に表示するようにします。
●SPIライブラリの利用方法
SPIライブラリを利用して、SPI通信を行う最もシンプルな方法を次に示します。
◆SPIライブラリの初期化
SPI.begin()関数でSPIライブラリの初期化を行う。setup()関数内で最初に行う。
◆通信を行う
(1) digitalWrite(SS,LOW); でSPIモジュールを選択する
(2) SPI.transfer()関数に送信データをセットして関数を実行すると、送信データがスレーブに送られ、スレーブから送られてきたデータが関数の戻り値として得られる。
送信のみで受信データが必要ないときも、スレーブからダミー・データが送られてくる。スレーブからの受信のみで、送信の必要がないときでも送受信のためにデータの送出が必要なので0xFFなどのダミー・データをセットしてSPI.transfer(0xFF)の命令を実行し関数の戻り値として受信データを得る
(3) 送受信の必要回数、バイト数分繰り返す
(4) digitalWrite(SS,HIGH);を実行してSPIモジュールとの通信をディセーブルにする
●MAX6675との通信プログラムの例
(「Arduinoで計る、測る、量る」第7章 ard70101.ins)
ライブラリを利用するために次のヘッダ・ファイルの読み込みを指定する
#include <SPI.h> |
電源供給のディジタル・ポートの割り当て
int VCC=8,GND=9; |
16ビットの受信データを格納するための変数を定義
int rdata; void setup(){ |
電源のディジタル・ポートを出力ポートに指定
pinMode(VCC,OUTPUT); pinMode(GND,OUTPUT); |
5Vの電源を得るため出力をHIGHの設定
digitalWrite(VCC,HIGH); |
マイナス側の電源の設定
digitalWrite(GND,LOW); |
SPIライブラリの初期化
SPI.begin(); Serial.begin(9600); } void loop(){ |
MAX6675との通信をイネーブルにする
digitalWrite(SS,LOW); |
ダミー・データを送信し、得られた受信データをrdataの上位バイトに格納、<<8で上位バイトに移動
rdata=SPI.transfer(0xFF) << 8; |
下位バイトを受信して、その結果を先に受信したデータが格納されているrdataと加算し16ビットの受信データを得る。
rdata=rdata+SPI.transfer(0xFF); |
MAX6675をディセーブルにする
digitalWrite(SS,HIGH); |
データ確認のためシリアル通信でPCに送信。
Serial.print(rdata,HEX); Serial.print(" "); Serial.print(rdata>>3); Serial.print(" "); Serial.print(rdata>>3,HEX); Serial.print(" "); Serial.println((rdata>>3)*0.25); delay(500); } |
●温度データの取り出しと換算
MAX6675からのデータの仕様は次のとおりです。
ビット・アドレス3から14の12ビットのデータを取り出し、1ビット0.25℃ですので0.25倍した値が測定温度となります。最上位のビットは0ですので、データを3ビット右にシフトすると、12ビットの測定データが得られます。測定温度は、
(rdata>>3) * 0.25 |
で得られます。
前回のLM35DZを用いた温度測定のプログラムに、以上の機能を追加したものを次に示します。
LCDも、上段左にT=で熱電対で測定した温度を表示しました。
実際にろうそくの炎の温度を測定している様子を次に示します。
熱電対で測定した炎の温度は828℃、LM35DZで測定した室温は283.5mVで28.38℃を示しています。
<神崎康宏>
バックグラウンド
K型熱電対;熱電対には、K:クロメル-アルメル(約-200~+1000℃)がポピュラですが、J、T、E、N、R、S、Bなど、JIS規格には用途や測定温度範囲の異なる種類があります。
ハーフ・ピッチ;ICの多くは0.1インチの間隔(ピッチ)でリード線が出ていました。0.1インチは2.54mmなので、1.28mmはその半分なのでハーフ・ピッチと呼びます。
SPIインターフェース;I2Cと並んで、マイコンの周辺デバイスとの通信でよく利用されるシリアル・インターフェースです。I2Cより制御線が1本多いですが、転送速度は高速です。
ビット・アドレス;
ディセーブル;disable。使用不可。反対はenable。
/SS;データシートでは、信号名の上に1本の線が描かれていると、負論理を表します。テキストで表現するとき、信号名の前にスラッシュを入れます。
マスタ、スレーブ;命令を出すほうをマスタ、それに答えるほうがスレーブです。インターフェースの規格によって、センサ・デバイスとマイコンの関係は、マスタが入れ替わることもあります。