« 最大20人の体温を同時測定するアイリスオーヤマのAIサーマルカメラ | トップページ | ゲームセンターあらしの作者 すがやみつる氏によるPython解説本「こんにちはPython」買ってみた »

2020年5月 2日 (土)

サーマルセンサー「AMG8833」とRaspberry Piで非接触体温計っぽいものを作ってみた

新型コロナウィルスの猛威が、収まりません。

ということで、毎日体温測定が欠かせない今日この頃ですが、やはり体温測定ってやつは、めんどくさいことこの上ない。

そこで、こんなものを買ってみました。

Img_3977

AMG8833というサーマルセンサー。スイッチサイエンスで購入、お値段5千円ほど。

Panasonic製のセンサーを搭載しており、解像度は8×8、0~80度まで測定可能というセンサーです。

ずっと以前から気にはなってましたが、コロナ禍のご時勢ということもあり、とうとう手を出してしまいました。

Img_3981

で、いきなりRaspberry Pi 3 B+に組み込んでみました。

接続ですが、それぞれRaspberry PiのGPIOの

3.3V ・・・ 1番ピン(3.3V)

GND ・・・ 6番ピン(GND)

SCL ・・・ 5番ピン(GPIO3、SCL)

SDA ・・・ 3番ピン(GPIO2、SDA)

に接続してます。カメラは、先日買った800円のRaspberry Pi Camera V1.3互換カメラ(Raspberry Pi Camera V1.3の「互換カメラ」買ってみた: EeePCの軌跡参照)を使います。

で、下準備ですが、こちらを参考に、

RaspberryPiで赤外線アレイセンサAMG8833(Grid-EYE)からデータ取得 - Qiita

ドライバーをダウンロードします。

あ、その前にあらかじめI2Cを有効にしたり(sudo raspi-configから)、IDを表示(i2cdetect -y 1)させて接続確認をしておいてください。

> sudo pip3 install adafruit-circuitpython-amg88xx

で、上のサイトを参考に、コードを作りました。

コードはこちら(amg8833_plt.py)。


import time
import busio
import board
import cv2

import adafruit_amg88xx

import picamera
import picamera.array

import matplotlib.pyplot as plt

plt.ion()
#plt.figure()
plt.subplots(figsize=(8, 4))

# I2Cバスの初期化
i2c_bus = busio.I2C(board.SCL, board.SDA)

try:
     while True:
         # センサーの初期化
         sensor = adafruit_amg88xx.AMG88XX(i2c_bus, addr=0x68)

        # センサーの初期化待ち

        time.sleep(.1)

        with picamera.PiCamera() as camera:
             camera.resolution = (320, 240)
             camera.capture('./tmp.jpg')

        max_temp = max(max(sensor.pixels))
        print(max_temp)

        img0 = cv2.imread('./tmp.jpg')
        img = img0[0:240,41:280]
        img = img[:, :, ::-1].copy()
       

        plt.subplot(1,2,1)
        fig = plt.imshow(sensor.pixels, cmap="inferno", interpolation="bicubic",vmin=27,vmax=30)
        plt.colorbar()

        plt.subplot(1,2,2)
        plt.imshow(img)
        plt.text(0, 0, str(max_temp) + 'deg',size = 20, color = "red")

        plt.draw()

        plt.pause(0.01)
        plt.clf()

except KeyboardInterrupt:
    print("done")

で、これを動かした結果ですが

> python3 amg8833_plt.py

Amg8833test02

こんな感じのヒートマップと画像、そして温度の最大値が出ます。

3秒間に1枚程度の速度ですが、まあまあ使えます。

ただし、問題はその表示温度でして・・・

私と次男が映ってますが、体温はそれぞれ36.1度、36.5度。

ですが、ごらんの通り30度前後しか表示されません(28.25~30.25)。

1メートルほど離れたところでは大体6度ほど、2、3センチまで近づけば、2度ほどのずれのようでした。

ただ、安定して温度が表示されるので、キャリブレーションをすればまあまあ使えそうかなぁと。

となると、校正用に何人かの人(体温測定済み)が必要かと。

ちょっと、大変ですねぇ……

このまま使うなら、このセンサー上で「31度以上(1メートル)」となった場合は要注意、という運用でもいいかもしれません。

それよりも、なんとかこの2つの画像(ヒートマップとカメラ映像)を重ねたいですが、これもキャリブレーションが必要。

もし本気で作ろうと思ったら、ここからが大変ですね。どうしようか、考え中です。


AMG8833 IR 8 * 8サーマルイメージャーアレイ温度センサーモジュール8x8赤外線カメラセンサー

« 最大20人の体温を同時測定するアイリスオーヤマのAIサーマルカメラ | トップページ | ゲームセンターあらしの作者 すがやみつる氏によるPython解説本「こんにちはPython」買ってみた »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

毎日、じっとする場所でやるのが一番なので
トイレで大する時に扉にでも付けていれば
温度を測ることが出来るんじゃねーすかね?

ついでに自分の横にでも熱源(これもラズパイで
有線で熱を管理)を用意しておけば、温度差から
体温の比較にもなるんじゃないでしょうか。


これを会社でやるなら、社員証を使えばいつ
測ったのかも判りますが、管理されまくって
嫌がるのもいるか(汗

> mokekyoさん

本当は出入り口にこっそり置いて、体温が高めの人が出てきたら警備員に警報を鳴らす程度の使い道が良いかと思うのですが……

いろいろ調べてみると、体表面から出る赤外線によって測定される温度は、実際の体温よりも数度ほど低く、しかもそれが周辺環境(つまり気温)に左右されるものだと分かり、一筋縄ではいかないということが判明。

もしやるなら、平熱の人の示す温度を1、2時間おきに測定し、その相対温度から異常を検知するという方法が現実的かと。しかも、距離も測定値に影響するので、1メートルのところで測定した結果を使うなど、決まった基準が要りそうです。案外、面倒ですね。

非接触の体温計の制作にチャレンジしたいのですが体温を正確に測ろうとするとどのようなセンサーが良いでしょうか?
型番や大まかな制作過程などを教えて頂けると助かります

> 開発太郎さん

このAMG8833以外には、オムロンのセンサーしか買ったことがないのでなんとも言えませんが……

AMG8833でも、接近すればわりとちゃんと測れそうです。が、体表面の温度と体温の関係(周囲の気温で結構変わる)をいろいろな条件で測定してみないと、どんなセンサーを使っても役に立たないという感触です。

Interfaceの2020年8月号に、まさに非接触体温計を作ろうという記事が出てました。ご参考まで。

コメントを書く

(ウェブ上には掲載しません)

« 最大20人の体温を同時測定するアイリスオーヤマのAIサーマルカメラ | トップページ | ゲームセンターあらしの作者 すがやみつる氏によるPython解説本「こんにちはPython」買ってみた »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ