wiki:AMG88

Version 4 (modified by kishida, 8 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でも公開しています。

/*******************************************************************************
// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
// AMG88 Arduino Sample
*******************************************************************************/
#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で公開しています。

Arduinoを接続した状態でProcessingファイル(amg88.pde)を実行してください。(Arduino IDEのシリアルモニタなどは閉じてください)

27行目 Serial.list()[1] の部分は環境に合わせて変更してください。

/*******************************************************************************
// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
// AMG88 Arduino-Processing link Sample
*******************************************************************************/
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 を押すことで描画アルゴリズムを変更できます。

取得データに従って64個の箱の奥行きが変わります。マウスの位置で視点変更ができます。

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

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

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

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

Attachments (4)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.