この記事は、#NervesJP Advent Calendar 2020の7日目です。
6日目は、@takasehideki 先生の「Docker(とVS Code)だけ!でNerves開発環境を整備する」でした。Docker+Windowsユーザにとっては有り難い記事ですね~
#1.はじめに
NervesJPというコミュニティでは、いろいろな勉強会やハンズオンに取り組んでいます。
Nervesとは? - Nervesが開拓する「ElixirでIoT」の新世界
ハンズオンしたら、やはり身近なところで実装してみたくなるところ・・・そういう用途を想定して、身近な測定や制御に活用するための機材を作ってみました。
補足:PLCという単語に馴染みのない方へ・・・
つまり、工場やプラントのなかの生産設備、エレベータ、ビル空調・照明・・・など、産業機器の制御に特化したコンピュータです。
##なぜPLCにElixirを使いたいの?
PLCの多くはラダーなどの言語で書かれています。
FA系では非常に馴染みのある言語ですが、C#やPythonなどの言語とは大分概念が違うので、IT系の方が触るとなると取っ掛かりに戸惑いがあります。
比較的新しいPLCでは、LinuxやリアルタイムOS等が自由に動かせる環境が整ってきて、多くの高級言語も容易に扱う事ができるようになりました。
それらの言語の中で、長期に渡る安定動作や分散処理、RUN中書き込み1など、PLCならではの機能を要求する場合に対応出来そうなのが、Elixirかなと考えています。
- Elixirの特徴(分かり易い記事です)
- 組込み向けElixirの可能性について
まだまだ作例が少ないのですが、上手くいけばラダーに変わる高級言語になり得るかと期待しているので、個人的に色々模索しています。
#2.考え方
いわゆる多機能リレーをモデルにしています。
表題は(イメージしやすいかと思って)PLCとしていますが、PLCほどガリガリと制御する程でもなく、やや高機能なリレーの制御、ついでにアナログ入力やSeeedのGROVEとの接続までを、組み合わせたデバイスとして、簡単に活用出来るイメージで開発してみました。
Raspberry Pi Zero WHをそのまま載せているので、Nerves/Elixir以外でも、PythonやGo、RustなどRaspberryPiで動く言語は何でもOKです。
##(1)外観
タカチの「DINモジュールボックス H53シリーズ」にぴったり収まるようにしています。
中の基板はこんな感じです。
Raspberry Pi Zero WH を垂直に取り付けます。
こうすることで、Raspberry Pi Zeroの側面に設置のコネクタに対し、DINモジュールボックスの正面からアクセスできるようになっています。(用事が無ければ、フタをして構いません)
DINレールに設置してみた
##(2)仕様
今までRaspberryPiを活用してきて、最低限必要な機能を盛り込んでみました。
また、NervesのOTA機能、Nerves HUBなどを活用する際に必要な、Nerves Keyも設置できるようにしています。
機能 | 仕様 | 補足 |
---|---|---|
出力 | 4ch(フォトリレー絶縁) | シンク(NPN)・ソース(PNP)駆動切り替え可能。各chの動作確認LEDあり。 |
入力 | 4ch(フォトカプラ絶縁) | 〃 |
AD変換 | 10bit 2ch | 非絶縁・入力保護のダイオード付き |
時刻保持 | リアルタイムクロックDS1307 | ボタン電池でバックアップ |
GROVEコネクタ | あり、I2C x 1 | 5V電源タイプ |
外部UART端子 | あり x 1 | RaspberryPiのUARTに直結 |
電源 | 5V系/24V系は個別に供給 | それぞれポリスイッチ(過電流防止)あり |
#3.ハードウェアのはなし
基板のデータはKiCAD形式で、Githubに公開しています。
ライセンスはクリエイティブコモンズです。
gerberディレクトリに、ガーバデータも一式入れてありますので、PCB業者さんにそのまま発注すれば基板を作る事ができます。
基板の発注の仕方については、こちらを参考にしてください。
##(1)全体構成
各入出力は、下記の様に接続しています。
##(2)入力/出力回路
(抜粋)
入出力共に、フォトカプラで絶縁しています。
74HC541を経由して、RaspberryPiのGPIOに接続しています。
J5, J7の接続
|対応表|GPIO(BCM表記)|本機の端子|
|:--|:--|:--|:--|
|入力|12|X0|
|〃|16|X1|
|〃|20|X2|
|〃|21|X3|
|出力|6|Y0|
|〃|13|Y1|
|〃|19|Y2|
|〃|26|Y3|
J2の接続
24V系の電源と、24V系の入出力端子の回路です。
J6
コネクタへの電源供給の仕方で、シンク・ソース駆動を切り替えられます。
供給方法に合わせて、LEDの点灯対象や、X・Y側のCOM端子への給電も変わります。
駆動したい方法 | Pow24+In | Pow24-In | D16 | D13 | X側COM端子 | Y側COM端子 | ||
---|---|---|---|---|---|---|---|---|
シンク | +24V | GND | → | 点灯 | 消灯 | GND | +24V | |
ソース | GND | +24V | → | 消灯 | 点灯 | +24V | GND |
ソース駆動にしたいときには、24V端子の接続を逆にするだけです。
入力(X)、出力(Y)とも、コモン端子を隣りに設置しているので、
接続対象の配線を隣り合わせでターミナルに差し込んでください。
##(4)I2C回路
(抜粋)
RaspberryPiのI2C端子から、3.3V→5Vレベルコンバータを経由して、RTCとNervesKey、GROVEコネクタに接続します。
#4.ソフトウェア
本記事では詳細は触れませんが、Qiita他でハードウェア制御の例がありますので、そちらのコードで試してみてください。
-
Nerves - Qiita
- https://qiita.com/takasehideki/items/94820516ec95b85bae32
- https://qiita.com/torifukukaiou/items/bf0354db8cd0628f161e
- https://qiita.com/nishiuchikazuma/items/cce6152430467cffba56
- https://qiita.com/kikuyuta/items/6c8debcfe7741ef48dd3
- https://qiita.com/kikuyuta/items/904acd2ce4117168d22a
- https://qiita.com/kikuyuta/items/a5a0dd72ef926299be7e
#5.おわりに
ハードは作った。さぁこれからだ!
今後、いろいろな社会実装に向けて、活用していけたら良いなぁ・・・
(どうやって展開していこう^^;)