はじめに
先日,東京のお台場にガンダムの実物大の模型ができました。見に行かれた方も多いのではないでしょうか。CGでどんな映像でも作れる時代ですが,やはり実物というのは迫力が違うものです。
ガンダムに対抗するわけではないのですが,本稿では鉄道模型の制御に挑戦してみようと思います。模型であっても,実際に車両が動くというのは格別なものです。普通,制御というとC言語などを使用しますが,ここではPHPからLAN経由で制御するようにしてみました。まずどうやって制御しているのか,見ていきましょう。
こんなふうに動きます
まずは写真のような一直線のレイアウトを動かしてみましょう。普通のNゲージでは電源は1ヵ所だけ供給しますが,今回は5ヵ所に供給しています。これについては,後ほど解説します。
そして,PHPのプログラムはリスト1のようになります。このプログラムをコマンドラインから実行すると,右端に置いた車両が左端まで走行して止まります。
リスト1 左端まで進む
#! /usr/local/bin/php
<?php
$url = "http://192.168.0.100/";
file_get_contents($url."?00=C");
file_get_contents($url."?01=D");
file_get_contents($url."?02=D");
file_get_contents($url."?03=C");
?>
往復運転させるには,リスト2のようにします。
リスト2 往復運転
#! /usr/local/bin/php
<?php
$url = "http://192.168.0.100/";
for (;;) {
file_get_contents($url."?00=C");
file_get_contents($url."?01=D");
file_get_contents($url."?02=D");
file_get_contents($url."?03=C");
sleep(30);
file_get_contents($url."?00=A");
file_get_contents($url."?01=A");
file_get_contents($url."?02=A");
file_get_contents($url."?03=A");
file_get_contents($url."?04=c");
file_get_contents($url."?03=d");
file_get_contents($url."?02=d");
file_get_contents($url."?01=c");
sleep(30);
file_get_contents($url."?04=A");
file_get_contents($url."?03=A");
file_get_contents($url."?02=A");
file_get_contents($url."?01=A");
}
?>
見ての通り,複雑なものではありません。これは,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から呼び出してみましょう。

