ProjectSR が 2025年04月27日20時24分22秒 に編集
コメント無し
本文の変更
🔳概要・基本構成 --- ①ホームセンターにあるフライパンとカセットコンロを使用 アルミフレームはNICオートテックより購入 電子工作でおなじみArduinoを使用 ②上記①を組み合わせて、加熱調理ロボット的な装置を構成 ③今回は試しにお米を炊いてみる 🔳解説 --- Youtube解説動画 @[youtube](https://www.youtube.com/watch?v=uPTTTmqnIbE) ニコニコ動画解説 https://www.nicovideo.jp/watch/sm44920465 ポイント --- ●Arduinoでカセットコンロの火力制御 ●フライパンも使って、半自動加熱調理 今回はお米 火力調整は、点火、中火、弱火、消火を時間計測で切り分け ●カセットコンロは改造せず、ハンドルに外付けの回転・点火機構を搭載 ●ハンドルの回転位置を、可変抵抗で読み取り ●9V乾電池を使用 リチウムイオンバッテリーは不使用(火を使うのでなるべく使用避けたい) 特殊な機材は不要で、ホームセンターで売られているものでも使用できます。 1⃣本体ハード --- 本体の外観はこのようになっています アルミフレームはNIOCオートテックから購入 ジョイントアングル材もNICで購入可能ですが、3Dプリンターで造形してコストを抑えています  ギアボックス構成 モータ~可変抵抗  ギアボックス 可変抵抗~カセットコンロハンドル 可変抵抗とハンドルは同軸上に配置されています。 可変抵抗は秋月電子にて販売されています これで、回転位置を読み取り、火力調整が可能になります  2⃣電気電子回路 --- 外観はこのようになっています  ただこれだとどうつながっているか全くわからないと思うので、簡易的な回路図がこちらになります (クリック推奨です)  モータドライバーはMDD3Aという、タクトスイッチが搭載されたものを使用しています。 これで、Arduinoを接続しなくても、電力を供給していれば、タクトスイッチを押して モータを回転させ、火力調整の事前確認であったり、 コンロでトラブルがあった際に、Arduinoの電源を切って、モータドライバーのスイッチを押して コンロのハンドルを消火位置まで回転できます(配線が生きていればですが・・・) 3⃣プログラム --- ```html const int INPUT_PIN = A1; int pin3 = 3; int pin5 = 5; int VOLUME; int timec; enum State { IDLE, IGNITION, ADJUST_FIRE, COOKINGS, COOKINGF, FINISHED }; State currentState = IDLE; unsigned long stateStartTime = 0; void setup() { Serial.begin(9600); pinMode(pin3,OUTPUT); pinMode(pin5,OUTPUT); } void loop() { unsigned long currentMillis = millis(); VOLUME = analogRead(INPUT_PIN); // アナログ値の読み取り int angle = map(VOLUME,0,1023,0,180); Serial.print("angle: "); // シリアルモニタに出力 Serial.println(angle); Serial.print("モード: "); // シリアルモニタに出力 Serial.println(currentState); switch (currentState) { case IDLE: Serial.println("待機中..."); if (digitalRead(12) == LOW) { // スイッチが押されたら開始 analogWrite(pin3,0); analogWrite(pin5,0); currentState = IGNITION; } break; case IGNITION: if(angle>135){ Serial.print("ハンドル回転"); Serial.println(angle); analogWrite(pin3,0); analogWrite(pin5,100); stateStartTime = currentMillis; } else{ Serial.println("点火中..."); Serial.println(angle); analogWrite(pin3,0); analogWrite(pin5,0); if ((currentMillis - stateStartTime)/1000 >= 3) { // 3秒経過 Serial.println("点火完了"); currentState = ADJUST_FIRE; } } break; case ADJUST_FIRE: if(angle<163){ Serial.println("火力中火調整モード"); Serial.println(angle); analogWrite(pin3,100); analogWrite(pin5,0); stateStartTime = currentMillis; } else{ Serial.println("中火維持 調理中"); Serial.println(angle); analogWrite(pin3,0); analogWrite(pin5,0); if ((currentMillis - stateStartTime)/1000 >= 240) { Serial.println("中火終了"); currentState = COOKINGS; } } break; case COOKINGS: if(angle<166){ Serial.println("火力弱火調整モード"); Serial.println(angle); analogWrite(pin3,100); analogWrite(pin5,0); stateStartTime = currentMillis; } else{ Serial.println("弱火維持 調理中"); Serial.println(angle); analogWrite(pin3,0); analogWrite(pin5,0); if ((currentMillis - stateStartTime)/1000 >= 300) { Serial.println("弱火終了"); currentState = COOKINGF; } } break; case COOKINGF: if(angle<174){ Serial.println("消火開始"); analogWrite(pin3,100); analogWrite(pin5,0); } else{ analogWrite(pin3,0); analogWrite(pin5,0); Serial.println("消火完了"); currentState = FINISHED; } break; case FINISHED: analogWrite(pin3,0); analogWrite(pin5,0); Serial.println("炊飯完了!"); while (true); // 停止 break; } delay(100); } ```
各火力調整の概念ですが、 よくある料理はハンドルやレバーを調整してから、中火で~分というように 調整し終えた時を0秒としてカウントしていると思います  今回のコードでは、ArduinoのスイッチをONにした瞬間を0secとして ハンドルを特定の位置に達した瞬間を記憶しつつ、引き続き時間計計測を実施 そして、計測時間と、ハンドル位置に達した時間の差分をとって、中火、弱火の時間が今どれくらいなのかを 判断して、制御を行っています。 
もし何かご質問がありましたら、コメントをください |部品名|購入先| |---|---|---| |Arduino uno|秋月電子通商orマルツパーツor千石電商| |可変抵抗|秋月電子通商orマルツパーツor千石電商| |マイクロスライドスイッチ|アマゾン| |Arduinoシールド|アマゾン| |配線|ホームセンタ| |9V乾電池|ホームセンター| |カセットコンロ|ホームセンタ| |フライパン|ホームセンター| |アルミフレーム|NICオートテック|