| 1 | == AMG88の使い方 == |
| 2 | |
| 3 | Panasonic製 AMG8832 赤外線センサアレイ の使い方説明とAdruino用サンプルスケッチです。 |
| 4 | メーカーからデータシートが公開されています。しかし、これだけでは制御出来ないので、 |
| 5 | 他から集めた情報なども合わせて本ページでは説明します。 |
| 6 | |
| 7 | AMG88は赤外線センサアレイです。 |
| 8 | 赤外線強度を元に、サーモカメラのように二次元的な赤外線情報を読み取ることができます。 |
| 9 | |
| 10 | データシートですが、 |
| 11 | |
| 12 | 公式データシート(日本語)(レジスタなどの情報なし) [[BR]] |
| 13 | (https://industrial.panasonic.com/cdbs/www-data/pdf/ADI8000/ADI8000CJ1.pdf) |
| 14 | |
| 15 | Digi-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 | |
| 54 | I^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 | |
| 81 | void 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 | |
| 108 | void 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 | |
| 140 | void 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 | |
| 151 | void 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 | |
| 167 | 64個のデータが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 | |
| 182 | processingと連携することでデータの可視化が簡単に行なえます。 |
| 183 | こちらも[https://github.com/SWITCHSCIENCE/samplecodes GitHubで公開(予定)]しています。 |
| 184 | 27行目 `Serial.lies()[0]` の部分は環境に合わせて変更してください。 |
| 185 | |
| 186 | {{{ |
| 187 | import processing.serial.*; |
| 188 | Serial serial; |
| 189 | boolean jsonDataStarted = false; |
| 190 | String jsondata = "[0]"; |
| 191 | String jsondata_temp = "[0]"; |
| 192 | JSONArray json; |
| 193 | |
| 194 | int drawingMode; |
| 195 | |
| 196 | void 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 | |
| 217 | void 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 | |
| 274 | void 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 | |
| 292 | void keyPressed() |
| 293 | { |
| 294 | if (key == BACKSPACE) |
| 295 | { |
| 296 | drawingMode++; |
| 297 | if (drawingMode > 2) drawingMode =0; |
| 298 | } |
| 299 | } |
| 300 | }}} |
| 301 | |
| 302 | ==== 出力例(processing) ==== |
| 303 | |