非接触赤外線温度計


赤外線(MLX90614)を試用した非接触温度計です。 PICマイコンでセンサーをコントロールします。
開発には、PIC評価ボードとPICBASIC Pro Compiler を使いました。



主要アイテム


・非接赤外線温度計センサー: MLX90614
購入先:https://www.robotshop.com/jp/
説明書:https://www.melexis.com/en/documents/documentation/datasheets/datasheet-mlx90614
September 2019 (rev. 013)

・PIC: PIC18F2550
2013年頃、別の試作回路でし使用していたPICとユニバーサル基板の残骸があったので流用しました。
当時は、PCとUSB接続してました。

・LCD: LCDキャラクタディスプレイモジュール 16x2行 SC1602BBWB-XA-GB-G
https://akizukidenshi.com/catalog/g/gP-02919/
これも以前の買い置き品です。 秋月電子通商さんでは現行販売品です。

 
・PICプログラム開発用品
評価ボード:http://www.microtechnica-shop.jp/shopdetail/000000000004/ct4/page1/order/
http://www.microtechnica-shop.jp/shopdetail/000000000023/ct5/page1/order/
PIC用BASICコンパイラ:PICBASIC Pro Compiler Ver.3.1 [PBP-31]
Ver.2.6の頃から使用してます。今回Ver3.1にアップデートしました。


回路図


PICプログラム

●PICBASIC Pro Compiler Ver.3.1(PBP)プログラム

※PBPコンパイラは、初期設定に少々間違いがあっても、記述されている命令語に応じて、強制的に設定変更してくれます。
例えば、初期設定でアナログ入力になっていても、デジタル出力命令のとき、そのポートをデジタル出力に変更して動作してくれます。
記述の初期設定は、正確ではありません。

'MLX.PBP
'2021.06.06

'ハンカクカタカナ コメントOK ミタイ

#CONFIG
CONFIG WDT = OFF
CONFIG FOSC = HS
CONFIG LVP = OFF
#ENDCONFIG

DEFINE OSC 20

Define LCD_DREG PORTB ' LCD SETUP
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5

TRISA = 0 '
TRISB = %10000000 'RB7:INPUT ELSE:OUTPUT
TRISC = %00000001

ADCON0 = 0 ' A/D NO USE
ADCON1 = %00001111

PORTA = 0
PORTB = 0
PORTC = %00000100 'RC2: LCDコントロール ヨヤクラシイ, RC1-RC0: I2CREAD ヨウ

DATAL VAR BYTE
DATAH VAR BYTE
DATAH VAR BYTE
DATAW VAR WORD '=DATAH+DATAL
DISPN VAR WORD 'ヒョウジシオンド セイスウNケタ
DISP1 VAR BYTE 'ヒョウジシオンド ショウスウ1ケタ
WORK1 VAR WORD 'ケイサンヨウ イチジヘンスウ
WORK2 VAR WORD 'ケイサンヨウ イチジヘンスウ

KEL0X50 CON 13658 '273.15/0.02 …(3)
 
LCDOUT $fe,1," "
LCDOUT $fe,$C0," "

cont_r CON %010110100 'B4= 0x5A << 1 for MXL90614
adr_Ta con 6 'Tdev
adr_Tobj1 con 7 'Tobj1

LCDOUT $fe,1,"Push RB7-SW..."
LCDOUT $fe,$C0,"ver 21.06.06 a"

'MAIN
DO
if PORTB.7 = 0 then
pause 1000
else
'PORTB.7 ボタン ソウサマチ
DO WHILE PORTB.7
PAUSE 100
LOOP
endif

dataL=0: dataH=0: DATAW=0: DISPN=0: DISP1=0: WORK1=0: WORK2=0

'--Format: I2CREAD SDA, SCL, Control, Address, Var... Label ---

'Get Senser Temp Ta
I2CREAD PORTC.0, PORTC.1, cont_r, adr_Ta, [DATAL,DATAH], i2c_err …(1)
gosub calc_tempera 'セッシオンド ケイサン
LCDOUT $fe,1,"Tdev:",dec2 DISPN,".",dec1 DISP1," (",hex2 DATAH, hex2 dataL,")" … (3)

dataL=0: dataH=0: DATAW=0: DISPN=0: DISP1=0: WORK1=0: WORK2=0

'Get Object Temp Tobj1
I2CREAD PORTC.0, PORTC.1, cont_r, adr_Tobj1, [DATAL,DATAH], i2c_err …(2)
gosub calc_tempera 'セッシオンド ケイサン

LCDOUT $fe,$C0,"Tobj:",dec2 DISPN,".",dec1 DISP1," (",hex2 DATAH, hex2 dataL,")" … (4)

PAUSE 500
LOOP

'セッシオンド ケイサン
calc_tempera:
DATAW = (DATAH << 8) + DATAL 'ソクテイ DATA
WORK1 = DATAW-KEL0X50 '(ソクテイチ - ゼッタイ0ド)x50 バイ
DISPN = WORK1/50 'ソクテイチ(セイスウフケダ) 1/50=0.02
WORK2 = (WORK1//50)*10 'ワリザンノアマリx10バイ
DISP1 = WORK2/50 'ショウスウ1桁
return

'ERROR
i2c_err:
LCDOUT $fe,1,"i2c_err..."
LCDOUT $fe,$C0," "
END


●プログラム要部解説
 I2CREAD PORTC.0, PORTC.1, cont_r, adr_Ta, [DATAL,DATAH], i2c_err … (1)
 I2CREAD PORTC.0, PORTC.1, cont_r, adr_Tobj1, [DATAL,DATAH], i2c_err … (2)

 PICとセンサーMLX90614とは、I2C通信します。
 (1),(2)は、I2C通信を実行するコマンドです。
 Formatは、「I2CREAD SDA, SCL, Control, Address, Var... Label」
 上記1行の記述で、温度データを1回受信します。
 PORTC.0=SDA
 ORTC.1=SCL
 cont_r=センサーに対するデータ読取コマンド(0xB4)
 ※MLX90614-Datasheet-Melexis.pdf(Page10/57)の表には「Slave address 5A」と記載されてますが、I2CREADコマンドでは、7ビット表記で記述することになるので、0x5Aを1ビット左シフトして0xB4と記述します。
 adr_Ta=センサー内で本体温度を保持しているレジスタ・アドレス(0x06)
 adr_Tobj1=センサー内で測定対象物温度を保持しているレジスタ・アドレス(0x07)
(アドレスの解説は説明書 Page17/57)
 [DATAL,DATAH] DATAL,DATAHは、それぞれ1バイトの変数。[DATAL,DATAH]は2バイトの配列。
 DATAHとDATALを並べた16ビットが受信温度を示している。
 i2c_err=PICはセンサーと通信できなかったとき、このラベル名のプログラムにジャンプする。

このPBPコンパイラは、8ビット変数の設定で使っており、整数計算しかできません。
ですが、LCD表示器では、「31.8」のように小数点以下1桁だけ表示するようにしました。

●LCDの温度表記について
「Tdev:」はセンサー本体の温度、「Tobj:」は測定対象物の温度です。
()内の4文字は、DATAHとDATALを並べた16ビットの16進数で、絶対温度(ケルビン温度)「°K」です。

●温度データの処理について
 絶対温度(ケルビン温度)「°K」と摂氏温度℃との換算式
  Ta=Tareg X 0.02 (説明書 Page30/57)
 
 例えば、掲記基板写真では、「Tdev:29.3 (3B17)」になってます。
 0x3B17 = 15127 → 15127 × 0.02 = 302.54℃
 摂氏 0℃ = 273.15 °K なので、302.54- 273.15 = 293.39 ℃ となります。
 
 しかし、今回のPBPプログラムの設定では、小数点以下の計算ができません。
 そこで、測定値は「X 0.02」しないで、50倍の数値のまま計算します。
KEL0X50 CON 13658 '273.15/0.02 …(3)
 これは、定数 KEL0X50 = 13658 という定義で、ケルビン温度 0°K の50倍の値です。
 
 上記測定「0x3B17」の場合、50倍の数値のまま、次のように計算します。
 0x3B17 - KEL0X50 = 15127 - 13658 = 1469 → 1469 ÷ 29 = 29 余り 19 → 整数2桁 29
 (19 × 10) ÷50 = 3 余り 40  → 小数1桁 3
  → 測定値表示 29.3℃

●LCDの表示コントロール

LCDOUT $fe,1,"Tdev:",dec2 DISPN,".",dec1 DISP1," (",hex2 DATAH, hex2 dataL,")" … (3)
LCDOUT $fe,$C0,"Tobj:",dec2 DISPN,".",dec1 DISP1," (",hex2 DATAH, hex2 dataL,")" … (4)

これらは、PBPのコマンドです。SC1602仕様に準拠して、文字・数値を表示できます。
●情報交換しましょう
今回センサー MLX90614はデフォルト設定のまま、測定値をデジタル値で出力させ方式で使用しました。 しかし、説明書(英文)にはPWM出力の設定についての詳細説明もあります。私は英文か読めないので、どなたかそんな設定でうまくできた方はぜひ教えてください。

閉じる


2021.06.14