OpenPLC用 Arduino UNO用テストベンチボードを作ってみました

最近OpenPLCを扱い始めたので、Arduino UNO用の入出力モニター用のテストベンチボードを作ってみました。
もちろん、OpenPLCを使わない場合も入出力のモニターボードとして使えます。

信号対応表はこのようになっています。
OpenPLCのArduino UNO向けの標準ピンアサインに対応させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/9affea5d-acca-0794-d9ef-1345c1083817.png)

このピンアサインを基に設計した回路図です。
![OpenPLC_Arduino_UNO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/cd0945e0-5acb-7437-1de5-d7f30f6b7bb1.png)

入出力共に正論理で設計していますので
1を出力したらLEDが光り、SWを押したら入力値が1になりモニタLEDが光ります。
また各信号を外部に取り出すためにスクリューターミナルを実装しています。

I2Cの接続用のGROVE準拠のコネクターを実装していますが、I2Cを使う場合は
A4とA5はアナログ入力に使えませんので、J1のショートバーを外します。
A1～A4もショートバーを外すとオンボードの半固定ボリュームを無効化出来ます。

部品実装前の基板(部品実装サービスを利用したので表面実装部品は実装されています)
![IMG-0923.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/6d654877-05d0-5027-57e5-e6ff9e3b1ad6.jpeg)
![IMG-0924.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/55e191ca-9f16-90e1-c72a-dae76cb8b40f.jpeg)
部品実装後の基板
![IMG-0928.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/ea17be15-1e87-8265-5087-9dd1dffe411a.jpeg)

ここで設計ミスを発見(泣)
1. I2C用のコネクターを取り付けると干渉して Analog output(J1)ターミナルからGNDをを取り出せない。
2. オンボードの半固定ボリュームが左がMAXで右がMIN となっている。
この2点は次期Versionで修正します。

テストプログラム
```arduino_plc_shield_test.ino
/*
  OpenPLC Arduino UNO Test Brnch Board Test Program.

  Document and source code.
  https://github.com/kaz19610303/OpenPLC
  
  modified 31 Nov 2022
  by Kazuaki Ueno
  NExt Step LLC
  https://nest-step.asia/

  This example code is in the public domain.
*/

// 入出力ピン 設定
#define OUT_0 7
#define OUT_1 8
#define OUT_2 12
#define OUT_3 13

#define INPUT_0 2
#define INPUT_1 3
#define INPUT_2 4
#define INPUT_3 5
#define INPUT_4 6

#define ANALOG_OUT_0 9
#define ANALOG_OUT_1 10
#define ANALOG_OUT_2 11

#define ANALOG_INPUT_0 A0
#define ANALOG_INPUT_1 A1
#define ANALOG_INPUT_2 A2
#define ANALOG_INPUT_3 A3
#define ANALOG_INPUT_4 A4
#define ANALOG_INPUT_5 A5

// the setup function runs once when you press reset or power the board
void setup() {
  Serial.begin(115200);
  
  // initialize pin to input or output.
  pinMode(OUT_0, OUTPUT);
  pinMode(OUT_1, OUTPUT);
  pinMode(OUT_2, OUTPUT);
  pinMode(OUT_3, OUTPUT);

  pinMode(ANALOG_OUT_0, OUTPUT);
  pinMode(ANALOG_OUT_1, OUTPUT);
  pinMode(ANALOG_OUT_2, OUTPUT);

  pinMode(INPUT_0, INPUT);
  pinMode(INPUT_1, INPUT);
  pinMode(INPUT_2, INPUT);
  pinMode(INPUT_3, INPUT);
  pinMode(INPUT_4, INPUT);
}

// the loop function runs over and over again forever
void loop() {
  uint16_t analog_value_0;
  uint16_t analog_value_1;
  uint16_t analog_value_2;
  uint16_t analog_value_3;
  uint16_t analog_value_4;
  uint16_t analog_value_5;

  uint8_t analog_out_value_0;
  uint8_t analog_out_value_1;
  uint8_t analog_out_value_2;

  uint8_t input_value_0;
  uint8_t input_value_1;
  uint8_t input_value_2;
  uint8_t input_value_3;
  uint8_t input_value_4;

  uint8_t output_value_0;
  uint8_t output_value_1;
  uint8_t output_value_2;
  uint8_t output_value_3;

  uint8_t InputValue_hex ;

  // Analog input
  analog_value_0 = analogRead(ANALOG_INPUT_0);
  analog_value_1 = analogRead(ANALOG_INPUT_1);
  analog_value_2 = analogRead(ANALOG_INPUT_2);
  analog_value_3 = analogRead(ANALOG_INPUT_3);
  analog_value_4 = analogRead(ANALOG_INPUT_4);
  analog_value_5 = analogRead(ANALOG_INPUT_5);

  // Digital input
  input_value_0 = digitalRead(INPUT_0);
  input_value_1 = digitalRead(INPUT_1);
  input_value_2 = digitalRead(INPUT_2);
  input_value_3 = digitalRead(INPUT_3);
  input_value_4 = digitalRead(INPUT_4);

  // Digital output data set
  output_value_0 = input_value_0 ;
  output_value_1 = input_value_1 ;
  output_value_2 = input_value_2 ;
  output_value_3 = input_value_3 || input_value_4;

  // Analog output data set
  analog_out_value_0 =  map(analog_value_0 + analog_value_3, 0, 1023*2, 0, 255);
  analog_out_value_1 =  map(analog_value_1 + analog_value_4, 0, 1023*2, 0, 255);
  analog_out_value_2 =  map(analog_value_2 + analog_value_5, 0, 1023*2, 0, 255);

  // Analog data write
  analogWrite(ANALOG_OUT_0, analog_out_value_0);
  analogWrite(ANALOG_OUT_1, analog_out_value_1);
  analogWrite(ANALOG_OUT_2, analog_out_value_2);

  // Digital data write
  digitalWrite(OUT_0,output_value_0);
  digitalWrite(OUT_1,output_value_1);
  digitalWrite(OUT_2,output_value_2);
  digitalWrite(OUT_3,output_value_3);

  // Digital output data to HEX
  InputValue_hex = 0;
  InputValue_hex |= input_value_4 << 4 ;
  InputValue_hex |= input_value_3 << 3 ;
  InputValue_hex |= input_value_2 << 2 ;
  InputValue_hex |= input_value_1 << 1 ;
  InputValue_hex |= input_value_0 ;
  
  Serial.print("Degital Input (hex): ");
  Serial.println(InputValue_hex,HEX);
  Serial.println("");
  
  Serial.print("Analog input 0 : ");
  Serial.println(analog_value_0);
  Serial.print("Analog input 1 : ");
  Serial.println(analog_value_1);
  Serial.print("Analog input 2 : ");
  Serial.println(analog_value_2);
  Serial.print("Analog input 3 : ");
  Serial.println(analog_value_3);
  Serial.print("Analog input 4 : ");
  Serial.println(analog_value_4);
  Serial.print("Analog input 5 : ");
  Serial.println(analog_value_5);
  Serial.println("");

  // 0.5sec deleay
  delay(500);
}
```
このボードを使ったOpenPLCのサンプルをYoutubeにて公開の予定です。

2023年1月5日　修正したボードです
![IMG-0951.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/8b3accc6-ce80-a9f2-41ea-e9fddd4bf774.jpeg)

修正版のボードの販売を開始しました。
https://nextstep.official.ec/items/70730102