ある日の出来事
(⌒▽⌒)「マカロンつくるお!」
(´ω`)「ええのう。がんばりや」
(⌒▽⌒)「マカロナージュしたお!」
(´ω`)「上手やのう。もう焼くんか」
(;^ω^)「(知らんのやな・・)最初に乾燥させるんやで」
(´・ω・`)「お、おう」
(-_-)zzz
(´ω`)「お昼寝かい。かわいいのう」
(^o^)「起きたお!」
(´ω`)「お、じゃあマカロン焼くんか?」
(・。・)「・・・」
:
:
٩(๑`^´๑)۶
٩(๑`^´๑)۶「乾燥しすぎや!何で起こさなかった!」
(;´Д`)「ええぇ・・・」
٩(๑`^´๑)۶「作り方おしえたやろがい!」
(´;ω;`)「知らんがな・・・」
(´;ω;`)「知らんがな・・・」
(´;ω;`)「もう怒られないようにIOTで見張ってもらおう・・・」
obnizによるマカロン監視
そんなこんなでマカロンの監視を自動的に行おうと考えていたところ、obnizコンテストを聞いて渡りに船と応募しました。
マカロンは焼成前に1時間ほどの乾燥が必要だそうですが、温度と湿度によって乾燥時間は大幅に変わるそうです。早く済ませたいときはドライヤーやサーキュレーターを使うそうですが、結局どのレシピも「指にくっつかない程度」になってからという、技術者にとっては曖昧な基準しか出していません。
「指がくっつかない程度」になるまで待ってなかなか乾かないと、何度も生地を触ることになり衛生上も精神衛生上もよくありませんし・・・
これを定量化して最適な乾燥状態になった時に教えてくれるセンサーを作れば冒頭の家庭内悲劇はおきなくなるだろうと思った次第です。ところが、
- 重量監視では思ったほど変化がない
- 表面の光散乱にも変化は分かりにくいし、マカロンの色と形に依存
という当初の目論見がうまくいかないことが分かってきました。ちょっと途方にくれましたが、結局
- 水分量を直接モニタリングすればいいじゃん
ということになりました。固形物の水分量モニター、そう、土壌水分モニターの利用です。
使用したデバイス
obniz 1Y
sensor
マカロンの水分モニタリング
まずマカロンの水分を計測するセンサーを用意します。今回は土壌水分センサーのXXXを用いました。ゲル状のマカロン生地の水分量をモニタリングする場合、センサーを生地に埋め込むと他のマカロンの状態と異なってしまいますし、何よりセンサーを取り除いた状態のマカロン生地を焼いても食べたいと思えません。
そこで、センサーにピッタリはまる台座を3Dプリンタで作成しました。マカロン生地の一つをこの上に載せてセンサーのアナログ出力から電圧変化を計測します。
obnizは5Vの電源を取り出せ、どのピンもVinにもGNDにもできるのでプロトタイピングはとても楽です。モニタリングを行うコードをNode.jsで実行し、解析を行いました。
水分量変化のモニタリング
const Obniz = require("obniz");
const OBNIZ_ID = "OBNIZ-ID";
const ACCESS_TOKEN = "YOUR_ACCESS_TOKEN";
const num_replicates = 3;
const interval = 30000;
const duration = 7200 * 1000;
let time_start;
async function wait(ms) {
return new Promise(r => setTimeout(r, ms));
}
async function monitor_voltage(obniz) {
let dt = Date.now();
let a2 = new Array();
let a3 = new Array();
obniz.io0.output(true);
obniz.io1.output(false);
for (let i = 0; i < num_replicates; i++) {
let v2 = await obniz.ad2.getWait();
let v3 = await obniz.ad3.getWait();
a2.push(v2);
a3.push(v3);
await wait(50);
}
obniz.io0.output(false);
obniz.io1.output(false);
return {time:dt, digital:a2, analog:a3};
}
async function sense_obniz() {
let ret = await monitor_voltage(obniz);
let line = (ret.time - time_start).toString();
for (let i = 0; i < num_replicates; i++) {
line += "\t" + ret.digital[i] + "\t" + ret.analog[i];
}
console.log(line);
if (ret.time - time_start > duration) {
running = false;
obniz.close();
}
if (running) {
setTimeout(sense_obniz, interval);
}
}
let obniz = new Obniz(OBNIZ_ID, {access_token:ACCESS_TOKEN});
obniz.onconnect = async function() {
time_start = Date.now();
running = true;
setTimeout(sense_obniz, 0);
};
obniz.onclose = async function() {
obniz = null;
running = false;
console.log("obniz stopped")
}
実際にマカロン生地をつくり、抵抗変化をモニタリングしました。図1−3はマカロン生地の水分量が中間的な場合、水分量が低い場合、高い場合です。抵抗値もその変化も条件によって変わってくることが分かります。水分量やセンサーに置かれた生地の広がりによって千差万別であることは予想できたことです。
従って抵抗値をしきい値にして決めるだけでは不十分です。また、かなりノイズが大きいデータであるため、土壌センサのデジタル部のように抵抗値をしきい値にするだけでは期待通りの動作をしないと考えられます。
生地の状態によって差はありますが、どの場合でも徐々にアナログの電圧が高くなっていることが分かります。水分量が多い=抵抗値が低いなので、期待した結果が得られていると言えるでしょう。
また、ノイズを除去して考えると、理想的なマカロン生地ではある時点で水分の喪失スピードが下がっていることがわかります。
おそらくここが相転移的な場所で、マカロンの表面が乾燥し、内部の水分が外気に放散されにくくなったポイントだと思います。ここを検出することができれば、最適なマカロンの乾燥ポイントが見つけられるように思います。
生地が理想状態でなくても、抵抗値の変化をモニタリングして最初よりも十分乾燥したポイントを見つけられれば十分乾燥したとして通知するアプリケーションを作成すればよい、という方針で作成しました。
放置可能なアプリケーション開発
マカロンの乾燥は数十分から数時間までかかります。この間家庭内でNode.jsサーバーを動かしているのは面倒ですし一々PCやラズパイを立ち上げると考えたらモチベーションが下がってしまいます。
他のマイコンと全く違うのは、obnizは本質的にステートレスなセンサーと考えてシステムを組み立てないといけないということです。これは一つの思想ですが、今回の目的では継続したモニタリングと変化の検出を行わなければならないので困ったことになります。マカロンの乾燥を始めて、現在の乾燥状態を評価するには最初どの程度水分を含んでいたかを覚えて置かなければいけないからです。
そのような場合、サーバー側に記録をもつことになるのですが、実行時間が限られ、ファイルやデータベースへのアクセスができないobnizクラウドでの実行では数時間に渡るモニタリングはできません。
そのため、今回はHerokuでサーバーを動かすことにしました。Herokuは30分に一回アクセスがあれば実行したままになってくれるので今回の目的には便利です。
コード
マカロンの状態を観測してセンサーの特性を調べるためのスクリプト
index.js
-
takaho
さんが
2021/05/16
に
編集
をしました。
(メッセージ: 初版)
-
takaho
さんが
2021/05/16
に
編集
をしました。
ログインしてコメントを投稿する