焼き芋DX: Recipe as code

# 免責事項
　**AC100Vの取り扱いがあります。ここで述べることでの事故については筆者は一切の責任を負わないことを予めお伝えしておきます。よろしくおねがいします。**

# はじめに
　```DX``` なる言葉はそろそろ死語になるかも知れませんが、皆さんの周りで一日に一度は聞く言葉ではないでしょうか？小職自体もこちらを生業としているわけですが、この手の言葉は文脈によって如何様にも変化して捉え所がありません。小職なりの解釈で```DX```をやりたいと思います。題材としては、身近にあるテーマが良いだろうということで```焼き芋```です。

|焼き芋DXシステム全景|
:-
|![IMG_1764.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/c2625e98-3b9d-f149-304f-56e53e4bcd85.jpeg)|


# 自己紹介
　ウフルでビジネスデベロップメントをしている大橋です。経歴に関して、ご興味のある方は[こちら](https://qiita.com/ooo_6502/items/99b596941e9e503875e3)をご笑覧ください。先述したとおり```DX```案件の担当者ではありますが、ここで述べるのは筆者の個人的な見解であり、所属している組織の見解とはなんら関わりがないことを予めお伝えしておく次第です。

# マーケティング編
　まずはマーケティング面からのアプローチです。```DX```とは、Digital Transformationの略称です。デジタル?を主力にして既存のモノ／コトをトランスフォーム(変革)していくと言うことです。理系脳からするとツッコミどころ満載の言葉です。なんで、トランスフォームが**X**になるのか？とか、離散値であるデジタルがなんで主力になるのか？とかたった二文字の全てにツッコミ入れたくなるのです。まぁ、IoTにしろブロックチェーンにしろマーケティングバズワードなんて、そんなものかと元デバイスエンジニアとしては思うわけですが…

## 焼き芋だってDX
　気を取り直して、周りを観察してみます。マーケティングの基本は市井の観察ですから…　最近、```焼き芋```をナニゲによく見かけると思いませんか？100円ローソン(100ロー)やファミリーマート(ファミマ)、ドンキホーテ(ドンキ)、業務スーパー(業スー)などです。その他にもバンで売りに来てたり、商店街で展開しているお店もあります。小職自身も最近知ったのですが、[専門店](https://pukupuku-yakiimo.stores.jp/)も出始めました。特に専門店の味に関しては、```焼き芋```のそれではありません。小職は思わずtwitterで、***「```超蜜```は```焼き芋```界の二郎だな、もはや```焼き芋```ではなく、```超蜜```という食べ物」***…それほどショックを受けたわけですし、ご察しのとおり、その価格のトランスフォーム(ちょっと高価)ぶりにもショックを受けました。

## DXしてみる
　では、早速```DX```してみましょう。普通の```焼き芋```を美味しい```焼き芋```にデジタルの力でトランスフォームするわけです。

 - 美味しい```焼き芋```の分析
　先述した**超蜜**を例に挙げると、その蜜の抽出度からもはやスイーツの粋に達していると言われていますし、食べてみた感想もそのとおりだと思います。つまり賞味時の糖度が重要です。 糖度は加熱温度と時間の制御で決まります。サツマイモ自身が持つデンプンを適切な温度と時間で糖に変換させるわけです(ここでもトランスフォームが来ましたね)。

 - トースタもトランスフォーム
　一般的な電子レンジ、オーブン、オーブントースターなどでも```焼き芋```が作れます。特に前２つのデバイスでは専用のモードを持つものも多いと思います。シンプルなオーブントースターでもそれなりに焼けます。ただ、専門店を始めとした昨今のお店との比較では旧来の```焼き芋```の域から脱出できません。コレをなんとか技術力でトランスフォームしたいと考えるのがエンジニア上がりのコンサルタントの性(サガ)というわけです…

# 技術編
　という事で、やっとQiitaらしくなってきました、いよいよ技術編です。始まりから水を自ら差すようですが、上記の目的をカバーしたオーブントースターがクラウドファンディングで発売されるようです。しかも、専門店が監修しているようなので、いくら業務・技術コンサルの小職とは言え太刀打ち出来るかどうかは微妙です…正直に申し上げますと、今までさんざんと能書きをコンサルらしく垂れてきましたが、要は自分が美味しい```焼き芋```を食べたいし、美味しさを含めたメカニズムは興味があるし、そのためのデバイスを作るのが楽しそうなので作ります(吐露)。

## IoT家電
　昨今ではIoT家電なるものがハイエンド白物家電の一角を占めるようになっています。OTAで不具合の修正や機能の追加が可能だったりします。機能の追加の文脈で新しいレシピを加えることも可能です。スマホからのアクセスも可能でUIもリッチにしています。中身は制御コンピュータを強化して、IP-Reachableにしているわけです。

## 機器もトランスフォーム
　普通の```焼き芋```を作るのは先に述べたオーブン、オーブントースター、電子レンジです。これらをトランスフォームすれば、美味しい```焼き芋```を作るための機器になるはずです。美味しい```焼き芋```にするには、加熱温度と時間が重要なのは先述したとおりです。ただ、オーブントースターを見るとタイマースイッチの設定値は15-30分程度です。また、温度も高温になるとサーモスタットが働いて電源を遮断します。これでは美味しい```焼き芋```を作るための条件を満足させることが出来ません。

### トースターのトランスフォーム(改造)
　加熱時間の限界はタイマーの上限値、同じ様に加熱温度の限界はサーモスタットの働きによるものですから、これらを外すか回避した後に適切な制御を加えれば所望の動作を得られます。外すのは簡単ですが大きめのドンガラの専用デバイスが自宅に転がるのも考えものです。UIを丹念に作り込めば、魔改造したデバイスを家人に使わせることも出来るかも知れませんが、不毛な行為であることは否めません。トランスフォームとは言うけれど、人は変わりたがらないイキモノなのです。

- 機器の選定  
　ヒーターの制御を外部に委ねるのなら制御部分が簡単な方が改造しやすくなります。小職自身、オーブントースターを二台購入して内部構造の差を確認しました。結果的には一番安い機器で十分でした。2,000円〜2,500円で購入可能です。

|購入した二台のトースター|
|:-|
|![IMG_1678.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/a4155023-13cd-f07d-31f3-b653db83bb77.jpeg)|
|改造前|


- スイッチの増設  
　タイマースイッチとサーモスタットを回避するためにヒーターから導線を直接取り出します、ヒーターへ直接給電することで所望の動作を得ます。既存の動作(タイマースイッチ、サーモスタットを介しての給電)と直接給電の切り替えスイッチを増設します。

|スイッチ取付位置|増設前の内部配線(シンプル)|増設後の内部配線(複雑…)|
|--- |--- |---|
|![IMG_1700.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/ebd15ee2-d0f7-d2d4-e4df-50810f3945ca.jpeg)|![IMG_1689.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/4e1234a5-2f11-1a72-dbb8-ad96357924d6.jpeg)|![IMG_1699.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/b8e89020-63a1-3bb7-0846-20f2744f12ce.jpeg)|
|スイッチを前面パネルの空いているスペースに取り付ける|改造前に配線の十分な確認を行うこと|改造後も配線チェックを十分に行うこと|

***電子工作好きはここで端子をハンダ付けしたいところですが、少なくともAC100Vや電流が多く流れる所ではカシメで配線するのが基本です。なので、切り替えスイッチも電流の許容値が満たせた上でネジ止めが出来るタイプを使いました。配線材自体も温度耐久品を使うことをお忘れなく。***

|オーブントースターの配線図とスイッチ増設後の配線図|
|---|
|![ModHeater.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/ca494514-548f-77f7-1d8c-70fa4d3b9f0f.png)|
|***注意: こちらは独自に解析したものなので、メーカに問い合わせることは御遠慮ください！***|



- 温度センサの増設  
　IoTネタではサーミスタを使ったりI2C接続の専用デバイスが市販されていますが、今回の場合は対象温度が高温なので熱電対と呼ばれるタイプを利用します。これは専用品が多く出回っています。Aliexpressの様な中華系サイトで安価に購入できます。500円程度です。具体的にはMAX6675チップを利用したものですが、インターフェイス形式がSPIのためPCなどでは直結できません。そのため、専用のインターフェイスボード(Groovy-SPI:ホストインターフェース)を開発しました、こちらについては後述します。

|温度センサ取り付けのためのドリルとオイル|6mmナットで取り付け|トースター中の様子|
|---|---|---|
|![IMG_1681.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/6f8d739f-c61f-5c28-a764-1f4b3a589221.jpeg)|![IMG_1682.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/addd30bd-4ebe-13d9-2a22-63c451afffc9.jpeg)|![IMG_1683.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/73507496-384e-1583-c6b7-763884551a37.jpeg)|

***薄いとは言え鉄板なので、穴開け時に冷却と滑りを良くするためにオイルを使います。食品関係なので何となくオリーブオイルを使いました。***

- Solid State Relay (SSR)によるOn/Off   
　繰り返しになりますが、通常の方法はサーモスタットによる温度制御とタイマースイッチによる時間制御でした。改造後は前者は熱電対によるセンシングに置き換わり、時間制御はSSRでOn/Offタイミングを外付けのコンピュータから直接制御になります。SSRの制御は論理的には**Lチカ**と同義です。SSRは名前の通り、メカニカル接点のリレーの接点部分を半導体のスイッチング特性に置き換えたものです。ユニット化されており手軽に100V程度なら取り扱えますが、あくまでも機能的にという事です。取り扱いを間違えると感電・火災などの重大事故につながるのでくれぐれもお気をつけください。

|SSRの動作特性確認|SSRの負荷特性確認|SSRの実特性確認|
|---|---|---|
|![IMG_1631.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/29eda52b-d855-9aa9-25fb-72b74fe4c342.jpeg)|![IMG_1648.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/f8ad70fe-ab21-e231-4729-87e32385eae5.jpeg)|![IMG_1651.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/2712b88c-8a92-0449-9b8d-0b016706c391.jpeg)|
|SSRを駆動するための電流値の確認|実負荷接続時の温度特性も観察|トースター接続時の挙動観察|

***基本的には大きな```Lチカ```ですが、AC100Vを取り扱っているのでそれなりに注意が必要となります。***


## DXのデジタル成分
　```DX```の ***D*** の部分はデジタルですが、これはコンピュータを指すことが多いようです。この章ではSSRの制御と温度センサの読み取りのためのコンピュータシステムについて解説します。

### ホストコンピュータとの接続
　制御関連を司るコンピュータの呼び方として、**ホストコンピュータ**なる名称が使われています。Windows, MacOS, Linuxが動作するPC, Single Board Computer (SBC = ラズパイなど)がコレに当たります。制御を行うにあたり、制御対象とホストコンピュータの接続が問題になるわけですが、今回はUART(非同期シリアル通信)とUSBを用いています。ここまで書いて、少し混乱を招いたかも知れません、(「???…SSRはデジタルのOn/Off(GPIO)で制御して、温度センサはSPIで読み取るのでは???」)と…。
　そうです。なので、UARTやUSBからGPIO, SPIに変換するためのインターフェイスが必要になります。もちろん、ラズパイなどのSBCでは既にGPIO, SPIが端子として使えるものもあります。現にこれらの端子を用いてGPIOを利用してSSRを制御したり、SPIを使って熱電対を読み取るプログラムなどググればいくつかヒットします。そういった特殊な事情(=ラズパイでしか使えない)よりも今回は様々なホストコンピュータが使えることを目指しました。時間制約が無ければ、インターフェイス間は**疎結合**にするのはソフトウェアもハードウェアも目指すところではないでしょうか？

## 閑話休題: メカニクス、ハードウェア、ソフトウェア
　IoTとは、Internet of Things の略称であることは、ここの読者には特段解説するものではないと思いますが、Things部分の区分けと言うか、レイヤー部分を整理するにあたって用語の定義やスコープについて少し考えてみたいと思います。小職の場合、Things部分を大きく分けて、メカニクス(メカ)、ハードウェア(ハード)、ソフトウェア(ソフト)と大きく分類します。時々、メカとハードが混同される場合があるので、その時は明確に、「それはメカだよね？それはハードだよね？」と言います。メカの部分は筐体や機構部分を指します。全体を収めるケースやキャビネット、アクチュエータから先の実際に動作する部分を指します。ハード部分はPCBなどの通電部分を指します。モータなどのアクチュエータはメカ／ハードの切り分けは難しいですが、筐体部分に取り込まれているような場合はメカになることが多いです。一方のソフトはわかりやすいです。割とリプレースしやすいものはソフトになるでしょう。この文脈からマイコン(MCU)に内蔵されているファームウェアはハードの扱いになる場合が多いです。厳密に明確な線引は難しい場合もありますが、そこがシステム開発の醍醐味だとも思うのです。

## 全体設計
　ここで少しステップバックして、システム全体を俯瞰したいと思います。メカ・ハード・ソフトの連携が求められるシステムでは全体最適を求める全体設計は重要です。この三要素のバランスを取りながら、設計したい思います。機能要件と非機能要件が入り乱れる場合もあることをお許しください。コレが生じるのは先に述べた各部がラップするところがあるので仕方ないかな？と思うところもあります。

### メカニクス
　今回の場合は機械的な駆動部はないので筐体の設計だけになります。使う電圧がAC100Vで、ヒータなどの加熱部があるので安全性を考慮する必要があります。また、目に付く部位なのでほんの少しのデザイン要素も必要になります。市販のプレーンなケースを購入して加工するので、用途に完全にフィットしきれない部分もあります。それらについて小職が思うところと実際に落とし込んだところを解説します。

- 安全性 
 　操作性を考慮しつつ、安全にトースターを加熱する。

- デザイン 
 　前面部は電源スイッチのみとする。後背面部は機能毎に端子の配置を分けます。向かって左側を前面からのスイッチ操作を含めた電源系統とし。放熱フィンを挟んで、センサ、コンピュータインターフェイスのいわゆる**弱電**関連の端子群を配置します。

  - スイッチ  
　視認性、デザイン性、電流容量を勘案して決めます。スイッチの取り付け位置はトースターのスイッチの延長線上に配置します。

|スイッチの配置|
|---|
|![IMG_1757.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/24764d47-4e06-bb38-4f13-74f02277fdab.jpeg)|
|筐体スイッチの位置はトースターの操作スイッチからまっすぐに降りたところにある|

   - 放熱フィン  
　コレについては完全に厨ニになっています。つまり、今回の電流容量とヒータの間欠動作では必要ありません。つまり、スパルタン(強そう)なイメージを出すためだけになっています。その割には道具の準備や加工方法など苦労した部分が大きいです。

|SSRの取り付け|取り付け|背面に占める割合|
|---|---|---|
|![IMG_1736.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/412c977f-9994-0dd0-4cc4-22cd0621041a.jpeg)|![IMG_1748.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/5fd46d82-9ba0-e566-e797-a6d19e3c2e8e.jpeg)|![IMG_1754.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/b058c397-14a3-2140-656a-ce63d09fb78a.jpeg)|
|ケースの一部を穿孔しSSRとの放熱部と伝熱シートを介して密着させる|SSR-ケース-放熱フィンは共締|

|4mmのタッピング|溶接ナットで垂直を確保|無事にネジ穴が完成|
|---|---|---|
|![IMG_1703.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/2fa21a98-9ddf-ca6c-4d08-1ce3a63f821b.jpeg)|![IMG_1705.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/527f5eb6-a417-9af4-d33d-897e0f797bc5.jpeg)|![IMG_1706.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/b7eb51c8-bb5b-ed97-95dc-89b14f3ab603.jpeg)|
|4mmネジのため、3.5mmのドリルを用意する|4mmの溶接ナットをシャコマンで固定しタップ油かCRC-556などで潤滑しながらタッピングドリルで揉む|4mmネジを通して、タッピングを確認する|

 - コネクタ  
 　後述しますが、四角い孔はドリルの穿孔一発で出来る丸穴加工に比べて数段手間がかかるので、なるべく丸穴で対応でき、デザイン性の高いコネクタを用います。また、温度センサのコネクタは**補償導線**なので、そのまま使うようにします。

|四角穴加工|コネクタ取り付け前|嵌合確認|
|---|---|---|
|![IMG_1728.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/449eaca7-7d13-ae80-52f5-4fd6426b20fb.jpeg)|![IMG_1733.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/bd828706-f3f3-cd2f-5558-6ef8ef2dca50.jpeg)|![IMG_1737.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/67dde151-4152-ded5-314f-8af1f77454fa.jpeg)|
|Rを考慮して4角を穿孔する|糸鋸で孔から孔を切った後にヤスリで仕上げる|取り付けの確認|

|熱電対コネクタ|Micro-USB|USB&HDMI|
|---|---|---|
|![IMG_1745.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/cb41b05b-29a6-e93e-bf79-47589b99d500.jpeg)|![IMG_1747.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/f4a81d27-188d-3ceb-397f-4f4526a94bdf.jpeg)|![IMG_1755.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/0b9286c5-8d3d-083c-1015-e54924f559fa.jpeg)|
|補償導線なので出荷時の状態で使う|屋内使用にも関わらず、<br>防水タイプの厨ニなコネクタ|コレも防水タイプな厨ニ仕様|

### ハードウェア
　先程、メカ・ハード・ソフトの小職なりの区分について開陳しました。ハードについては大きく分けて２つあります。一つはAC100V関連を中心とした**電装**、もう一つはSSRの制御と熱電対の読み取りに対応した**ホストインターフェース**になります。それぞれについて解説します。

#### 電装
　電装部はAC100Vの給配電をスイッチとSSRの配線により行います。トースターの改造の章でも述べましたが、結線にはハンダ付けではなくてコネクタを圧着しそれらを結合していきます。AC100Vの電源を使用目的に応じて配電します。具体的には複数のACアウトレットを接続し、スイッチやSSRの状態に応じて給電します。大きく分けて、常に給電(Always-On)、スイッチオン時のみ給電(Switched-On)、SSRが動作した時に給電(SSR-On)があります。前の２つは必須ではありませんが、システムの使い勝手の向上のために実装しました。まとめると、

 - スイッチ配線  
 
|ACアウトレットの種類|ユースケース|
|---|---|
|常に給電|PCなどの外部電源用|
|システムのスイッチオン時のみ給電|システム専用SBC(ラズパイ)の給電｜
|SSRオン時|トースターの電源|

　今回利用しているスイッチはLED内蔵タイプですので、配線がスイッチ単独タイプに比べて少しだけ複雑になりました。また、上記の様に様々なアウトレットの管理を行うので、何度か配線図を描き起こして動作の確認をしました。

|スイッチ配線図|
|---|
|![SwHarness.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/464235f8-acd8-1ca0-04a2-467e7e8edcb5.png)|

 - SSR  
 　SSRはAC電源と直列に挿入される外部制御可能な半導体を利用したリレーです。トライアックというパワー半導体を使っているため、従来の機械式のリレーに比べて、スイッチングは無音で速度も高速です。外部制御を行う場合に切替回路にある一定以上のトリガ電流を流す必要があります。このSSRではトリガ電流はMax12mA以下と書いてあります。こう書かれていると上限が12mAだと思います、では下限は何mAにすれば良いのでしょうか？とりあえず、手持ちの470Ωで試してみます。5/470x1000≆10.6mAです。良さそうな気がしますが、これではスイッチングトリガをかけることが出来ませんでした…そこで、470Ωの代わりに330Ωに変えてみます。5/330x1000≆15.1mAになりました。先述の12mAを超えていますが、これだとスイッチングトリガをかけることが出来、無事にSSRを動作させることが出来ました。

#### ホストインターフェース(ボード): Groovy-SPI 
　ホストインターフェースを図示すると、
　**```Host Computer<=>UART/USB[Host I/F]<=>GPIO/SPI<=>SSR/K-ThermoCouple```**
　となります。
　ホストインターフェースはSSRや熱電対が接続されているインターフェイスであるGPIO/SPIをUART/USBに変換してホストコンピュータに接続します。UARTモード時はホストコンピュータであるPC/MCUのシリアルインターフェイスに接続します。USBモード時も同様で、ホストコンピュータのUSB端子に接続します。USBで接続した場合はCDC-ACMと言う仮想シリアルポートのモードになります。この時点でソフトウェアからはUART/USBとも同様に見えます。

- Groovy-SPI  
　ホストインターフェースの具体的な製品として、Groovy-SPIとして出荷予定です。Groovy-SPIはPIC16F1459というMCUが搭載されたマイコンボードになります。今回のプロジェクトのために開発されました。GPIOx2ch, SPIx2ch実装しています。SPIは今回のプロジェクト用にMAX6675の読み取りプログラムが実装されています。SPIは共通インターフェイスなので、CSをうまくハンドリングすれば別の系統のSPIデバイスを接続することも可能です。

|Groovy-SPI|Groovy-SPIとGPIOケーブル、SPIタイプ熱電対|
|---|---|
|![IMG_1793.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/931218c3-454e-dcc3-9d55-b3f66f024f68.jpeg)|![IMG_1800.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/45393a5d-a5cb-111b-e8fe-06bcc572ddf6.jpeg)|


- SPIとMAX6675  
　先程から```SPI```, ```熱電対```の言葉が飛び交っていますので、もう少し整理しつつ詳細を説明したいと思います。熱電対は異種金属接合部分の温度差が起電力になる(ゼーベック効果)特性を利用しています。コレとは反対に電圧をかけると温度差が発生する現象は皆さんおなじみの「ペルチェ効果」になります。この発生する電圧は極めて微小で取り扱いが難しく、オペアンプなどで信号増幅を行う必要があります。アナログ部が関わると極めて**面倒くさい**システム構成になってしまいます。ただ、高温測定が出来る熱電対をお手軽に取り扱う世の中のニーズはあります。そこで登場するのが熱電対のインターフェイスICです。それがMAX6675になります。もちろんチップ単体でも購入できますが、熱電対とセットになった完成品の基板が安価で販売されています。今回はこれを利用しました。測定となると精度が気になるところですが、今回の応用例のように±2-3℃程度の誤差なら十分実用的です。

|MAX6675を利用したSPI熱電対:全体|MAX6675を利用したSPI熱電対:インターフェイス部|
|---|---|
|![IMG_1795.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/5868113b-1564-03b7-f4db-8c7dabeed4cc.jpeg)|![IMG_1796.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/295148c6-ae49-59d1-a4f9-d2994a606824.jpeg)|


- GPIOへのアクセス方法 
　シリアルポートの通信パラメータを9600-8N1でターミナルソフトを立ち上げます。GPIOは2チャンネル実装していて、それぞれ```A```, ```B```が割り当てられています。大文字の```A```あるいは```B```をターミナルソフトから打鍵した場合、GPIOポートが ```High```になります。今回の場合はSSRのトリガ電流が電流が流れ、SSRがOnになり、AC電源がオーブントースターに給電されヒーターが加熱されます。反対に小文字の```a```あるいは```b```でトリガ電流がオフになり、SSRがオフになりAC給電が停止します。

- SPIへのアクセス 
　SPIは熱電対の読み取りに使われます。SPIも2チャンネル割り当てられています。それぞれチャンネル```0```,```1```が割り当てられています。GPIOと同様にターミナルソフトから```0```,```1```を打鍵します。それぞれのSPIに接続された熱電対から温度が返ってきます。SPIに何も接続されていない場合は```NC```が返ってきます。

　まとめると、

||UART|USB|Result
|---|---|---|---|
|GPIO|ターミナルソフトから ```A/a```or```B/b```打鍵<br>エコーバックなし|同左|SSR=On/Off|
|SPI|ターミナルソフトから ```0``` or ```1```打鍵<br>エコーバックなし|同左|温度センサ読み出し、センサ未接続の場合は```NC```|

- 温度センサの増設  
　Groovy-SPIは前述の通り、2chの温度センサの読み取りが出来ますので、芋の中身の温度が読み取れるように熱電対を増設します。

|追加センサ用の孔開け|センサの取り回し|芋に突き刺す|
|---|---|---|
|![IMG_1878.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/c43a5d1a-b1cd-4728-6382-7a542b9866fc.jpeg)|![IMG_1880.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/29dcea8d-a127-9de4-f65e-b1f26ff36d25.jpeg)|![IMG_1896.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/5028a68b-512d-abed-3030-ba8b9bc564d7.jpeg)|  

**穿孔後はシリコンゴムなどで塞ぎ、熱気が漏れないようにする**


### ソフトウェア 
　IoTデバイスなので、ソフトウェアはファームウェアからクラウドまで万遍なく必要になります。ここでは、新規に開発したファームウェアとミドルウェアの[kikori]()、クラウド側はenebular-editorでの使用例を説明したいと思います。 

#### ファームウェア
　Groovy-SPI用のファームウェアのソースコードは[gitlab](https://gitlab.com/teamknox/groovy_spi_u2)に上げてありますので、コード自体に興味のある方や他のMCUへのポートをしたい方はご参照ください。

- [groovy_spi_u2](https://gitlab.com/teamknox/groovy_spi_u2)  
　UART, USBの2種類の接続で利用できます。現状のファームウェアではホストへの接続は排他使用です。UARTを選択した場合はUSBは利用できませんし、USBを選択の場合はUARTは使えなくなります。起動時にジャンパピン(J1)の真ん中のピンをジャンパするとUARTモードになります。なにもジャンパしない場合はUSBモードで起動します。USB接続はCDC-ACMで認識されるので様々なホストに対応できます。

|Groovy-SPIのUARTモード|ジャンパピン設定|
|---|---|
|![IMG_1797.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/89e3f6aa-64ce-a5c3-e2f7-6550c89b9101.jpeg)|![IMG_1794.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/582eac07-3652-2b24-58b8-4d5242ea83a0.jpeg)|
|Groovy-IoTに接続|J1コネクタの真ん中のピンをショートしてUARTモード|


#### アプリケーション(Recipe as code)
　小職は普段はpythonを利用することが多いので、ここではpythonのサンプルアプリを紹介します。浅学非才ゆえ、直線的でなんの工夫も無いコードですが、どの様に動作していることの一助になるかと思います。

```python:functionized.py

import serial
import time
import datetime

ser = serial.Serial('/dev/ttyACM0', baudrate=9600, parity=serial.PARITY_NONE)
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')


def GSOnOffController(aMessage, aPeriod, aOn, aOff):
    print ('%s --- On = %03d℃ / Off = %03d℃' % (aMessage, aOn, aOff))

    for i in range(aPeriod):
        print ('%04d ' % i, end="")

        now = datetime.datetime.now(JST)
        d = now.strftime('%Y/%m/%d-%H:%M:%S')
        print(d, end=" ")  # 2021/11/04 17:37:28

        ser.write(str.encode("0"))
        tempStr = ser.readline().strip().decode('utf-8')

        if tempStr == "NC":
            print ("Sensor is not working !!")
            print ("Operation is terminated !!")
            ser.write(str.encode("a"))
            break;
        else:
            tempInt = int(tempStr)
            print ('%03d℃ ' % tempInt, end="")

            if (tempInt > aOff):
                ser.write(str.encode("a"))
                print ("Off")

            elif (tempInt < aOn):
                ser.write(str.encode("A"))
                print ("On")

            else:
                print ("Dead-band.")
        
        time.sleep(1)

    ser.write(str.encode("a"))


def main():
    try:
        GSOnOffController("01-Stage", 3600, 60, 75)
        GSOnOffController("02-Stage", 3600, 155, 160)

    except KeyboardInterrupt:
        print ("")
        print ("Operation is terminated by USER !!")
        ser.write(str.encode("a"))
        ser.close()


if __name__ == '__main__':
    main()
```

***main()ファンクション内の ```GSOnOffController("01-Stage", 3600, 60, 75)```でトースタの制御をしている。
ヒータをOnにする条件温度とヒータをOffにする条件温度を与えると一秒ごとに測定し決定する、これを指定時間(秒数)だけ繰り返す。***

#### クラウド
　小職が所属しているウフルにはIoTの強力なツールである[enebular](https://www.enebular.com/ja/)があります。ホストから対話的に利用する場合は[enebular-editor](https://docs.enebular.com/ja/enebulareditor/)を利用するのがいいでしょう。システムとの接続方法は二通りあります。一つはシリアルノードを用いて、そのまま接続する方法です。シリアルノードは標準ではインストールされていないので、別途インストールします。Groovy-SPIを単体で利用している場合はこちらになります。もう一つは[kikori](https://gitlab.com/myst3m/kikori)を用います。SBCにGroovy-IoTを実装している場合は、kikoriの持つWebServer機能を利用して```Http-requestノード```から使います。

## 結果
　皆さん、気になるのは美味しい焼き芋が出来たかどうかだと思います。作りながら、焼いているのでまだ片手ほどしか焼けていませんが、家族には好評です。少なくとも拙宅にある```焼き芋```モードを装備している電子レンジには軽く勝ててます。

|紅はるか|ブランド不明|
|---|---|
|![IMG_1785.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/709dca10-3546-5f73-1fd5-19de22ff5612.jpeg)|![IMG_1789.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/f4d3a503-a84f-2db8-32f0-9b05a650a859.jpeg)|
|蜜がすごい|これは２本目、糖化時間を長くすると良さげ|



## 今後
　現在の制御は上限値に達したらヒータをOff、下限値に達したらヒータをOnのシンプルなOnOffControllerの実装です。今後はPID制御, AIなども導入してより美味しい```焼き芋DX```を進めていこうと思います。また、ケース自体にもスペースがあるのでラズパイ4や他の強力なSBCに換装してサーバ化しようとも考えています。

|ケース内部の様子(1)|ケース内部の様子(2)|
|---|---|
|![IMG_1751.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/e039d4b7-fca9-5bc3-56cc-bfd5aff4ba1c.jpeg)|![IMG_1749.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156757/97be0c06-566b-d561-6289-ce15a0956709.jpeg)|


## 謝辞
　```焼き芋DX```と命名してくれた元同僚のM.T.氏に感謝します。また、本稿を最後までお読みいただいた方々にも感謝します。ありがとうございました。

## さいごに
　IoT家電も一段落した感があります。```DX```もすっかり手垢のついた言葉になってしまいましたが、自分でやってみると色々な所をトランスフォーム出来ることがわかります。皆さんも皆さん自身や身の回りの何かをトランスフォームしてみてはいかがでしょうか？


## リソース
*[Twitter](https://twitter.com/teamknox)
*[gitlab](https://gitlab.com/teamknox/yaki-imo-dx)