今回はです。これは何かって?ちっちゃなディスプレイの表示に注目。赤く手の平みたいなのが写ってますよね。実は16X4の赤外線非接触センサー1個だけで手の平を認識させてるんです。
今回は、楢の木技研製USBサーモグラフィーモジュールを使って見る。
以前、楢の木技研製 USBサーモグラフィーモジュールhttp://oaktree-lab.com/products/OTK-THG02.html
を入手していたので、今回はPyboardで結果の画像を表示させて見ます。このセンサーボードは、ネット上で売り出すとすぐ売り切れてしまうみたいで、たまたま在庫があった時に、手に入れたまま、ほったらかしにしてました。一応、製造元のLinuxドライバを使って、Edison のHenryボードで温度表示の確認ができました。
このセンサーは、16X4の解像度を持ち、今まで私のブログで紹介しているOMURON非接触センサー(D6T-44L-06)の4倍の解像度です。製造元の解説が不十分なので、マニア向けと言えますが、自分で実験しながら作り上げる面白さがあります。
温度測定範囲も解像度も趣味レベルでは申し分ないのですが、垂直視野が16.4度なので、OMURONとは違い、ソフト的に縦方向に広げて補間しても、限界がある点がチョットイマイチ。製造元の写真で見ても
こんな感じです。かなり見事な解像度に補間していますが、縦方向は寸づまりになってどうしようもありません。
今回は、「機械的に、この寸づまりをクリアしよう」という壮大な計画を立て、実験してみました。
内容はなんてことありません。模型用のサーボモーターで、16.4度本体を傾けて温度を測定。これを4回実行してソフトで合成すれば16X16の解像度になるのではという仮定の元、いつものように試行錯誤で頑張ってみました。
作り方
まず、センサーが5Vであることと、サーボがすぐ制御できて、おまけに結果をすぐ表示できるボードを探すことから。そうなんです。以前の記事からこれが使えるんです。takesan.hatenablog.com
問題は、センサーのシリアル信号が5Vなので、PyboardのCPUが壊れないかなのですが、今までの経験上、実験程度ならレベル変換をしなくてもあまり問題なかったので、そのま接続することにしました。
USBサーモグラフィーモジュール側の配線はこんな感じです。
シリアル出力に変更するため、基盤裏側のパターンにハンダを盛ります。
あとは、専用のケースに入れて、グルーガンでサーボへ仮止め
本体にはこんな感じで接続します。
後述するテスト用のプログラムを実行すれば。
てな感じで、レーダーみたいにくるくる回る超面白サーモグラフィーの出来上がり!!。センサーの初期値とサーボの角度値の調整で、4つの画像がなんとか自然につながるようになりました。ちょっとわかりにくいですが、私の5本の指の温度を感知して、ちゃんと表示してます。そして手のひらを握ったり開いたりしているのも確認できると思います。今回は16X16ドットそのまま表示しているので表示が荒いですが、各測点間を10〜20分割ぐらいで補間すれば、以前取り上げたOMURONの4X4でもかなり良かったので、実用レベルになるはずです。(ただしメカニカルなので動画には追従できませんが)
もっと工作精度を上げれば、今まで紹介してきたものの応用で、iPhoneか、Piで面白いサーモグラフィーができますぞっ。
今後の予定
もう還暦も過ぎたので、死ぬ前に最先端を一杯体感したい〜〜ということで、大奮発して3Dプリンタを注文(CEL-ROBOX)しました。実験がてら今回のサーモグラフィーの機械的な部品を作ることを目標にしてみようと思ってます。
3DプリンタをCEL-ROBOXにしましたが、精度と拡張性がかなり高い割には、海外での評価が大して良くありません。注文した理由は、イギリスで学校用に5000件分の発注があったそうなので、(少なくとも1万台は学校市場に流れる)今後の制御プログラムの修正頻度と本体の拡張性に期待したからです(かっこいいのが最大の理由かも)。やはり趣味なので、すべてパーフェクトでは面白くありません。こちらの記事も書く予定なので乞うご期待。
今回の練習プログラム
gfxライブラリは、以前の記事を確認してください。Pythonがあまりわからないのでプログラム内容は、幼稚です。ご勘弁を....。その代わり、どんなことをしているのか良くわかると思います。通信エラーが出て、たまに止まってしまいます。やはりレベル変換をした方が良いのかも知れません。
from pyb import Servo from pyb import UART from gfx import * import time gfx_cls() gfx_texfgcolor(0x8410) gfx_movecursor(0,0) gfx_putstr(" Thermography ?") gfx_movecursor(14,3) gfx_putstr("Max=") gfx_movecursor(15,3) gfx_putstr("Min=") ondo=[[0 for x in range(16)] for y in range(16)] s1 = Servo(1) uart = UART(3, baudrate=38400) uart.init(38400, bits=8, parity=None, stop=1,read_buf_len=1024) uart.write('\r\n') uart.readline() uart.write('SETF 80\r\n') uart.readline() uart.write('SETE 990r\n') uart.readline() for take in range(100): print('No= ',take) max1=-50 min1=300 avr=0 for j in range(4): s1.angle(j*17.4) time.sleep(0.4) uart.write('READ\r\n') for i in range(4): st=uart.readline() for k in range(16): sx=float(int(st[k*5:k*5+5]))/10 ondo[k][j*4+i]=sx avr=sx+avr if sx >= max1: max1=sx if sx <= min1: min1=sx uart.readline() print("max=",max1," min=",min1," avr=",avr/256) div=(max1-min1)/3 for ii in range(16): for jj in range(16): if ondo[ii][jj] <= min1+div: col=int((31/(div))*(ondo[ii][jj]-min1)) colx=RGB_color(0, 0, col) elif ondo[ii][jj] >= min1+div*2: col=int((62/(div))*(ondo[ii][jj]-min1-div*2)) colx=RGB_color(col, 0, 0) else: col=int((31/(div))*(ondo[ii][jj]-min1-div)) colx=RGB_color(col, col, 0) gfx_FillCircle(19+6*jj,15+6*ii,4,colx) gfx_texfgcolor(0xF800) gfx_movecursor(14,9) gfx_putstr(str(max1)) gfx_texfgcolor(0x001F) gfx_movecursor(15,9) gfx_putstr(str(min1))