東京メトロ7000系の表示灯を動かす

東京メトロ7000系の車掌スイッチを動かすの続きで表示灯を動かしてみます。

https://qiita.com/usashirou/items/5d0faba900008a1e0c44

![表示灯](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/324e6780-171b-1f64-afc7-d871f48d939f.jpeg)

:::note alert
注意
本記事には部品を改造する内容が含まれています部品改造が嫌な人は見ないようにしてください
:::
# 表示灯とは
ホームドアの検知ランプや連絡用ブザー用ボタン、走行表示灯がついた箱になります。
実際の動作はこちらの資料のようになっていたようですがどの資料を探してもランプが光っているものを確認できませんでした。
__ホーム検知装置の開発__

https://www.jreast.co.jp/development/tech/pdf_21/Tech-21-21-26.pdf
## 内部の様子
中を見て一目で気づくのが綺麗に取り回しされた配線でしょう。
近年の製品というのもあると思いますが、タイラップを使い、綺麗に配線が取り回された様は驚愕でさすがコイト電工と思ってしまいます。
![表示灯](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/667127be-58b3-9028-3c36-da45eb0d8652.jpeg)
シャーシマウントの抵抗器が特徴的ですね
JRMのGZシリーズでしょうか？ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6e2ff0a2-84be-f416-71eb-4de728d53299.png)
©引用元：https://www.jrm.co.jp/pdf_products/fixed_resis/g.pdf
![表示灯](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ab4256ba-d273-89ed-d4a3-2cfb6f7604fa.jpeg)
# ピン配列
ピン配列は以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dc2c3699-21fe-1ad3-86cc-30a52ab8cdf5.png)
©引用元：https://www.souriau.com/en-en/system/files/productrange/downloads/g_web.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/01714e17-ac93-3888-b2ad-da0e47097300.png)
# 動作の様子
ＬＥＤ類は5KΩ程度の抵抗が入っており100Vを前提としていると思われますが２４Ｖで動作可能でした。
# 再製の前に
コネクタは __SOURIAU社__ の __G2B18-22PNE__ と言う製品でした。
相手部品は1個8千円近くするため、コネクタを社外のものと交換することとしました。
断腸の思いで内部の配線を外して行きます。
１個5千円以上のコネクタです、万が一使用することを考えて出来る限り配線を残すようにしました。
![配線](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/912dbe83-094a-cac4-bad3-f1f6312f8d62.jpeg)
# 代替コネクタ
サイズは若干異なりますが、同形状で使用可能なコネクタをAliexpressで発見したのでこちらを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0bedaabf-a588-9100-b46f-81b69badaff5.png)
https://ja.aliexpress.com/item/32819133450.html?spm=a2g0o.order_list.0.0.50d6585aFXnS8h&gatewayAdapt=glo2jpn
![コネクタ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2bc04a53-7fe4-a95e-3eb6-7454cc2f7120.jpeg)
# 内部配線
それでは再製開始です。
![表示灯](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c02c5db2-6c92-bed5-af99-dfcae96a12ad.jpeg)
まずは、強制ドア開閉スイッチに配線します。
強制ドア開扉スイッチは __AH164-TFR11__ というスイッチで、中にLEDが入っていません。
スイッチ自身は共通なのがおもしろいですね。
![スイッチ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a2f84dbf-0616-01ce-725b-328a49452670.jpeg)
極力原型に近いような配線にしました。
さすがコイト電工という位、配線が綺麗だったのでタイラップで少し綺麗に配線してあげましょう。
私のようにいつも必要以上に長い配線にすると写真のようになるのでほどほどにする事をお勧めします。
![DSC_0777 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6c00ffca-9040-0c61-a596-8cd2bb11fcc7.jpeg)
コネクタも良い感じですね
![DSC_0785 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8887e6b1-9876-ea31-27c6-2899c5e84268.jpeg)

# 配線
配線に８芯のケーブルを探しましたが適当なものが無かったのでAWG24を使用しているLANケーブルを切って使用しました。
__※ノイズを拾うことがあるので使用には注意しましょう※__
![LANケーブルとコネクタ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/838e31d2-8348-1dfb-4fa9-8abb0d31ace3.jpeg)
いつもの通り配線には熱収縮チューブでラベルを用意しました。

https://qiita.com/usashirou/items/c456222b953cff4ecb24

![ラベル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/89fd7762-2a0b-e410-979c-28ae0aefcc9d.jpeg)

![熱収縮チューブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3bbc214e-6d13-beb9-0a4b-1c34566643be.jpeg)
先日の車掌スイッチに台座を取り付けた様子
![取付1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a6561b2a-d167-fe77-c278-fa173ae83f49.jpeg)
本体を取り付けた様子
![取付②](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/85de3711-401a-9ac2-f995-5ab8735c462c.jpeg)
## 完成
LANケーブルそのままでは見た目が良く無いので編組チューブを使います。
![編組チューブ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f2690530-08f2-70fb-e9cd-78d9fceb4d26.jpeg)
これで一応完成です。
![取付③](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c3def932-3202-b82a-acd9-04c86e59a8fd.jpeg)
## プログラム
それでは動作させるプログラムを作りましょう。
- 強制開扉を押すとドアが開く
- 走行表示灯を点灯させる
- ホーム検知のランプを点灯させる
動作を可能にします。

元となるプログラムは、以前から使っているBVEのものを転用します。
今回もマイコンボードはRaspberryPiPicoの為、通信にはUSB-Serial変換モジュールを使います。
__10Km/h__ になると走行表示灯が点灯するようになりました。
ホームドアの検知ランプはBVEには存在しませんが、コマンドを送ると使えるようにしてあります。
```
//https://qiita.com/Ninagawa_Izumi/items/6a18249a31a87dad84e2
char dai0;
char dai1;
char dai2;
char dai3;
char dai4;
char dai5;

#include <SoftwareSerial.h>
#define microsw 10
#define opensw 11
#define closesw 18
#define openled 9
#define tobuled 8
#define closeled 7

#define runled 2
#define k1 3
#define k3 4

#define forced 28
char bvein;

SoftwareSerial SoftSerial(12, 13);    // RX,TXの割り当て
volatile int state = LOW;

#define elements 5 //カンマで区切るデータの最大項目数
String data_string; //シリアルで受け取る全文字列
char *p; //文字列をカンマで分割するstrtok処理で使うポインタ
String p_string; //上記ポインタで区切った文字列の仮格納用
String data_array[elements]; //カンマ分割されたstrデータを格納する

void setup() {
  pinMode(microsw, INPUT_PULLUP);
  pinMode(opensw, INPUT_PULLUP);
  pinMode(closesw, INPUT_PULLUP);
  pinMode(forced, INPUT_PULLUP);
  pinMode(openled, OUTPUT);
  pinMode(tobuled, OUTPUT);
  pinMode(closeled, OUTPUT);
  pinMode(runled, OUTPUT);
  pinMode(k1, OUTPUT);
  pinMode(k3, OUTPUT);

  attachInterrupt(digitalPinToInterrupt(opensw), openop, FALLING);
  attachInterrupt(digitalPinToInterrupt(closesw), closeop, FALLING);
//  attachInterrupt(digitalPinToInterrupt(forced), forceop, FALLING);

  Serial.begin(115200);
  Serial1.begin(115200);
  Serial1.setTimeout(10);        // タイムアウトの時間を100msに変更
  SoftSerial.begin(9600);
  volume(0x1E);//Volume settings 0x00-0x1E
}

void loop() {
  if (Serial1.available() > 5 ) {
    data_string = Serial1.readStringUntil(0x0a); //シリアルデータを改行記号が現れるまで読み込む
    data_string.trim(); //文字列を念のためトリミングする
    int data_len = data_string.length() + 1; //str→char変換用にデータの長さを調べる
    char data_char[data_len]; //str→char変換用のchar配列を準備
    data_string.toCharArray(data_char, data_len); //ようやくstr→charに変換
    p = strtok(data_char, ","); //カンマ分割の1要素目を行う
    p_string = p; //一旦strにいれる
    data_array[0] = p_string; //最終目的の配列に1要素目を格納

    for (int i = 1; i < elements; i++) { //2要素名以降について、要素数分だけデータ配列に格納
      p = strtok(NULL, ","); //カンマ分割の2要素目以降のstrtokはこの書式になる
      if (p != NULL) { //要素が空でない場合はその要素をデータ配列に格納
        p_string = p;
        data_array[i] = p_string;
      } else {
        data_array[i] = "0"; //要素が空の場合はデータ配列に0を格納
      }
    }
    //データを表示する
    for (int i = 0; i < elements ; i++) {
      dai0 = data_array[0].toInt();
      if (dai0 >= 0 && dai1 < 10) {
        digitalWrite(runled, LOW);
      }
      if (dai0 >= 10 && dai1 <= 125) {
        digitalWrite(runled, HIGH);
      }
      dai1 = data_array[1].toInt();
      if (dai1 == 0) {
        digitalWrite(openled, LOW);
        digitalWrite(tobuled, LOW);
        digitalWrite(closeled, HIGH);
      }
      if (dai1 == 1) {
        digitalWrite(openled, HIGH);
        digitalWrite(tobuled, HIGH);
        digitalWrite(closeled, LOW);
      }
      dai2 = data_array[2].toInt();
      if (dai2 == 1) {
        digitalWrite(k1, HIGH);
      }
      if (dai2 == 0) {
        digitalWrite(k1, LOW);
      }
      dai3 = data_array[3].toInt();
      if (dai3 == 1) {
        digitalWrite(k3, HIGH);
      }
      if (dai3 == 0) {
        digitalWrite(k3, LOW);
      }
    }
    Serial1.println();
  }
  if (digitalRead(microsw) == LOW)
  {
    Serial1.println("microsw");
    play(0x01);//Play the specified audio:0x01-file0001
    delay(2500);
  }
  if (digitalRead(forced) == LOW)
  {
    Serial1.println("Forced Opening");
    play(0x01);//Play the specified audio:0x01-file0001
    digitalWrite(openled, HIGH);
    digitalWrite(tobuled, HIGH);
    digitalWrite(closeled, LOW);
    digitalWrite(k1, HIGH);
    delay(2500);
  }
}

void play(unsigned char Track)
{
  unsigned char play[6] = {0xAA, 0x07, 0x02, 0x00, Track, Track + 0xB3};
  SoftSerial.write(play, 6);
  Serial1.println("Sound");
}
void volume( unsigned char vol)
{
  unsigned char volume[5] = {0xAA, 0x13, 0x01, vol, vol + 0xBE};
  SoftSerial.write(volume, 5);
}

void openop() {
  Serial1.println("Open Door");
  digitalWrite(openled, HIGH);
  digitalWrite(tobuled, HIGH);
  digitalWrite(closeled, LOW);
}
void closeop() {
  Serial1.println("Close Door");
  play(0x01);//Play the specified audio:0x01-file0001
  digitalWrite(openled, LOW);
  digitalWrite(tobuled, LOW);
  digitalWrite(closeled, HIGH);
  digitalWrite(k1, LOW);
}
void forceop() {
  Serial1.println("Forced Opening");
  play(0x01);//Play the specified audio:0x01-file0001
  digitalWrite(openled, HIGH);
  digitalWrite(tobuled, HIGH);
  digitalWrite(closeled, LOW);
  digitalWrite(k1, HIGH);
}
```
# 連絡用ブザーを追加
連絡用ブザーを追加しました。
![ブザー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ae2d2bd9-c861-6055-eebd-e27a0c56a89f.jpeg)
![ブザー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/50eebdc7-6ea2-c767-02fc-80e08f88b17e.jpeg)
# 完成
これでBVEと表示灯が連携して使用できるようになりました。
全景
![表](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8b1db082-5a94-167f-de8a-4b612067eaf5.jpeg)
側面
![横](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a6dce48f-6a5e-8337-0607-a33e12893279.jpeg)
背面
![裏](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/26f7956a-bad7-44a3-5541-03a26894faed.jpeg)
以上で完成です。
# 製作動画
https://youtu.be/qeIKEuHA6_s