Webプログラマの夏休み PHPでNゲージ模型を自由自在に動かそう[動画つき]

第1回 三次元に挑戦

この記事を読むのに必要な時間:およそ 4 分

PHPのプログラム

先ほどのプログラム(リスト1,2)では,PHPのfile_get_contents()を利用しています。これはURLを指定すると,ページの内容を文字列で返してくれます。00~03までの4つのレールに電気を供給することで,左に向かって走行し,左端で停止します。

図2 給電のようす

図2 給電のようす

走り終わるのを時間待ちして,今度は01~04のレールに給電することで,右端まで走行します。

図3 給電のようす(その2)

図3 給電のようす(その2)

時間待ちでは信頼性が低いので,レールに車両が来たことをコマンドで検出してみましょう。これは,たとえば以下のようにします。

 while (file_get_contents("http://192.168.0.100/?00=S") + 0 == 0)
   ;

Sコマンドは,指定したレールに車両があると1を返します。車両がないと0を返すので,0でなくなるまでポーリングすることで,車両が来るまで待つことができます。これを利用すると,プログラムはリスト3のようになります。

リスト3 位置検出ルーチンを付加

#! /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");
	while (file_get_contents($url."?04=S") + 0 == 0)
		;
	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");
	while (file_get_contents($url."?00=S") + 0 == 0)
		;
	file_get_contents($url."?04=A");
	file_get_contents($url."?03=A");
	file_get_contents($url."?02=A");
	file_get_contents($url."?01=A");
}

?>

なお,このコントローラは内部の通信をシリアルでおこなっているため,1回のリクエストの処理に0.3秒くらいかかります。また,複数のリクエストを同時に受け付けることはできません。

ポイントも動かそう

ポイントの制御も,コマンドを送るだけです。ポイントが1つのレイアウトを見てみましょう。

図4 引き込み線のあるレイアウト

図4 引き込み線のあるレイアウト

図4 引き込み線のあるレイアウト

リスト4のプログラムでは,引き込み線から車両が出て,レールを2周して,また引き込み線に戻ります。

リスト4 引き込み線。車輪が絶縁レールをまたぐ瞬間があるため,駅に着いたことを検出したあと待ちが必要

#! /usr/local/bin/php
<?php

$url = "http://192.168.0.100/";

#
# +--------|---------+
# |                  |
# +---03---|<<<02<<<<p1
#                    <<<<<<<|<<<00<<<|
#
file_get_contents($url."?01=p");
file_get_contents($url."?00=D");
file_get_contents($url."?02=D");
while (file_get_contents($url."?03=S") + 0 == 0)
	;
file_get_contents($url."?00=A");
file_get_contents($url."?02=A");
sleep(5);	# wait in station

#
# +>>>>>>>>|---------+
# |                  |
# +<<<03<<<|---02---<p1
#                    -------|---00---|
#
file_get_contents($url."?01=P");
file_get_contents($url."?03=D");
sleep(5);	# make sure of leaving rail 02
while (file_get_contents($url."?02=S") + 0 == 0)
	;
file_get_contents($url."?03=A");
sleep(5);	# wait in station

#
# +--------|>>>>>>>>>+
# |                  |
# +---03---|<<<02<<<<p1
#                    -------|---00---|
#
file_get_contents($url."?01=P");
file_get_contents($url."?02=D");
sleep(5);	# make sure of leaving rail 03
while (file_get_contents($url."?03=S") + 0 == 0)
	;
file_get_contents($url."?02=A");
sleep(5);	# wait in station

#
# +>>>>>>>>|---------+
# |                  |
# +<<<03<<<|---02---<p1
#                    -------|---00---|
#
file_get_contents($url."?01=P");
file_get_contents($url."?03=D");
sleep(5);	# make sure of leaving rail 02
while (file_get_contents($url."?02=S") + 0 == 0)
	;
file_get_contents($url."?03=A");
sleep(5);	# wait in station

#
# +--------|>>>>>>>>>+
# |                  |
# +---03---|<<<02<<<<p1
#                    -------|---00---|
#
file_get_contents($url."?01=P");
file_get_contents($url."?02=D");
sleep(5);	# make sure of leaving rail 03
while (file_get_contents($url."?03=S") + 0 == 0)
	;
file_get_contents($url."?02=A");
sleep(5);	# wait in station

#
# +<<<<<<<<|---------+
# |                  |
# +>>>03>>>|>>>02>>><p1
#                    >>>>>>|---00---|
#
file_get_contents($url."?01=p");
file_get_contents($url."?03=d");
file_get_contents($url."?02=d");
while (file_get_contents($url."?00=S") + 0 == 0)
	;
file_get_contents($url."?03=A");
file_get_contents($url."?02=A");

?>

リスト4の実行結果を動画で見てみましょう。

引き込み線プログラムの実行

ニコニコ動画:http://www.nicovideo.jp/watch/sm7797189

車両が進むまで待って,次のコマンドを送るだけですから,特に難しいものではありませんね。しかし,ちょっとソースが見にくくなってきました。そこで,次回はオブジェクト指向スタイルに移行することにしましょう。

著者プロフィール

木元峰之(きもとみねゆき)

独立系ソフトハウスに8年間勤務,パッケージソフトの開発や記事執筆などを行う。現在はフリーのコンサルタント。SWESTなどのワークショップで分科会のコーディネータを務める。デジタル回路設計歴30年,プログラミング歴27年。

きもと特急電子設計
URL:http://business.pa-i.org/