BeagleBone Green 上の Elixir / Nerves で電力制御をする

これは [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp) の8日目です（書いてるのは 23日ですが… 汗）。昨日は [@myasu](https://qiita.com/myasu) さんの [Elixir/NervesでPLC(多機能リレー)を作ってみた](https://qiita.com/myasu/items/a6664d3a3c76503affc7) でした。

# はじめに
以前から産業用のシステムをITデバイスで制御するシステムを作ろうと目論んでいます。
通常は産業用には、いわゆる PLC (Programmable Logic Controller) と呼ばれるコンピュータを用います。PLC はマイクロプロセッサが出てしばらくして、我々の知っているIT系とは異なる進化を遂げたコンピュータシステムです。このため、プログラミング言語の進化やネットやクラウドと連携した広域分散の概念の導入などの現代的なイノベーションの恩恵を受けていません。

そこで私達 [kochi.ex](https://qiita.com/organizations/kochi-ex) は、Elixir を武器に産業用制御システムの世界を塗り替えようと、2年ほど前から活動しています。なぜ Elixir なのか、については Qiita の記事 [Elixir を使うようになった経緯 〜電力システム制御の現場から〜](https://qiita.com/kikuyuta/items/96c3f91a850e9274b0e9) を参照してください。

この記事では PLC を使わずに、IT嬢やIoT野郎がよく知ってるようなコンピュータボードで電力制御をやってみます。はい、このアドベントカレンダーの昨日の記事 [Elixir/NervesでPLC(多機能リレー)を作ってみた](https://qiita.com/myasu/items/a6664d3a3c76503affc7) と狙っているところは同じです。大きく違うのはベースが Raspberry Pi じゃないことです。

ITで産業機械の制御をやろうとする場合のデバイスとしては、まず Raspbery Pi シリーズが思いつきますし、他にもいまだと Linux が動くような小さなボードがたくさん出てきてます。今回は [BeagleBone Green](http://beagleboard.org/green) というボードを使って電力制御をやる例をお見せします。

# BeagleBone Green
今回使う [BeagleBone Green](http://beagleboard.org/green) を紹介します。これの基になった BeableBone Black とともによく BBB, BBG と略されるので、ここでも後は BBG と省略します。ちなみに Nerves を使う場合には `export MIX_TARGET=bbb` を指定すると、BBB も BBG もあと PocketBeagle も使えるファームウェアを作ってくれます。
![BeagleBone Green の外観]
(https://files.seeedstudio.com/wiki/BeagleBone_Green/images/cover.jpg)
ボード自体は [SeeedStudio](https://www.seeedstudio.com) が開発しており、いろんなショップから通販で購入可能です。1枚5000円ぐらいです。

- CPU は ARM Cortex-A8 (NEON) が乗ってる [TI AM3358](https://www.tij.co.jp/ja-jp/processors/sitara-arm/am335x-cortex-a8/overview.html)
- 512MB DDR3 RAM
- 4GB eMMC フラッシュ

これに GPIO, I2C, SPI, UART などの I/O がついています。Seeed Studio 製らしいのは [Grove コネクタ](https://wiki.seeedstudio.com/Grove_System/) が2つ乗ってて、簡単に I/O が繋げられることです。Grove を産業機器に応用することについては [Seeed Users' Group のアドベントカレンダー](https://qiita.com/advent-calendar/2020/seeed_ug) の [Groveと産業機器をつないでみよう](https://qiita.com/myasu/items/7b429ae24543488c390d) を見てください。

Linux が動いてこれぐらいの大きさというと、馴染み深いところでは Raspberry Pi 3B 相当といったところでしょうか。で、なんであえて Raspberry Pi じゃなくて BeagleBone を使うのかというと、それがオープンソースハードウェアだからです。

## BeagleBoard シリーズはオープンソースハードウェア
BBG につながった [BeagleBoard.org](http://beagleboard.org/) の話をしましょう。このページの [About Us](http://beagleboard.org/about) の先頭にはこのように書いてあります。


BeagleBoard.org 財団は、組込みコンピューティングにおける教育およびオープンソースのソフトウェアとハードウェアの設計と利用のコラボレーションを進めるため設立された、アメリカ合衆国ミシガン州に拠点を置く 501(c)(3) 型[^501-c-3]の非営利法人です。

[^501-c-3]: [アメリカの法律が定める非営利法人の形態](https://en.wikipedia.org/wiki/501(c)(3)_organization) を示す用語のようです。

改めて注目してほしいのは **オープンソースのハードウェア** です。オープンソースハードウェアとは、設計書がオープンになっているハードウェアのことです。オープンソースソフトウェア同様に、公開されている資料を基に自分で作ったり改変したりすることが出来ます。

これに対して Raspberry Pi シリーズはオープンソースハードウェアではありません。もちろんオープンソースソフトウェアが動きますが、ハードウェアはオープンではないのです。ですので、Raspberry Pi でなにか作って、ハードウェア的にもっとハックして自分なりのボードを作ろうとしても出来ないのです。その点、BeagleBoard シリーズは回路図やパターンを見ながら自分で独自のコンピューティングボードを開発することが可能です。この自由さが BeagleBoard シリーズの嬉しさです。

# 電力制御をするまで
さてボードとして BBG を使うとして、それで電力制御をするまでには若干距離があります。今回は以下のステップを踏んでみました。順に説明していきます。

- Cape を作成する
- 電力制御箱に収める
- 三相誘導電動機を接続する
- プログラムを書く

## Exi Cape
ボード単体だと I/O があまり多く出ていません。この手のボードはドータボード (Daughter board) と言って、機能拡張用のボードを容易に拡張することが出来るようになっています。Raspberry Pi の場合はこのドータボードを **HAT** というふうに呼びます。昨日の記事はまさに HAT を作って PLC の代わりをさせる話でした。このようなドータボードを BeagleBone では **Cape** と呼ぶ習慣があります。

BeagleBone にはすでに[多くの Cape](http://beagleboard.org/capes) が販売されています。ただ欲しい機能をちょこちょことまとめて1枚の Cape にしたいというのが人情ですので、今回、欲しい仕様を [kochi.ex](https://kochi-ex.connpass.com) の面々と考えて [@myasu](https://qiita.com/myasu) さんに設計してもらいました。それがこちらです。

![ExiCape 基板（上）と部品を実装した様子（下）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260320/4d9d56a1-01ee-3e4f-b517-c6e015e726b9.jpeg)

これはコードネーム `Exi Cape` といいます。発音は「イチケイプ」です。

|機能|仕様|補足|
|:--|:--|:--|
|デジタル出力|4ch|非絶縁。シンク（NPN）・ソース（PNP）駆動切り替え可能。各chの動作確認LEDあり。|
|デジタル入力|4ch|〃|
|AD変換|10bit 2ch|非絶縁・入力保護のダイオード付き|
|暗号化|ATECC608A|[NervesKey](https://github.com/nerves-hub/nerves_key)の接続に対応|
|外部操作スイッチ|Power, Reset, μBoot|BeagleBone Green のスイッチ同様|
|外部UART端子|あり x 1|BeagleBone GreenのUARTに直結|
|電源|5V系/24V系は個別に供給|ポリスイッチ（過電流防止）あり|

基板は Seeed Studio の基板作成サービスの [Fusion PCB](https://www.seeedstudio.com/fusion.html) を使いました。[ExiCapeのガーバーデータ](https://github.com/exineris/exicape/tree/main/gerber) を送ると1週間ほどで出来上がってきます。基板10枚で作成費が 5USD未満です。ただ送料が 20USD ぐらいかかります。

Elixir の IoT プラットフォームである Nerves を使うと、次に OTA　(On the Air) 管理が可能になる [Nerves Hub](https://www.nerves-hub.org) を使いたくなります。このときに暗号化チップがあるとセキュリティが強化されていい塩梅です。
以下は裏面に暗号化チップ [ATECC608A](http://ww1.microchip.com/downloads/jp/DeviceDoc/40001977A_JP.pdf) を実装した様子です。

![暗号化チップを実装した様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260320/79d1f1d1-d267-e70f-969c-9408b2c358a4.jpeg)


### ExiCape を専用ケースに収める
Raspberry Pi や BeagleBone などのケースが売られていますが、HAT や Cape を装着した状態では使えないものがほとんどです。Cape を使ってもキレイにケースに収まるようにしたかったので、ケースも独自に設計しました。以下が BBG に ExiCape を乗せて、さらにケースに収容したものです。この Cape は Elixir / Nerves だけでなく、一般に BBB/BBG の IoT 的な応用として用いることができます。

![ExiCase](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260320/45a50342-b61c-994d-0497-e4e78720b87d.jpeg)

なお、このケースはご紹介だけで、電力制御用に使うときにはこのケースを使わずに別のボックスを使いました。

## 電力ボックスに収める
BBG と ExiCape の組み合わせで電力を制御するには、まだ足りません。BBG が扱うデジタル信号はたかだか DC3.3〜5.0V です。ExiCape はトランジスタで DC24V を駆動できるように設計されています。DC24V が使えるなら電磁リレーを使って AC100〜240V 等の電力の制御ができます。

以下の写真は木の板がはめ込んであるプラのボックスです。これに電力制御用の小物を収めました。これ複雑そうに見えますが、要は右上の赤い板に取り付けた BBG とその上（写真ではすぐ左側）に ExiCape があって、その DC24V のデジタル出力がはkの左上にある MC (Magnet Contact) と呼ばれる電磁接触器を On/Off させるという回路です。

![ExiBox](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260320/4fb4a8bf-b27f-efb1-68cd-9e9a05b2f563.jpeg)

下から伸びてる太い灰色のケーブルは三相200Vの電源につながるケーブルです。それが MC につながっています。MC が On の場合は MC の下側につながっている黒・白・緑の電線に電源が繋がります。この黒・白・緑の線は今回はモータにつなげてあります。

## 三相誘導電動機
電力を制御するって、どこまで何をやったら制御したことになるのでしょうか。電力制御の分野にはシーケンス制御という考え方があります。スイッチ・ボタンを押すと事前に決めてあるアルゴリズムに従ってランプ・モータを On/Off したりする技術です。我々はアルゴリズムといいますが、電力制御ではシーケンスと呼ばれます。このシーケンス制御っぽいことが出来ると電力制御をしたことになるでしょう。

シーケンス制御にはランプの On/Off とかもあります。光るの良いのですが、それだけだと消費電力の大きなLチカになるだけなのでちょっと感動がありません。やっぱりモータ（電動機）も動かさないと。シーケンス制御の教科書を見ると、後ろの方にやや難し目な例が出てきます。その中に三相誘導電動機の正転・逆転制御やY-Δ（ワイ・デルタ）制御というのが出てきます。最終的にはこれをやりたいと。すると三相誘導電動機、それもY-Δ対応の三相誘導電動機が必要になります。

以下は私が探した限りで最も小さいY-Δ駆動が可能な三相誘導電動機です。AliExpress でゲットしました。この電動機からは6本の線が出ていて電源線のつなぎ方によって、380V用・220V用、右回転・左回転、が選べます。これに貼ってある図で、上がΔ結線、下がY結線です。

![三相誘導電動機](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260320/3a6e6ee3-6f5d-1814-e934-68fa148068e3.jpeg)

なお、今回は時間がなかったので、正転・逆転やY-Δ制御はしませんで、On/Off だけで我慢しました。On/Off だけなら、電動機の図にある220Vか380Vのどちらかを選んで、それに該当する電線をボックス内の MC の負荷側にネジ止めするとおしまいです。

## プログラムを書く
今回のプログラムは Elixir の IoT プラットフォームである Nerves と、Web プラットフォームである Phoenix とを、Poncho 手法で構成しました。

今回はプログラムの中身を具体的には書きません。やっている内容は [@nishiuchikazuma](https://qiita.com/nishiuchikazuma) さんの [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜Phoenix/GCPでPub編〜（1/2）](https://qiita.com/nishiuchikazuma/items/6c537342f8815728f69d) と [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜NervesでSub編〜（2/2）](https://qiita.com/nishiuchikazuma/items/d0d1891349ea5b97a3cc) の内容でできます。

# 動かしてみる

実際に動かしてみた様子の動画を Twitter にあげましたので御覧ください。電源は三相AC200Vです。もはやチカってませんが「モタチカ」と命名させていただきました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">三相誘導電動機のモタチカの様子。<br>Driving 3 phase induction motor with <a href="https://twitter.com/hashtag/Nerves?src=hash&amp;ref_src=twsrc%5Etfw">#Nerves</a> and <a href="https://twitter.com/hashtag/Phoenix?src=hash&amp;ref_src=twsrc%5Etfw">#Phoenix</a>. <a href="https://t.co/ENR9y29aiN">pic.twitter.com/ENR9y29aiN</a></p>&mdash; KIKUCHI Yutaka 🌧 菊池 豊 (@kikuyuta) <a href="https://twitter.com/kikuyuta/status/1341751337692721154?ref_src=twsrc%5Etfw">December 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Web上のボタンを一つずつ押すと順に 4つの GPIO 出力が Off→On になります。最初の3つは積層表示灯をつけて、最後の1つが表示灯とともに電動機を動かします。なお、電動機の出力は減速ギアで回転数が落とされています。

# まとめ
オープンソースハードウェアの BBG を用い、Nerves と Phoenix によるプログラムで、Web から三相誘導電動機の動作をさせてみました。次は Y-Δ と正転・逆転などをやってみたいです。

さて、明日の [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp) の9日目の記事は [@torifukukaiou](https://qiita.com/torifukukaiou) さんの [Nervesで書き込める場所 (Elixir)](https://qiita.com/torifukukaiou/items/9dd5cfa81109a2e0a5eb) です。お楽しみに！

## 謝辞
ExiCape, ExiBox の設計・実装には [@myasu](https://qiita.com/myasu) さんの大いなる支援を受けました。ここに記して感謝いたします。ありがとうございました。

# 参考文献
ExiCape については GitHub 上で公開しています。ご自由にお使いください。何の保証もしないのでよく理解した上で使ってください。あと、何の前触れもなく変更する可能性もありますのでご了承ください。

- [ExiCape (github)](https://github.com/exineris/exicape)
    - [ExiCape 回路図](https://github.com/exineris/exicape/blob/main/doc/ExiCape.pdf)
    - [ExiCape Gerber データ](https://github.com/exineris/exicape/tree/main/gerber)
- [Elixir/NervesでPLC(多機能リレー)を作ってみた](https://qiita.com/myasu/items/a6664d3a3c76503affc7)
- [Groveと産業機器をつないでみよう](https://qiita.com/myasu/items/7b429ae24543488c390d)
- [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜Phoenix/GCPでPub編〜（1/2）](https://qiita.com/nishiuchikazuma/items/6c537342f8815728f69d)
- [NervesとPhonenix(Gigalixir)とGCP Cloud PubSubを使ってBBG CapeのLEDをチカした話〜NervesでSub編〜（2/2）](https://qiita.com/nishiuchikazuma/items/d0d1891349ea5b97a3cc) 
- [はじめてNerves(0) ElixirによるIoTフレームワークNervesがとにかく動くようになるためのリンク集](https://qiita.com/kikuyuta/items/9dee85c32004c8e827e7)