LoginSignup
21
8

More than 3 years have passed since last update.

Elixir/NervesでPLC(多機能リレー)を作ってみた

Last updated at Posted at 2020-12-06

この記事は、#NervesJP Advent Calendar 2020の7日目です。
6日目は、@takasehideki 先生の「Docker(とVS Code)だけ!でNerves開発環境を整備する」でした。Docker+Windowsユーザにとっては有り難い記事ですね~


1.はじめに

NervesJPというコミュニティでは、いろいろな勉強会やハンズオンに取り組んでいます。

Nervesとは? - Nervesが開拓する「ElixirでIoT」の新世界

ハンズオンしたら、やはり身近なところで実装してみたくなるところ・・・そういう用途を想定して、身近な測定や制御に活用するための機材を作ってみました。

補足:PLCという単語に馴染みのない方へ・・・

  1. プログラマブルロジックコントローラ
  2. PLCとは?

つまり、工場やプラントのなかの生産設備、エレベータ、ビル空調・照明・・・など、産業機器の制御に特化したコンピュータです。

なぜPLCにElixirを使いたいの?

PLCの多くはラダーなどの言語で書かれています。
FA系では非常に馴染みのある言語ですが、C#やPythonなどの言語とは大分概念が違うので、IT系の方が触るとなると取っ掛かりに戸惑いがあります。

比較的新しいPLCでは、LinuxやリアルタイムOS等が自由に動かせる環境が整ってきて、多くの高級言語も容易に扱う事ができるようになりました。

それらの言語の中で、長期に渡る安定動作や分散処理、RUN中書き込み1など、PLCならではの機能を要求する場合に対応出来そうなのが、Elixirかなと考えています。

まだまだ作例が少ないのですが、上手くいけばラダーに変わる高級言語になり得るかと期待しているので、個人的に色々模索しています。

2.考え方

いわゆる多機能リレーをモデルにしています。

市販品の一例
スマートリレー、多機能リレー:IDECOMRON
ローコストPLC:キーエンス三菱電機

表題は(イメージしやすいかと思って)PLCとしていますが、PLCほどガリガリと制御する程でもなく、やや高機能なリレーの制御、ついでにアナログ入力やSeeedのGROVEとの接続までを、組み合わせたデバイスとして、簡単に活用出来るイメージで開発してみました。

Raspberry Pi Zero WHをそのまま載せているので、Nerves/Elixir以外でも、PythonやGo、RustなどRaspberryPiで動く言語は何でもOKです。

(1)外観

タカチの「DINモジュールボックス H53シリーズ」にぴったり収まるようにしています。

image.png

中の基板はこんな感じです。
Raspberry Pi Zero WH を垂直に取り付けます。
こうすることで、Raspberry Pi Zeroの側面に設置のコネクタに対し、DINモジュールボックスの正面からアクセスできるようになっています。(用事が無ければ、フタをして構いません)

image.png

DINレールに設置してみた

image.png

(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)全体構成

各入出力は、下記の様に接続しています。

image.png

(2)入力/出力回路

(抜粋)
入出力共に、フォトカプラで絶縁しています。
74HC541を経由して、RaspberryPiのGPIOに接続しています。

image.png

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端子の接続を逆にするだけです。

image.png

入力(X)、出力(Y)とも、コモン端子を隣りに設置しているので、
接続対象の配線を隣り合わせでターミナルに差し込んでください。

(4)I2C回路

(抜粋)

RaspberryPiのI2C端子から、3.3V→5Vレベルコンバータを経由して、RTCとNervesKey、GROVEコネクタに接続します。

image.png

4.ソフトウェア

本記事では詳細は触れませんが、Qiita他でハードウェア制御の例がありますので、そちらのコードで試してみてください。

5.おわりに

ハードは作った。さぁこれからだ!
今後、いろいろな社会実装に向けて、活用していけたら良いなぁ・・・
(どうやって展開していこう^^;)

21
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
8