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

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

Arduino 2往復自動運転で??

やっぱりうまくいきません。oomoriさん、rtmrwさんから貴重なアドバイスをいただきながら、この正月、テスト回路で「変数」を使ったスケッチをいろいろ検討しましたが、一部の読者の方々には深入り過ぎてたいへん失礼と思いつつ、なんとか自分のものにしたい気持ちがあり、今回ブログ更新する次第です。


本来、2軌道にそれぞれれのArduinoでそtれぞれの車両を2往復走らせ、パラ運転させようと思っています。そのために1軌道に2往復、をまず実験しているのですが、最後の終了が自動でできないのです。「変数」と、if文、while文を使っていろいろ試しているのですが、順番通りにランプが点いてくれなかったり途中で止まったり‥。


これがテストの実装です。リード線を所定部分に順番通りタッチさせることでランプが交互に点き、スケッチが正しいかの確認をしています


以下は、「i f 文」を基本にして作った未完のスケッチです。「変数」はまだ入れてない状態です。
void setup() {                   ⇦この下に int nikaime;
 pinMode(2, INPUT);//スタートPB     
 pinMode(3, INPUT);//正送
 pinMode(4, INPUT);//逆走
 pinMode(8, OUTPUT);//逆走ランプ
 pinMode(9, OUTPUT); //
 pinMode(10, OUTPUT); //正走ランプ
 pinMode(11, OUTPUT); //
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
}
void loop() {                                                           ⇦この下に  nikaime=0;
 if(digitalRead(2)==HIGH){//スタート信号                                   
  delay(1000);
  digitalWrite(10, HIGH);//正走開始
  digitalWrite(11, LOW);
  delay(1000);
 }
 if(digitalRead(3)==HIGH){ //B停止と逆走信号
  delay(1000);
  digitalWrite(10, LOW);//Bで停止          
  digitalWrite(11, LOW);
  delay(1000);
  digitalWrite(8, HIGH);//逆走開始
  digitalWrite(9, LOW);
  delay(1000);
 }
 if(digitalRead(4)==HIGH){ //A停止と再正走信号
  delay(1000);
  digitalWrite(8, LOW);//Aで停止
  digitalWrite(9, LOW);
  delay(1000);
  digitalWrite(10, HIGH); //再正走開始
  digitalWrite(11, LOW); //
  delay(1000);
 }                         ⇦この下にnikaime=1;
                                                                                                              if(nikaime==1){
if(digitalRead(3)==HIGH){ //B停止と再逆走信号         
  delay(1000);
  digitalWrite(10, LOW);//Bで停止 
  digitalWrite(11, LOW);
  delay(1000);
  digitalWrite(8, HIGH);//再逆走開始
  digitalWrite(9, LOW);
  delay(1000);
 }
 if(digitalRead(4)==HIGH){ //終了信号
  delay(1000);
  digitalWrite(8, LOW);//終了
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  delay(1000);
 }                                                                                         ⇦この下に  }
}                                nikaime=0;


以上の未完スケッチに、右側にある文を挿入したり、段を変えて入れたり、while文をいろいろ試したりしましたが、2往復運転で終了するにまで至っておりません。「変数」やシステム構成などイマイチです。もう少しヒントをいただけければ幸いです。このたびは特定の方々にお願いするブログになってしまい、たいへん失礼な内容をお許しください。

アドバイスに感謝、感謝です。

前回のブログでは、Arduinoスケッチの件で、当ジオラマの車両運行を含めていろいろ助言をいただき、感謝に堪えません。その実現に向けていいものにしていきたいです。ただ今回は、自分なりに進めてきた内容に1つ区切りができたので、それを述べさせてください。


「スタートボタンONで、別々の軌道の それぞれの車両が2回の往復運転で終了する」というテーマです。変数を使いこなせていないので、以下の経過で進んで力づくでやってきました。センサーの増設や回路の不具合など、かなりの時間をかけてしまいました。


青い矢印はセンサー(リードスイッチRS)の位置で、駅に停車する手前にあります。箕面駅(図左上のA、B)に2回目に帰ってきた時に終了するためにとった行動は、
①センサーの手前にもう1つセンサーを追加して(RS8とRS11)、この追加センサーで終了させることにしました。
②そのためには追加センサー回路を始めは切っておき、働かせるときだけ回路をONする。それをリレー接点のON/OFFでする、としたのです。
(注)もう1組あるセンサー(図の右中ほどにあるRS9、RS10)はループ制御用です。


この図はリードリレーRS8がONするとArduinoD7ポートに5vが印加されるのをリレーCRのオープン接点で阻止するため、ArduinoD7に直接入れてました(回路図の上方)。この回路ではリレーON/OFFにかかわらず誤動作して制御不能となり悶々としていました。
ふとしたことで図の矢印の位置に接点位置を変えたのです。すると想定通り順調に制御でき、リレーONでD7ポートに5vが印加されました。Arduinoの各ポートはアースにつながっていないとダメなんですね。電気の初歩かもしれません(恥ずかしい)。やっとひとつ解決した感じです。
とりあえず追加センサーの取り付け作業とリレー接点の間違い探しに時間をとられましたが、当初のテーマはクリアできました。高架線の2往復運転は下の動画です。



Arduinoで2往復運転
第一段階の高架線につづき、もう一つの軌道(渓谷線)の制御もセンサーの取り付け作業は終っていますので、まずは同方法でやっていこうと思っていましたが、前回のアドバイスを受けた内容を参考に、スケッチを再構築できるかがんばってみます。

Arduinoに関わってやっと兆しが‥

こんにちは。いつもお読みいただきありがとうございます。コロナ禍で体操/太極拳が休止しているあいだ、同時間に1人で山すそにある「スカイアリーナ(市営スポーツ施設)の駐車場で体操/太極拳をやっています。


この写真はきょうの南方向の様子で、今季一番の冷え込みの中、大阪市街のビル群の先に雪に覆われた生駒山麓!を彷彿させる光景に出会いました。冷気の中、約30分体操/太極拳をして往復1時間以上のウォーキングをして帰ってきます。


Arduinoによる自動運転のほうは、遅々として進みません。去年、おととしと何が違うのか、「がおう」さん「rtmrw」さんの貴重なアドバイスをいただきながら、基本に戻ろうと2年前に初めて電車が動いた当時のスケッチと比較しながら出直しました。



Arduino2系統自動運転 ①基本テスト
基本テスト、すなわち1回だけの往復運転にやっとたどり着きました。スタートボタンを押すと3秒後にスローアップスタートし、定速になったあと強制的に検出信号を入れるとスローダウンして停止して5秒後に逆走を始め、同様に検出信号を入れるとゆっくり止まる。写真右端にみえる手でタッチ操作しています。


ここまでくるのにいろいろありました。前もありましたがジャンパー線が接触不良(導通不動通が起きる)のが困ります。この線の場合、接触ピン(先端)のメッキ状態が関係しているらしい。ワイヤ線自身はくねくねさせても変わりません。とにかく、回路が確定したらハンダして接触部分を極力少なくすることですね。


このつぎにしたのは、スタートボタン1回で2往復運転をした後停止する、という試みをしましたがうまくいきませんでした。往復の繰り返しは電源を入れている限りつづくスケッチはできるのですが、設定回数n回になったら往復運転を止めなさいというスケッチが書けない。n回をカウントする関数があったとしてもArduinoは1つの流れ作業しかできないと思うのです。まだまだ素人です。ちなみに、昨年、一昨年のジオラマでは、1回の往復運転でした。
「if」文での疑問: i f (条件式 ) { 処理 }  の「処理」の中にもう1回、2回‥「if」文を入れられると想定して進めましたができず悩みました。「for」文は入るのに。割込み関数を使ってできるかは未検討です。


どちらにしても、まずジオラマ本体に組み込んで、高架線(阪急勝尾寺線)で順調に走行ができるかが次のステップです。


かなりデスクワーク(パソコン~Arduino~テスト線路)に時間が掛かったため、ジオラマ本体は新聞紙をこのようにかけてホコリ防止してました。やっと娘のこの部屋で作業する段階になりました。


後ろのスペースに制御ユニットを持ってきて配線作業の開始です。配線するのになるべく接触点をおさえたいのですが、ジオラマを分離可能にするため、コネクタを多く使わざるを得ません。


これは検出用リードスイッチ3組のコネクタです。


線路に供給する電源は、チェック用に単独でコネクター接続します。


ほかの検出線などは、ブレッドボードに直接抜き差しできるように多連ピンヘッダにはんだ付けしました。


図の勝尾寺線の運転成功後、早く渓谷線の作業計画を進めたいです。もともとArduino1個ではピン数が足りないので2個使うのですが、確実性を期すため、この図のような分担でやります。スタートボタンを同時に押すことで、delay(数値)の調整で2線同時運転も可能です。