BVE 鉄道シミュレーターで自宅運転台を動かそう~自宅運転台を作ろうの続きです。
前回は板金で作った為、「自分には作れない」
という意見を頂いたので今回は、3Dプリンタで作ってみる事にします。
部品の用意
今回も、書泉や東急ハンズで売っていた、東京メトロの部品を使用しました。
速度計はATCメータではなく、SC-11という電流計や電圧計を使用し、それらしくしています。
(電流計のため値が10倍になっています。150Vまでの電圧計を使用することをお勧めします)
圧力計はブレーキ指令を使っています。
もちろん、速度計や、圧力計を用意できる場合は、そちらを使用することをおすすめします。
コントローラ基板
BVE 鉄道シミュレーターで自宅運転台を動かそう~Arduino Unoで動かす を基に製作します。
https://qiita.com/usashirou/items/4f5ad751152834698919
今回は ArduinoUno の代わりに ArduinoNano で動くメータ制御基板を製作しました。
ArduinoNano は 3,5,6,9,10,11 のピンで PWM が使用可能です。
注意:5・6番ピンはデューティー比の問題がある為使わない方が良いようです。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2153
ATmega328P の仕様通り最大6個のPWMが使用可能です。
本基板では6個のうち2個が共用となり、アナログ、サーボで最大6個のメータを動かす事が出来る仕様としました。
プログラム
BVE 鉄道シミュレーターで自宅運転台を動かそう~Arduino Unoで動かす を基に、以下のようにしました。
今回は、速度、パイロットランプ、ブレーキ指令に対応させます。
基板につける可変抵抗もそれに合わせて2個のみとなります。
https://qiita.com/usashirou/items/4f5ad751152834698919
//https://qiita.com/Ninagawa_Izumi/items/6a18249a31a87dad84e2
char dai0;
char dai1;
char dai2;
#define elements 3 //カンマで区切るデータの最大項目数
String data_string; //シリアルで受け取る全文字列
char *p; //文字列をカンマで分割するstrtok処理で使うポインタ
String p_string; //上記ポインタで区切った文字列の仮格納用
String data_array[elements]; //カンマ分割されたstrデータを格納する
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
// digitalWrite(10, HIGH );
Serial.begin(19200);
Serial.setTimeout(10); // タイムアウトの時間を100msに変更
}
void loop() {
if (Serial.available() > 7 ) {
data_string = Serial.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 == 1) {
digitalWrite(2, HIGH );
}
if (dai0 == 0) {
digitalWrite(2, LOW );
}
dai1 = data_array[1].toInt();
if (dai1 == 1) {
analogWrite(11, 57);
}
else if (dai1 == 2) {
analogWrite(11, 80);
}
else if (dai1 == 3) {
analogWrite(11, 95);
}
else if (dai1 == 4) {
analogWrite(11, 118);
}
else if (dai1 == 5) {
analogWrite(11, 145);
}
else if (dai1 == 6) {
analogWrite(11, 162);
}
else if (dai1 == 7) {
analogWrite(11, 180);
}
else if (dai1 >= 8) {
analogWrite(11, 220);
}
else if (dai1 == 0) {
analogWrite(11, 33);
}
dai2 = data_array[2].toInt();
if (dai2 >= 0 && dai2 <= 125) {
analogWrite(10, dai2 * 1.6);
Serial.print("C");
Serial.print(data_array[2]);
}
}
Serial.println();
}
}
モデリング
3Dプリンタで出力
今回製作する自宅運転台は本体を左右で分割して出力しました。
簡単に作るという割に出力は意外と大変で片側40時間程度かかっています。
パイロットランプのカバーが綺麗に成形出来ていないので、この後、削ってしまいました。
仮組
パイロットランプ は 5V で点灯するものを選びました。
これにより、他の電源や制御用ICが無くても使用可能です。
右手前には、電車でGoコントローラー の基板を付けられるようにしています。
組立
それでは組立て行きましょう。
メータ制御用基板と電車でGoコントローラー制御用基板を組付けます。
完成
動作の様子
最後に、電車でGoコントローラーを取り付けて動作させてみました。
制御基板はBVE 鉄道シミュレーターで自宅運転台を動かそう~電車でGoコントローラーを使う~2
動作映像