次は分岐器を一つ増やしてスイッチバックを構成してみる。と言っても、高低差を作る意味はあまり無いので、あくまで平面上でのスイッチバック実験だ。ポイントは2個を個別に制御する必要は無く、同時に同方向へ動かせば良いので、回路は前回のものと同じである。
スイッチバック
スケッチの方も前回のものと同等だが、そのままだと全体が長くなるので、走行とポイント切替をサブルーチン化してそれらを呼び出す様に改造した。変数にセットした走行時間は往路と復路で変えてあるが、車両の特性で走る速さが微妙に異なる為の補正分である。本来なら線路端部にセンサーを設け、車両位置をセンシングするのが実際のところであろう。
[ スケッチ: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);
}