【Arduino】赤外線センサアレイ(AMG8833)を使う

it

対象物の温度測定をする赤外線センサアレイ(AMG8833)をArduino環境でRaspberry Pi Picoをつかって制御しました。

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

簡単紹介

対象物の温度を8×8マトリクスで読み取る。

ピン配置

外観

使ってみた

◆開発環境

Arduino環境で開発しました。
読み出しマイコンにはRP2040搭載Raspberry Pi Picoを使いました。
AMG8833を制御するためのボードライブラリにはAdafruitの「Adafruit AMG88xxLibrary by Adafruit」を使いました。
インストール時に多くの依存関係のインストールを促しますが基本的には不要です。

I2Cで通信しますが、Adafruitライブラリを使用するとI2Cアドレスを意識することなく使用できます。

ADO端子をGNDにショートすることでI2Cアドレスを68(h)に変更できます。
ライブラリ側の変更に手間がかかるので、当記事ではデフォルトの69(h)で作業します。

◆温度読み取り

温度を読み取りました。
温度情報の読み出しをシリアルに読み出します。
読み出した情報を並び替えてマトリクス(8×8)にします。

読み出した温度を色情報に変換してWS2812(8×8)に表示しました。

準備

開発環境

Arduino環境でRaspberryPi Picoを使用します。
Arduino環境の準備はこちらの記事で紹介しています。

ボードライブラリ

今回RP2040搭載基板を使用します。

Arduino IDEのボードマネージャからRP2040用のライブラリのインストールとボードの選択をします。
ボードライブラリには「Raspberry Pi Pico/RP2040 by Earle F. Philhower, III」を使用します。
Generic RP2040またはRaspberry Pi Picoを使用します。

追加のボードマネージャのURLhttps://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※
Raspberry Pi PicoRaspberry Pi RP2040 Boards(x.x.x) > Raspberry Pi Pico
※動作確認はバージョン 4.1.1です

モジュールライブラリ

AMG8833を使うためのモジュールライブラリにはAdafruit製を使いました。
インストール時に多くの依存関係のインストールを促しますが、必要なライブラリは以下2点。

ライブラリ名検索動作確認Ver
Adafruit AMG88xx Library by Adafruitamg881.3.2
Adafruit BusIO by Adafruitbusio1.16.3

WS2812を使用する場合は、以下のライブラリをインストールします。

ライブラリ名検索動作確認Ver
Adafruit NexPixel by Adafruitneopixel1.12.4

スケッチ

8×8温度読み出しとWS2812表示

説明

読み出した温度情報を色情報に変換しWS2812に表示します。
2度ごとにLEDの色を変えて表示します。
温度と色は以下の関係にします。

配線

スケッチ

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

#define AMG8833_SDA      (4)
#define AMG8833_SCL      (5)

#define PIN_DIN_WS2812  (0)   // NeoPixel DINピン
#define WS2812_COUNT (8 * 8)  // 連結数

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

Adafruit_AMG88xx amg;

float TempArray[AMG88xx_PIXEL_ARRAY_SIZE];
uint32_t ConvertTEMP2Palette(float Temp);

void setup()
{
  // Wire.setSDA(AMG8833_SDA);
  // Wire.setSCL(AMG8833_SCL);

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

void loop()
{ 
    amg.readPixels(TempArray);

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

//温度に対する色(パレット情報)を返す
//Temp : 温度
//戻り値 : WS2812パレット情報
uint32_t ConvertTEMP2Palette(float Temp)
{
  //20℃から2℃温度が上昇するごとに色を変化させています。
  uint32_t 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;
}

結果

手のひらの温度を測りました。
手を振ると温度の移動している様子がわかります。

手の表面温度は30℃前後と思いますが、10cmほどに近づくと予想している温度付近になります。

コメント

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