マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

ArduinoでPLC(Programmable logic controller)みたいなことをしてみた。

2020年02月08日 | 電子工作
様々な理由により、メーカーから販売されているPLCを使用しないで電子工作でPLCみたいなことをすることにした。

白羽がたったのは、昔ながらのArduinoだ。
(Raspberry Piを使用しなかったのは実は理由がある)

ラダーエディターは当初、LDmicroを使うつもりであった。(私の開発環境はUbuntuなのだが、wine上でLDmicroが動きました。)
結果的にはラダープログラムからarduino IDEに変換がうまく行きませんでしたので、ラダーの部分のみ使用させていただくことにしました。



回路はこんな風に配線しました。

arduinoの向こう側はただの端子台です。入力の端子を意味します。
こちら側にあるのは8 Relay Moduleです。出力を意味しています。
入力はプルアップ回路がめんどくさいので、ソフト上でPULL_UPしています。(これはSwitchSceinceさんのブログを参考にさせていただきました。)また、ソフトでPULL_UPすると動作が逆になるのでビックリマークで逆転しています。
リレーは「8 Relay Module」で調べるとだいたい出てきます。ただし、そのまま接続してdigitalWriteすると動作が逆になるので、これもビックリマークで逆転させています。また、 arduinoの5V端子から8台のリレーをいっぺんに駆動しようとすると電圧降下が起きるらしく、誤動作します。 別電源にすることをおすすめします。

arduinoのプログラムはこんなふうに作成しました。

 
  boolean x00 = false;
  boolean x01 = false;
  boolean x02 = false;
  boolean x03 = false;
  boolean m00 = false;
  boolean m01 = false;
  boolean m02 = false;
  boolean m03 = false;
  boolean m04 = false;
  boolean m05 = false;
  boolean m06 = false;
  boolean m07 = false;
  boolean y00 = false;
  boolean y01 = false;
  boolean y02 = false;
  boolean y03 = false;
  boolean y04 = false;
  boolean y05 = false;
  boolean y06 = false;
  boolean y07 = false;

void setup() {
  pinMode(2, INPUT_PULLUP); //x00
  pinMode(3, INPUT_PULLUP); //x01
  pinMode(4, INPUT_PULLUP); //x02
  pinMode(5, INPUT_PULLUP); //x03
  pinMode(6, OUTPUT);             //y00
  pinMode(7, OUTPUT);             //y01
  pinMode(8, OUTPUT);             //y02
  pinMode(9, OUTPUT);             //y03
  pinMode(10, OUTPUT);           //y04
  pinMode(11, OUTPUT);            //y05
  pinMode(12, OUTPUT);            //y06
  pinMode(13, OUTPUT);            //y07
}

void loop() {
// 入力部分
  x00 = !digitalRead( 2 );
  x01 = !digitalRead( 3 );
  x02 = !digitalRead( 4 );
  x03 = !digitalRead( 5 );  

// 実際のプログラム部分(開始)

  y00 = ( x00 || y00 ) && !(x01);

// 実際のプログラム部分(終了)

// 出力部分
  digitalWrite( 6 , !y00);
  digitalWrite( 7 , !y01);
  digitalWrite( 8 , !y02);
  digitalWrite( 9 , !y03);
  digitalWrite(10 , !y04);
  digitalWrite(11 , !y05);
  digitalWrite(12 , !y06);
  digitalWrite(13 , !y07);
}


PLCとしてのプログラムは「実際のプログラム部分」の一行のみです。 このプログラムの内容としては保持回路です。