記事

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ピン分をはんだ付けします。

ar011a.png

 11番ピンはMOSIでマスタ(Arduino)からスレーブ(MAX6675モジュール)への信号線です。今回はMAX6675はMOSIの端子がなくマスタからスレーブへはデータ送信は行いませんから、信号線も省略されて接続されてません。
 このモジュールは、5V電源ですのでArduino Uno、Arduino Leonardoなどの5V電源のArduinoにはそのまま直接、ピンソケットに挿し込んで利用できます。

ar012a.png

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からのデータの仕様は次のとおりです。

ar014a.png

 ビット・アドレス3から14の12ビットのデータを取り出し、1ビット0.25℃ですので0.25倍した値が測定温度となります。最上位のビットは0ですので、データを3ビット右にシフトすると、12ビットの測定データが得られます。測定温度は、

     (rdata>>3) * 0.25

で得られます。
 前回のLM35DZを用いた温度測定のプログラムに、以上の機能を追加したものを次に示します。

image007-a983eee3.png

 LCDも、上段左にT=で熱電対で測定した温度を表示しました。
 実際にろうそくの炎の温度を測定している様子を次に示します。

ar013a.png

 熱電対で測定した炎の温度は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本多いですが、転送速度は高速です。

ビット・アドレス

ar014b.png

ディセーブル;disable。使用不可。反対はenable。

/SS;データシートでは、信号名の上に1本の線が描かれていると、負論理を表します。テキストで表現するとき、信号名の前にスラッシュを入れます。

マスタ、スレーブ;命令を出すほうをマスタ、それに答えるほうがスレーブです。インターフェースの規格によって、センサ・デバイスとマイコンの関係は、マスタが入れ替わることもあります。

連載メニュー ArduinoにLCDキャラクタ・ディスプレイ・モジュールを接続する

(1)  ArduinoにLCDディスプレイを接続する準備

(2)  アナログ入力ポートのデータをLCDに表示する

(3)  LiquidCrystalライブラリを使用したテスト・プログラム

(4)  超小型LCDキャラクタ・ディスプレイ・モジュールをArduinoで使う(1)接続

(5)  超小型LCDキャラクタ・ディスプレイ・モジュールをArduinoで使う(2)測定した温度をLCDに表示する

(6)  超小型LCDキャラクタ・ディスプレイ・モジュールをArduinoで使う(3)A-Dコンバータの基準電圧を変更して分解能を上げる

(7)  超小型LCDキャラクタ・ディスプレイ・モジュールをArduinoで使う(4)SPIインターフェースのK型熱電対で温度を測定する(その1)

(8)  I2CインターフェースのLCDキャラクタ・モジュールをArduinoで使う(1)利用できる電源電圧を整理して接続(その1)

(9)  I2CインターフェースのLCDキャラクタ・モジュールをArduinoで使う(2)Wire ライブラリを使用してLCD処理の関数を作る

(10)  I2CインターフェースのLCDキャラクタ・モジュールをArduinoで使う(3)I2Cバス双方向電圧レベル変換モジュール