私の入門記録であって、入門者向け解説サイトではありません。

スイッチバック

  • 投稿日:
  • Category:

次は分岐器を一つ増やしてスイッチバックを構成してみる。と言っても、高低差を作る意味はあまり無いので、あくまで平面上でのスイッチバック実験だ。ポイントは2個を個別に制御する必要は無く、同時に同方向へ動かせば良いので、回路は前回のものと同じである。

Img_6879.png

スケッチの方も前回のものと同等だが、そのままだと全体が長くなるので、走行とポイント切替をサブルーチン化してそれらを呼び出す様に改造した。変数にセットした走行時間は往路と復路で変えてあるが、車両の特性で走る速さが微妙に異なる為の補正分である。本来なら線路端部にセンサーを設け、車両位置をセンシングするのが実際のところであろう。

[ スケッチ:PwmPnt2 ]


const int fwd = 3500;  // 往路時間
const int bak = 4000;  // 復路時間
const int stp = 5000;  // 停止時間
const int spd = 83;    // スピード
void setup() {
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}
void loop() {
  cngPoint("r");  // ポイント切替 右
  delay(1000);
  runTrain("b", spd, fwd); // 往路
  runTrain("s",   0, stp); // 停止
  cngPoint("l");  // ポイント切替 左
  runTrain("f", spd, bak*1.1); // 復路
  runTrain("s",   0, stp); // 停止
  cngPoint("r");  // ポイント切替 右
  runTrain("b", spd, fwd); // 往路
  runTrain("s",   0, stp); // 停止
  runTrain("f", spd, bak); // 復路
  runTrain("s",   0, stp); // 停止
  cngPoint("l");  // ポイント切替 左
  runTrain("b", spd, fwd*1.1); // 往路
  runTrain("s",   0, stp); // 停止
  cngPoint("r");  // ポイント切替 右
  runTrain("f", spd, bak); // 復路
  runTrain("s",   0, stp); // 停止
}
// 走行用
void runTrain(String drc, int spd, int tim) {
  if (drc == "f"){
    analogWrite(10, spd); // 往路
    digitalWrite(11, LOW);
  }
  else if (drc == "b"){
    analogWrite(11, spd); // 復路
    digitalWrite(10, LOW);
  }
  else {
    analogWrite(10, LOW); // 停止
    digitalWrite(11, LOW);
  }
  delay(tim);
  return;
}
// ポイント切替用
void cngPoint(String drc) {
  if(drc == "l"){
    digitalWrite(5, HIGH);  // ポイント切替 左
    digitalWrite(6, LOW);
  }
  if(drc == "r"){
    digitalWrite(5, LOW);   // ポイント切替 右
    digitalWrite(6, HIGH);
  }
  delay(200);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
}