オムロンのセンサとArduinoとProcessing on ネットブック with WinXp
私の職場の高専では、6月下旬から課外活動も徐々に再開しています。ただし、活動前に体温計測が義務付けられています。
そこで、研究室にあったWinXPのネットブックと非接触赤外線センサ(OMRON MEMS非接触温度センサD6T-44L-06)をつかって非接触の検温器をつくってみました。
顔表面の温度を測るので、外気温の影響を補正しないといけないのですが、そこは、NEC技研に掲載されていた実験結果の図を使って学生達に補正してもらうことにしました。
パソコンの横に気温計を設置する必要がありますが。
失敗は、数多くありました。一番、大変だったのが、WinXPのノートブックにArduinoをUSB認識させ、サンプルプログラムのProcessingのCOMポート指定の克服ですね。
やっと完成しました。学生さんたち、使ってくれるだろうか。。。
外観等
写真外観
Arduinoとセンサの筐体は蓋面に両面テープで貼り付けています。
動作画面とセンサ部分です。
このセンサは4x4のセルで計測温度を表示してくれます。非常に画素のあらいサーモグラフィですね。センサ部に顔を近づければ、全セルが34~5度になります。
離れて立っても顔のあたりの温度が、34~35度になりました。
計測方法を示す図
# ハード構成
- NetBook EeePC (OS WindowsXP←もちろん、インターネットには接続していません)ASUS Eee PC 901 メモリ 1GB SSD 16GB
- OMRON MEMS非接触温度センサD6T-44L-06
- Arduino UNO
Arduino UNOのプログラム
Arduino UNO のプログラムはスイッチサイエンスさんの「MEMS温度センサを使おう」ページを参考にしました。
このページの「// D6T-44L test program for Arduino // D6T_test_Arduino.ino // 2013/03/27 http://www.switch-science.com 」をそのまま使わせてもらいました。
ネットブック上のプログラム
- OS はWindowsXPです。使いみちのないネットブックですが、小型なのでなにかに使えると思って、捨てずにおいてありました。ストレージはSSDです。
- ProcessingはWin 32bit版をダウンロードすれば使えました。
- Arduinoを認識させるためにnon admin用のArduinoIDEをインストールしました。
- Processingのプログラムも上のページを参考にしました。
- 変更箇所は、11行目のポート番号のところです。リストでCOMに接続されている番号がコンソールに出力されるので、ポート番号を示す、リストの順番(一番目は0です)を書く必要があります。私の場合は、COM8で、リストの2番目に表示されたので、1を指定しました。
- 温度は16エリアの中の最大値を計測値にしています。
- 表示部の大きさを変えて、一番上に最大値を計測値として表示するようにしました。
- 以下がリストです。
/*
D6T-44L test program for Processing
2013/03/26 www.switch-science.com
2020/07/05 https://www.youtube.com/channel/UC41qeaw-dXNdl0puKkXiuKA/
*/
import processing.serial.*;
float[] tdata = new float[17]; // 温度を入れる配列(PTAT込みで来ることも考えて17要素分確保)
float tptat; // PTAT
float tmax; // Taion
String portName; // シリアルポート名
int serialport = 1; // 接続するシリアルポート番号を指定する
// Macの場合、/dev/tty.*のポートを選択してください。
String buf; // 受信バッファ
color[] tcolor = {#400040,#000080,#006060,#008000,#C0C000,#E0A000,#E00000,#F08080}; // 色テーブル
Serial myPort; // Create object from Serial class
void setup() {
size(480,600);
println(Serial.list());
portName = Serial.list()[serialport];
myPort = new Serial(this, portName, 9600);
myPort.clear();
}
void draw() {
myPort.write(0x01); // データのリクエストをする
delay(100); // 100ms待つ(すぐにシリアルポートの受信チェックをしないため)
while (myPort.available() > 0) { // シリアルポートにデータが来ていたら
delay(300); // 300ms待つ(データ全体が送信されるのを待つため)
buf = myPort.readString(); // 受信
myPort.clear(); // シリアルポート受信バッファのクリア
tdata = float(split(buf, ',')); // データをカンマで分割し、floatで配列に格納
tmax = 0.0;
for (int i = 0; i < 16; i++) { // 各エリアごとに色を設定し、四角を描画する
if ( tmax < tdata[i] ){ tmax = tdata[i]; }
if (tdata[i] < 0) {
fill(tcolor[0]);
} else if (tdata[i] < 5) {
fill(tcolor[1]);
} else if (tdata[i] < 10) {
fill(tcolor[2]);
} else if (tdata[i] < 15) {
fill(tcolor[3]);
} else if (tdata[i] < 20) {
fill(tcolor[4]);
} else if (tdata[i] < 25) {
fill(tcolor[5]);
} else if (tdata[i] < 30) {
fill(tcolor[6]);
} else {
fill(tcolor[7]);
}
rect((i % 4)*120, (i / 4)*120+60, (i % 4)*120+120,(i / 4)*120+120+60);
if (tdata[i]<5) {fill(255);} else {fill(0);}
textAlign(CENTER, CENTER);
textSize(20);
text(str(tdata[i]),(i % 4)*120+60, (i / 4)*120+60+60);
}
rect(0, 0, 480,60); fill(255);
textAlign(CENTER, CENTER);
textSize(32);
text(str(tmax),240, 30);
}
}
コスト概算
概算は、12,000円ぐらいですね。
なお、M5Stackで同じようなものを作れるみたいです。
- センサ 7150円
- ArduinoUNO 3300円
- ASUS Eee PC 901 メモリ 1GB SSD 4GB ヤフオクで2200円ぐらい