東京メトロ7000系の車掌スイッチを動かすの続きで表示灯を動かしてみます。
注意
本記事には部品を改造する内容が含まれています部品改造が嫌な人は見ないようにしてください
表示灯とは
ホームドアの検知ランプや連絡用ブザー用ボタン、走行表示灯がついた箱になります。
実際の動作はこちらの資料のようになっていたようですがどの資料を探してもランプが光っているものを確認できませんでした。
ホーム検知装置の開発
内部の様子
中を見て一目で気づくのが綺麗に取り回しされた配線でしょう。
近年の製品というのもあると思いますが、タイラップを使い、綺麗に配線が取り回された様は驚愕でさすがコイト電工と思ってしまいます。
シャーシマウントの抵抗器が特徴的ですね
JRMのGZシリーズでしょうか?
©引用元:https://www.jrm.co.jp/pdf_products/fixed_resis/g.pdf
ピン配列
ピン配列は以下のようになっています。
©引用元:https://www.souriau.com/en-en/system/files/productrange/downloads/g_web.pdf
動作の様子
LED類は5KΩ程度の抵抗が入っており100Vを前提としていると思われますが24Vで動作可能でした。
再製の前に
コネクタは SOURIAU社 の G2B18-22PNE と言う製品でした。
相手部品は1個8千円近くするため、コネクタを社外のものと交換することとしました。
断腸の思いで内部の配線を外して行きます。
1個5千円以上のコネクタです、万が一使用することを考えて出来る限り配線を残すようにしました。
代替コネクタ
サイズは若干異なりますが、同形状で使用可能なコネクタをAliexpressで発見したのでこちらを使用します。
https://ja.aliexpress.com/item/32819133450.html?spm=a2g0o.order_list.0.0.50d6585aFXnS8h&gatewayAdapt=glo2jpn
内部配線
それでは再製開始です。
まずは、強制ドア開閉スイッチに配線します。
強制ドア開扉スイッチは AH164-TFR11 というスイッチで、中にLEDが入っていません。
スイッチ自身は共通なのがおもしろいですね。
極力原型に近いような配線にしました。
さすがコイト電工という位、配線が綺麗だったのでタイラップで少し綺麗に配線してあげましょう。
私のようにいつも必要以上に長い配線にすると写真のようになるのでほどほどにする事をお勧めします。
コネクタも良い感じですね
配線
配線に8芯のケーブルを探しましたが適当なものが無かったのでAWG24を使用しているLANケーブルを切って使用しました。
※ノイズを拾うことがあるので使用には注意しましょう※
いつもの通り配線には熱収縮チューブでラベルを用意しました。
先日の車掌スイッチに台座を取り付けた様子
本体を取り付けた様子
完成
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と表示灯が連携して使用できるようになりました。
全景
側面
背面
以上で完成です。
製作動画