編集リクエストは記事の情報を改善するために、内容の変更を依頼できる仕組みです。
受理するかどうかは自由ですので、発信したい情報に近づくかどうかを意識して、記事編集の判断のご協力をお願いします。
本文の変更
# きっかけ 寒い季節になると毎日ヤカンで1.5Lほどのお茶を沸かして飲む生活をしているのですが、 ヤカンの口に付いた笛がなるぐらいまで沸かすと熱すぎてすぐ飲めないので、 「Siriで6分のタイマーをセットして、時間になったら自分がコンロの火を消しに行く」という形でちょうどいい温度のお茶を沸かすということをしていました。 しかし、タイマーをセットするのも、時間になったら火を消しに行くというのも面倒です。 特にコロナ禍で在宅勤務が主となり、作業や会議に集中するために上記の火を消す作業を自動化したいと考えていました。 # 注意 本記事には、安易に真似をしたり良くない使い方をした場合に事故につながる可能性のある事柄が書かれています。 真似をする際には、その場から長時間離れたりせず、最悪の場合でもヤカンの笛が鳴っていることに気づいて火を消しに行けるような状況のもとで、自己責任で行ってください。 # 構想 もちろんガスコンロにはAPIが用意されていないので、どうにかして人間が火を消すのと同じ動作ができる装置を作ることになります。 そこでまず「ガスコンロのノブをどうひねるか」ということを考えていきました。  ## 既存製品の調査 「コンロ ノブ 自動」などで検索してみると、海外の以下のような製品が見つかりました。 - https://www.kickstarterfan.com/archives/24344 - https://www.kickstarterfan.com/archives/7042 既存のノブを外して「バッテリーを内蔵しスマホと通信できる装置」を取り付けるという仕組みであることがわかります。 しかしこれを自分で作ろうとした場合、以下のような懸念点が思い浮かびました。 - 熱にさらされる場所にバッテリーやパーツをずっと置いておくのは危険そう - バッテリー駆動での電源周りのことを考えたくない - スマホと連動させる気はない(単体でタイマーとして動作してくれれば良い) そこでひとまず「ガスコンロのノブは取り外しできる」という知識をもとにして他の方法を探ることにしました。 ## 実際にノブを外してみる マイナスドライバーを差し込んで下から持ち上げてやると少しずつ持ち上がっていきます。 そのまま外してみるとパーツは以下のようになっていることがわかりました。  また、ノブは根元まで完全に押し込まなくても正しく動作することがわかりました。 つまり、通常より数ミリ持ち上げた位置に付いていても操作には問題ないということです。 そこで「ノブの底面に歯車の付いたパーツを追加して、その歯車を回す装置を使用のたびに外側から取り付ける」という方針で設計していきました。  もともと持っていたジャンクパーツの中にちょうどいいサイズのギアードモーターがあったので。これを使うことに決めました。 ## ノブの底面に歯車を追加する Fusion 360でパーツを設計し、3Dプリンターで出力しました。 ノブの裏側の形状にパチッと合うようにしてあります。  ## モーター側のパーツも作る ノブの歯車と噛み合う「モーター側の歯車」と「モーターを支える土台」も作りました。 まずは単純にM5Atomから5Vを供給してみて干渉せず歯車が回ることが確認できました。  ## 2つの歯車が噛み合うように土台を作る ノブが取り付けられた面は少し傾斜しており、キッチン台との段差もあります。 そこを埋めるようなパーツも作って、モーターを支える土台の下に追加しました。  ## 取り外しと位置調整が容易になるように磁石を取り付ける 歯車が噛み合うようにはなったのですが、その位置に毎回上手く固定されなくてはいけません。 そこでネオジム磁石をコンロ側と装置側それぞれに接着し「狙った位置への取り付け」「(モーターの動きに負けずに)固定」「使用後の取り外し」が可能になるようにしました。  (対象が金属であれば頑張れば取れる接着剤を使用しています) ## 回路とコード 今回はモーターの速度を気にする必要がなく、火を消す方向にしかノブをひねらないので、モータードライバーは不要です。 また、取り付け位置をスッキリさせるためにM5Atomのgroveコネクタ部分を使いたかったので、 groveコネクタの「G(Ground)」と「G32ピン」を使い、単純にdigitalWriteでHIGHを出力してモーターを回すようにしました。 そしてタイマーの時間設定は6分固定で良いため、以下のようなコードをArduino IDEで書いてM5Atomに書き込みました。 ```arduino #include <M5Atom.h> const int PIN = 32; const int DEFAULT_COUNT = 360; int count = 0; void setup() { M5.begin(true, false, true); delay(50); M5.dis.drawpix(0, 0xf00000); pinMode(PIN, OUTPUT); count = DEFAULT_COUNT; digitalWrite(PIN, LOW); } void loop() { // 終了 if (count <= 0) { return; } M5.update(); // 1秒ずつ処理 delay(1000); M5.dis.clear(); // 分の表示(1マス1分) int m = min(count / 60, 5); for (int i = 0; i < m; i++) { M5.dis.drawpix(i, 0xff0000); } // 秒の表示(1マス3秒) int s = round((float)(count % 60) / 3); for (int j = 0; j < s; j++) { M5.dis.drawpix(5 + j, 0xffff00); } Serial.println(count); if (count > 0) { count--; } if (count == 0) { // 時間になった digitalWrite(PIN, HIGH); delay(10000); digitalWrite(PIN, LOW); } } ``` 緑色で点いているLEDひとつが1分を表し、黄色で点いているLEDひとつが3秒を表すようにして、残り時間が見えるようにしてあります。 終了時に音が鳴るといったギミックも案として考えられますが、音で気づいたとしても特に人間がすることは無いので盛り込みませんでした。 # その他工夫した点 ## ノブの回しすぎを考慮しなくて良い構造
https://twitter.com/Moyashipan/status/1365002529944207367
@[twitter](https://twitter.com/Moyashipan/status/1365002529944207367)
こちらの動画を見てもらうとわかるのですが、 もともとガスコンロのノブは「火が消える位置までひねるとノブが持ち上がる」ようになっています。 それを利用して「ノブが持ち上がったら歯車が空転するような厚さ・高さ」にパーツを調整してあります。 これにより、ノブの回しすぎなどを気にする必要がなく「途中でノブが持ち上がって歯車が空転しているだろうから、十分な時間モーターを回せば良い」という風に考えれば良く、 全体的にシンプルな構造になっています。 ## インクリメンタルなパーツ出力 パーツを設計し3Dプリンターで出力するにあたって、ガスコンロ・ノブ・ギアードモーター・M5Atom・磁石など、すでに現実にある物と上手く合うかを考慮して調整しながら作る必要がありました。 その際、全体をひとつのパーツとして出力しようとすると、継ぎ目などが無くなるのは良いのですが、 途中の工程で上手く合わない部分が出てきた時に毎回全体を出力しなくてはいけなくなってしまい、 最後の工程に近づくにつれて3Dプリンターがパーツを出力するまでの待ち時間がどんどん長くなってしまいます。 そこで、以下の写真からもわかるように、輪切りになったパーツを接着したり、フタとなるパーツで固定したりという風にして、 「すでに成功したパーツに他のパーツを接着していく」「ある段階のパーツ設計で失敗しても、その失敗した部分のパーツだけ再出力すればいい」という作り方を意識しました。  これにより、3Dプリンターでの出力時間が1回20分〜1時間で済むようになり、 すでに成功したパーツに手を加えなくて済んだため、ストレス無くスムーズに制作ができました。 # さいごに 今回、電子工作的な面では「M5Atomにモーターをつないだだけ」というとてもシンプルな物となりましたが、 「現実にある物に上手く合わせて、面倒なことをしなくて良いように全体を設計する」という工作の面白さを感じられるような制作内容になったと感じています。 また、繰り返しとなりますが 本記事には、安易に真似をしたり良くない使い方をした場合に事故につながる可能性のある事柄が書かれています。 真似をする際には、その場から長時間離れたりせず、最悪の場合でもヤカンの笛が鳴っていることに気づいて火を消しに行けるような状況のもとで、自己責任で行ってください。