ESP-WROOM-02で二次元温度センサ(ROBOBA041, Grid-EYE)を使ってみる 前編

th_grid_eye_2

先日、Arduino界隈の情報をウロウロ探していたら、以下の記事を見つけました。

おお、これはなんだか、とても可能性を感じます。是非使ってみたい!

ということで、自分で購入して使ってみることにしました。どうせなら、取得したデータをクラウドとかに上げられるようにしておいた方がライフログとしては便利だろうと思ったので、Wi-Fiに繋がりかつArduinoライクに開発可能なESP-WROOM-02で動かしてみました。

ESP-WROOM-02は以前使ったことがあるのですが、今回はよりお手軽に開発可能な、スイッチサイエンス製のESPr Developerを使うことにしました。

これならわざわざ自分で書き込み機を作らなくてよいので大変ラクです。Arduino IDEでの開発方法についてはこちらにまとめられています。

 

さて、ではさっそく二次元温度センサこと、Panasonic製赤外線アレイセンサ「Grid-EYE」を接続。。。といきたいところなのですが、その前に、当たり前ですがGrid-EYEを入手しないといけません。先の記事では「とある伝で入手した」とありますが、私にはそんなツテはございませんので、普通に買ってこないといけません。

が。

これが全然売っていない。唯一、RSコンポーネンツが買えそうな気配を出していたのですが、基本法人相手なようで、個人では買えませんでした。ちょっと粘ってみましたが、海外からの輸入品になるらしく、申請の書類に所属する会社の許可が必要と言われて断念しました。

それでも諦めきれなくてもう少し探してみたところ、Moo Soft様がGrid-EYEを使用した二次元温度センサを販売されていました。こちらはAmazonから購入可能。

I2C接続版のROBOBA041とUSB接続版のROBOBA043がありますが、Arduinoで使う分にはI2C接続版の方が都合が良いですし、価格もお安いのでこちらにしました。お安いといってもほぼ一万円するので、買うからには有効活用してやるという覚悟が問われます(?)。

ちなみに、上記のROBOBA041には10pinのフレキシブルケーブルが付属していますが、このままだと工作としては少々扱いづらいので、秋月で販売されているDIP化キットなどを併用すると扱いやすくなります。

 

さて、Grid-EYEには3.3V駆動と5V駆動の2タイプ(AMG883X系とAMG885X系)がありますが、ROBOBA041に搭載されているのはAMG8832で3.3Vなので、ESP-WROOM-02との接続については特に電圧の変換は気にしなくて良さそうです。ROBOA041の関連ドキュメントはこちらで公開されているので、主に回路図を見ながらESP-WROOM-02と接続してみます。

回路図によると、フラットケーブル(CN1)の10番に3.3V、9番にSDA、8番にSCL、6番にGNDを繋げば良さそうです。

th_grid-eye_4

これが実際のROBOBA041ですが、回路図でR2とR3となっている部分には、実際には抵抗がついていません。これは、接続するマスタデバイス側でI2Cのプルアップ抵抗が内蔵されているか否かで抵抗の要不要が変わるため、このような形になっているようです。EPS-WROOM-02でI2Cを利用する場合、プルアップ抵抗は内蔵されていないので、この部分にそれぞれ10kΩを取り付けてあげた方が良さそうです。本来はチップ抵抗を取り付けてあげるべきなのですが、所有していなければ半田づけする技術もありませんので、不細工ですが普通のカーボン抵抗をくっつけます。

th_grid_eye_3

で、こちらがブレッドボードに実際に配線してみた状態です。フラットケーブルの10番に相当する部分は、DIP化キットの基板上では1番になっている点に注意です。

th_grid_eye_1

見やすいように基板を外した状態です。ESP-WROOM-02では、GPIOの4番がSDA、5番がSCLになります。

 

プログラムについては、素晴らしいことに、上記のサイトの方Arduino用のライブラリを作ってくださっています。本当にありがたいです。ありがとうございます。こちらをArduino IDEにインクルードして、サンプルプログラムを動かして見ます。

#include <Wire.h>
#include <GridEye.h>

GridEye myeye = GridEye(GridEye_DeviceAddress_1);

void setup(void)
{
  // I2Cバスに参加
  Wire.begin();
  // シリアルポート初期化
  Serial.begin(115200);
  while (!Serial) {
    ; // シリアルポート接続待ち
  }
}

// ピクセル温度データ保存用
int pixel[64];

void loop(void)
{
  // サーミスタ温度読み出し
  int temp = myeye.thermistorTemp();
  Serial.print(F("Thermistor Temp: "));
  Serial.println(temp * 0.065); // 1単位 = 0.065度

  // ピクセル温度データ読み出し
  myeye.pixelOut(pixel);
  Serial.println(F("Pixel Output: "));
  for (int i = 0; i < 64; i++) {
    if (i && ((i % 8) == 0)) {
      Serial.println();
    }
    Serial.print(pixel[i] * 0.25); // 1単位 = 0.25度
    Serial.print(' ');
  }
  Serial.println();

  // 1秒待つ
  delay(1000);
}

サンプルプログラムは上記のサイトのサンプル1ほぼそのままなのですが、一点だけ変更しています。一番最初のGridEyeオブジェクトの宣言部分で、引数として”GridEye_DeviceAddress_1″を渡しています。

こちらの仕様を見るとわかるのですが、Grid-EYEは二つのI2Cアドレス(0x68と0x69)を選択できるようになっています。AD_SELECTピンをLOWにすると0x68、HIGHにすると0x69になります。その上で改めてROBOBA041の回路図を見てみると、ADの部分がHIGHになっており、アドレスが0x69になっていることがわかります。そして、ライブラリではデフォルトのアドレスがGridEye_DeviceAddress_0(=0x68)になっているため、オブジェクトの初期化時にGridEye_DeviceAddress_1(0x69)を渡して、プログラムがアクセスするアドレスを変更しています。

なお、このサンプルをコンパイルすると、Arduino IDE上では”ライブラリGridEye-masterはアーキテクチャ[avr]に対応したものであり、アーキテクチャ[esp8266]で動作するこのボードとは互換性がないかもしれません“という警告が表示されますが、特に問題はありません。

 

さて、サンプルプログラムを実行してみると、シリアルモニタには以下のように表示されます。

Thermistor Temp: 26.13
Pixel Output: 
22.75 22.50 22.50 23.25 20.50 22.75 21.00 24.00 
22.00 23.50 21.50 22.25 22.75 22.75 24.00 24.00 
23.00 22.00 23.25 22.00 23.25 22.50 23.50 23.00 
23.50 22.00 22.75 22.75 22.50 22.50 23.00 24.75 
22.50 22.00 24.00 22.75 23.75 23.00 24.75 25.50 
24.00 22.75 22.25 23.75 23.75 24.75 25.50 27.00 
22.50 22.50 24.25 23.75 24.00 25.00 27.25 26.75 
23.75 23.50 22.00 23.25 24.75 26.00 27.00 26.75 
Thermistor Temp: 26.13
Pixel Output: 
22.75 23.00 22.25 23.25 21.50 23.25 23.00 24.00 
21.75 23.50 22.25 23.50 21.25 22.25 23.00 24.00 
22.75 22.50 22.75 22.50 22.50 23.00 22.75 24.00 
23.00 22.00 22.75 23.00 23.50 23.25 22.75 25.75 
22.00 22.50 22.75 22.50 23.25 23.50 23.50 25.50 
28.75 23.00 26.50 24.25 28.00 24.50 29.75 26.25 
23.00 23.00 22.75 24.00 23.50 24.75 26.75 27.00 
22.50 24.00 23.50 22.75 23.75 25.25 25.75 26.75 
...

うん、だいたい合ってそうです。Pixel Outputの値が、Grid-EYEがどういう向きのときの値に対応しているかですが、仕様を参考にするに、

th_grid-eye_5

だいたいこの向きで向かい合ってこんな感じではないか。。。と思うのですが、すみません、まだ確認できていません。確認出来次第更新します。

 

ということで、Grid-EYEを動かすまでに結構手間取ってしまいましたので、取得したデータをクラウドに上げるのはまた次回とさせてください。ちなみに、これを書いている時点ではまだ成功していません。