Changes between Initial Version and Version 1 of AMG88


Ignore:
Timestamp:
May 30, 2016 9:06:21 AM (8 years ago)
Author:
kishida
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AMG88

    v1 v1  
     1== AMG88の使い方 ==
     2
     3Panasonic製 AMG8832 赤外線センサアレイ の使い方説明とAdruino用サンプルスケッチです。
     4メーカーからデータシートが公開されています。しかし、これだけでは制御出来ないので、
     5他から集めた情報なども合わせて本ページでは説明します。
     6
     7AMG88は赤外線センサアレイです。
     8赤外線強度を元に、サーモカメラのように二次元的な赤外線情報を読み取ることができます。
     9
     10データシートですが、
     11
     12公式データシート(日本語)(レジスタなどの情報なし) [[BR]]
     13(https://industrial.panasonic.com/cdbs/www-data/pdf/ADI8000/ADI8000CJ1.pdf)
     14
     15Digi-Keyの公開しているデータシート(レジスタなどの情報あり) [[BR]]
     16(https://eewiki.net/download/attachments/20938914/Grid-EYE%20Full%20Datasheet.pdf?version=1&modificationDate=1379520699720&api=v2)
     17
     18出所不明ですがarduino向けのサンプルスケッチが書かれたpdf [[BR]]
     19(http://www.netzmafia.de/skripten/hardware/Datenblaetter/Movement/Grid-Eye_Designguideline_460495954.pdf)
     20
     21があります。
     22----
     23
     24== 特徴 ==
     25
     26販売中のAGM8832は3.3V DC駆動のローゲインタイプです。
     27
     28 * 電源電圧: 3.3 ± 0.3 V DC
     29 * 測定対象物の温度範囲: 0 ~ 80 ℃
     30 * 通信方式: I<sup>2</sup>c
     31 * フレームレート: 毎秒 10 又は 1 フレーム
     32 * 出力モード: 温度出力
     33 * 温度出力分解能: 0.25℃
     34 * サーミスタ出力温度範囲: -20 ~ 80 ℃
     35 * サーミスタ出力分解能: 0.0625 ℃
     36 
     37
     38== 使い方 ==
     39
     40本製品はI^2^C接続で通信されます。実体配線図は下記のとおりです。
     41
     42=== 実体配線図 ===
     43
     44(後日掲載予定)
     45
     46また、3.3V動作系のArduino R3フォームファクターのボードであればA1~A5ピンに直接刺さるかもしれません。
     47
     48本製品にはI2C通信時のプルアップ用抵抗は実装されていません。ピンヘッダと合わせて各自で実装してください。
     49
     50プルアップ抵抗はR1とR2に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。
     51
     52=== 通信方法 ===
     53
     54I^2^Cアドレスは、7bit表記で0x69です。これは裏面のジャンパをつなげることで0x68に変更可能です。
     55
     56
     57=== サンプルスケッチ ===
     58
     59==== Arduino用 ====
     60
     61[https://github.com/SWITCHSCIENCE/samplecodes GitHubでも公開(予定)]しています。
     62
     63{{{
     64#include <Wire.h>
     65
     66#define PCTL 0x00
     67#define RST 0x01
     68#define FPSC 0x02
     69#define INTC 0x03
     70#define STAT 0x04
     71#define SCLR 0x05
     72#define AVE 0x07
     73#define INTHL 0x08
     74#define TTHL 0x0E
     75#define INT0 0x10
     76#define T01L 0x80
     77
     78#define AMG88_ADDR 0x69 // in 7bit
     79
     80
     81void setup()
     82{
     83    Serial.begin(115200);
     84    Wire.begin();
     85   
     86    int fpsc = B00000000;// 1fps
     87    datasend(AMG88_ADDR,FPSC,&fpsc,1);
     88    int intc = 0x00; // diff interrpt mode, INT output reactive
     89    datasend(AMG88_ADDR,INTC,&intc,1);
     90    // moving average output mode active
     91    int tmp = 0x50;
     92    datasend(AMG88_ADDR,0x1F,&tmp,1);
     93    tmp = 0x45;
     94    datasend(AMG88_ADDR,0x1F,&tmp,1);
     95    tmp = 0x57;
     96    datasend(AMG88_ADDR,0x1F,&tmp,1);
     97    tmp = 0x20;
     98    datasend(AMG88_ADDR,AVE,&tmp,1);
     99    tmp = 0x00;
     100    datasend(AMG88_ADDR,0x1F,&tmp,1);
     101
     102    int sensorTemp[2];
     103    dataread(AMG88_ADDR,TTHL,sensorTemp,2);
     104    //Serial.print("sensor temperature:");
     105    //Serial.println( (sensorTemp[1]*256 + sensorTemp[0])*0.0625);
     106}
     107
     108void loop()
     109{
     110    Serial.print("[\n");
     111    // Wire library cannnot contain more than 32 bytes in bufffer
     112    // 2byte per one data
     113    // 2 byte * 16 data * 4 times
     114    int sensorData[32];
     115    for(int i = 0; i < 4; i++)
     116    {
     117        // read each 32 bytes
     118        dataread(AMG88_ADDR, T01L + i*0x20, sensorData, 32);
     119        for(int l = 0 ; l < 16 ; l++)
     120        {
     121            int16_t temporaryData = (sensorData[l * 2 + 1] << 8 ) + sensorData[l * 2];
     122            float temperature;
     123            if(temporaryData > 0x200)
     124            {
     125                temperature = (-temporaryData +  0xfff) * -0.25;
     126            }else
     127            {
     128                temperature = temporaryData * 0.25;
     129            }
     130            Serial.print(temperature);
     131            if( (l + i * 16)<63 ) Serial.print(",");
     132        }
     133        Serial.println();
     134    }
     135    Serial.println("]");
     136   
     137    delay(100);
     138}
     139
     140void datasend(int id,int reg,int *data,int datasize)
     141{
     142    Wire.beginTransmission(id);
     143    Wire.write(reg);
     144    for(int i=0;i<datasize;i++)
     145    {
     146        Wire.write(data[i]);
     147    }
     148    Wire.endTransmission();
     149}
     150
     151void dataread(int id,int reg,int *data,int datasize)
     152{
     153    Wire.beginTransmission(id);
     154    Wire.write(reg);
     155    Wire.endTransmission(false);
     156    Wire.requestFrom(id, datasize, false);
     157    for(int i=0;i<datasize;i++)
     158    {
     159        data[i] = Wire.read();
     160    }
     161    Wire.endTransmission(true);
     162}
     163}}}
     164
     165 ===== 出力例 =====
     166 
     16764個のデータがjson形式で出力されます。
     168{{{
     169[
     170  27.75,
     171  28.5,
     172  27.75,
     173  (中略)
     174  31.5,
     175  32,
     176  30.25
     177]
     178}}}
     179
     180==== 応用例 ====
     181
     182processingと連携することでデータの可視化が簡単に行なえます。
     183こちらも[https://github.com/SWITCHSCIENCE/samplecodes GitHubで公開(予定)]しています。
     18427行目 `Serial.lies()[0]` の部分は環境に合わせて変更してください。
     185
     186{{{
     187import processing.serial.*;
     188Serial serial;
     189boolean jsonDataStarted = false;
     190String jsondata = "[0]";
     191String jsondata_temp = "[0]";
     192JSONArray json;
     193
     194int drawingMode;
     195
     196void setup()
     197{
     198  size(640, 640, P3D);
     199
     200  translate(width/2, height/2, 0);
     201  rotateX(0.5);
     202  rotateY(0.5);
     203  //rotateZ(0.5);
     204
     205  frameRate(60);
     206
     207  fill(63, 127, 255);
     208
     209  textSize(8);
     210  stroke(255);
     211  println(Serial.list());
     212  String arduinoPort = Serial.list()[1];
     213  serial = new Serial(this, arduinoPort, 115200);
     214}
     215
     216
     217void draw()
     218{
     219  background(128);
     220 
     221  if (!jsonDataStarted)
     222  {
     223    jsondata = jsondata_temp;
     224  }
     225 
     226  float max, min, dataRange;
     227
     228  translate(width/2, height/2);    //立体の中心を画面中央に移動   
     229  rotateY(radians(mouseX-width/2)/5);
     230  rotateX(radians(mouseY-height/2)/5);
     231
     232  json = JSONArray.parse(jsondata);
     233  print(json);
     234
     235  max = json.getFloat(0);
     236  min = json.getFloat(0);
     237  for (int i=0; i<json.size(); i++)
     238  {
     239    if (max < json.getFloat(i)) max = json.getFloat(i);
     240    if (min > json.getFloat(i)) min = json.getFloat(i);
     241  }
     242  dataRange = max-min;
     243
     244  for (int i=0; i<json.size()/8; i++)
     245  {
     246    for (int l=0; l<json.size()/8; l++)
     247    {
     248      pushMatrix();
     249      // translate(50*l -200, 200-50*i, 0); // 鏡写し
     250      translate(200 - 50*l, 200-50*i, 0); // カメラと同等
     251      colorMode(HSB, 1.0);
     252      switch(drawingMode)
     253      {
     254      case 1:
     255        fill(0.75 - ((json.getFloat(i*8+l)-min)/dataRange)*0.75, 1.0, 1.0); // 取得データの中の最大最小値を元に色を決定
     256        break;
     257      case 2:
     258        fill(0.75 - ((json.getFloat(i*8+l)+20)/120)*0.75, 1.0, 1.0); // 測定レンジ(-20~100℃)を元に色を決定
     259        break;
     260      default:
     261        fill(0.75 - ((json.getFloat(i*8+l)-20)/20)*0.75, 1.0, 1.0); // (20~40℃)を元に色を決定
     262        break;
     263      }
     264      box(50, 50, ((json.getFloat(i*8+l)-min)/dataRange)*50);
     265      fill(0, 0, 0);
     266      text(json.getFloat(i*8+l), -10, -10, ((json.getFloat(i*8+l)-min)/dataRange)*25 + 1);
     267      colorMode(RGB, 100);
     268      popMatrix();
     269    }
     270  }
     271 
     272}
     273
     274void serialEvent(Serial p)
     275{
     276  char temp = (char)p.read();
     277  if (temp == '[')
     278  {
     279    jsonDataStarted = true;
     280    jsondata_temp = "";
     281  }
     282  if (jsonDataStarted)
     283  {
     284    jsondata_temp += String.valueOf(temp);
     285    if (temp == ']')
     286    {
     287      jsonDataStarted = false;
     288    }
     289  }
     290}
     291
     292void keyPressed()
     293{
     294  if (key == BACKSPACE)
     295  {
     296    drawingMode++;
     297    if (drawingMode > 2) drawingMode =0;
     298  }
     299}
     300}}}
     301
     302==== 出力例(processing) ====
     303