M5Stackを用いたコーヒーメーカー制御装置の製作(カリタ ET-102に蒸らし機能追加)

概要

以下サイトにてコーヒーメーカー制御装置の製作記事が全4回掲載されており、コーヒーメーカーとしてET-102が使用されています。記事は部品リストやソフトプログラムが掲載されており実際に製作がしやすい内容です。(執筆者に感謝😃)


「ラズパイを使ったコーヒーメーカー制御装置の製作」
https://deviceplus.jp/hobby/coffee-maker-with-raspberry-pi-01/


丁度自分もET-102を持っていた事、記事の製作物に興味が沸いたので当初は記事通りにラズパイZERO W Hを用いて制御装置を製作しました。

f:id:Sa2raKitsune:20210620200011j:plain
記事通り作った物での実機テスト風景

しかし自分の目的はET-102に蒸らし機能を追加したいだけだったため、WEBブラウザからパラメータ変更する等の機能を省いた、より簡素な構成にすべくM5Stack Basicへの機能移植を行いました。

f:id:Sa2raKitsune:20210620200202j:plain
M5Stack版コーヒーメーカー制御装置

製作詳細

<製作動機>

リンク先記事の内容通りに製作すると、主な構成要素である秋月電子SSRリレーは置いておくとして、LEDやスイッチ、キャラクタ液晶を購入してユニバーサル基板への配線・半田付け作業が必要であり結構な作業量でした。しかしM5Stack Basicを使えば、SSRリレーユニットと電源ケーブルの製作を除けば殆ど作業不要で完成するってわけです。
更にラズパイはLinuxなのでシステム起動に時間がかかる上、遮断時に電源ぶつ切りするとmicroSDのデータ破壊が起こって起動しなくなる恐れがあります。コーヒーを淹れるのにラズパイ起動を待ってはいられないし、1日にせいぜい1~2回しか使わないコーヒーメーカーのためにラズパイ常時起動も省エネの観点から無駄に感じた所がM5Stackへの機能移植の動機です。

<ハード構成>

ハードは以下要素で構成しました。
価格は執筆時点でM5Stack以外の要素の詳細は元記事を御参照頂ければと思います。
ヒューズは色々調べた所、100V仕様で無くても電流値が同じ8Aなら機能上問題無いらしいので200V仕様を購入しました。

品名 型式(or 通販コード) 価格 製造元 入手先 備考
コーヒーメーカー ET-102 ET-102-BK 1 ¥3,360 カリタ ヨドバシ等  
M5Stack Basic M-16008 1 ¥4,565 M5Stack Technology Co., Ltd. 秋月電子  
ソリッド・ステート・リレー(SSR)キット 8Aタイプ K-06009 1 ¥660   秋月電子  
放熱器(ヒートシンク)46×25×17mm P-05050 1 ¥60   秋月電子  
ヒューズホルダー(パネル取付・ミゼット用) MF-525M P-07080 1 ¥75   秋月電子
ELPA ガラス管ヒューズ 20mm 250V 8A MF-2080H MF-2080H 1 ¥95 ELPA Amazon 2個入
縦型ラグ板 L-3552-3P P-11831 1 ¥80   秋月電子
ケース ??? 1 ??? 百均とか 適当に
NC-20H [片プラグ付耐熱コード12A] NC-20H 1 ¥481 ELPA ヨドバシ等 黒色
WH4615-BP [ベター小型コードコネクタボディ] WH4615-BP WH4615-BP 1 ¥78 Panasonic ヨドバシ等 黒色
¥9,454      


ちなみに今回の主要部品であるM5Stack BasicはESP32マイコンに液晶、ボタン、スピーカー、microSD端子等を詰め込んだユニットであり一見すると非常に便利なもの。
しかし実際に使ってみると分かりますが色々M5固有の問題(Basicでは特にスピーカー周辺)を抱えており、私には微妙な存在に映りました。Twitter等の熱狂的支持者に影響されて買ってしまうと肩透かしにあった気持ちになると思います。


さて、部品が揃ったらSSRリレーキットや電源ケーブルやヒューズホルダーを元記事に従って半田付け製作し、下図のように繋ぎます。

f:id:Sa2raKitsune:20210625100827j:plain
感電防止のため100VケーブルとSSRユニットはケース内に収納する。


M5StackとSSRを繋ぐ配線はM5付属のジャンパー線でよいと思います。
(ジャンパー線を複数持っていてどれがM5付属品だったか判別できないので適当に書いています。)


今回はM5Stack Basicの5番ピンをSSRの信号線として使うのでそこに繋ぎます。
f:id:Sa2raKitsune:20210625101009j:plain

<ソフト構成>

ソフトプログラムは元記事のpythonプログラムをM5Basic用にArduino IDEで書き換えて以下内容を追加しました。

  1. 1杯用抽出パラメータの追加(私は1杯だけ抽出する事もあるので)
  2. それっぽい画像表示(M5Stackのカラー液晶が勿体無かったので)


1杯用に限らず各カップ数での抽出パラメータは室温・水温等、環境で変わるものと思いますので、元の値に縛られず適宜変更したらよいと思います。2.の画像表示は蛇足ではありますが、せっかく液晶があるので画像表示を試みました。尚、M5StackはmicroSDの相性にうるさく、画像表示させるだけでも結構な時間を無駄にさせられたので、不要であればプログラムのjpg表示行をコメント化すればよいでしょう。

f:id:Sa2raKitsune:20210620204819j:plain
CoffeeUI.jpg


この画像は以下の著作権フリーサイトからダウンロードしたコーヒーカップの画像を改変したものです。改変・二次配布OKのようなので↑に載せておきます。
https://publicdomainq.net/coffee-drink-0032739/


さて肝心のプログラムは以下。
私はプログラマでもなく所々無作法かもしれないので適宜修正してください。

#include <M5Stack.h>

#define SSRPIN 5       // SSRの接続ポート番号(digital port)

// 各カップ数でのパラメータ[sec]:初期投入時間、蒸らし時間、抽出時間、ON時間、OFF時間
uint16_t wtimers[5][5] ={
  {50,40,200,20,10},
  {50,50,200,60,20},
  {68,50,480,60,20},
  {70,50,600,60,20},
  {74,50,600,60,0},
};

uint8_t cupsNum = 1; // グローバル変数 抽出カップ数

void setup() {
  // put your setup code here, to run once:
  
  pinMode(SSRPIN, OUTPUT); // PWM出力するpinを出力モードにする
  
  // M5Stack初期化関連
  M5.begin();
  M5.Power.begin();                  // 内蔵バッテリー駆動ON
  M5.Lcd.setBrightness(30);          // バックライトの明るさを0(消灯)~255(点灯)で制御
  M5.Lcd.setTextSize(2);             // 文字サイズの変更 (1~7)
  //M5.Lcd.loadFont("filename", SD); // フォント読み込み
  M5.Lcd.setCursor(0, 0);            // 文字表示の左上位置を設定
}

void loop() {
  // put your main code here, to run repeatedly:

  // jpg画像を表示(microSD直下にCoffeeUI.jpgを置くこと)
  M5.Lcd.drawJpgFile(SD, "/CoffeeUI.jpg", 0, 0);
    
  // ユーザーに珈琲抽出カップ数を選択してもらう関数呼び出し
  cupsHowMany();

  // 1st Step:蒸らしを行うため、ドリッパーへお湯を少量投入
  M5.Lcd.setCursor(0, 100);    //文字表示の左上位置を設定
  M5.Lcd.printf("1st Pouring...");
  ssr_pwm(wtimers[(cupsNum-1)][0], 1, 0);
  
  // 蒸らし時間、コーヒーメーカー電源をOFFにする。
  M5.Lcd.setCursor(0, 100);    //文字表示の左上位置を設定
  M5.Lcd.printf("Pre-infusion...");
  ssr_pwm(wtimers[(cupsNum-1)][1], 0, 1);
  
  // 抽出時間、コーヒーメーカー電源をデューティ比でON/OFF制御する。
  M5.Lcd.setCursor(0, 100);    //文字表示の左上位置を設定
  M5.Lcd.printf("Extraction...");
  ssr_pwm(wtimers[(cupsNum-1)][2], wtimers[(cupsNum-1)][3], wtimers[(cupsNum-1)][4]);

  M5.Lcd.setCursor(0, 100);    //文字表示の左上位置を設定
  M5.Lcd.printf("Done.");
}

void cupsHowMany(void){
  M5.Lcd.setCursor(0, 0);    //文字表示の左上位置を設定
  M5.Lcd.printf("How many cups do you want to brew?\r\n");

  // ボタンCが押されるまで無限ループ
  while(1){
    M5.update(); // ボタンの状態更新
    if(M5.BtnC.wasPressed()){
      break;
    }
    if(M5.BtnA.wasPressed()){
      cupsNum = cupsNum -1;
      if(cupsNum < 1){
        cupsNum =1;// カップ数が1以下になった場合は1のままに。
      }
    }
    if(M5.BtnB.wasPressed()){
      cupsNum = cupsNum +1;
      if(cupsNum > 5){
        cupsNum =5;// カップ数が5以上になった場合は5のままに。
      }
    }
    M5.Lcd.setCursor(0, 80);            //文字表示位置を(X,Y)=(0,50)に設定
    M5.Lcd.printf("-> %dCup(s)",cupsNum);
   }
}

// dulation[sec]期間、SSRをontime[sec]とofftime[sec]で定まるPWM制御する関数
void ssr_pwm(uint16_t dulation, uint16_t ontime, uint16_t offtime){
  uint8_t ssrState = HIGH;
  uint16_t pwm_time = 0; // pwm実行時間
  
  // 現在時間を記録
  unsigned long current_time = millis();  
  // 完了時間
  unsigned long completion_time = current_time + dulation*1000;
  
  while( current_time <= completion_time) {
    // duty比に従ってOFF状態を持続する
    if(ontime==0){  // ontime==0ならずっとOFF制御
      ssrState = LOW;
    }else if(offtime==0){  // offtime==0ならずっとON制御
      ssrState = HIGH;
    }else if( (ssrState == LOW) && (pwm_time >= offtime) ){ // OFFでOFF周期が来たらONに
      ssrState = HIGH;
      pwm_time = 0; // pwm_timeをゼロクリア
    }else if( (ssrState == HIGH) && (pwm_time >= ontime) ){ // ONでON周期が来たらOFFに
      ssrState = LOW; // OFF状態に移行
      pwm_time = 0; // pwm_timeをゼロクリア
    }

    // デバッグ用
    M5.Lcd.setCursor(0, 150);            //文字表示位置を(X,Y)に設定
    M5.Lcd.printf("-> time=%03d, end_time=%03d",current_time/1000,completion_time/1000);

   
    // SSRPINの状態をssrStateに書換
    digitalWrite(SSRPIN, ssrState);

    // 1秒待機
    delay(1000);
    
    current_time = millis();   // 現在時間current_timeの更新
    pwm_time = pwm_time + 1;   // 1秒毎に加算
  }
} 

おわりに

蒸らし時間等は室温、水温が変わるため、季節によって変化させる必要があると思います。
電子工作用の温度センサーは容易に入手可能なので、室温や水温を測って自動調整するのも面白いでしょう。


私はハリオV60珈琲王2も所有していますが、この制御装置とカリタ ET-102+V60ドリッパー(01型)を用いてプアマンズ珈琲王2を作れないか気になっています。
そのためには課題点が幾つかありますが、最も問題なのはM5Stack Basicの価格(執筆時点で約4,600円)が、実売3,000円台のコーヒーメーカー:ET-102より高い事だと思います。
ひとまずM5StickC plus(執筆時点で約2,900円)を使えばコーヒーメーカーよりは安くなるので、そちらで製作した方が安上がりに済んでよいかもしれないです。(上のM5Stack Basic用プログラムがそのまま動くかは怪しいのですが。)

もちろんArduino Nano互換機版等で製作すると(工数はかかりますが)安価に製作できると思います。


以上おわり