イノッチの鉄道模型ブログ

日常生活の中のトピックスを気ままに書きます。鉄道模型製作や畑作業が中心です。
これまで製作した鉄道模型作品は、ホームページ「イノッチの鉄道模型」inoyoshio.jimdo.comに載せていますので、こちらもよかったらみてください。

Arduinoで2列車往復運転

2つの車両を交互に往復運転させます。Arduinoを使うのは約1年ぶりです。物忘れが気になる年になり、スケッチづくりは大丈夫か不安でしたが、ボチボチやっているうちに思い出してきました。

(既掲載)このような走行計画を立て、これに従った回路とスケッチを作っていきます。停止時間や加減速時間などは仮設定です。
Arduinoスケッチをつくるにあたり、
 ①外部信号(スタートボタンPBや リードスイッチRS)をif関数で検出していく方法で進めました。昨年と同様。
 ②なめらかな速度増減にfor関数を使用。これは読者の方々から教えてもらった定番の方法みたいです。昨年はステップ制御してました。
 ③if関数条件下の時間帯にRS信号を読み込まないようにdelay関数を駆使する。
以上、試行錯誤して作ったスケッチを最後に載せています。


つぎに回路図です。

モータドライバTA7291Pを2車両それぞれに使っています。
さて いよいよ実装回路の製作ですが、


去年使ったArduinoと新調したブレッドボードをスチレンボード上に並べ、この上にジャンパー線などで回路を組み込みます。


これが実験用の配置です。大きな平板に2本の線路を並べ、4つのリードスイッチを線路の両側に置き、組み込んだ回路を手前に置いています。実際は ジオラマの裏側に配線群を置くので、ここでは線路の右側が「箕面駅」左側が「滝下駅」にあたります。左側にスタートボタンが見えます。まず右上の3両編成の車両が動き出し、駅に着いたら左下の阪急電車がスタートし、交互に1往復して終了します。


しかしなかなか思うように動いてくれません。リードスイッチRSの位置と加速減速時間やif関数の拘束時間などパラメータが多く、しかも再現、不再現を繰り返しました。頭がパニックになりかけたとき、その主原因が判明しました。写真のジャンパー線です。 20本セットで購入した1本ですが、接触不良でした。カシメ不良か素線断線か?


ジャンパー線を入れ替え、速度/時間をこの実験配置に合わせた結果、予定通りの走行ができました。その様子を動画にしています。



P1110029
実験配置はジオラマよりかなり狭いので、ここでは加速/減速時間を各約2秒、車両停止後次の別車両発車まで時間を1秒としています。


さて最後の製作作業は踏切の遮断カンの動作機構です。私には未知の分野でして、サーボモータの回転と遮断カンの開閉をシンプルな伝達機構でできないか、次週検討します。


付記)今回のスケッチを参考に掲載します。
int i;
void setup(){
pinMode(2,INPUT);//RSa
pinMode(3,INPUT);//RSb
pinMode(4,INPUT);//RSc
pinMode(5,INPUT);//RSd
pinMode(6,INPUT);//M2速度
pinMode(7,OUTPUT);//PB
pinMode(9,OUTPUT);//M1速度
pinMode(10,OUTPUT);//M1
pinMode(11,OUTPUT);//M1
pinMode(12,OUTPUT);//M2
pinMode(13,OUTPUT);//M2
digitalWrite(6,LOW);//M2速度
digitalWrite(7,LOW);//PB/ON用
digitalWrite(9,LOW);//M1速度
digitalWrite(10,LOW);//M1
digitalWrite(11,LOW);//M1
digitalWrite(12,LOW);//M2
digitalWrite(13,LOW);//M2
}
void loop(){
int val;
val=analogRead(0);//速度

if(digitalRead(7)==HIGH){//PBでスタート
delay(3000);//3秒後に発車
//----------------------------------
digitalWrite(10,HIGH);//①M1正走
for(i=val/12;i analogWrite(9,i);
delay(30);//約2秒後に定速
}
delay(7000);//SRaによる誤動作防止用
}
if(digitalRead(3)==HIGH){//RSb検出
for(i=val/4;i>0;i--){//減速
analogWrite(9,i);
delay(30);//約2秒後に停止
}
digitalWrite(10,LOW);
delay(1000);//1秒後M2発車
//-----------------------------------
digitalWrite(13,HIGH);//②M2逆走
for(i=val/12;i analogWrite(6,i);
delay(30);//約2秒後に定速
}
delay(7000);//SRdによる誤動作防止用
}
if(digitalRead(4)==HIGH){//RSc検出
for(i=val/6;i>0;i--){//減速
analogWrite(6,i);
delay(30);//約2秒後に停止
}
digitalWrite(13,LOW);
delay(1000);//1秒後M1発車
//------------------------------------
digitalWrite(11,HIGH);//③M1逆走
for(i=val/12;i analogWrite(9,i);
delay(30);//約2秒後に定速
}
delay(7000);//SRbによる誤動作防止用
}
if(digitalRead(2)==HIGH){//RSa検出
for(i=val/4;i>0;i--){//減速
analogWrite(9,i);
delay(30);//約2秒後に停止
}
digitalWrite(11,LOW);
delay(1000);//1秒後M2発車
//-------------------------------------
digitalWrite(12,HIGH);//④M2正走
for(i=val/12;i analogWrite(6,i);
delay(30);//約2秒後に定速
}
delay(7000);//SRcによる誤動作防止用
}
if(digitalRead(5)==HIGH){//RSd検出
for(i=val/6;i>0;i--){//減速
analogWrite(6,i);
delay(30);//約2秒後に停止
}
digitalWrite(12,LOW);
}
}

×

非ログインユーザーとして返信する