HOゲージでも山あり谷あり(?)
4月初め、春本番を告げる桜が咲きはじめるや否や あっという間に満開になりました。
月1回(月初め)のブログ更新なので、UPするときはもう次月になってます(笑)。

近所の公園でも、日曜日の夕方にもかかわらず にぎわってました。

公園の横に小川が流れ、遊歩道に沿って桜のトンネルが続いています。年に一度の"大地の贈り物"に、幸せいっぱいです。

畑では2~3週間前に植えたキタアカリ(じゃがいも)が、マルチ(黒いシート)の下から出してくれと言わんばかりに芽が伸びていました。

マルチを開けて 芽が顔を出しました。畑をやっていてこの瞬間が一番癒されます。これから日を追うごとに葉でいっぱいになり、6月初~中旬に収穫です。
さてHOゲージの話です。
前回まで、順調にArduino自動運転が進み、更にレールのレイアウトを周回軌道を加えたものにしました。取り組んだ経過を以下に書きます。

上の写真のレイアウトを作り、起動ボタンを押すと
①A→B→C→D→逆走行で→Aに戻る。次に
②AAから同様にDに行ってAAに戻る。次に
➂A→B→周回1回→Aに戻る。以上で終了。
という構想です。

前述の走行行程を制御するための電源供給とリードスイッチ(RS)、ポイント信号の位置です。GAPを2カ所設けています。

現在までに入手したHOの動力車両は、上の4種類です。これらの車両を自動運転して走行状態をチェックしていきました。
すると、思わぬ結果が出ました。ディーゼル機関車が一番快調に走り、ほかの3車両は周回軌道以外のスイッチバック軌道ではトロトロ走行なんです! その時のレール間の電圧を測ってみると本来4~5vのはずが、1,5~2vしかありません。2つのスイッチバックのレイアウトやGAP、電源供給(5v)、Arduino周辺の回路などの間で"回り回路"ができてしまってレールへの電圧供給が低くなっていると推定するも、結局わかりません。解決できませんでした。トホホ‥‥

そこで、車両自体に差があるかを調べました。KATOのパワーサプライBOXを直線線路+R370曲線線路に電源供給し、線路に流れるモータ電流を測定しました。

同様に、Arduinoでも同じ測定をしました。それらの結果をつぎに示します。

上記の結果になり、レール間電圧は約5v、モータ電流は0.07~0.2Aで車両による差はほとんどありませんでした。ただ車両速度は少し差が出ています(車輪やモータで)。
(注)モータ電流は抵抗1Ωを直列に入れ、両端をテスタで測定

各車両は特に問題はないとわかり、そこで基本に立ち返ろうと、上の写真のようにスイッチバック箇所をやめて、電源供給も1カ所だけにしたシンプルなレイアウトにしました。

スタイロフォーム上にあったリード線を中に埋め込んで表面を平らにします。

やっとスッキリしました。制御ユニット周りは山間部になるので配線は固定していません。

線路のレイアウトを図で示すとこのような関係になります。

電気機関車とディーゼル機関車を走らせる計画なので、その走行順序を①→⑪で示しています。電気機関車が走行する途中でディーゼル機関車が割り込んで周回する行程です。
Arduinoスケッチでは特に新しいテクはありません。

回路図です。前回から作っていたものから不要なところを消したりして書き換えました。
線路のレイアウトが決まり、車両の走行が一段落しないと風景の製作に移れないので、これで少し電気関係から離れられます。
走行の様子を動画に撮りました。
最後に、TA7288Pを使ったスケッチを参考に載せます。
//----------------(分岐→周回→分岐)-------
int i;//速度加減速用
int n;
void setup() {
n=0;
pinMode(3, INPUT); //RSb
pinMode(4, INPUT); //RSc
pinMode(9, INPUT); //RSaa
pinMode(11, INPUT); //RSe
pinMode(15, INPUT); //PB1
pinMode(6, OUTPUT); //4(IN1)
pinMode(7, OUTPUT); //5(IN2)
pinMode(8, OUTPUT); //6(IN3)
pinMode(10, OUTPUT);//8 速度
pinMode(16, OUTPUT); //ポイント切替1
pinMode(17, OUTPUT); //ポイント切替3
digitalWrite(3, LOW); //
digitalWrite(4, LOW); //
digitalWrite(6, LOW); // IN1停止
digitalWrite(7, HIGH); //IN2停止
digitalWrite(8, LOW); // IN3停止
digitalWrite(9, LOW); //
digitalWrite(10, LOW); //速度
digitalWrite(11, LOW); //
digitalWrite(15, LOW); //PB1/OFF
digitalWrite(16, LOW); //ポイント1(直進設定)
digitalWrite(17, HIGH);//ポイント3(分岐設定)
}
void loop() {
int val;
val = analogRead(0); //速度
if(digitalRead(15)==HIGH){//PB/ON(AA→B)正走
delay(5000);
digitalWrite(6, HIGH);//-----AAから発車
digitalWrite(7, LOW);
digitalWrite(8, LOW);
for(i=val/12;i<val/4;i++){//加速
analogWrite(10, i);
delay(10);//加速度
}
delay(6000);//RSaa誤動作防止
}
if(digitalRead(3)==HIGH){//------- RSb
digitalWrite(6, HIGH);//正送
digitalWrite(7, LOW);
digitalWrite(8, LOW);
for(i=val/4;i>0;i--){//減速
analogWrite(10, i);
delay(12);//減速度
}
digitalWrite(6, LOW);//B停止
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(5000);
if(n==0){
digitalWrite(16, HIGH);//ポイント1分岐
delay(5000);
digitalWrite(6, HIGH);//逆走(B→C)
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
for(i=val/12;i<val/4;i++){//加速
analogWrite(10, i);
delay(10);//加速度
}
delay(6000);//RSb誤動作防止
n=1;
}
else{
digitalWrite(16, LOW);//--ポイント1直進
digitalWrite(17, HIGH);//--ポイント3直進
delay(3000);
digitalWrite(6, HIGH);//逆走(B→AA)
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
for(i=val/12;i<val/4;i++){//加速
analogWrite(10, i);
delay(10);//加速度
}
delay(6000);//RSb誤動作防止
}
}
if(digitalRead(4)==HIGH){//------ RSc
digitalWrite(6, HIGH);//逆走
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
for(i=val/4;i>0;i--){//減速
analogWrite(10, i);
delay(9);//減速度
}
digitalWrite(6, LOW);//C停止
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(3000);//---------C停止中
digitalWrite(16, LOW);//ポイント1直進
delay(1000);
digitalWrite(17, LOW);//ポイント3直進
digitalWrite(6, HIGH);//--正走(A→周回)
digitalWrite(7, LOW);
digitalWrite(8, LOW);
for(i=val/12;i<val/4;i++){//加速
analogWrite(10, i);
delay(10);//加速度
}
delay(15000);//RSb誤動作防止
}
if(digitalRead(11)==HIGH){//---- RSe
digitalWrite(6, HIGH);//正走
digitalWrite(7, LOW);
digitalWrite(8, LOW);
for(i=val/4;i>0;i--){//減速
analogWrite(10, i);
delay(15);//減速度
}
digitalWrite(6, LOW);//Aで停止
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(17, HIGH);//AAに分岐
delay(1000);
digitalWrite(16, HIGH);//ポイント1分岐
delay(5000);
digitalWrite(6, HIGH);//正走(C→B)
digitalWrite(7, LOW);
digitalWrite(8, LOW);
for(i=val/10;i<val/4;i++){//加速
analogWrite(10, i);
delay(6);//加速度
}
analogWrite(10, val/4);
delay(5000);//RSd誤動作防止
n=1;
}
if(digitalRead(9)==HIGH){//---- RSaa
digitalWrite(6, HIGH);//逆走
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
for(i=val/4;i>0;i--){//減速
analogWrite(10, i);
delay(16);//減速度
}
digitalWrite(6, LOW);//AAで停止
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(5000);
n=0;
}
}