wiki:AMG88

Version 2 (modified by kishida, 2 years ago) (diff)

--

AMG88の使い方

Panasonic製 AMG8832 赤外線センサアレイ(リンク追加予定) の使い方説明とAdruino用サンプルスケッチです。 メーカーからデータシートが公開されています。しかし、これだけでは制御出来ないので、 他から集めた情報なども合わせて本ページでは説明します。

AMG88は赤外線センサアレイです。 赤外線強度を元に、サーモカメラのように二次元的な赤外線情報を読み取ることができます。

データシートですが、

公式データシート(日本語)(レジスタなどの情報なし)
(https://industrial.panasonic.com/cdbs/www-data/pdf/ADI8000/ADI8000CJ1.pdf)

Digi-Keyの公開しているデータシート(レジスタなどの情報あり)
(https://eewiki.net/download/attachments/20938914/Grid-EYE%20Full%20Datasheet.pdf?version=1&modificationDate=1379520699720&api=v2)

出所不明ですがarduino向けのサンプルスケッチが書かれたpdf
(http://www.netzmafia.de/skripten/hardware/Datenblaetter/Movement/Grid-Eye_Designguideline_460495954.pdf)

があります。


特徴

販売中のAGM8832は3.3V DC駆動のローゲインタイプです。

  • 電源電圧: 3.3 ± 0.3 V DC
  • 測定対象物の温度範囲: 0 ~ 80 ℃
  • 通信方式: I<sup>2</sup>c
  • フレームレート: 毎秒 10 又は 1 フレーム
  • 出力モード: 温度出力
  • 温度出力分解能: 0.25℃
  • サーミスタ出力温度範囲: -20 ~ 80 ℃
  • サーミスタ出力分解能: 0.0625 ℃

使い方

本製品はI2C接続で通信されます。実体配線図は下記のとおりです。

実体配線図

(後日掲載予定)

また、3.3V動作系のArduino R3フォームファクターのボードであればA1~A5ピンに直接刺さるかもしれません。

本製品にはI2C通信時のプルアップ用抵抗は実装されていません。ピンヘッダと合わせて各自で実装してください。

プルアップ抵抗はR1とR2に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。

通信方法

I2Cアドレスは、7bit表記で0x69です。これは裏面のジャンパをつなげることで0x68に変更可能です。

サンプルスケッチ

Arduino用

GitHubでも公開(予定)しています。

#include <Wire.h>

#define PCTL 0x00
#define RST 0x01
#define FPSC 0x02
#define INTC 0x03
#define STAT 0x04
#define SCLR 0x05
#define AVE 0x07
#define INTHL 0x08
#define TTHL 0x0E
#define INT0 0x10
#define T01L 0x80

#define AMG88_ADDR 0x69 // in 7bit


void setup()
{
    Serial.begin(115200);
    Wire.begin();
    
    int fpsc = B00000000;// 1fps
    datasend(AMG88_ADDR,FPSC,&fpsc,1);
    int intc = 0x00; // diff interrpt mode, INT output reactive
    datasend(AMG88_ADDR,INTC,&intc,1);
    // moving average output mode active
    int tmp = 0x50;
    datasend(AMG88_ADDR,0x1F,&tmp,1);
    tmp = 0x45;
    datasend(AMG88_ADDR,0x1F,&tmp,1);
    tmp = 0x57;
    datasend(AMG88_ADDR,0x1F,&tmp,1);
    tmp = 0x20;
    datasend(AMG88_ADDR,AVE,&tmp,1);
    tmp = 0x00;
    datasend(AMG88_ADDR,0x1F,&tmp,1);

    int sensorTemp[2];
    dataread(AMG88_ADDR,TTHL,sensorTemp,2);
    //Serial.print("sensor temperature:");
    //Serial.println( (sensorTemp[1]*256 + sensorTemp[0])*0.0625);
}

void loop()
{
    Serial.print("[\n");
    // Wire library cannnot contain more than 32 bytes in bufffer
    // 2byte per one data
    // 2 byte * 16 data * 4 times
    int sensorData[32];
    for(int i = 0; i < 4; i++)
    {
        // read each 32 bytes 
        dataread(AMG88_ADDR, T01L + i*0x20, sensorData, 32);
        for(int l = 0 ; l < 16 ; l++)
        {
            int16_t temporaryData = (sensorData[l * 2 + 1] << 8 ) + sensorData[l * 2];
            float temperature;
            if(temporaryData > 0x200)
            {
                temperature = (-temporaryData +  0xfff) * -0.25;
            }else
            {
                temperature = temporaryData * 0.25;
            }
            Serial.print(temperature);
            if( (l + i * 16)<63 ) Serial.print(",");
        }
        Serial.println();
    }
    Serial.println("]");
    
    delay(100);
}

void datasend(int id,int reg,int *data,int datasize)
{
    Wire.beginTransmission(id);
    Wire.write(reg);
    for(int i=0;i<datasize;i++)
    {
        Wire.write(data[i]);
    }
    Wire.endTransmission();
}

void dataread(int id,int reg,int *data,int datasize)
{
    Wire.beginTransmission(id);
    Wire.write(reg);
    Wire.endTransmission(false);
    Wire.requestFrom(id, datasize, false);
    for(int i=0;i<datasize;i++)
    {
        data[i] = Wire.read();
    }
    Wire.endTransmission(true);
}
出力例

64個のデータがjson形式で出力されます。

[
  27.75,
  28.5,
  27.75,
  (中略)
  31.5,
  32,
  30.25
]

応用例

processingと連携することでデータの可視化が簡単に行なえます。 こちらもGitHubで公開(予定)しています。 27行目 Serial.lies()[0] の部分は環境に合わせて変更してください。

import processing.serial.*;
Serial serial;
boolean jsonDataStarted = false; 
String jsondata = "[0]";
String jsondata_temp = "[0]";
JSONArray json;

int drawingMode;

void setup()
{
  size(640, 640, P3D);

  translate(width/2, height/2, 0);
  rotateX(0.5);
  rotateY(0.5);
  //rotateZ(0.5);

  frameRate(60);

  fill(63, 127, 255);

  textSize(8);
  stroke(255);
  println(Serial.list());
  String arduinoPort = Serial.list()[1];
  serial = new Serial(this, arduinoPort, 115200);
}


void draw()
{
  background(128);
  
  if (!jsonDataStarted)
  {
    jsondata = jsondata_temp;
  }
  
  float max, min, dataRange;

  translate(width/2, height/2);    //立体の中心を画面中央に移動   
  rotateY(radians(mouseX-width/2)/5);
  rotateX(radians(mouseY-height/2)/5);

  json = JSONArray.parse(jsondata);
  print(json);

  max = json.getFloat(0);
  min = json.getFloat(0);
  for (int i=0; i<json.size(); i++)
  {
    if (max < json.getFloat(i)) max = json.getFloat(i);
    if (min > json.getFloat(i)) min = json.getFloat(i);
  }
  dataRange = max-min;

  for (int i=0; i<json.size()/8; i++)
  {
    for (int l=0; l<json.size()/8; l++)
    {
      pushMatrix();
      // translate(50*l -200, 200-50*i, 0); // 鏡写し
      translate(200 - 50*l, 200-50*i, 0); // カメラと同等
      colorMode(HSB, 1.0);
      switch(drawingMode)
      {
      case 1: 
        fill(0.75 - ((json.getFloat(i*8+l)-min)/dataRange)*0.75, 1.0, 1.0); // 取得データの中の最大最小値を元に色を決定
        break;
      case 2:
        fill(0.75 - ((json.getFloat(i*8+l)+20)/120)*0.75, 1.0, 1.0); // 測定レンジ(-20~100℃)を元に色を決定
        break;
      default:
        fill(0.75 - ((json.getFloat(i*8+l)-20)/20)*0.75, 1.0, 1.0); // (20~40℃)を元に色を決定
        break;
      }
      box(50, 50, ((json.getFloat(i*8+l)-min)/dataRange)*50);
      fill(0, 0, 0);
      text(json.getFloat(i*8+l), -10, -10, ((json.getFloat(i*8+l)-min)/dataRange)*25 + 1);
      colorMode(RGB, 100);
      popMatrix();
    }
  }
  
}

void serialEvent(Serial p)
{
  char temp = (char)p.read();
  if (temp == '[')
  {
    jsonDataStarted = true;
    jsondata_temp = "";
  }
  if (jsonDataStarted)
  {
    jsondata_temp += String.valueOf(temp);
    if (temp == ']')
    {
      jsonDataStarted = false;
    }
  }
}

void keyPressed()
{
  if (key == BACKSPACE)
  {
    drawingMode++;
    if (drawingMode > 2) drawingMode =0;
  }
}

出力例(processing)

キーボード上の b を押すことで描画アルゴリズムを変更できます。

以下の画像は、センサー前に氷の入ったグラスを置いた時のものです。 コップの形にそって測定温度が下がっている事がわかると重います。

No image "amg88_proccessing_img1.png" attached to AMG88

取得データの-20~100℃を色相の赤~青に割り当てています。

No image "amg88_proccessing_img2.png" attached to AMG88

取得データの20~40℃を色相の赤~青に割り当てています。画像では20℃以下の領域が青~紫~赤の色相に入っています。

No image "amg88_proccessing_img3.png" attached to AMG88

取得データの最大最小を色相の赤~青に割り当てています。

Attachments (4)

Download all attachments as: .zip