BVE 鉄道シミュレーターで自宅運転台を動かそう~3Dプリンタで自宅運転台を作ろう

BVE 鉄道シミュレーターで自宅運転台を動かそう~自宅運転台を作ろうの続きです。
前回は板金で作った為、「自分には作れない」
という意見を頂いたので今回は、３Dプリンタで作ってみる事にします。
# 部品の用意
今回も、書泉や東急ハンズで売っていた、東京メトロの部品を使用しました。
速度計はATCメータではなく、SC-11という電流計や電圧計を使用し、それらしくしています。
（電流計のため値が10倍になっています。150Vまでの電圧計を使用することをお勧めします）
圧力計はブレーキ指令を使っています。
もちろん、速度計や、圧力計を用意できる場合は、そちらを使用することをおすすめします。
# コントローラ基板
__BVE 鉄道シミュレーターで自宅運転台を動かそう~Arduino Unoで動かす__ を基に製作します。
https://qiita.com/usashirou/items/4f5ad751152834698919
今回は __ArduinoUno__ の代わりに __ArduinoNano__ で動くメータ制御基板を製作しました。
__ArduinoNano__ は __3,5,6,9,10,11__ のピンで __PWM__ が使用可能です。

:::note warn
__注意：5・6番ピンはデューティー比の問題がある為使わない方が良いようです。__
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2153
:::
__ATmega328P__ の仕様通り最大6個のPWMが使用可能です。
本基板では6個のうち2個が共用となり、アナログ、サーボで最大6個のメータを動かす事が出来る仕様としました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8bf18198-59e3-8cee-2366-d0f4b2336260.jpeg)
# プログラム
__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();
  }
}
```
# モデリング
パイロットランプ、２メーターが入るように設計していきます。
![Meter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7bd0de9d-2cee-521f-e45f-799d6820f2da.jpeg)
# 3Dプリンタで出力
今回製作する自宅運転台は本体を左右で分割して出力しました。
簡単に作るという割に出力は意外と大変で片側40時間程度かかっています。
![Base.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fd97a3bd-4cd7-ed4e-d34e-042f5cf11d60.jpeg)
パイロットランプのカバーが綺麗に成形出来ていないので、この後、削ってしまいました。
![DSC_0850 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2ad813fc-e3c4-fe10-e5e9-d536303dbcea.jpeg)
# 仮組
__パイロットランプ__ は __5V__ で点灯するものを選びました。
これにより、他の電源や制御用ICが無くても使用可能です。
右手前には、__電車でGoコントローラー__ の基板を付けられるようにしています。
![DSC_0857 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e84c5ecb-ac1a-71f2-6467-a436898736dd.jpeg)
# 組立
それでは組立て行きましょう。
![DSC_0901 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f79c11f9-76d7-da93-2184-d5be16844437.jpeg)
![DSC_0913 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9bad6613-b51e-6e26-9656-400cf8832e19.jpeg)
メータ制御用基板と電車でGoコントローラー制御用基板を組付けます。
![DSC_0916 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0373e33c-c556-9bbf-305a-5bff98e46b41.jpeg)
# 完成
![DSC_0936 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4224e55e-34d2-76ba-f52d-927e89d96cfb.jpeg)
# 動作の様子
最後に、電車でGoコントローラーを取り付けて動作させてみました。
制御基板はBVE 鉄道シミュレーターで自宅運転台を動かそう～電車でGoコントローラーを使う～2

https://qiita.com/usashirou/items/97f380f3643136d5cc28

![DSC_0926 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d9709930-1f7c-89ae-ec5e-5faa7d8f7f28.jpeg)
## 動作映像
https://youtu.be/zjefIvv03ok