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

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

Arduinoで自動往復・ポイント切替運転

先日の作品展に出したジオラマに搭載した Arduinoの回路図とスケッチについて整理します。作品展搬入の直前にポイント付近で脱線し 焦りましたが、返却後の検討結果で、低速で通過すればジオラマ上でもスケッチ通りの走行ができました。



P1090052
(動画は既掲載)
運転の具体的な動きを下記チャートにしました。

●走行ルート ;中間からスタートしてb方向に向かい(正走)、2回往復する。
●終端停止;終端で5秒間停止する。
●速度制御;2段階減速したのち停止する。1段階低速発進ののち定速になる。
●検出点の役目;3か所の終端付近に検出点(リードスイッチ)をそれぞれ設け、検出後速度制御に入る。折り返し後に再び通過する検出点は無視される(最初の通過時の検出が支配)
●ポイント切替;リードスイッチRSa検出の支配下で「直進に切替」の指示を出す。
       リードスイッチRSc検出の支配下で「分岐に切替」の指示を出す。
●運転開始終了;手動によるON/OFF操作で行う。操作するタイミングは終端ではなく、検出点の支配が及ばない中間の区間で行う。OFF操作をしないと、往復運転が繰り返される。


次に、回路図を載せます。

●モータ制御;ドライバICのTA7291Pを使用。
●ポイント切替制御;ドライバICのTA7291Pを使用。
●折り返し検出;リードスイッチを使用。
●運転開始終了;テスト段階からずっと フィーダー線の片側をON/OFFして運転開始終了をしていました。回路図には表していません。


(写真は、強曲線(R117のS字)でも走行可能か確認した時のもの→OKでした)


最後に、Arduinoのスケッチについて検討しました。 まだまだ未熟ですが、”初心者の設計力” としてみていただければ、と思います。


《構成》シンプル イズ ベストを貫き、基本的な「if関数」と「delay関数」で構成しています。リードスイッチで検出して電位が上がったときにif条件を実行する方法です。また、再び同じリードスイッチが入っても無視するように、始めに成立しているif条件が持続するようderay時間で引っ張っています。


《速度の増減》今は階段式に増減しています。しかし oomoriさん、親爺Iいさんからアドバイスされた「for関数」で連続制御するほうがスマートで自然です(前述の動画)。が、メカ的な原因で急発進などの不安定がでて、階段式の方が速度と時間が確実なので、展示会にも出すこともあったので、今は階段式にしています。実際の階段時間設定はジオラマに合わせて調整しました。


《ポイント切替》サーボモータで切り替えるのが一番確実安全と思います。が、費用、時間、労力の関係で、スケッチ内で制御することにしました。oomoriさんからの推薦図書「Arduinoで楽しむ鉄道模型」(技術評論社)2,580円 にあった記事(12v、200~300msの矩形波でポイント切替する方法)を参考に実験したところ、良好でした。信頼性など不明ですが、確実に切替できて今のところOKです。


《運転の開始終了》「駅のホームから発車して何度かの往復運転後、同じホームに帰着して終了する」が理想ですが、今の私のスケッチ設計力からは ほど遠く、中間点での起点終点となりました。しかもそれを手動で行うので、スケッチにも入れてません。


(寒がりの私は、自室の机まわりをカーテンで覆い、机の下のセラミックヒーターを有効活用しています)


最後に、スケッチを載せます。


void setup(){
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(10,HIGH); //正走
digitalWrite(11,LOW);
digitalWrite(12,LOW); //ポイント入力ナシ
digitalWrite(13,LOW);
}
void loop(){
int val;
val=analogRead(0); //速度
analogWrite(9,val/4);

if(digitalRead(3)==HIGH){ //RSb検出
analogWrite(9,val/6); //減速1(0.5秒間)
delay(500);
analogWrite(9,val/9); //減速2(0.5秒間)
delay(500);
digitalWrite(10,LOW); //停止5秒間
delay(5000);
digitalWrite(11,HIGH); //逆走スタート
analogWrite(9,val/6); //初速5秒間
delay(5000);
}
if(digitalRead(4)==HIGH){ //RSc検出  
analogWrite(9,val/6); //減速1(0.5秒間)
delay(500);
analogWrite(9,val/9); //減速2(0.5秒間)
delay(500);
digitalWrite(11,LOW); //停止5秒間
delay(5000);
digitalWrite(10,HIGH); //正走スタート
analogWrite(9,val/6); //初速2秒間
delay(2000);
analogWrite(9,val/4); //定速5秒間
delay(5000);
digitalWrite(12,LOW); //ポイント分岐へ
digitalWrite(13,HIGH);
delay(200);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
if(digitalRead(2)==HIGH){ //RSa検出
analogWrite(9,val/6); //減速1(0.5秒間)
delay(500);
analogWrite(9,val/9); //減速2(0.5秒間)
delay(500);
digitalWrite(11,LOW); //停止5秒間
delay(5000);
digitalWrite(10,HIGH); //正走スタート
analogWrite(9,val/6); //初速2秒間
delay(2000);
analogWrite(9,val/4); //定速5秒間
delay(5000);
digitalWrite(12,HIGH); //ポイント直進へ
digitalWrite(13,LOW);
delay(300);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
}


以上です。次やりたいことは、「中間点からプッシュボタンで起動し、2往復後に中間点で自動停止する」の検討です。

×

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