0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

表示灯

注意
本記事には部品を改造する内容が含まれています部品改造が嫌な人は見ないようにしてください

表示灯とは

ホームドアの検知ランプや連絡用ブザー用ボタン、走行表示灯がついた箱になります。
実際の動作はこちらの資料のようになっていたようですがどの資料を探してもランプが光っているものを確認できませんでした。
ホーム検知装置の開発

内部の様子

中を見て一目で気づくのが綺麗に取り回しされた配線でしょう。
近年の製品というのもあると思いますが、タイラップを使い、綺麗に配線が取り回された様は驚愕でさすがコイト電工と思ってしまいます。
表示灯
シャーシマウントの抵抗器が特徴的ですね
JRMのGZシリーズでしょうか?
image.png
©引用元:https://www.jrm.co.jp/pdf_products/fixed_resis/g.pdf
表示灯

ピン配列

ピン配列は以下のようになっています。
image.png
©引用元:https://www.souriau.com/en-en/system/files/productrange/downloads/g_web.pdf
image.png

動作の様子

LED類は5KΩ程度の抵抗が入っており100Vを前提としていると思われますが24Vで動作可能でした。

再製の前に

コネクタは SOURIAU社G2B18-22PNE と言う製品でした。
相手部品は1個8千円近くするため、コネクタを社外のものと交換することとしました。
断腸の思いで内部の配線を外して行きます。
1個5千円以上のコネクタです、万が一使用することを考えて出来る限り配線を残すようにしました。
配線

代替コネクタ

サイズは若干異なりますが、同形状で使用可能なコネクタをAliexpressで発見したのでこちらを使用します。
image.png
https://ja.aliexpress.com/item/32819133450.html?spm=a2g0o.order_list.0.0.50d6585aFXnS8h&gatewayAdapt=glo2jpn
コネクタ

内部配線

それでは再製開始です。
表示灯
まずは、強制ドア開閉スイッチに配線します。
強制ドア開扉スイッチは AH164-TFR11 というスイッチで、中にLEDが入っていません。
スイッチ自身は共通なのがおもしろいですね。
スイッチ
極力原型に近いような配線にしました。
さすがコイト電工という位、配線が綺麗だったのでタイラップで少し綺麗に配線してあげましょう。
私のようにいつも必要以上に長い配線にすると写真のようになるのでほどほどにする事をお勧めします。
DSC_0777 (2).JPG
コネクタも良い感じですね
DSC_0785 (2).JPG

配線

配線に8芯のケーブルを探しましたが適当なものが無かったのでAWG24を使用しているLANケーブルを切って使用しました。
※ノイズを拾うことがあるので使用には注意しましょう※
LANケーブルとコネクタ
いつもの通り配線には熱収縮チューブでラベルを用意しました。

ラベル

熱収縮チューブ
先日の車掌スイッチに台座を取り付けた様子
取付1
本体を取り付けた様子
取付②

完成

LANケーブルそのままでは見た目が良く無いので編組チューブを使います。
編組チューブ
これで一応完成です。
取付③

プログラム

それでは動作させるプログラムを作りましょう。

  • 強制開扉を押すとドアが開く
  • 走行表示灯を点灯させる
  • ホーム検知のランプを点灯させる
    動作を可能にします。

元となるプログラムは、以前から使っている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);
}

連絡用ブザーを追加

連絡用ブザーを追加しました。
ブザー
ブザー

完成

これでBVEと表示灯が連携して使用できるようになりました。
全景
表
側面
横
背面
裏
以上で完成です。

製作動画

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?