SONY Spresense でRS-485 マルチドロップのテスト

**Spresens rs-485 Multi Drop test program**

3枚の基板を使ってRS-485のテストを行います。
実際は3枚の基板に対してのマスター・スレーブの制御が必要となりますが、今回は単純に3枚の基板から別々のデータを送信しています。
よって送信のタイミングが重なった場合は正常に動きません。

**事前準備**  
SJ1　受信イネーブル制御ピン選択　1: EMMC_DATA3
SJ2　送信イネーブル制御ピン選択　1: EMMC_DATA2
SJ3　ショート RXラインの終端抵抗有効 (両端の2枚)
SJ4　ショート:RS-485
SJ5　ショート:RS-485  

3枚の基板の Y Z または A B どうしを接続
![IMG-0375.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/4e302dd0-812c-e643-1f1f-9fc79ca84b78.jpeg)
  
**プログラム**  
spresense_rs485_unit1.ino  
　送信データ "1234567890"

```spresense_rs485_unit1.ino
/*
  Spresense RS-422/485 ボード(NS-SPR-0301)　テストプログラム
  rS-422/485 test
  Set Jummper
  SJ1　1-2ショート　　
  SJ2　1-2ショート　　
  SJ3　ショート
  SJ4　ショート
  SJ5　ショート

  Next Step LLC
  https://next-step.asia/
  https://github.com/kaz19610303/SPRESENSE_RS422_485
*/

#define Receive_Enable 21                     // 受信許可ピン Active LOW
#define Transmit_Enable 20                    // 送信許可ピン Active High


void setup() {
  // initialize both serial ports:
  Serial.begin(115200);                         // Monitor terminal
  Serial2.begin(115200);                        // RS-422/485 terminal
  pinMode(21,OUTPUT);
  pinMode(20,OUTPUT);
  digitalWrite(Receive_Enable, LOW);          // Receive Enable
}

void loop() {
  Serial.println("Send unit_1 : 1234567890");
  digitalWrite(Transmit_Enable, HIGH);        // Transmit Enable
  Serial2.println("1234567890");              // Send RS-422/485 
  Serial.flush();
  digitalWrite(Transmit_Enable, LOW);         // Transmit Enable
  while (Serial2.available()) {               // Recive RS-422/485
    Serial.write(Serial2.read());             // Send Monitor terminal 
  }
  delay(1000);
}
```

spresense_rs485_unit2.ino  
　送信データ "9876543210"

```spresense_rs485_unit2.ino
/*
  Spresense RS-422/485 ボード(NS-SPR-0301)　テストプログラム
  rS-422/485 test
  Set Jummper
  SJ1　1-2ショート　　
  SJ2　1-2ショート　　
  SJ3　ショート
  SJ4　ショート
  SJ5　ショート

  Next Step LLC
  https://next-step.asia/
  https://github.com/kaz19610303/SPRESENSE_RS422_485
*/

#define Receive_Enable 21                     // 受信許可ピン Active LOW
#define Transmit_Enable 20                    // 送信許可ピン Active High


void setup() {
  // initialize both serial ports:
  Serial.begin(115200);                         // Monitor terminal
  Serial2.begin(115200);                        // RS-422/485 terminal
  pinMode(21,OUTPUT);
  pinMode(20,OUTPUT);
  digitalWrite(Receive_Enable, LOW);          // Receive Enable
}

void loop() {
  Serial.println("Send unit_2 : 9876543210");
  digitalWrite(Transmit_Enable, HIGH);        // Transmit Enable
  Serial2.println("9876543210");              // Send RS-422/485 
  Serial.flush();
  digitalWrite(Transmit_Enable, LOW);         // Transmit Enable
  while (Serial2.available()) {               // Recive RS-422/485
    Serial.write(Serial2.read());             // Send Monitor terminal 
  }
  delay(1000);
}
```

spresense_rs485_unit3.ino  
　送信データ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

```spresense_rs485_unit2.ino
/*
  Spresense RS-422/485 ボード(NS-SPR-0301)　テストプログラム
  rS-422/485 test
  Set Jummper
  SJ1　1-2ショート　　
  SJ2　1-2ショート　　
  SJ3　ショート
  SJ4　ショート
  SJ5　ショート

  Next Step LLC
  https://next-step.asia/
  https://github.com/kaz19610303/SPRESENSE_RS422_485
*/

#define Receive_Enable 21                     // 受信許可ピン Active LOW
#define Transmit_Enable 20                    // 送信許可ピン Active High


void setup() {
  // initialize both serial ports:
  Serial.begin(115200);                         // Monitor terminal
  Serial2.begin(115200);                        // RS-422/485 terminal
  pinMode(21,OUTPUT);
  pinMode(20,OUTPUT);
  digitalWrite(Receive_Enable, LOW);          // Receive Enable
}

void loop() {
  Serial.println("Send unit_3 : ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  digitalWrite(Transmit_Enable, HIGH);        // Transmit Enable
  Serial2.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");              // Send RS-422/485 
  Serial.flush();
  digitalWrite(Transmit_Enable, LOW);         // Transmit Enable
  while (Serial2.available()) {               // Recive RS-422/485
    Serial.write(Serial2.read());             // Se<<<nd Monitor terminal 
  }
  delay(1000);
}
```

**実行結果**
![rs485_3units_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/b65f2193-0270-2d90-bb65-694b32170b8f.png)

RS-485 は半二重通信の為、送信と受信の制御が必須となります。
(受信は常時アクティブでも可)
このタイミングを正しく制御しないと正しく通信出来ませんのでご注意ください。