HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2018/05/01

Raspberry Piに赤外線アレイセンサ AMG8833を接続してサーモグラフィーもどきを作る方法 Raspberry Piに赤外線アレイセンサ AMG8833を接続してサーモグラフィーもどきを作る方法

(ラズパイで I2Cの AMG8833赤外線アレイ・サーモ・センサモジュールを使用する方法)

Tags: [Raspberry Pi], [電子工作]





● Raspberry Piに赤外線アレイセンサ AMG8833を接続してサーモグラフィーもどきを作る方法

 サーモグラフィーの市販の商品を見ていたら衝動的に欲しくなりましたが、市販品は高いです。
 ググッた所 AMG8833赤外線アレイセンサを使ったラズパイや Adruinoでの作例が有ります。
 AMG8833モジュールの値段を調べた所、アマゾンで比較的安く手に入ります。

 と言う訳で Raspberry Pi + 赤外線アレイセンサ AMG8833でサーモグラフィーもどきを作ります。
 作ると言っても前述の様に既に動かせるプロジェクトが有るのでそれを使用します。

 下記の最新の Raspbianバージョンで動作を確認しています。
Download RASPBIAN STRETCH WITH DESKTOP
 RASPBIAN STRETCH WITH DESKTOP
 Version:April 2018
 Release date:2018-04-18
 Kernel version:4.14
$ uname -a
Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux


●その他のお買い得

AMG8833 IR 8x8 Infrared Thermal Imager Array Temperature Sensor 7M Farthest Detection Distance
 AMG8833を使用した液晶画面付きの完成品!


● Raspbian Stretchで I2C-I/Fを有効にする方法

 以前にも I2Cを有効にする手順を書きましたが、時間が経っているので再度まとめます。
 (raspi-configアプリも Raspbian OSのバージョンアップで細かく変わります。)


2018/05/01
Raspberry Piの I2C機能を有効化する方法、最新の Raspbian Stretch対応 2018年版
Raspberry Piの I2C機能を有効化する方法、最新の Raspbian Stretch対応 2018年版

  ラズパイの I2C機能を有効にして各種センサーを繋げる方法まとめ


● Raspberry Piの I2Cに AMG8833 赤外線アレイセンサ Grid-EYEを接続する方法

 今回は AMG8833 赤外線アレイセンサとして、スイッチサイエンスの「Conta サーモグラフィー AMG8833搭載」を使用しました。
 「Contaシリーズ」の規格云々書いてありますが、普通にラズパイの I2Cに接続して使用可能です。(もちろん Arduino等でも使用できます)

赤外線アレイセンサ Grid-EYE 高性能タイプ / AMG8833
Conta サーモグラフィー AMG8833搭載
 AMG8833は Panasonic社製の 8x8の赤外線アレイセンサです。
 センサ正面(上下左右約 60度)の四角錘の範囲を 8x8の全 64エリアに分割して、各エリアを 0℃~80℃の温度で測定できます。
 8x8のエリアに対して Bicubic等の演算で補間する事で擬似的に検出解像度を上げる事ができます。

●赤外線アレイセンサ Grid-EYE(AMG88)
 ハイゲイン品、測定対象物の温度範囲 0~80度
 AMG8833 = +3.3V動作 ★入手性の良いこれを使用します
 AMG8853 = +5.0V動作

 ローゲイン品、測定対象物の温度範囲 -20~100度
 AMG8834 = +3.3V動作
 AMG8854 = +5.0V動作

赤外線アレイセンサ Grid-EYE (AMG88) - Panasonic Industrial Devices

AMG8833の参考仕様書

 共立電子産業の「赤外線アレイ・サーモ・センサモジュール」も同様に使用可能です。
 (スイッチサイエンス、共立電子産業のどちらも Amazonで購入可能です)

Conta サーモグラフィー AMG8833搭載
ASIN: B079BMKRW7

赤外線アレイ・サーモ・センサモジュール
ASIN: B079N943NT


●ラズパイの I2Cと赤外線アレイセンサ AMG8833の接続方法

・Raspberry Pi I2Cと赤外線アレイセンサ AMG8833の接続方法
Raspberry Pi I2Cと赤外線アレイセンサ AMG8833の接続方法


・Raspberry Piと赤外線アレイセンサ AMG8833の写真
Raspberry Piと赤外線アレイセンサ AMG8833の写真
 ラズパイの I2Cに 赤外線アレイセンサ AMG8833を接続した所。


● i2cdetectコマンドで AMG8833の接続を確認

 68(0x68)を表示すれば OK。
i2cdetect -y 1

pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
・i2cdetectコマンドで AMG8833の接続を確認
i2cdetectコマンドで AMG8833の接続を確認
 68(0x68)を表示すれば OK。



●コマンドラインの I2Cコマンドで AMG8833を動かしてみるテスト

 コマンドラインの I2Cコマンドで AMG8833を動かして、AMG8833との I2C接続が正しい事を確認します。

 i2cdumpコマンドで AMG8833のレジスタの内容を全部読み出します。
 AMG8833が電源オンの状態で赤外線センサアレイが動作しているので測定値も読み出せます。
 (赤外線センサアレイの測定値はレジスタアドレス 0x80~0xFFの 128バイト、8x8の全 64エリアで 1エリアに 2バイト)
i2cdump -y 1 0x68

pi@raspberrypi:~ $ i2cdump -y 1 0x68
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 02 00 00 00 00 00 00 00 00 00 da 01    ....?.........??
10: bb bb 7d 5f 7c b0 7f fd 00 00 00 00 00 00 00 00    ??}_|???........
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 74 00 75 00 74 00 72 00 74 00 73 00 75 00 75 00    t.u.t.r.t.s.u.u.
90: 74 00 74 00 75 00 75 00 74 00 73 00 74 00 74 00    t.t.u.u.t.s.t.t.
a0: 73 00 74 00 73 00 74 00 75 00 74 00 70 00 75 00    s.t.s.t.u.t.p.u.
b0: 70 00 74 00 72 00 73 00 73 00 73 00 73 00 72 00    p.t.r.s.s.s.s.r.
c0: 75 00 73 00 74 00 74 00 72 00 73 00 74 00 71 00    u.s.t.t.r.s.t.q.
d0: 72 00 73 00 73 00 73 00 71 00 71 00 74 00 73 00    r.s.s.s.q.q.t.s.
e0: 71 00 72 00 70 00 74 00 73 00 72 00 71 00 72 00    q.r.p.t.s.r.q.r.
f0: 72 00 72 00 72 00 6f 00 71 00 71 00 73 00 72 00    r.r.r.o.q.q.s.r.

 i2cset -y 1 0x68 0x00 0x10で AMG8833をスリープモードにします。
 AMG8833がスリープモードの時は全ての読み出し値が 00になります。
i2cset -y 1 0x68 0x00 0x10
i2cdump -y 1 0x68

pi@raspberrypi:~ $ i2cset -y 1 0x68 0x00 0x10
pi@raspberrypi:~ $ i2cdump -y 1 0x68
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

 i2cset -y 1 0x68 0x00 0x00で AMG8833を通常モード(動作モード)にします。
 AMG8833が動作状態で赤外線センサアレイが動作しているので測定値も読み出せます。
i2cset -y 1 0x68 0x00 0x00
i2cdump -y 1 0x68

pi@raspberrypi:~ $ i2cset -y 1 0x68 0x00 0x00
pi@raspberrypi:~ $ i2cdump -y 1 0x68
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 02 00 00 00 00 00 00 00 00 00 d7 01    ....?.........??
10: ff ff fa cf c5 aa fd 9f 00 00 00 00 00 00 00 00    ..??????........
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 70 00 72 00 70 00 70 00 71 00 70 00 6f 00 6f 00    p.r.p.p.q.p.o.o.
90: 70 00 6f 00 72 00 72 00 72 00 72 00 70 00 70 00    p.o.r.r.r.r.p.p.
a0: 71 00 72 00 71 00 70 00 72 00 72 00 70 00 72 00    q.r.q.p.r.r.p.r.
b0: 71 00 73 00 70 00 71 00 72 00 6f 00 73 00 72 00    q.s.p.q.r.o.s.r.
c0: 72 00 71 00 72 00 71 00 70 00 71 00 71 00 6e 00    r.q.r.q.p.q.q.n.
d0: 72 00 73 00 73 00 72 00 72 00 6e 00 71 00 71 00    r.s.s.r.r.n.q.q.
e0: 70 00 70 00 71 00 71 00 6f 00 6e 00 72 00 73 00    p.p.q.q.o.n.r.s.
f0: 6f 00 71 00 72 00 70 00 72 00 72 00 71 00 72 00    o.q.r.p.r.r.q.r.

 単体でデータを読み出す場合は i2cgetコマンドを使います。
 i2cget -y 1 0x68 0x0e wでセンサ自体の測定温度を取得します。
 w = Wordなのでレジスタの 0x0e 0x0fの 2バイトを読み込みます。
 0x0eと 0x0fは Thermistor registerです。
 サーミスタ温度レジスタは、サーミスタ温度データを表示する読み出し専用のレジスタです。
 温度データは、12bitデータ,2バイトデータとなります。
 1LSBが0.0625℃に相当する12bit分解能を持ち、符号+絶対値で表されます。
pi@raspberrypi:~ $ i2cget -y 1 0x68 0x0e w
0x01d7

0x01d7をデータシートの計算式に当てはめると約 29.44℃となります。
 0x01d7 * 0.0625 = 471 * 0.0625 = 29.4375℃

 0x02は Frame rate registerです。
 i2cset -y 1 0x68 0x02 0x00でセンサーの更新頻度を 1秒間に 10回(10FPS)に設定します。
 i2cset -y 1 0x68 0x02 0x01でセンサーの更新頻度を 1秒間に 1回(1FPS)に設定します。
pi@raspberrypi:~ $ i2cset -y 1 0x68 0x02 0x00
pi@raspberrypi:~ $ i2cget -y 1 0x68 0x02
0x00

pi@raspberrypi:~ $ i2cset -y 1 0x68 0x02 0x01
pi@raspberrypi:~ $ i2cget -y 1 0x68 0x02
0x01

pi@raspberrypi:~ $ i2cget
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC

pi@raspberrypi:~ $ i2cset
Usage: i2cset [-f] [-y] [-m MASK] [-r] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    c (byte, no value)
    b (byte data, default)
    w (word data)
    i (I2C block data)
    s (SMBus block data)
    Append p for SMBus PEC

pi@raspberrypi:~ $ i2cdump
Error: No i2c-bus specified!
Usage: i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  MODE is one of:
    b (byte, default)
    w (word)
    W (word on even register addresses)
    s (SMBus block)
    i (I2C block)
    c (consecutive byte)
    Append p for SMBus PEC


● AMG8833の制御プログラム

DIY Thermal Imaging Camera FREE CODE
 DIY Thermal Imaging Camera FREE CODE
 by Kris Kasprzak

・DIY Thermal Imaging Camera FREE CODE by Kris Kasprzak
DIY Thermal Imaging Camera FREE CODE by Kris Kasprzak
 上記のソースをそのままパク、、参考にしました。
 70x70の補間が「やり過ぎ」に思えたので半分の 35x35にしました。

 また、液晶画面を繋がなくても SSHコンソール画面上で確認できるようにエスケープシーケンスで色を指定してテキストを表示しています。

 ESC_COLOR.Cを動かして SSHコンソール画面に 256色が出る事を確認してください。
 ESC[48;5;XXXmで 0x10~0xE7の範囲で RGB各 6諧調の 216色(6 * 6 * 6)を表現できます。

・SSHコンソール画面に 256色が出る事を確認
SSHコンソール画面に 256色が出る事を確認



ESC_COLOR.c
#include <stdio.h>

 /*
gcc ESC_COLOR.c -o ESC_COLOR
./ESC_COLOR
 */

void printEscapeRgbColor(int r, int g, int b)
{
    int rgb = (r * 36 + g * 6 + b) + 16;
    printf("\x1b[48;5;%dm %3d", rgb, rgb);
}


int main(int argc, char *argv[])
{
    int r, g, b;

    printf("\x1b[39m");
    printf("\x1b[49m");
    printf("\x1b[2J");
    printf("\x1b[0;0f");
    printf("\n");

    for (int r=0; r<6; ++r)
    {
        printf("R = %d: B= 0,  1,  2,  3,  4,  5\n", r);

        for (int g=0; g<6; ++g)
        {
            printf("G = %d: ", g);
            if (g >= 3)
            {
                printf("\x1b[38;5;00m");
            }

            for (int b=0; b<6; ++b)
            {
                printEscapeRgbColor(r, g, b);
            }
            printf("\x1b[39m");
            printf("\x1b[49m");
            printf("\n");
        }
    }
    return (0);
}


●ラズパイで AMG8833を動かすサンプルのソースリスト

 補間演算処理と温度に対応する色計算の部分に Kris Kasprzakさんのプログラムをそのまま使用しました。

 C言語で I2Cを制御するのには pigpioライブラリを使用しました。(Raspbianに標準で組み込まれているのでインストール作業は不要です)
pigpiod C Interface

 なお、AMG8833センサーの温度測定値は 0x80~0xFFの 128バイト(8x8の全 64区画で 1区画で 2バイト)ですが、I2Cライブラリの制限で最大で 32バイトしか読み込めません。なので温度情報を 4回に分けて取得しています。(正確にはラズパイは I2Cではなく SMBusと言う I2Cを基にした Intelの規格で動いており、その SMBusの制約で最大 32バイトとなります。I2Cは Philipsの規格。)

AMG8833.c
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <pigpio.h>
 /*
gcc -o AMG8833 AMG8833.c -lpigpio -lpthread
sudo ./AMG8833
 */
 /*
Connect Pi I2C to AMG8833
3V3 - VCC
Ground - Ground
SDA - SDA
SCL - SCL
 */
#define AMG8833_I2C_ADDR 0x68

#define ENABLE_BICUBIC 1

 // Temperature vs Color
 // DIY Thermal Imaging Camera FREE CODE by Kris Kasprzak
 // https://youtu.be/A9F1ezGgaC4?t=2m
#if 0
#define temp_min 20.0f
#define temp_a 25.0f
#define temp_b 30.0f
#define temp_c 33.0f
#define temp_d 50.0f
#define temp_max 80.0f

#else
#define temp_min 26.0f
#define temp_max 36.0f
#define temp_a (temp_min + (temp_max - temp_min) * 0.2121f)
#define temp_b (temp_min + (temp_max - temp_min) * 0.3182f)
#define temp_c (temp_min + (temp_max - temp_min) * 0.4242f)
#define temp_d (temp_min + (temp_max - temp_min) * 0.8182f)

#endif


 // array for the 8 x 8 measured pixels
float pixels[64];

 // array for the interpolated array
float HDTemp[40][40];


void printTempColor(float temp)
{
    int r = 0;
    int g = 0;
    int b = 255;

    if (temp < temp_min)
    {
        r = 0;
    }
    else if (temp < temp_a)
    {
        r = 0;
    }
    else if (temp < temp_b)
    {
        r = 0;
    }
    else if (temp < temp_c)
    {
        r = (temp - temp_b) * 255.0f / (temp_c - temp_b);
    }
    else if (temp < temp_d)
    {
        r = 255;
    }
    else if (temp < temp_max)
    {
        r = 255;
    }
    else
    {
        r = 255;
    }

    if (temp < temp_min)
    {
        g = 0;
    }
    else if (temp < temp_a)
    {
        g = (temp - temp_min) * 255.0f / (temp_a - temp_min);
    }
    else if (temp < temp_b)
    {
        g = 255;
    }
    else if (temp < temp_c)
    {
        g = 255;
    }
    else if (temp < temp_d)
    {
        g = (temp_d - temp) * 255.0f / (temp_d - temp_c);
    }
    else if (temp < temp_max)
    {
        g = 0;
    }
    else
    {
        g = 0;
    }

    if (temp < temp_min)
    {
        b = 255;
    }
    else if (temp < temp_a)
    {
        b = 255;
    }
    else if (temp < temp_b)
    {
        b = (temp_b - temp) * 255.0f / (temp_b - temp_a);
    }
    else if (temp < temp_c)
    {
        b = 0;
    }
    else if (temp < temp_d)
    {
        b = 0;
    }
    else if (temp < temp_max)
    {
        b = (temp - temp_d) * 255.0f / (temp_max - temp_d);
    }
    else
    {
        b = 255;
    }

    //  256 pallete 0x10-0xE7 rgb:0-5
    r = (int)(r * 6.0f / 256.0f);
    g = (int)(g * 6.0f / 256.0f);
    b = (int)(b * 6.0f / 256.0f);
    int rgb = (r * 36 + g * 6 + b) + 16;
    printf("\x1b[48;5;%dm  ", rgb);
}


void InterpolateRows() {

    // interpolate the 8 rows (interpolate the 70 column points between the 8 sensor pixels first)
    for (int row = 0; row < 8; ++row) {
        for (int col = 0; col < 35; ++col) {

            // get the first array point, then the next
            // also need to bump by 8 for the subsequent rows
            int aLow =  col / 5 + (row * 8);
            int aHigh = (col / 5) + 1 + (row * 8);

            // get the amount to interpolate for each of the 10 columns
            // here were doing simple linear interpolation mainly to keep performace high and
            // display is 5-6-5 color palet so fancy interpolation will get lost in low color depth
            float intPoint = (( pixels[aHigh] - pixels[aLow] ) / 5.0f);
            // determine how much to bump each column (basically 0-9)
            int incr = col % 5;
            // find the interpolated value
            float val = (intPoint * incr) + pixels[aLow];
            // store in the 70 x 70 array
            // since display is pointing away, reverse row to transpose row data
            HDTemp[(7 - row) * 5][col] = val;
        }
    }
}


void InterpolateCols() {

    // then interpolate the 70 rows between the 8 sensor points
    for (int col = 0; col < 35; ++col) {
        for (int row = 0; row < 35; ++row) {

            // get the first array point, then the next
            // also need to bump by 8 for the subsequent cols
            int aLow =  (row / 5 ) * 5;
            int aHigh = aLow + 5;

            // get the amount to interpolate for each of the 10 columns
            // here were doing simple linear interpolation mainly to keep performace high and
            // display is 5-6-5 color palet so fancy interpolation will get lost in low color depth
            float intPoint = (( HDTemp[aHigh][col] - HDTemp[aLow][col] ) / 5.0f);
            // determine how much to bump each column (basically 0-9)
            int incr = row % 5;
            // find the interpolated value
            float val = (intPoint * incr ) + HDTemp[aLow][col];
            // store in the 70 x 70 array
            HDTemp[row][col] = val;
        }
    }
}


void DisplayGradient() {

    // rip through 70 rows
    for (int row = 0; row < 35; ++row) {
        // then rip through each 70 cols
        for (int col = 0; col < 35; ++col) {
            printTempColor(HDTemp[row][col]);
        }
        printf("\n");
    }
}


int main(int argc, char *argv[])
{
    int handle;

    if (gpioInitialise() < 0) return 1;

    // int i2cOpen(unsigned i2cBus, unsigned i2cAddr, unsigned i2cFlags)
    handle = i2cOpen(1, AMG8833_I2C_ADDR, 0);

    // int i2cWriteByteData(unsigned handle, unsigned i2cReg, unsigned bVal)
    i2cWriteByteData(handle, 0x00, 0x00);
    // Sleep 50ms
    usleep(100000);
    // Initial Reset
    i2cWriteByteData(handle, 0x01, 0x3F);
    // Sleep 2ms
    usleep(100000);
    // Flag Reset
    i2cWriteByteData(handle, 0x01, 0x30);
    // Frame rate 10 fps
    i2cWriteByteData(handle, 0x02, 0x00);

    // mode Average
    i2cWriteByteData(handle, 0x1F, 0x50);
    i2cWriteByteData(handle, 0x1F, 0x45);
    i2cWriteByteData(handle, 0x1F, 0x57);
    // mode Average twice moving average output mode
    i2cWriteByteData(handle, 0x07, 0x20);
    // mode Average normal
    // i2cWriteByteData(handle, 0x07, 0x00);
    i2cWriteByteData(handle, 0x1F, 0x00);


    // int i2cReadI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)

    char buf[128]; // 128 bytes(8 x 8 x Word = 128)
    char c;
    int temp;
    float tempf;

    printf("\x1b[2J");

    while (1)
    {
        // Temperature register 0x80-0xFF
        i2cReadI2CBlockData(handle, 0x80, &buf[0], 32);
        i2cReadI2CBlockData(handle, 0xA0, &buf[32], 32);
        i2cReadI2CBlockData(handle, 0xC0, &buf[64], 32);
        i2cReadI2CBlockData(handle, 0xE0, &buf[96], 32);

        // TTH Thermistor register 0.0625
        // TTHL
        c = i2cReadByteData(handle, 0x0E);
        temp = c;
        // TTHH
        c = i2cReadByteData(handle, 0x0F);
        temp += ((c & 0x07)<<8);

        printf("\x1b[49m");
        printf("\x1b[0;0f");
        printf("Thermistor: %5.2f", temp * 0.0625);
        printf("\n");

        for (int x=0; x<8; ++x)
        {
            for (int y=0; y<8; ++y)
            {
                int idx = ((x<<3)+y)<<1;
                int t = ((buf[idx + 1] & 0x07) << 8) + buf[idx];
                // printf("%04X ", t);
                tempf = (t * 0.25f);
#if ENABLE_BICUBIC
                pixels[x*8+y] = tempf;
#else
                printTempColor(tempf);
#endif
            }
#if ENABLE_BICUBIC
#else
            printf("\n");
#endif
        }

#if ENABLE_BICUBIC
        // now that we have an 8 x 8 sensor array
        // interpolate to get a bigger screen
        InterpolateRows();

        // now that we have row data with 70 columns
        // interpolate each of the 70 columns
        // forget Arduino..no where near fast enough..Teensy at > 72 mhz is the starting point
        InterpolateCols();

        // display the 70 x 70 array
        DisplayGradient();
#endif
    }

    i2cClose(handle);

    gpioTerminate();

    return (0);
}


●ラズパイで AMG8833を動かした所、サーモグラフの表示が得られます

・Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
 何も無い所(35x35の補間有り)

・Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
 Vサイン(35x35の補間有り)
 ※ 補間処理の演算の関係か、上下が入れ替わっています。

・Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
 Vサイン(8x8のオリジナル)

・Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
 片手を挙げた人物(35x35の補間有り)
 ※ 補間処理の演算の関係か、上下が入れ替わっています。

・Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
Raspberry Piで AMG8833を動かした所、サーモグラフの表示が得られます
 片手を挙げた人物(8x8のオリジナル)


● Bicubic補間方法

Bicubic interpolation

 ちなみに Python言語だと画像処理ライブラリ PIL Pillowのリサイズ処理を転用して超簡単に Bicubic補間の結果を得られます。

from PIL import Image
dummy_image.resize((35, 35), Image.BICUBIC)

Adafruit AMG8833 IR Thermal Camera Breakout
 Vサインは Adafruitのこの動画を真似しました。


●赤外線アレイセンサ AMG8833の写真

・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真


・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真


・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真


・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真
 スイッチサイエンスの製品はアマゾンでも購入できます。

・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真
 梱包箱の内蓋に「Le idee sono infinite .」イタリア語、「アイデアは無限大!」のフレーズが!

・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真


・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真


・赤外線アレイセンサ AMG8833の写真
赤外線アレイセンサ AMG8833の写真




●一般的なサーモグラフィーの製品はこちら


KKmoon ハンドヘルド サーモグラフィカメラ 熱画像カメラ 赤外線放射温度計 -20〜300°C / -4〜572°F カラースクリーン サーマルカメラ
ASIN: B0798N1XH3

FLIR(フリアー) サーマルイメージ放射温度計ミニ TG130
ASIN: B01ALSO84E

【国内正規品】FLIR(フリアー) ONE for iOS Personal Thermal Imager (iPhone/iPad対応)
ASIN: B073RG5SDZ

超高性能 携帯型サーモグラフィーカメラ FLIR(フリアー) C2 ★コンパクトサイズ★【並行輸入品】
ASIN: B00T9RANUC


● Raspbian OS Stretchで I2C-I/Fを有効にする方法


2018/05/01
Raspberry Piの I2C機能を有効化する方法、最新の Raspbian Stretch対応 2018年版
Raspberry Piの I2C機能を有効化する方法、最新の Raspbian Stretch対応 2018年版

  ラズパイの I2C機能を有効にして各種センサーを繋げる方法まとめ

2016/03/26
Raspberry Pi 3で 標準とは別の GPIO端子の I2C機能を有効化する方法(I2C-3編)
Raspberry Pi 3で 標準とは別の GPIO端子の I2C機能を有効化する方法(I2C-3編)

  ラズパイ3の GPIO23と GPIO24で I2C機能を有効にする方法まとめ

● センサデバイスの I2Cアドレス一覧 IICアドレス一覧と使用方法
加速度センサMMA7455L
NXP
使い方の説明
0x1D(W:0x32 R:0x33)MMA7455 三軸加速度センサモジュール
AQM0802Aと一緒に使えない相性?
地磁気センサHMC5883L
Honeywell
使い方の説明
0x1E(W:0x3C R:0x3D)CJ-M49 デジタルコンパスモジュール 3軸地磁気センサ
RFID NFCリーダライタNXP PN532使い方の説明
0x24(W:0x48 R:0x49)ELECHOUSE NFC MODULE V3
8ビット I/OエクスパンダPCF8574
Texas Instruments
使い方の説明
0x2F(W:0x5E R:0x5F)FC-113 PCF8574 キャラクタ液晶モジュール接続用
キャラクタ液晶 8文字x2行秋月 AQM0802A
ST7032
Sitronix
使い方の説明
0x3E(W:0x7E R:0x7F)秋月の AQM0802液晶はラズパイ側の回路が原因の癖が有ります。
MMA7455と一緒に使えない相性?
PCA9515AD I2Cバスリピーターとの併用を推奨
キャラクタ液晶モジュール 16文字×2行秋月 AQM1602A
ST7032
Sitronix
使い方の説明
0x3E(W:0x7E R:0x7F)秋月の AQM1602A液晶モジュール
湿度センサHTU21D
TE Connectivity
使い方の説明
0x40(W:0x80 R:0x81)GY-21 温度、湿度センサーモジュール
AD/DA変換PCF8591
NXP
使い方の説明
0x48(W:0x90 R:0x91)YL-40 8ビットA/D & D/Aコンバータ
温度センサLM75A
Texas Instruments
使い方の説明
0x4F
A0-A2=H
(W:0x9E R:0x9F)A0~A2を "H"に設定で 0x4F
デフォルト 0x48
3軸加速度センサADXL345
Analog Devices
使い方の説明
0x53(W:0xA6 R:0xA7)GY-291 3軸加速度センサモジュール
I2CメモリAT24C32
(4KBメモリ)
0x57(W:0xAE R:0xAF)ZS-042 下記の RTCモジュールに搭載
RTC リアルタイムクロックDS3231
現 Maxim
旧 Dallas Semiconductor
使い方の説明
0x68(W:0xD0 R:0xD1)ZS-042 温度補償水晶発振器(TCXO)および水晶を内蔵する低コスト、 超高精度 I2Cリアルタイムクロック(RTC)
赤外線アレイセンサAMG8833
Panasonic
使い方の説明
0x68(W:0xD0 R:0xD1)AMG8833 赤外線アレイセンサ Grid-EYEモジュール
サーモグラフィーごっこが可能
6軸 ジャイロ+加速度センサMPU-6050
InvenSense
使い方の説明
0x68
ADO=L
(W:0xD0 R:0xD1)GY-521 三軸加速度センサ・三軸ジャイロセンサモジュール、
AD0端子 プルアップ時=0x69、
AD0端子 プルダウン時=0x68
9軸 ジャイロ+加速度+地磁気センサMPU-9150
InvenSense
0x69(W:0xD0 R:0xD1)MPU-6050に地磁気センサーを追加した最強センサー
9軸 ジャイロ+加速度+地磁気センサMPU-9250
InvenSense
0x69(W:0xD0 R:0xD1)MPU-9150の改良型、3軸加速度 + 3軸ジャイロ + 3軸コンパス
気圧/気温/高度センサBMP180
Bosch Sensortec
0x77(W:0xEE R:0xEF)BMP085の改良型
気圧/温度/高度センサBMP280
Bosch Sensortec
使い方の説明
0x76
SDO=L
(W:0xEC R:0xED)BMP180の改良型、温度・気圧(高度)センサー
SDO端子 プルアップ時=0x77、
SDO端子 プルダウン時=0x76
湿度/気圧/温度/高度センサBME280
Bosch Sensortec
0x76
SDO=L
(W:0xEC R:0xED)BMP280の進化型、湿度・温度・気圧(高度)の 4種類の環境情報を取得できる(湿度が追加になった)
SDO端子 プルアップ時=0x77、
SDO端子 プルダウン時=0x76
照度、近接センサAPDS-9930
Broadcom
使い方の説明
0x39(W:0x72 R:0x73)
RGB色センサ、ジェスチャー、照度、近接センサAPDS-9960
Broadcom
使い方の説明
0x39(W:0x72 R:0x73)
RGB色センサTCS34725
TAOS
使い方の説明
0x29(W:0x52 R:0x53)
12点 静電タッチセンサMPR121
Freescale Semiconductor
使い方の説明
0x5A(W:0xB4 R:0xB5)
有機LEDモジュール 128x64 0.96インチSSD1306
SOLOMON SYSTECH
使い方の説明
0x3C(W:0x78 R:0x79)DC='L'で 0x3C、DC='H'で 0x3D

 センサー類は必要な GPIOピンが 2本で済む I2C通信方式のデバイスで揃えました。
 また、全てのデバイスの信号電圧レベルは +3.3Vです。
 制御アドレスが異なるセンサーモジュール同士は同一の I2Cバスに接続してラズパイで使用する事ができます。

 ※ MMA7455と一緒に使用すると ST7032iコントローラが認識されない。I2Cデバイス間の相性? I2C配線の引き回し?

 ※ ST7032iには STARTコンディションの前に、バス調停のSCLパルスがあると、誤動作してACKを返さないバグが有るそうです。
ストロベリー・リナックス ST7032 低電圧I2C液晶モジュール アプリケーションノート
 ごみが直前にあるとその後正しいシーケンスで通信しても ST7032は通信に失敗します。

 ※ AQM0802A液晶モジュール使用時のI2Cバスのプルアップ抵抗は10kΩを推奨いたします。(ラズパイ側で 1.8kΩでプルアップされているのが問題)
 ※ Raspberry Pi 全シリーズに共通する仕様の制約から、AQMシリーズの液晶を接続する場合にはバッファ(I2Cバスリピーター、例:PCA9515AD)を介して接続してください。
I2C接続小型LCDモジュール(8x2行)ピッチ変換キットの質問と回答



Tags: [Raspberry Pi], [電子工作]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利
FWinSdCardImager SDカード イメージ書き込みアプリ、ラズパイの Raspbian OS、Jetson Nanoの Ubuntuの書き込みに便利

  ラズパイや Jetson Nano等のワンボードマイコン等への OSイメージの書き込みが簡単にできる

FWinPiFinder ラズベリーパイ IPアドレス発見アプリ。ARPコマンドでラズパイの IPアドレスを探索発見する
FWinPiFinder ラズベリーパイ IPアドレス発見アプリ。ARPコマンドでラズパイの IPアドレスを探索発見する

  Raspberry Piや NVIDIA Jetson Nano等の IPアドレスを MACアドレスの OUI部分を使用して発見する

Raspberry Pi 3系のトラブルであるある第一位の電源トラブル、低電圧警報に関する情報のまとめ
Raspberry Pi 3系のトラブルであるある第一位の電源トラブル、低電圧警報に関する情報のまとめ

  ラズパイ3B系での低電圧警報に関する情報まとめ、コマンドラインやログファイルから低電圧を検知する方法

Raspberry Piで CPUの脆弱性 Spectreと Meltdownの脆弱性をチェックする方法
Raspberry Piで CPUの脆弱性 Spectreと Meltdownの脆弱性をチェックする方法

  ラズパイで 2018年初頭に大騒ぎになったスペクターとメルトダウンの CPUの脆弱性をチェックする方法

Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ
Raspberry Pi Zero Wを海外通販の Pimoroni等での購入方法、購入できる通販ショップ一覧まとめ

  ラズパイゼロW ワイヤレスモデルを海外通販でサクッと簡単に個人輸入で入手。技適通過でも国内販売は常に品切れ

Raspberry Pi 3で安定して使える相性の無い最適な microSDカードの種類のまとめ
Raspberry Pi 3で安定して使える相性の無い最適な microSDカードの種類のまとめ

  ラズパイ3で安定して使える microSDカードを購入する Teamと SanDiskは絶対に買わない

Raspberry Pi 3 Model Bに専用カメラモジュール RaspiCamを接続する方法
Raspberry Pi 3 Model Bに専用カメラモジュール RaspiCamを接続する方法

  ラズパイに専用カメラモジュールを接続して Raspbianで写真の静止画撮影や動画を録画する方法

Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ
Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ

  ラズパイの Raspbian OSのコマンドラインで使用する便利コマンド、負荷試験や CPUシリアル番号の確認方法等も

Raspberry Pi 3公式フォーラムの FAQの内容の日本語訳
Raspberry Pi 3公式フォーラムの FAQの内容の日本語訳

  ラズパイ公式フォーラムの「The Raspberry Pi 3 Model B Q&A thread」の日本語訳

Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法
Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法

  ラズパイ3の GPIO端子の I2C機能を有効にして各種センサーを繋げる方法まとめ

大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう
大人気の CPUボード、Raspberry Pi 3 Model Bで作ってみよう

  Raspberry Piの開発環境の構築やタッチパネル付き液晶ディスプレイや各種センサーの使い方まとめ


Raspberry Pi 3、シングルボードコンピュータ ラズパイ3 Raspberry Pi関連はこちらへまとめました
 下記以外にも多数のラズパイ関係の記事が有ります。
 (I2C制御、GPIO制御、1-Wire制御、シリアル通信、日本語音声合成、日本語音声認識、中国語音声合成、MeCab 形態素解析エンジン、赤外線リモコン制御、秋月 I2C液晶モジュール、KeDei 3.5インチ液晶、HDMI 5インチ液晶、NFCカードリーダ、コマンドライン操作方法等)
Raspberry Pi 3に HDMI接続の 800x480 5インチ TFT液晶を接続して使用する方法
Raspberry Pi Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法
Raspberry Pi 3の WiFiを広告ブロック機能付きの無線LANアクセスポイント化 hostapd + dnsmasq編
Raspberry Pi 3の Bluetoothで ブルテザで通信する方法(Bluetooth編)
Raspberry Pi 3で日本語音声を合成して喋らせる方法(OpenJTalk編)
Raspberry Pi 3に USB Micを接続して日本語の音声認識をする方法(Julius編)
Raspberry Pi 3の GPIOに LEDとスイッチを接続して Lチカする方法
Raspberry Pi 3の GPIOに LEDとスイッチを接続してシャットダウンボタンを実装する方法
Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法
Raspberry Pi 3の GPIOに I2C通信方式の気圧計 BMP280を接続する方法
Raspberry Pi 3に I2C通信方式の NFCリーダライタ PN532を接続して NFC FeliCaカードを読む方法
Raspberry Pi 3でネットワーク ライブカメラを構築する方法 Motion編
Raspberry Pi 3でネットワーク ライブカメラを構築する方法 MJPG-streamer編
Raspberry Pi 3 Model Bで動画処理アプリ FFmpegをコンパイルする方法
Raspberry Pi3の X-Window Systemに Windowsのリモートデスクトップから接続する方法
Raspberry Pi3に WebRTCの STUN/TRUNサーバと PeerJSサーバをインストールする方法
【成功版】Raspberry Piで NNPACK対応版の Darknet Neural Network Frameworkをビルドする方法


Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板
Espressif ESP8266 Arduino互換でスケッチが使える ESP-12Eモジュール基板

  Espressif ESP8266 ESP-12-E NodeMCU V1 ESP12 CP2102

BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)
BangGood通販はドローン以外にも面白い商品がまだまだ有った(電子工作編)

  レーザー彫刻機、カラー液晶の DIYオシロ、Arduinoや Raspberry Pi用の小型カラー液晶




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2018 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_i2c_amg8833_thermo_graph_sensor/