この記事は Akerun Advent Calendar 2022 - Qiita の7日目の記事です。
3日目の記事も書きましたので、こちらもどうぞ。
WebエンジニアのBunです。
数年前からキャンプ🏕にハマっています。多い時は週一くらいでキャンプに行ってます。 最初はソロキャンですが、最近はよくグループで行きます。一人で静かに過ごすのも良いですが、みんなでワイワイするグループキャンプも楽しいです(夜は静かにしていますw)。
キャンプと言えば定番?のBBQですが、朝のホットサンドも格別お美味しいです。食パンにハームやチーズ、半熟目玉焼き...好きなものを色々挟んで、ホットサンドメーカーに乗せて、両面を数分ほど焼けば、美味しいサンドの出来上がりです。
しかし、こんな時もありますね。ホットサンドメーカーをコンロに置いたまま喋っているうちにこうなってしまいます。
何度も焼き加減をチェックするのも面倒なので、タイマー機能が付いているホットサンドメーカーならもっと手軽くいい感じに焼けるんじゃないかなと思って色々調べてみましたが、キャンプで使えるものは見つかりませんでした。残念。。。
なかったら作ります。ホットサンドメーカーではなく、後付けタイマーを。
アイディア
必須機能
- タイマーの設定、変更が可能
- 設定された時間になったら、alerm(音)での通知が可能
- ホットサンドメーカーをひっくり返した後、自動的にタイマー再設定が可能(これがないと、百均のタイマーを付けるだけで良いので)
- 後付けが可能(これは大事)
- IoTっぽく、WiFi/BLEでインターネット、あるいはスマホに繋げて、いろんなホットサンドメニューの焼き時間の設定が可能
オプション機能
材料準備
色々部品が必要だったので、作りながら数回分けてAmazonでポチりました。ブラックフライデーセールに間に合っていないのがちょっと残念です。
- マイコン:ESP32
- 各種センサー:6軸(加速度、ジャイロ)センサー、3軸磁気センサー
- 電子ブザー:電圧スピーカー(パッシブブザー)
- 各色発光ダイオード(LED)
- スイッチ:タクトスイッチ
- ボタン電池ホルダ:CR2032用
- ブレッドボード
- ジャンプワイヤ
- ユニバーサル基板
- はんだごてセット
- その他諸々
試作
マイコンのLチカの確認から各種センサー、ブザー、タイマーの確認が取れたので、簡単な回路図を作ってブレッドボードに各種部品を組み込みます。
回路図
各パーツ毎に確認しながら問題なく組み立てたので、回路図までは作りませんでした。後日、作ってみたいと思います。
ESP32
ESP32はESP-32S NodeMCUを購入しました。DEVKIT V1のピン配置になっています。今回は下記のピンを使いました。
#define BEEP_PIN 13 // ブザーBEEP音のピン #define BEEP_CHANEL 0 // BEEPのチャネル番号 #define LED_START 25 // 開始/終了LED用ピン #define LED_BIT4 26 // タイマー表示用LED(4bit目) #define LED_BIT3 27 // タイマー表示用LED(3bit目) #define LED_BIT2 14 // タイマー表示用LED(2bit目) #define LED_BIT1 12 // タイマー表示用LED(1bit目) #define SW_START 33 // 開始/終了スイッチ #define SW_TIMER 32 // タイマー設定スイッチ
6軸(加速度、ジャイロ)センサー、あるいは3軸磁気センサーはI2Cのピン22(SCL)とピン21(SDL)を使います。
各種センサー:6軸(加速度、ジャイロ)センサー、3軸磁気センサー
最初は6軸の加速とジャイロセンサーか、あるいは3軸磁気センサーでホットサンドメーカーのひっくり返しを判定しようと思いましたが、計算方法がやや複雑でしたので、シンプルに加速度のZ軸で判定するようにしました。
6軸(加速度、ジャイロ)センサーはMPU-6050を使いました。
void setup() { // SDA(GPIO21) / SCL(GPIO22) Wire.begin(); //I2C通信開始 // センサ開始動作 Wire.beginTransmission(0x68); //アドレス0x68指定でMPU-6050を選択、送信処理開始 Wire.write(0x6B); //MPU6050_PWR_MGMT_1レジスタのアドレス指定 Wire.write(0x08); //8を書き込むことでセンサ動作開始(Temp: disable) Wire.endTransmission(); }
Z軸加速度を取得し、0.9g前後でUP、-0.8gでDOWNとし、UP->DOWN、あるいはDOWN->UPになった時、ひっくり返しと判定しました。
void loop() { Wire.beginTransmission(0x68); //アドレス0x68指定でMPU-6050を選択、送信処理開始 // Wire.write(0x43); //GYRO_XOUT_Hレジスタのアドレス指定 Wire.write(0x3B); //ACCEL_XOUT_Hレジスタのアドレス指定 Wire.endTransmission(false); //false設定で接続維持 Wire.requestFrom(0x68, 6, 1); //MPU-6050に対して6byte分データ(accel)を要求、I2Cバス開放 int16_t ax, ay, az; //シフト演算と論理和で16bitのデータを変数に格納 //ax~gzまで、16bit(2byte) × 7 = 14byte ax = Wire.read() << 8 | Wire.read(); //x軸の加速度の読み取り 16bit ay = Wire.read() << 8 | Wire.read(); //y軸の加速度の読み取り 16bit az = Wire.read() << 8 | Wire.read(); //z軸の加速度の読み取り 16bit // 連続3回分の軸加速度を取得し、その平均値でUP/DOWNを判定 少し長いので、割愛 }
タイマー
シンプルに開始スイッチを押したら、タイマーを開始し、1分間隔のタイマーCallbackでTimeをカウントダウンします。 設定Timeが0になったら、ブザーを鳴らします。
void IRAM_ATTR onTimer() { if (timeCounter > 0) { timeCounter--; } // Timeを3bitを表すLEDで表現 setTimeLED(); } void startTimer() { timer = timerBegin(0, 80, true); timerAttachInterrupt(timer, &onTimer, true); timerAlarmWrite(timer, TRUN_OVER_TIME_UNIT * 1000000, true); timerAlarmEnable(timer); Serial.println("Timer started."); }
ブザー(BEEP音)
設定Timeが0になったら、BEEP音を鳴らします。
void makeBeep() { ledcSetup(BEEP_CHANEL, 12000, 8); ledcAttachPin(BEEP_PIN, BEEP_CHANEL); ledcWriteTone(BEEP_CHANEL, 820); delay(50); ledcWriteTone(BEEP_CHANEL, 0); // 消音 delay(50); ledcWriteTone(BEEP_CHANEL, 820); delay(50); ledcWriteTone(BEEP_CHANEL, 0); }
スイッチとLED
タクトスイッチ二つを用意し、Timeの設定とタイマー開始終了に使います。
ピンの数の制限もあって、とりあえず3つのピンにLEDを繋げて、二進数で最大7分(111b)の時間を表示します。4桁7セグメントLEDでも良かったなと後から気付きました。。。
void init() { // ピン情報設定 pinMode(SW_START, INPUT_PULLUP); // ボタンスイッチのピン番号と、入力(INPUT)を指定 pinMode(SW_TIMER, INPUT_PULLUP); // ボタンスイッチのピン番号と、入力(INPUT)を指定 pinMode(LED_START, OUTPUT); pinMode(LED_BIT1, OUTPUT); pinMode(LED_BIT2, OUTPUT); pinMode(LED_BIT3, OUTPUT); digitalWrite(LED_START, LED_OFF); digitalWrite(LED_BIT1, LED_OFF); digitalWrite(LED_BIT2, LED_OFF); digitalWrite(LED_BIT3, LED_OFF); // 3bitのLEDのON/OFF設定 setTimeLED(); }
組み立て完成
こうなりました。
Time設定スイッチで0~7分の時間を設定します。
タイマー開始スイッチでタイマーを開始し、設定された時間になりましたらブザーのBEEP音が鳴ります。 同時に加速度センサーが動作し、Z軸の加速度でひっくり返しを判定します。ひっくり返しになったら、BEEP音が止まって再度タイマーが開始します。これでホットサンドの両面が時間通りに焼けます。
ただ、このままだとホットサンドメーカーに後付けができないので、ユニバーサル基板にはんだ付けをします。小さい基板にそこそこの部品を配置しないといけないし、また久しぶりのはんだ付けなので、配線を考えたら想定以上の時間が掛かってしまいました。
特に不要な電源ケーブルを減らすために、ボタン電池を使えないか結構苦労しました。CR2032x2を多少無理やりに電池ケースに詰め込んで何度かギリギリ基板に付けることができました。
もう少し上手く配置できそうですが、まだ初心者なので、一旦下記で良さそうです。USB給電でもボタン電池給電でもなんと一発で想定通りの動作になりました🎉
ちょうどワールドカップ2022が始まっている時期に作り始めたので、ワールドカップを見ながらよなよな作っていました。今夜はグループステージのポルトガル最終戦。そして、明日は会社サークルでキャンプに行くので、そこでユーザーテストもしたく、今夜は最後の仕上げと後付け後のテストをします。
後付けと言えば弊社のスマートロックAkerun(サラッと宣伝w)。
明日までもう時間がないので、家の中を色々探したところ、ちょうど息子のポケモンカードが使えそうなので、数枚を両面テープでくっつけて基板を固定しました。そして、ホットサンドメーカーのハンドルに両面テープでくっつけます。
いざホットサンドを作って最終チェックです。弱火で両面それぞれ3分設定し焼きます。
あれ、ちょっとタイマーがおかしい。1分経っても2分経ってもTimeを表示するLEDが変わりません。さらに時間が経って、少し焦げた匂いがします。焦げてしまいました。。。
PCに繋げてデバッグしてみると、タイマーの単位が間違ってしまいました。ちゃんと動作することを確認し、再度コンロに載せました。片面の焼き時間になったらブザーが鳴り、ひっくり返しでブザーが止まり、タイマーが再開します。もう一面の焼き時間のブザーが鳴ったら出来上がりです。
これはまあまあ上手く出来ていますね!明日のキャンプ直前にホットサンド2個も食べちゃいました。。。
ユーザーテスト
山梨県の富士西湖近くのキャンプ場にやってきました。12月に入っているのにあんまり寒さを感じない良い天気でした。
翌朝、ホットサンドを作ってもらいました。ホットサンドの中身も火加減も変わったので、時間は2~4分の間で適当に設定しました。悪くない出来上がりです。焼き時間の忘れやスマホを出してタイマーを設定する手間は無くなりました。
ただ、両面テープで適当にくっ付けたので、ゆるゆるになってしまい、今後改善の課題になります。
また、「片面は3分、もう一面は2分とかできないの?」の要望も出てました。なるほど、パンに乗せる物によって焼き時間は異なる可能性がありますね。この発想はありませんでした。
※ちなみに、ボタン電池で上手く動作しなかったので、急遽モバイルバッテリからUSB給電にしたのがちょっと残念でした。
今後改善
あんまり余裕がなくて、大分手抜きで作ってしまいましたが、せっかくなので、来年こそキャンプで活用できるように改善していこうかなと思います。
- ちゃんとした後付けに改善する。百均で探せば色々あるはず。3Dプリンターも使ってみる。
- IoTっぽくWiFiで直接クラウドに繋げるか、BLEでスマホに繋げる。ホットサンドメニューによって最適な焼き時間を簡単に設定できるようにする。
- タイマー情報がもっと分かりやすく見えるようにLCDパネルを付ける。SPIピンがまだ残っているので、行けるはず。
- 温度センサーを付けて火加減によるタイマー設定をもっと簡単にする。
- ボタン電池で安定して給電できるようにする。
などなど色々発想が膨らんできます。
まとめ
数年ぶりにマイコンを触って、はんだ付けもして、やっぱり電子工作は楽しいですね。ただ、色々忘れてしまい、マイコンや回路についてもっと勉強が必要だなと実感しました。
これからもキャンプを楽しみながら改善していきたいと思います。来年のAdvent Calendarでは改良版を見せられたらなと思います。
株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co
Akerun Proにご興味のある方はこちらから akerun.com