Arduinoで赤外線アレイセンサ「Grid-EYE」から2次元の温度データを取得する
Posted by arms22 on 2016年01月03日

Grid-EYEはPanasonicが開発した赤外線センサで8x8(64画素)の2次元の温度データを出力します(上写真、四角い窓の缶パッケージ)。視野角60度で広範囲の温度が計測できます。電子レンジやエアコン、また静止した人体の検出も可能なのでデジタルサイネージなどにも使われています。
とある伝でこのICのサンプルを頂いたのでサーモグラフィーを作ってみました。Grid-EYEで取得した2次元の温度データをProcessingを使って表示しています(詳細はサンプルコード2)。
回路

industrial.panasonic.com/cdbs/www-data/pdf/ADI8000/ADI8000CJ1.pdfより引用
Arduinoとの接続
2)SDA -- A4 または SDA
3)SCL -- A5 または SCL
4)INT -- 2番 または 3番
9)VDD -- 3.3V
6)GND -- GND
SDA/SCL/INT端子は10kΩの抵抗でプルアップします。その他のコンデンサ・抵抗は推奨回路どおり接続します。INTピンは割り込み信号を出力する端子です。設定した閾値を超えた時、または下回った時にLOWレベルを出力します。今回は使用しないので未配線でもOKです。電源はAMG883xなら3.3V、AMG885xなら5.0Vを接続します。
ライブラリ
Grid-EYEからピクセル毎の温度を読み込むためのライブラリを作りました。下記URLからzipファイルをダウンロードしてください。ライブラリをインストールするにはArduinoのメニューからスケッチ > Include Library > Add .ZIP Library...を選択し、先ほどダウンロードしたzipファイルを選びます。
arms22/GridEye
https://github.com/arms22/GridEye/archive/master.zip
サンプル1
Arduinoでピクセル温度データを読み込むサンプルです。サーミスタ温度とピクセル温度データを読み込み、シリアル通信で温度を文字列として送信します。シリアルモニタでサーミスタ温度とピクセル温度データが確認できます。サーミスタ温度を読み出す関数thermistorTemp()の戻り値はint型で1LSB=0.0625度です。ピクセル温度データを読み出す関数pixelOut()の第1引数には温度データを格納するint型配列を渡します。1LSB=0.25度です。
サンプル2
Processingを使ってサーモグラフを表示するサンプルです。Arduinoでピクセル温度データを読み込み、シリアル通信で1ピクセルを2バイトのshort型で下位バイト・上位バイトの順で送信します。温度データの送信前に2バイトのヘッダ(0x55、0xaa)をデータの区切りとして送信します。Processing側では130バイトのデータ(ヘッダ2バイト+ピクセル温度データ64*2)がバッファに溜まるのを待ちます。130バイト受信したらヘッダを受信したか確認します。ヘッダを受信したらピクセル温度データを変数に格納します。
受信したピクセル温度データはサーモグラフっぽく見せるために色と温度の対応を調整するのが結構大変でした。Processing側のコードはPythonで記述しています。
赤外線アレイセンサ Grid-EYE | 電子デバイス・産業用機器 | Panasonic
http://industrial.panasonic.com/jp/products/sensors/built-in-sensors/grid-eye
↓本格的なモノは結構高いですな。。
トウタク(Taotuo)赤外線サーモグラフィイメージングカメラ プロフェッショナル 産業業務用 液晶ディスプレイ 2%の精度
posted with amazlet at 16.01.03
Taotuo
Ads by Google
21 Comments
小売店では販売されていないようなので難しいと思います。
条件付きでもいいから小売りで買えるといいのですが、、
最近RSでも取り扱いはじまりましたね。
http://jp.rs-online.com/web/c/semiconductors/sensor-ics/proximity-sensor-ics/
http://jp.rs-online.com/web/c/semiconductors/sensor-ics/proximity-sensor-ics/
このコメントは管理人のみ閲覧できます
サンプル2の2つ目のスケッチはProcessing用でPythonで書いていいます。
ダウンロード直後のProcessingはjavaモードしかないのでPythonモードを追加してください。
たしか新しいスケッチを開いたあと、右上のプルダウンボタンからモードの追加でPythonモードのダウンロードが行えたはずです。。
ダウンロードが終わったらPythonモードに切り替えてスケッチを貼り付けてください。
下記の行は適宜書き換えてください。
1か2になると思います。たぶん。。
portIndex = 3 # 環境に合わせて変更してください
ダウンロード直後のProcessingはjavaモードしかないのでPythonモードを追加してください。
たしか新しいスケッチを開いたあと、右上のプルダウンボタンからモードの追加でPythonモードのダウンロードが行えたはずです。。
ダウンロードが終わったらPythonモードに切り替えてスケッチを貼り付けてください。
下記の行は適宜書き換えてください。
1か2になると思います。たぶん。。
portIndex = 3 # 環境に合わせて変更してください
すぐに御回答頂いたようでありがとうございました.
いま,気が付きました.
仰るとおりに動かしているつもりですが…
なんせ,まったくの初心者でして…
こちらでは,com8になるのですが,それをarduinoが専有したまま,Processingの方からそのデータを読めるのでしょうか?
基本的にやり方が間違っているのかも知れませんが…
grid_eye_view.inoを動かしたままgrid_eye_view.pydeを動かすのですよね.
なお,read_grid_data.inoは正常にデータを読み込んでくれています.
どうか,よろしくお願いいたします.
いま,気が付きました.
仰るとおりに動かしているつもりですが…
なんせ,まったくの初心者でして…
こちらでは,com8になるのですが,それをarduinoが専有したまま,Processingの方からそのデータを読めるのでしょうか?
基本的にやり方が間違っているのかも知れませんが…
grid_eye_view.inoを動かしたままgrid_eye_view.pydeを動かすのですよね.
なお,read_grid_data.inoは正常にデータを読み込んでくれています.
どうか,よろしくお願いいたします.
arduinoからProcessingにグリッドデータをシリアルポート経由で送っています。
grid_eye_view.pydeがシリアルポートを開けなくなるので、
arduino ソフトウェアのシリアルモニタは閉じてください。
grid_eye_view.pydeがシリアルポートを開けなくなるので、
arduino ソフトウェアのシリアルモニタは閉じてください。
たびたびすみません.
牛歩のあゆみですが…
arduino ソフトウェアのシリアルモニタは閉じています.
portIndex = 8 # 環境に合わせて変更してください > となっています.
print "Connecting to", Serial.list()[portIndex]
この行が黄色く表示されます.
array(java.lang.String, [u'COM8'])
Connecting to
processing.app.SketchException: IndexError: index out of range: 8
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
というエラーが表示されます.
これでなにか原因がわかりますでしょうか?
よろしくお願いいたします.
牛歩のあゆみですが…
arduino ソフトウェアのシリアルモニタは閉じています.
portIndex = 8 # 環境に合わせて変更してください > となっています.
print "Connecting to", Serial.list()[portIndex]
この行が黄色く表示されます.
array(java.lang.String, [u'COM8'])
Connecting to
processing.app.SketchException: IndexError: index out of range: 8
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
というエラーが表示されます.
これでなにか原因がわかりますでしょうか?
よろしくお願いいたします.
そのエラー出力の前にポートの一覧が表示されていると思います。
その中からcom8が何番目か調べてください。
調べたらその番号を portIndex に代入してください。
com8だからといって8とは限らないようです。
その中からcom8が何番目か調べてください。
調べたらその番号を portIndex に代入してください。
com8だからといって8とは限らないようです。
御教示ありがとうございます.
実は,1から順に18位まで試してみたのですが,同様でした…
私には無理なのかもしれません.
実は,1から順に18位まで試してみたのですが,同様でした…
私には無理なのかもしれません.
お付き合いありがとうございます.
公開の場所ですみません.
0もやってみました
>シリアルポート
ですが,エラーは次がすべてで,18しか表示されないようです.
array(java.lang.String, [u'COM18'])
Connecting to COM18
processing.app.SketchException: java.lang.NullPointerException
at processing.core.PImage.set(PImage.java:884)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:186)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204)
at org.python.core.PyObject.__call__(PyObject.java:515)
at org.python.core.PyObject.__call__(PyObject.java:521)
at org.python.core.PyMethod.__call__(PyMethod.java:171)
at org.python.pycode._pyx11.draw$2(grid_eye_view.pyde:85)
at org.python.pycode._pyx11.call_function(grid_eye_view.pyde)
at org.python.core.PyTableCode.call(PyTableCode.java:167)
at org.python.core.PyBaseCode.call(PyBaseCode.java:124)
at org.python.core.PyFunction.__call__(PyFunction.java:403)
at org.python.core.PyFunction.__call__(PyFunction.java:398)
at jycessing.PAppletJythonDriver.draw(Unknown Source)
at processing.core.PApplet.handleDraw(PApplet.java:2418)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1540)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
公開の場所ですみません.
0もやってみました
>シリアルポート
ですが,エラーは次がすべてで,18しか表示されないようです.
array(java.lang.String, [u'COM18'])
Connecting to COM18
processing.app.SketchException: java.lang.NullPointerException
at processing.core.PImage.set(PImage.java:884)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:186)
at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:204)
at org.python.core.PyObject.__call__(PyObject.java:515)
at org.python.core.PyObject.__call__(PyObject.java:521)
at org.python.core.PyMethod.__call__(PyMethod.java:171)
at org.python.pycode._pyx11.draw$2(grid_eye_view.pyde:85)
at org.python.pycode._pyx11.call_function(grid_eye_view.pyde)
at org.python.core.PyTableCode.call(PyTableCode.java:167)
at org.python.core.PyBaseCode.call(PyBaseCode.java:124)
at org.python.core.PyFunction.__call__(PyFunction.java:403)
at org.python.core.PyFunction.__call__(PyFunction.java:398)
at jycessing.PAppletJythonDriver.draw(Unknown Source)
at processing.core.PApplet.handleDraw(PApplet.java:2418)
at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1540)
at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
setup()を下記の1行のみに変更してその結果を教えてください。
print Serial.list()
arduinoが接続されているシリアルポートを正しく指定できていないように思います。
ちなみにcom18にarduinoが接続されているのでしょうか。
print Serial.list()
arduinoが接続されているシリアルポートを正しく指定できていないように思います。
ちなみにcom18にarduinoが接続されているのでしょうか。
と思ったけど、draw()の中で例外吐いてるのかな。。
draw()の処理1つ1つにprint文を入れてどこまで処理が進んだか確認してみてください。
これでどこで問題が起きているかわかると思います。
draw()の処理1つ1つにprint文を入れてどこまで処理が進んだか確認してみてください。
これでどこで問題が起きているかわかると思います。
お世話になっております.
comが増えすぎたので削除して,現在com3です
>setup()を下記の1行のみに変更してその結果を教えてください。
>print Serial.list()
エラーは
array(java.lang.String, [u'COM3'])
processing.app.SketchException: NameError: global name 'myPort' is not defined
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
となります.
com3をモニターすると,
ronngtuvtrqqosursqpqptttuttqnstrspqqqpprqqqnkUェvurtolbcvtsrpnhbrurspolhtutssppmttsrsqnprsrtsqopssrqqqsnrpqpoponUェwwtrqmaavtrsoohcsssrqpmhtttsqrnnsttsrpqqtrsssqqotsrtqpqorqqpqnnnUェxwtrsoedvusspnjftutsropnvsutrqqprtstqqqouqsvsrppussqqqrqpqqsrnqoUェ
のような,英字の文字列が出力されています.
なんか,ちがいますよね.
数字が出ると思うのですが…
もちろんProcessingのときは切っています.
comが増えすぎたので削除して,現在com3です
>setup()を下記の1行のみに変更してその結果を教えてください。
>print Serial.list()
エラーは
array(java.lang.String, [u'COM3'])
processing.app.SketchException: NameError: global name 'myPort' is not defined
at jycessing.mode.run.SketchRunner.convertPythonSketchError(Unknown Source)
at jycessing.mode.run.SketchRunner.access$300(Unknown Source)
at jycessing.mode.run.SketchRunner$3.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
となります.
com3をモニターすると,
ronngtuvtrqqosursqpqptttuttqnstrspqqqpprqqqnkUェvurtolbcvtsrpnhbrurspolhtutssppmttsrsqnprsrtsqopssrqqqsnrpqpoponUェwwtrqmaavtrsoohcsssrqpmhtttsqrnnsttsrpqqtrsssqqotsrtqpqorqqpqnnnUェxwtrsoedvusspnjftutsropnvsutrqqprtstqqqouqsvsrppussqqqrqpqqsrnqoUェ
のような,英字の文字列が出力されています.
なんか,ちがいますよね.
数字が出ると思うのですが…
もちろんProcessingのときは切っています.
シリアルポートは1つだけみたいなので
portIndex = 0
でよさそうですね。
portIndex = 0
としたときのエラーは上記だとした場合、
Processingのバージョンか環境要因によるものかもしれませんね。。
> なんか,ちがいますよね.
> 数字が出ると思うのですが…
> もちろんProcessingのときは切っています.
あっています。
2byteの整数値を送っているのでシリアルモニタで開くと文字化けします。
portIndex = 0
でよさそうですね。
portIndex = 0
としたときのエラーは上記だとした場合、
Processingのバージョンか環境要因によるものかもしれませんね。。
> なんか,ちがいますよね.
> 数字が出ると思うのですが…
> もちろんProcessingのときは切っています.
あっています。
2byteの整数値を送っているのでシリアルモニタで開くと文字化けします。
このコメントは管理人のみ閲覧できます
このコメントは管理者の承認待ちです
Leave a reply
該当の記事は見つかりませんでした。