search
LoginSignup
8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

#NervesJP Advent Calendar 2020 Day 7

posted at

updated at

Organization

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

この記事は、#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.おわりに

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

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
What you can do with signing up
8
Help us understand the problem. What are the problem?