コロナ禍の時などによく見かけた、非接触の体温計、ご覧になった事ありますか?手首などに接近させて、体温を測定していましたよね?そのような非接触の温度計に使われるのが、サーモパイルと呼ばれるセンサです。
今回、サーモパイルを入手したので、使って見たいと思います。
今回購入したのは、A3D01S-FU-50-60と言う型名のサーモパイルです。まずはデータシートを検索して、入手しておきたいと思います。
サーモパイル(A3D01S-FU)のデータシートを検索(別ウインドウが開きます)
通信規格はI2C(最大100kHz)で、PEC(Packet Error Checking)コード付SMBusワードアクセスプロトコルに対応しています。ただし、PECを実行しない場合、PECコードを受信せず普通にワードアクセスして問題ないと思われます。
サーモパイルと言うセンサは、黒体放射温度と言って、対象物が発する赤外線波長や強度によって温度を計測するセンサです。室内で使う前提で設計されており、屋外で使う場合、太陽光に含まれる赤外線により、正しい温度を計測できない場合があります。
入手したA3D01S-FUは5V定格(5V±10%)でした。消費電流は5mA(MAX)が規定されています。
温度の測定精度は、対象物温度@40℃に於いて約±2℃です。±2℃だと、体温計として使うには、ちょっと精度不足なセンサです。体温計として使う事が目的の場合は、もう少し精度の高いサーモパイルを選定すべきでしょう。
本ページでは、安いサーモパイルを購入して見ただけなので、その辺りは許容して使う事になります。
※「A3D01S-FUがサーモパイルの中では安い」と言っても、こちらのお値段なので、電子部品の中では高価な部類です。
A3D01S-FUは電子部品として、あまり見かけない円形のパッケージですが、サーモパイルとしては、この様な円形の形状を多く見かけます(下図)。

※A3D01S-FUデータシートから引用
ただ、これが曲者🥷なのです。端子数は8本なのですが、円形に配置されているのでブレッドボードで使うにも、万能基板へ実装するにも、使い難いのです。
そこで、丸ピンソケットを使って、8DIP形状にピッチ変換して使いたいと思います。
ピッチ変換手順:
8DIP形状へのピッチ変換後、完成図は以下の通りです。

上の写真にて、空中配線した8ピンの様子などがご確認いただけると思います。2.54mmピッチの8DIP形状にピッチ変換できましたので、ブレッドボードや万能基板に実装して使えます。
データシートによると、対象物温度の測定可能範囲は、−30〜400[℃]です。
センサ自体の温度も計測できる様になっていて、そちらは内蔵されたサーミスタで測定しています。測定可能範囲は、−20〜100[℃]です。
また、使用に当たっては視野角(FOV;Focus Of View)に注意が必要です。A3D01S-FUの視野角は90°と、思いの外広く設定されています(下図)。

※A3D01S-FUデータシートから引用
測定できる対象物温度は視野角内の積分平均温度なので、測定対象物との距離が離れている場合など、視野角に対して測定対象物が小さい場合は、実際の温度よりも周囲の温度に引っ張られてしまって、想定外の温度が観測されてしまいます。
正しく測定するには、測定対象物が視野角全体を覆い尽くすくらい近づける必要があります。
サーモパイルA3D01S-FUは、電源投入から20ms後に最初の測定を開始します。1回の測定には29.4msかかります。即ち、電源投入後、最初のデータが取得できるのは約49.4ms後(=20ms+29.4ms)です。その後は自動的に次の測定が始まり、29.4ms間隔で測定データが更新されます。
ですので、温度測定時に実行することは、以下の通りです。
測定開始コマンドを投入したり、何らかの設定をI/Oレジスタへ書き込んだりする必要は全くありません。ただ、当該I/Oレジスタを読むだけです。お手軽〜。
温度レジスタは2種類存在しています。以下に示す通り、測定温度範囲が異なるため、摂氏温度への換算式が異なる事に注意してください。
測定温度の解像度は1÷8=0.125℃なので、有効数字としては小数点以下1桁弱です(log10 (0.125)≒−0.903桁より)。
温度レジスタの有効ビット数は12ビットなので、レジスタ値は0〜4,095[LSB]の範囲を取ります。摂氏温度への換算は、浮動小数float型を使うか、×10倍(小数点以下1桁)した後でint32型の演算をすることになります。Arduino UNO等、非力なマイコンボードを使う場合は以下の様に式を変形して計算しましょう。
TEMP_THP×10÷8−30=TEMP_THP×5÷4−30
ただ約分しただけなのですが、上の式変形後なら、int16型で計算可能です。∵TEMP_THP(MAX)=4,095であるから、4,095×5=20,475であり、int16で充足するためです(log2 (20,475)≒14.3ビット)。「UNO等で16ビット演算できます」って事です。32ビットのマイコンボードを使う場合は、忘れちゃってください。
なお、上の式は×10倍の固定小数点演算ですので、演算結果は×0.1[℃]です。例えば、43.2℃は432と算出されます。
今回のお買い物は以下の通りです。
秋月電子通商にて、こちらのShrike-Liteと一緒に購入しました。
ピッチ変換工作の検証も含めて、実験で確かめて行きましょう。
今回のサーモパイルA3D01S-FUは5V定格なので、Arduino UNOを使うのが最適です。下図の回路をブレッドボードなどに構築して、UNOと接続してください。もし、3.3V定格のマイコンボードを使う時は、サーモパイルに5V電源を供給し、I2C信号線にレベルシフタ(L/S)を挟んでください。

データシートに記載のある、コンデンサ×2個を接続する必要があります。単なるパスコンとしては少し大きめの容量が指定されているので、ちゃんと接続しておかないと、動作不良や不安定化に至る可能性があります。
また、I2C信号線の処置については、UNOのWireライブラリが設定するINPUT_PULLUPを期待しているため、プルアップ抵抗を接続していません。状況に応じて各自、プルアップ抵抗を接続してください。
サーモパイルの評価に使用するプログラムですが、今回はお試しなので、以下プログラムを流用します。
プログラム:smbus_master.ino
コンパイルしてUNOへ書き込むと、シリアルモニタからこちらのコマンドを受け付けています。
以下図に実験中の様子を示します。

実験サンプルに従って実験を進めましょう。
実験サンプル:【 】内はシリアルモニタからの送信データ
【scan】
OK+ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- 3d -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
OK: scan i2c slave address
スレーブアドレス0x3dがサーモパイルA3D01S-FUです。
【slv,3d】
OK: i2c_slv_adr=0x3d
アクセス対象のスレーブアドレスを設定しました。
【srd2,70】
OK: srd2.3d[0x70]=0x0183
センサ温度TEMP_THTレジスタを読み出しました。
読み出し値TEMP_THT=0x0183[LSB]より、摂氏温度換算で約27.4℃だと判りました。消費電力5mA(MAX)の分だけ周囲温度よりも、いくらか高めの温度が観測されると推察できます。実験時の室温+αと見て矛盾ありません。
【srd2,71】
OK: srd2.3d[0x71]=0x01ce
続いて本命の対象物温度TEMP_THPレジスタを読み出しました。摂氏温度換算で約27.0℃でした。
実験中の写真に示した通り、ブレッドボードに実装して机の上に置いた状態だと、恐らく天井の温度を測定しています。とは言え、天井までは2m以上離れているので、ほぼほぼ、周囲温度を測定したのと同じであろうと推察します。即ち、センサ温度と似通った値が観測されて矛盾しません。
同様にして、色々な物の温度を測定してみました。下表にまとめます。
| 測定対象 |
観測値 [LSB] |
摂氏温度 [℃] |
備考 |
| 天井(?) | 0x01ce | 27.0 | ほぼ室温。 |
| 手首をかざした | 0x01f4 | 32.5 |
接触型体温計(脇の下)で36.2℃だった時の手首温度。 体表面の温度なので、少し低め(−約4℃)に読めるのか? |
| 保冷剤 | 0x0069 | −16.9 |
冷凍庫に入れてあった保冷剤。 冷凍庫の温度はJIS規格で−18℃以下が規定されている。 |
| 湯の入ったステンレス鍋 | 0x0222 | 38.3 |
一度沸騰させ、直ちに持ってきて測定した。 湯温は60〜70[℃]くらいありそうなものだけど、 観測値は意外と低かった(?)。 |
沸かした湯の入った鍋だけ、ちょっと低温すぎる気がします(※)が、それ以外は概ね、矛盾が無い温度が示されました。ひとまず最初のお試しとしては、この位で良いでしょう。
※本当に上表の温度なのであれば、ぬるいお風呂くらいだから触れるはずだけど、沸かした直後だし、触ったら火傷するよ……。黒体放射に関しては、人体などの放射率ε≒0.98等と高いのに対して、ステンレス鋼など、一般に金属の放射率ε≒0.3前後と低いので、その辺りが関係していると推測。
サーモパイルA3D01S-FUをピッチ変換して、実際に使ってみました。粗方の特性も、データシートなどから理解しました。測定する対象物次第では、もっと視野角が狭く、測定精度の高いサーモパイルを選ぶべきでしょう。その様なサーモパイルは、こんなに安くないので、覚悟してお買い求めください(1^_^;)。


