Raspberry Pi Picoで赤外線アレイセンサを使ってみた(AMG8833)

コンピュータ、組み込み

RaspberryPi Picoを使って赤外線アレイセンサ(サーモグラフィー)から温度を読み取ります。
読み取った温度情報をWS2812(8x8Matrix)に色情報で表示してみます。

今回紹介するもの

赤外線アレイセンサ(AMG8833)

特徴
電源電圧3.3V
通信I2C (Address 0x69)
センサー画素(x, y)8, 8
計測温度範囲0~80℃

結果は一次配列の摂氏で読み取ることができます。
64個の連続した配列で読み取るため、8個ごとにY軸を加算することで8×8の平面情報に変換することができます。

モジュールと向かい合った場合、下図マトリクスのように右上からデータが送られます。
配列でデータを受け取った時のIndexは図の通りです。

ピン配置
外観
使用感

摂氏温度の情報と簡単な変換で平面温度を利用することができるのでライブラリを含めて使いやすいと思います。
サンプルではAdafruit製のライブラリとスケッチサンプルを使用しました。
ライブラリでは接続するI2Cアドレスを意識することなく使えて楽ですが、複数のセンサを使う場合や、自前のI2Cモジュールを使う場合ではI2Cアドレスを重複しないように注意が必要です。

AMG8833は8×8マトリクスの情報を出力するので、WS2812Bの8x8LEDMatrixを使用しました。
8×8の映像では被写体の輪郭はほぼわからず、熱源の存在がわかる程度です。
解像度の高いLCDを使用して、移動平均などの処理を使用することでもう少し被写体の形のわかりやすい画像になると思います。

準備

使うもの

画像名称、型番用途
赤外線アレイセンサ
AMG8833
対象物の温度を8×8の平面に測定し、
配列に保存します。
Raspberry Pi PicoAMG8833から温度配列を読み取り、
温度情報を色情報に変換した結果を
WS2812で表示します。
WS2812B Matrix(8×8)温度から色情報に変換した結果を表示します。
ブレッドボード配線します
ジャンパワイヤ数本配線します

動作

説明

AMG8833 から読み取った温度アレイ情報をWS2812(8×8 Matrix)に表示します。
温度ごとに表現する色はスケッチの後半で設定しています。

今回は20℃以上の温度を2度ごとに色を変えて表現します。

配線

ロジックレベル変換モジュールを使用した配線

Raspberry Pi Pico配線AMG8833配線WS2812B
VBUS(5V)+5V
3V3VIN
GNDGNDGND
GPIO0(I2C0 SDA)SDA
GPIO1(I2C0 SCL)SCL
GPIO2DIN

スケッチ

 /**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Raspberry Pi Pico

【スケッチの説明】
AMG8833 から読み取った温度アレイ情報をWS2812(8x8 Matrix)に表示します。
温度ごとに表現する色はスケッチの後半で設定しています。

【ライブラリ】
Raspberry Pi Pico / RP2040 > Generic RP2040

Adafruit AMG88xx Library by Adafruit Ver 1.3.2
Adafruit NeoPixel by Adafruit 1.11.0

【準備】
Raspberry Pi Pico <-> AMG8833
3V3             <-> VIN
GND             <-> GND
GPIO0(I2C0 SDA) <-> SDA
GPIO1(I2C0 SCL) <-> SCL

Raspberry Pi Pico <-> WS2812
VBUS(5V)         <-> +5V 
GND             <-> GND
GPIO3           <-> DIN

【バージョン情報】
2023/10/14 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_AMG88xx.h>
#include <Adafruit_NeoPixel.h>

#define PIN_SDA_AMG8833 (0)   //AMG8833用I2Cピン
#define PIN_SCL_AMG8833 (1)

#define PIN_DIN_WS2812  (2)   // NeoPixel DINピン
#define WS2812_COUNT (8 * 8)  // 連結数
#define BRIGHTNESS (28)       // 輝度

Adafruit_NeoPixel pixels(WS2812_COUNT, PIN_DIN_WS2812, NEO_GRB + NEO_KHZ800);

Adafruit_AMG88xx amg;

float TempArray[AMG88xx_PIXEL_ARRAY_SIZE];
unsigned long ConvertTEMP2Palette(float Temp);

void setup()
{

  //AMG8833通信用I2C
  Wire.setSDA(0);
  Wire.setSCL(1);

  //シリアル出力
  Serial.begin(115200);
  Serial.println(F("AMG88xx pixels"));

  //WS2812
  pixels.begin();
  
  bool status;
    
  // default settings
  status = amg.begin();
  if (!status) 
  {
      Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
      while (1);
  }
}

void loop()
{ 
    amg.readPixels(TempArray);         //温度情報読み取り

    Serial.println("");
    for(int i=1; i<=AMG88xx_PIXEL_ARRAY_SIZE; i++)
    {
      Serial.printf("%2.2f, ", TempArray[i-1]);
      if( i%8 == 0 ) Serial.println();
    }
    Serial.println("");

    for(int i=1; i<=AMG88xx_PIXEL_ARRAY_SIZE; i++)
    {
      pixels.setPixelColor(i - 1, ConvertTEMP2Palette(TempArray[i - 1]));
    }
    pixels.show();
    delay(100);
}

//温度に対する色(パレット情報)を返す
//Temp : 温度
//戻り値 : WS2812パレット情報
unsigned long ConvertTEMP2Palette(float Temp)
{
  //このサンプルでは、20℃から2℃温度が上昇するごとに色を変化させています。
  unsigned long retPalette = 0;
  if(Temp < 20)
  {
    retPalette = pixels.Color(0, 0, 10);
  }
  else if(Temp < 22)
  {
    retPalette = pixels.Color(0, 0, 40);
  }
  else if(Temp < 24)
  {
    retPalette = pixels.Color(0, 20, 40);
  }
  else if(Temp < 26)
  {
    retPalette = pixels.Color(0, 40, 20);
  }
  else if(Temp < 28)
  {
    retPalette = pixels.Color(0, 40, 0);
  }
  else if(Temp < 30)
  {
    retPalette = pixels.Color(20, 40, 0);
  }
  else if(Temp < 32)
  {
    retPalette = pixels.Color(40, 0, 0);
  }
  else
  {
    retPalette = pixels.Color(40, 0, 20);
  }

  return retPalette;
}

結果

結果を動画で撮影しました。
手の動きにWS2812Bの表示が連動しています。

コメント

タイトルとURLをコピーしました