はじめに
先日、東京のお台場にガンダムの実物大の模型ができました。見に行かれた方も多いのではないでしょうか。CGでどんな映像でも作れる時代ですが、やはり実物というのは迫力が違うものです。
ガンダムに対抗するわけではないのですが、本稿では鉄道模型の制御に挑戦してみようと思います。模型であっても、実際に車両が動くというのは格別なものです。普通、制御というとC言語などを使用しますが、ここではPHPからLAN経由で制御するようにしてみました。まずどうやって制御しているのか、見ていきましょう。
こんなふうに動きます
まずは写真のような一直線のレイアウトを動かしてみましょう。普通のNゲージでは電源は1ヵ所だけ供給しますが、今回は5ヵ所に供給しています。これについては、後ほど解説します。
そして、PHPのプログラムはリスト1のようになります。このプログラムをコマンドラインから実行すると、右端に置いた車両が左端まで走行して止まります。
往復運転させるには、リスト2のようにします。
見ての通り、複雑なものではありません。これは、PHPから送ったコマンドをコントローラが受けとり、電気の制御を行ってくれているからです。
LANから制御する仕掛け
Nゲージの動く仕組みは、レールにかけた電圧を車輪が受けとり、モーターが回って走行するというものです。電圧を高くすればスピードが速くなり、電圧をマイナスにすれば逆方向に走ります。普通のNゲージのセットでは、電源(パワーパック)からレール全体に電気を供給し、速度と方向を制御するようになっています。例えば駅のところで車両を止めるには、人間が目で見ながら、スピードを落として止めることになります。
今回のシステムでは、少し違った方法を採用しました。絶縁レールを用いて、レールを電気的に分割し、部分ごとに異なる電圧を供給できるようにします。駅のところのレールの電気をオフにしておけば、駅のところまで来ると勝手に停止することになります。今回のレイアウトで5箇所に給電しているのは、この方法によるものです。
このようなシステムには、たくさんの出力があるコントローラが必要です。今回開発したコントローラ(写真)は出力が14組あり、LANからそれぞれの出力を別個に制御できるようになっています。Nゲージではポイントも電気で制御するようになっているので、ポイントとレールを合計で14個までつなげることになります。ちなみに、コントローラにはPICというマイコンを使用しています。
コントローラはHTTPサーバになっており、PHPからHTTPリクエストを送ることで制御します。たとえばhttp://192.168.0.100/?00=D
のリクエストを送ると、00番のレールに電圧が出力されます。Dの部分がコマンドで、表1のようなコマンドが使用できます。
表1 コマンド一覧
コマンド | 機能 |
A | 停止 |
B | 走行1/16 |
C | 走行1/8 |
D | 走行1/4 |
E | 走行1/2 |
F | 走行100% |
b | 逆走行1/16 |
c | 逆走行1/8 |
d | 逆走行1/4 |
e | 逆走行1/2 |
f | 逆走行100% |
P | ポイント分岐 |
p | ポイント直進 |
S | 車両検出 |
では、これをPHPから呼び出してみましょう。
PHPのプログラム
先ほどのプログラム(リスト1、2)では、PHPのfile_get_contents()を利用しています。これはURLを指定すると、ページの内容を文字列で返してくれます。00~03までの4つのレールに電気を供給することで、左に向かって走行し、左端で停止します。
走り終わるのを時間待ちして、今度は01~04のレールに給電することで、右端まで走行します。
時間待ちでは信頼性が低いので、レールに車両が来たことをコマンドで検出してみましょう。これは、たとえば以下のようにします。
Sコマンドは、指定したレールに車両があると1を返します。車両がないと0を返すので、0でなくなるまでポーリングすることで、車両が来るまで待つことができます。これを利用すると、プログラムはリスト3のようになります。
なお、このコントローラは内部の通信をシリアルでおこなっているため、1回のリクエストの処理に0.3秒くらいかかります。また、複数のリクエストを同時に受け付けることはできません。
ポイントも動かそう
ポイントの制御も、コマンドを送るだけです。ポイントが1つのレイアウトを見てみましょう。
リスト4のプログラムでは、引き込み線から車両が出て、レールを2周して、また引き込み線に戻ります。
リスト4の実行結果を動画で見てみましょう。
車両が進むまで待って、次のコマンドを送るだけですから、特に難しいものではありませんね。しかし、ちょっとソースが見にくくなってきました。そこで、次回はオブジェクト指向スタイルに移行することにしましょう。