はじめに
今回は、AMG8833 サーマルカメラ(赤外線アレイセンサ)を使って、Raspberry Pi で人や物体の温度分布を可視化する方法を紹介します。
AMG8833の動作原理
AMG8833 は、Panasonic製の8×8赤外線センサアレイです。
64個のセンサがエリアごとの温度を検出し、最大10回/秒で読み取ることができます。
特徴
・解像度 : 8×8ピクセル(64点)
・温度検出範囲 : 0 ~80℃
・検出距離 : 最大7m(人間など)
・通信 : I2C接続
動作原理(ざっくり)
物体が放射する赤外線を、センサ1つ1つがキャッチして、放射強度を温度に換算し、配列の形で出力しています。
これで、非接触で温度の分布がわかります。
配線
ラズベリーパイを使用します
RaspberryPi | AMG8388 |
GPIO 1 | VCC |
GPIO 6 | GND |
GPIO 2 | SDA |
GPIO 3 | SLC |
温度分布を描写する
正しく接続されているか、まずは下記で確認ください。デフォルトでは0x68に設定されています。
i2cdetect -y 1
以下のコードで描写できます。
import smbus2
import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# i2c
I2C_BUS = 1
AMG8833_ADDR = 0x68
# i2c bus
bus = smbus2.SMBus(I2C_BUS)
def read_thermopile():
raw_data = []
for i in range(4):
raw_data += bus.read_i2c_block_data(AMG8833_ADDR, 0x80 + i * 32, 32)
pixels = np.zeros(64)
for i in range(64):
low = raw_data[2 * i]
high = raw_data[2 * i + 1]
value = (high << 8) | low
if value > 2047:
value -= 4096
pixels[i] = value * 0.25
return pixels.reshape((8,8))
# heatmap
fig, ax = plt.subplots()
cbar = None
def update(frame):
global cbar
data = read_thermopile()
ax.clear()
heatmap = ax.imshow(data, cmap='plasma', interpolation='bicubic', vmin=20, vmax=40)
if cbar is None:
cbar = plt.colorbar(heatmap, ax=ax)
ax.set_title("AMG8833 Thermal Camera")
return heatmap,
ani = animation.FuncAnimation(fig, update, interval=200)
plt.show()
bus.close()
参考に、matplotlibのカラーマップ(cmap)の一覧を示します。サンプルではplasmaとしています。
カラーマップ名 | 説明 |
inferno | 暗い背景+明るい強調 |
plasma | 明るく鮮やか、バランス型 |
magma | 暗い紫~明るいオレンジのグラデ |
hot | 黒→赤→黄→白(熱感重視) |
viridis | 緑系ベース、色覚バリアフリー対応 |
coolwarm | 青→白→赤、温度差を視覚化に最適 |
cividis | 色覚バリアフリー重視、落ち着いたトーン |
Greys | グレースケール |
また、補完(interpolation、ピクセルの滑らかさ)もいろいろありますので、一部を紹介します。
今回のモジュールは8×8と低解像度ですので、滑らかにするかどうか?などを決められます。
名前 | 見た目の効果 |
nearest | 拡大してもそのまま。ドット感が残る(カクカク) |
bilinear | 線形補間。少しなめらかになる |
bicubic | 三次補間。よりなめらかになる |
hamming, hanning, gaussian | 特殊なぼかし(効果弱い) |
lanzos | 精密な補間。時間かかるがキレイ |
まとめ
温度が可視化でき、非常に面白いと思います。物体の温度値を画面に表示したり、人間(34-40℃)を検知したら別のモジュールを作動させるなどいろいろなことができると思います。ぜひ試してみてください。
コメント