/HTCPCPwithBARISTA

Implementing HTCPCP with Barista

Primary LanguageC++

バ○スタの解析とHTCPCPの実装

  • バ○スタはI2Cで制御できる。なので、HTCPCP対応にした。
  • 本README.mdをしっかりさせた版は、C91 1日目 西み-20a SIGCOWW にて頒布

はじめに

バ○スタって何かな?

  • ネスカフェ ゴールドブレンド バリスタ PM9631

HTCPCPって何かな?

  • RFC2324
  • ジョークRFC

解析

全体はこうだよ

  • メイン基板がある
    • こいつがヒーターやポンプを制御する
    • STM8Sが使われている
  • 操作パネルがある
    • こいつでメイン基板を操作する
    • こいつもSTM8S(メイン基板と異なる型番)
  • ちなみにSWIMは動かなかった

メイン基板と操作パネルの通信

  • I2Cやんけ
  • マスターはメイン基板、スレーブが操作パネル
    • ちなみにメイン基板側でプルアップ
  • 操作パネルがスレーブ?どうやってマスターにボタンが押されたことを伝える?
    • ポーリングでもするか?
    • 実はIRQの線がある
    • これを使って、あたかもスレーブから通信を開始したように見える
    • 全く関係ないけど、某NFC関連のICに似てる
    • でも、SPIやUARTで良いんじゃないですかね…
    • 他にバスに繋がる機器があるのかな…
  • ロジアナでメッセージを解析した
    • 電源ON/OFF、コーヒー抽出(全5種類)、水切れ、コーヒータンクカバー開状態、ドロワー開状態
    • IRQがこんなタイミングで出て、こんなメッセージが来て、またIRQを出すんだ
    • スレーブはメッセージを受け取ったらレジスタに格納して、状態を持っておくんだ
    • その他のエラーや、コーヒーの濃さ調整のメッセージは見ていないよ

実装

バリスタを操作する方法

  • 電子的にボタンを「押す」
    • 操作パネルのボタンです
    • トランジスタを用いて電極を短絡させる
    • 過去にやったわ
    • おふざけが足りない
  • オレオレ操作パネル
    • 操作パネルの挙動をまねる
    • メイン基板とI2Cで通信する
    • カッコイイ!
    • こっちにしよう

仕様

  • HTCPCPでコーヒー抽出命令を受ける
    • そしてI2Cでメイン基板を操作
  • HTCPCPではRTCを用いるべきとされる
    • 面倒そうなので却下
    • やるとしたら、NTPを使ってI2C/SPIのRTCモジュールに書き込んで…みたいな感じでしょう
  • 元々の操作パネルも使えるようにしたほうが良いのでは
    • 面倒そうなので却下
    • やるとしたらI2Cマスターにもなる「オレオレメイン基板」も作る必要がある
  • コーヒーカップがセットされていないときは抽出できなくしたほうが良いのでは
    • 面倒そうなので却下
    • やるなら圧力センサとか、光センサでなんとかすることになるでしょう

実現方法

  • TCP/IPが喋れる必要がある
    • Raspberry Piは豪華すぎる
    • ESP-WROOM-02で良い
    • ESP-WROOM-02はまぁ良い
  • I2Cスレーブになる必要がある
    • ESP-WROOM-02(ESP8266)のI2Cはソフトウェア実装らしい
    • I2Cスレーブも「GPIOをこうやって制御すれば動くよ」で非常に不安
    • なんか適当なマイコン繋いで、それをUARTで制御しよう
      • 簡単のため1文字(ここでは8bitとする)だけでやりとり
      • 人間に優しく、基本的には頭文字(エスプレッソ抽出命令 ならば E とか)
    • LPC1114を使う
    • LPC1114は素晴らしい
    • 使うピンは5本(I2C + UART + IRQ)なのでLPC810でもISPピンやRESETピンを潰せば動きそう

徹底的に実現するぞ

動かないI2C

  • マスターがクロックストレッチ非対応
    • これもしかしてソフトウェアで作ってある?
    • SCLも14.2kHzとか変な感じだし、微妙に変わる
    • クロックストレッチが発生しないように対策
      • 強制的に…でなく、時間のかからない単純な処理とした
  • シリアルのドライバ
    • オレオレ操作パネルをいきなりメイン基板に繋ぐのは不安
    • 簡単なI2CマスターをArduinoで作ろう
      • Arduinoはaliexpressで買った激安の互換品
      • 当然、USB-シリアル変換器は専用チップ
    • オレオレ操作パネルとArduinoは、USB-シリアル変換器とか介してPCへ接続
    • 同じPCに繋ぐとドライバが干渉したのか、どちらもリセットされる
    • もしかしてどこかで短絡したのかな…と時間溶かした先輩
    • 対処法は「別のPCへ繋ぐ」
  • プルアップ抵抗
    • データシート「このマイコンのこのピンはプルアップ抵抗入っているので」
    • なるほど
    • でも、外部でプルアップしないと動かないピンがあった
    • プルアップが弱かったのかな…

動くぞ

  • コードはこんな感じだよ

評価

  • まぁいいんじゃないか バリスタでHTCPCP

まとめ

  • バリスタをI2Cで制御できたので、HTCPCP対応にした
  • ところで、バリスタiが出ました
  • Bluetooth(BLEかな)とTCP/IPが話せる機器を近くに置いておけば、無改造でHTCPCP対応にできそう
  • 至急、ESP-WROOM-32(ESP32)技適取ってくれや
  • Raspberry Pi 3でもいいぜ