HOME >> 鉄道模型自動運転システム >  卓上レイアウトで楽しもう 自動運転 その9

卓上レイアウトで楽しもう 自動運転 その9

 今回の内容は、先回と同じレイアウトを使用して制御ロジックを変更してみました。 なんとか多くの列車を同時に走らせたいという狙いのもとに、手始めといて追い抜きロジックを考えてみました。

 

  .

■ 今回のレイアウト

 今回のレイアウトは先回と同じです。 狭い卓上を精一杯使って、長い周回路を構成し、さらに欲張って待避線としてのホームを2ヶ所設けました。 このため、追い抜き運転が可能となったので、これを生かす運行パターンを発展させようとしたものです。

 今回のレイアウトを上から見た状態を右に示します。 また、空間部には、いつもの様にあり合わせのストラクチャーを並べて賑やかにしていますが、クリスマスが近づいて来たので少し飾ってみました。

 

■ 運行ダイヤの検討

 自動運転を実施するための運行ダイヤについて、東海道新幹線の途中の駅のように、中央部の本線をのぞみ号が通過し、駅ホームに停車しているこだま号を追い抜いていく追い抜き運転モードを中心に考えて見ました。

 その考えとして、

  1. ホームが空いていると待避線に入線して停車する。
  2. ホームに停車している列車があると本線上を追い抜いていく。
  3. 待避線の列車は、本線を通過した列車が先方のセンサを通過後に発車する。

 この考えをもとにして、今回は片側のホームだけを対象として制御することにしてしましょう。 ポイントやセンサ、および給電用フィーダーの位置は先回のままです。

  .

 その制御ステップを左の表にまとめてみました。 最初は待避線、即ちホームに呼び込む状態で待っています。

 そこに次の列車が来ると待避線上のセンサ S1 を踏む事によって列車を停車させます。 この時、後続の列車のために、入場用ポイントを本線側に切り替えておきます。

 次の列車は本線上を追い抜いて行き、先方の通過センサ S2 を踏むことによって列車は通過し終えてことを感知します。 そして、次の列車は待避線に誘導させるように入場ポイントを切り替えておき、駅ホームに停車中の列車を発車させます。

 列車が無事に発車完了しますと、先方の通過センサ S2 を踏むことになるので、最初の待機状態に戻します。

  ****************************************

 簡単な制御の様ですが、色々問題を含んでいます。 レイアウトを走行させる列車が2本のみの場合は、交互に追い抜きを実施するので問題なく運行出来るのですが、3本、いや4本の列車を同時に走らせようとした欲張った場合には対応できないのです。

 本線を通過する列車のすぐ後ろをも一つの列車が付いて来た場合はどうなるのか。 少し離れていた場合は、待避線に入ろうとしてポイントの途中で停車してしまうが。 また、本線を通過後に何秒後に発車させればよいのか。 5秒待ちが良いのか、3秒ではどうか。 もう一つの駅とのタイミングを合わせる必要があるのかどうか。

 

■ ハード回路の構成

 でも、とりあえずこの運行ダイヤで実験してみる事にしましょう。 反対のホームも同じ制御を実施するつもりですので、二つの駅の制御タイミングを合わせるとなるとややこしくなるので、独立した制御を実施することを念頭にしています。 このため、2台のArduino よりも2個のPICマイコンを使う方が良いと判断しました。 さらに欲張って、信号機の制御も・・・・・・・・・・・・! と考えて、ピン本数の多い PIC16F1827 を使い、プログラムはC言語にて記述することとしました。

 一気にグレードアップしたようですが、最初は簡単な上記のロジックを実現することにします。 このための回路構成を下に示します。

 PICマイコンの右側は信号機のためのポートとして残しています。 本線と待避線の出発信号と入場信号の赤と青で6個のポートが最低限必要となるのですが、何時になったら使うのかは分かりません。

 

■ プログラムの内容

 運行ダイヤに従ってプログラムを組んで見ました。 とは言っても、久しぶりのC言語ですから、あれこれの参考資料をひっくり返しながら復習しました。 設定がなかなか面倒ですね。 使用したソフトは、ノートパソコン Panasonic CF-N10 にインストールした MPLAB X v5.30 、Cコンパイラは XC8 v2.10 です。 書き込みは PICkit 3 を使い、ICSP書込みアダプタ(秋月製 AE-PICKIT-ライト)を使用した。

 1 /*****************************************
 2 *   Takujo-9-1
 3 *           2019/12/16
 4 *           PIC16F1827   MPLAB X   XC8
 5 ******************************************/
 6 #include <xc.h>
 7 
 8 #define _XTAL_FREQ  8000000
 9 
10 // CONFIG1
11 #pragma config FOSC = INTOSC    // 内部クロック使用
12 #pragma config WDTE = OFF       // ウォッチドッグ不使用
13 #pragma config PWRTE = ON       // パワーアップタイマ
14 #pragma config MCLRE = ON       // リセットピン
15 #pragma config CP = OFF         // プログラムメモリ保護
16 #pragma config CPD = OFF        // データメモリ保護 
17 #pragma config BOREN = ON       // 電源電圧監視
18 #pragma config CLKOUTEN = OFF   // クロック出力
19 #pragma config IESO = ON        // クロック切替
20 #pragma config FCMEN = OFF      // 外部クロック監視
21 
22 // CONFIG2
23 #pragma config WRT = OFF        // フラッシュメモリ保護
24 #pragma config PLLEN = ON       // 4xPLLの作動
25 #pragma config STVREN = ON      // スタック時のリセット
26 #pragma config BORV = LO        // リセット電圧
27 #pragma config LVP = OFF        // 低電圧プログラミング
28 
29 void main()
30 {
31     unsigned int spe ;       // デューティ比変数の宣言
32     
33     OSCCON = 0b01110010;    // 内部クロック 8MHz設定
34     ANSELA = 0b00000000;    // I/Oは全てデジタル使用
35     ANSELB = 0b00000000;    // I/Oは全てデジタル使用
36     TRISA  = 0b00000000;    // I/Oの入出力設定
37     TRISB  = 0b00001100;    // I/Oの入出力設定
38     PORTA  = 0b00000000;    // I/Oの初期値設定
39     PORTB  = 0b00000000;    // I/Oの初期値設定
40     CCPTMRS = 0b00000000;   // PWM制御タイマー指定
41     CCP3CON = 0b00001100;   // PWM制御使用宣言
42     T2CON = 0b00000010;    // プリスケーラ値の設定
43     PR2 = 124;             // PWMの周期設定
44     CCPR3L = 0;           // カウンターの初期化
45     CCPR3H = 0;           // カウンターの初期化
46     TMR2  = 0;            // タイマー2の初期化
47     TMR2ON = 1;           // PWM機能のスタート
48      

49     RB0 = 0;             //ポイント1と2の作動確認
50     __delay_ms(500);
51     RB1 = 0;
52     __delay_ms(500);
53     RB0 = 1;
54     __delay_ms(500);
55     RB1 = 1;
56     __delay_ms(500);
57     RB1 = 0;
58     __delay_ms(500);
59     
60     CCPR3L = 255;    //デューティ比100%
61     RA2 = 1;         //給電ON
62     
63     while(1){
64         
65         //STEP1
66         while(RB2 == 1){           // センサ1を待つ
67              __delay_ms(10);
68         }
69         RB0 = 0;                   // P1ポイントを正位に
70         for(spe=255; spe>-1; spe--){  //減速開始
71            CCPR3L = spe ;
72            __delay_ms(5);
73         }
74         RA2 = 0;               // 給電停止
75         __delay_ms(500);
76         
77         //STEP2
78         while(RB3 == 1){       // センサ2を待つ
79             __delay_ms(10);
80         }
81         RB0 = 1;              // P1ポイントを反位に
82         __delay_ms(5000);
83         RA2 = 1;              // 給電開始
84         for(spe =0; spe<256; spe++){   //加速開始
85             CCPR3L = spe ;
86             __delay_ms(5); 
87          }
88         RB1 = 1;              // P2ポイントを反位に
89         __delay_ms(500);
90         while(RB3 == 1){      // センサ2を待つ
91             __delay_ms(10);
92         }
93         RB1 = 0;             // P2ポイントを正位に
94         __delay_ms(500);
95     }
96 }
97

 

 

  幾つかの記述ミスがあったものの、問題無く書き込みは実施出来た。

   ****************************************************************************************************************

 次に、回路の配線を実施した。 その配線状態をを下に示す。

 コンピュータは、Arduino を取外し、ブレッドボードの上でPICマイコン周りの配線を実施しました。 PICはICソケットを使って挿入している。

 

■ 作動状態

 最初は正常に作動しないのが常ですね。 まず、何処が悪いのかを突き止める必要がありますが、これも経験と勘の世界です。

 PWM制御が不安だったのでこの機能を停止させるも改善出来なかった。 どうもランダムに作動している様子だったので、マイコンの電源ポートに 0.1μFのパスコンを取付けるとピタリとおとなしくなり、正常な作動を始めた。 改めてパスコンの効力を実感しました。 その後、PWM機能も正常に作動するようになり、待ち時間を変えたりして調整を実施しました。

 運行状態は動画のとおりで、順調に機能しています。 さて、これからもう一つの駅も制御するのですが、上記でも述べて問題点にどうやって対応するのかしっかりと考える必要がありそうです。

ページトップへ戻る .


 2019/12/17 作成