つじるの忘れんぼ鉄道

DCC自動運転で秋葉原にあった交通博物館のジオラマを目指すブログ

DSbasic 入門してみる(7)スイッチバック往復(機関車2両)

 

f:id:tsujiru:20180828231247j:plain

上の写真の通り、敷設した線路全体としては、スイッチバックをイメージした線路となっています。

以前に、DesktopStationソフトウェアのイベント処理では、1両をスイッチバックで自動往復させているので、今回は機関車2両を順番にスイッチバック往復させていきたいと思います。

前回の入門してみる(6)のコードをもとに作りましたが、大きな変更点は以下の通り。

  • スイッチバック往復の上り/下り方向を管理する変数「DEST」を追加。
    上り方向を1、下り方向を2 とした。

上記以外は、検知区間ごとにほぼこれまでのコピペで、DESTの値によってポイントの分岐/直進を制御する処理の追加程度です。

 コードは以下の通り。

screen(7)
s88start

print "START S88 Control -Shuttle switchback + 2xLoco-"
sleep 5000
pwr 1
acc 30,1
acc 31,1
acc 40,1
acc 41,1
sleep 5000

'動かす2両のアドレスをSlot0と1に設定する
SLOT0 = getslotaddr(0)
SLOT1 = getslotaddr(1)
print "SLOT 0 = " + SLOT0
print "SLOT 1 = " + SLOT1

'前提:2両の初期位置は、SLOT0を検知区間①、SLOT1を検知区間②にすること。
'S0Pos:SLOT0のPosition(在線する区間)を格納していく変数
S0Pos = 2
S1Pos = 1

'先発をSlot0に設定
NextLoco = 0

'スイッチバック往復時の上り(1)/下り(2)を管理
DEST = 1

'SLOT0を起動(ESU BR151)
print "BR151 booting..."
dir SLOT0,2
fnc SLOT0,0,1
sleep 5000
fnc SLOT0,1,1
sleep 2000
fnc SLOT0,3,1
sleep 2000
fnc SLOT0,4,1
sleep 2000
fnc SLOT0,9,1
sleep 2000
fnx SLOT0,2
print "BR151 boot completed"
sleep 2000
'SLOT0を発進(ESU BR151)
spd SLOT0,200

sleep 10000

'SLOT1を起動(NGC DD51)
print "DD51 booting..."
dir SLOT1,2
fnc SLOT1,0,1
fnc SLOT1,1,1
print "DD51 boot completed"
sleep 2000
fnx SLOT1,2


while 1


if s88get(2)=1 then
if S0Pos = 2 then
else
print "S88.2 Detected"
S0Pos = 2
sleep 500
'SLO0を停止
spd SLOT0,0
sleep 10000
'ポイントを分岐
acc 31,0
'SLOT1を発進
NextLoco = 1
DEST = 1
dir SLOT1,2
sleep 2000
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if


if s88get(1)=1 then
if S1Pos = 1 then
else
print "S88.1 Detected"
S1Pos = 1
sleep 1000
'SLO1を停止
spd SLOT1,0
sleep 10000
'ポイントを直進
acc 31,1
'SLOT0を発進
NextLoco = 0
DEST = 1
dir SLOT0,2
sleep 2000
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if


if s88get(3)=1 then
'検知区間③に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 3 then
else
print "S88.3 Detected as SLOT0"
S0Pos = 3
spd SLOT0,0
sleep 10000
dir SLOT0,1
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 41,0
end if
if DEST = 2 then
acc 41,1
end if
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if
'検知区間③に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 3 then
else
print "S88.3 Detected as SLOT1"
S1Pos = 3
spd SLOT1,0
sleep 10000
dir SLOT1,1
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 41,0
end if
if DEST = 2 then
acc 41,1
end if
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if
end if

if s88get(5)=1 then
'検知区間⑤に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 5 then
else
print "S88.5 Detected as SLOT0"
S0Pos = 5
spd SLOT0,0
sleep 10000
dir SLOT0,2
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 40,0
end if
if DEST = 2 then
acc 40,1
end if
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if
'検知区間⑤に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 5 then
else
print "S88.5 Detected as SLOT1"
S1Pos = 5
spd SLOT1,0
sleep 10000
dir SLOT1,2
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 40,0
end if
if DEST = 2 then
acc 40,1
end if
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if
end if

if s88get(6)=1 then
'検知区間⑥に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 6 then
else
print "S88.6 Detected as SLOT0"
S0Pos = 6
spd SLOT0,0
sleep 10000
dir SLOT0,1
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 30,0
end if
if DEST = 2 then
acc 30,1
end if
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if
'検知区間⑥に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 6 then
else
print "S88.6 Detected as SLOT1"
S1Pos = 6
spd SLOT1,0
sleep 10000
dir SLOT1,1
sleep 2000
'上り/下りの判定
if DEST = 1 then
acc 30,0
end if
if DEST = 2 then
acc 30,1
end if
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if
end if

if s88get(7)=1 then
'検知区間⑦に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 7 then
else
print "S88.7 Detected as SLOT0"
S0Pos = 7
spd SLOT0,0
sleep 10000
dir SLOT0,2
sleep 2000
'下りに切り替え
DEST = 2
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if
'検知区間⑦に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 7 then
else
print "S88.7 Detected as SLOT1"
S1Pos = 7
spd SLOT1,0
sleep 10000
dir SLOT1,2
sleep 2000
'下りに切り替え
DEST = 2
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if
end if


wend

end

BASファイルはここです。 

 

で、実際に動かした動画はこちら。

youtu.be

  

今後

手持ちの線路、機器でやりたいことはいったんできた。

次は、複数の車両を同時に動かす自動運転したいな~

ということで、レイアウトをちょっと変更し、待避線を追加したい。

 あと、動かしたい内容でコードを書きつづけるのも、今後の拡張性を考えると限界が見えてきたので、進行方向の閉塞状況をチェックしながら車両が勝手に動き続けるようなロジックを追加していきたい。うむ、ハードル高い。。。

 

つづく

 

DSair2 Flashairの無線LAN接続について

以前にやーさんも記事にされていましたが、Flashairの無線LAN接続にはいくつかの選択肢があります。主に以下3つのモードです。

  • 親機モード(APモード:アクセスポイントモード)
    Flashair自身が無線LANの親機となって、無線アクセスポイントとして動作する。
    Flashairのデフォルト動作はこれ。
  • 子機モード(STAモード:ステーションモード)
    既設の無線アクセスポイントへ子機として接続して動作する。
  • インターネット同時接続モード(APモードとSTAモードを同時に提供)
    同時に機能することで、Flashair自身やFlashairの子機となったデバイスに対して、上位側のネットワーク経由でのインターネット接続ができるように動作する。つまりルータ的にふるまってくれる。

詳細は、以下のメーカーサイトの説明を参照ください。


けつろん

上記をみると、同時接続モードが一番便利そうじゃないですかー。ということで、いろいろいじってみましたが、私の家庭内LAN環境を前提とした結論は、おとなしくデフォルトの「親機モード」を利用する、でした。

 

インターネット同時接続モードの感想

そもそも、デフォルトの親機モードの何が嫌だったのかというと、子機となったスマホやPCがインターネット接続できなくなっちゃうこと。今時、自分がメインで利用しているデバイスがインターネット接続できない状態になるなんて考えられない。

ということで、まずはこの同時接続モード(APPMODE=6)を試したけれど、子機から親機(Flashair)への通信や、子機からインターネットへの通信が使い物にならないレベルで遅くなる事象が発生し、解決もできなかったので諦めました。具体的には、子機からDSair2の画面をブラウザで表示するのに数分かかる、またpingを打つと、遅延がひど過ぎて数秒を要するもしくはタイムアウトする。

子機モードの感想

同時接続モードの次に子機モードを試した。同時接続モードで発生していたネットワーク遅延周りの事象は改善され、それなりに便利に使えてた。

ただ、Bonjourによるホスト名アクセス(http://flashair)が、Win10 PCからだと正常にアクセスできるのに、スマホ(Android7/8)からだと名前解決ができずアクセスできない。IPアドレスを指定してアクセスするとOKなのだが、我が家の無線APルータ Aterm との相性なのかは分からないけど、なぜかそのような状態となってしまった。

 また、DSair2と無線APが別の部屋となるため、Flashairの無線LAN接続そのものが、不安定なのも気になった。ときどーーき、途中で車両操作できなくなることがあったので解消したかった。

親機モードの感想

ということで、結局デフォルトの親機モードに戻ってきた。

私はDSbasicのコード書きなどをメインPCから行いたいため、有線LAN接続のみであったPCにUSB接続の小さい無線LANアダプタをつけ、Flashairとの通信のみ無線LANを利用するようにした。これで、通常のインターネット通信等は有線LANで行い、Flashair(というかDSair2)との通信(=192.168.0.0/24セグメントとの通信)のみ無線LANで行われる環境となった。

なおこのような使い方の場合、既設の家庭内LANのネットワークアドレスが「192.168.0.0/24」ではないことが前提となる。というのも、親機モード時のFlashairのネットワークアドレスは「192.168.0.0/24」から変更できないため。子機モードならFlashairのIPアドレス等は変更できるんだけど、親機モードだと変更できなかった。

親機モードだと、DSair2に接続したスマホはインターネット接続できなくなってしまうけれど、基本的にはPCでの操作がメインとなるのだし諦めました。

 

ということで、何を言いたい記事だったのかよく分からなくなってしまったけど、備忘録ということで。。。

 

おまけ

参考までに、各モードでのFlashairのCONFIGファイル。

親機モード

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=4
APPNAME=flashair
APPSSID=flashair-tsujiru
APPNETWORKKEY=12345678
VERSION=F15DBW3BW4.00.02
CID=02544d535733324755e3546c7a012101
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPAUTOTIME=3000000
MASTERCODE=b072bff3e12b
LOCK=1
WEBDAV=2
UPLOAD=1
DHCP_Enabled=YES
Preferred_DNS_Server=192.168.10.1
Preferred_DNS_Server=192.168.10.1
Alternate_DNS_Server=192.168.10.1

 

子機モード

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=5
APPNAME=flashair
APPSSID=自分ちの無線APのSSID
APPNETWORKKEY=上記SSID接続用のキー
VERSION=F15DBW3BW4.00.02
CID=02544d535733324755e3546c7a012101
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPAUTOTIME=3000000
MASTERCODE=b072bff3e12b
LOCK=1
WEBDAV=2
UPLOAD=1
DHCP_Enabled=NO   ※ここから3行はFlashairに固定IPを振りたい場合
IP_Address=192.168.10.110
Subnet_Mask=255.255.255.0
Preferred_DNS_Server=192.168.10.1
Preferred_DNS_Server=192.168.10.1
Alternate_DNS_Server=192.168.10.1

 

同時接続モード

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=6
APPNAME=flashair
APPSSID=flashair_tsujiru
APPNETWORKKEY=********
VERSION=F15DBW3BW4.00.02
CID=02544d535733324755e3546c7a012101
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPAUTOTIME=3000000
MASTERCODE=b072bff3e12b
LOCK=1
WEBDAV=2
UPLOAD=1
BRGSSID=自分ちの無線APのSSID
BRGNETWORKKEY=上記SSID接続用のキー
DHCP_Enabled=NO  ※ここから3行はFlashairに固定IPを振りたい場合
IP_Address=192.168.10.110
Subnet_Mask=255.255.255.0
Preferred_DNS_Server=192.168.10.1
Preferred_DNS_Server=192.168.10.1
Alternate_DNS_Server=192.168.10.1

  

おわり

DSbasic 入門してみる(6)往復運転 + 機関車2両

前回の往復運転コードをベースに、機関車2両を互いに発進させるコードを作ります。

と、気軽に始めたはいいものの、いざコードを作り始めると、考えなければいけないことが多く、いきなり難易度が上がったような気がしてきた。。。

忘れないように流れを図にまとめてみました。

 

f:id:tsujiru:20190502004818p:plain

f:id:tsujiru:20190502004833p:plain

f:id:tsujiru:20190502004850p:plain

f:id:tsujiru:20190502004905p:plain

f:id:tsujiru:20190502004920p:plain

 

2台の機関車を行ったり来たりさせたいだけなのに、結構大変。。。

ちなみにここでは、Slot0(アドレス4) と Slot1(アドレス51)の2つの車両を動かす前提でコードを書いています。(下図の4と51)

f:id:tsujiru:20190502013409p:plain

 

コードは下記のとおりです。

※ブログに貼り付けるとタブインデントが消えちゃって可読性悪いですね。。。

GoogleDriveにアップしましたので、DSbasic - Google ドライブ からダウンロードしてください。(今回のコードは[006_s88-shuttle_2xloco_20190501.BAS]というファイルです)

screen(7)
s88start

print "START S88 Control -Shuttle + 2xLoco-"
sleep 5000
pwr 1
acc 31,1
acc 41,1
sleep 5000

'動かす2両のアドレスをSlot0と1に設定する
SLOT0 = getslotaddr(0)
SLOT1 = getslotaddr(1)
print "SLOT 0 = " + SLOT0
print "SLOT 1 = " + SLOT1

'前提:2両の初期位置は、検知区間①、②にすること。
S0Pos = 2
S1Pos = 1
'先発をSlot0に設定
NextLoco = 0

'SLOT0を起動(ESU BR151)
print "BR151 booting..."
dir SLOT0,2
fnc SLOT0,0,1
sleep 5000
fnc SLOT0,1,1
sleep 2000
fnc SLOT0,3,1
sleep 2000
fnc SLOT0,4,1
sleep 2000
fnc SLOT0,9,1
sleep 2000
fnx SLOT0,2
print "BR151 boot completed"
sleep 2000
spd SLOT0,200

sleep 10000

'SLOT1を起動(NGC DD51)
print "DD51 booting..."
dir SLOT1,2
fnc SLOT1,0,1
fnc SLOT1,1,1
print "DD51 boot completed"
sleep 2000
fnx SLOT1,2


while 1


if s88get(2)=1 then
if S0Pos = 2 then
else
print "S88.2 Detected"
S0Pos = 2
sleep 500
'SLO0を停止
spd SLOT0,0
sleep 10000
'ポイントを分岐
acc 31,0
'SLOT1を発進
NextLoco = 1
dir SLOT1,2
sleep 2000
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if


if s88get(1)=1 then
if S1Pos = 1 then
else
print "S88.1 Detected"
S1Pos = 1
sleep 1000
'SLO1を停止
spd SLOT1,0
sleep 10000
'ポイントを直進
acc 31,1
'SLOT0を発進
NextLoco = 0
dir SLOT0,2
sleep 2000
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if


if s88get(3)=1 then

'検知区間③に進入した車両がSLOT0の場合
if NextLoco = 0 then
if S0Pos = 3 then
else
print "S88.3 Detected as SLOT0"
S0Pos = 3
spd SLOT0,0
sleep 10000
dir SLOT0,1
sleep 2000
fnx SLOT0,2
sleep 2000
spd SLOT0,200
end if
end if

'検知区間③に進入した車両がSLOT1の場合
if NextLoco = 1 then
if S1Pos = 3 then
else
print "S88.3 Detected as SLOT1"
S1Pos = 3
spd SLOT1,0
sleep 10000
dir SLOT1,1
sleep 2000
fnx SLOT1,2
sleep 2000
spd SLOT1,200
end if
end if

end if

wend

end

キモは、流れ図内にも吹き出しで記載していますが、「NextLoco」値による、命令対象となる機関車の判断ロジックかと思います。(上記の赤文字箇所)

たった2両でこれなので、これ以上増やす場合は、配列とか定義していかないと厳しいのかもしれません。私はプログラマーではないので、そういったコーディングがどこまで可能なのか心配。。。

 

 実行すると、こんな感じでメッセージ出力します。

f:id:tsujiru:20190502012452p:plain

  

実際に動かした動画はこちら。


DSbasic 機関車2両による自動往復運転

 

次は、これをスイッチバック全体で往復させる自動運転かな~

 

つづく

 

DSbasic 入門してみる(5)slot命令

次は、2つの機関車を動かしていきたいので、アドレスベタ打ちのコードをslotに直しておこうと思います。

Slotって?

Slotとは、下図のキャブ画面右側にある4つのロコアドレス登録箇所のことを指します。

f:id:tsujiru:20190501202603p:plain

上記画面だと、Slot0がアドレス3、Slot1がアドレス51、Slot2がアドレス4、Slot3がアドレス22 となります。要は、よく使うロコのアドレスを4つ登録しておくことで、これをクリックするだけで切り替えることができて便利だよー、という機能です。

 ※スロット番号は、0~3です。1~4ではないので注意。

 

DSbasicでも、このスロットを指定して命令を出すことができます。

Wikiを見てみると、Slot関連の命令として以下4つが記載されてます。

f:id:tsujiru:20190501214617p:plain


まずは基本的な命令の「getslotaddr」の動きを確認します。

これは指定したスロットのアドレスを取得するコマンドなので、スロット0~3のアドレスを取得し、それを変数に格納して警笛を鳴らす動きをみてみました。

screen(7)
s88start

pwr 1
print "START S88 Control -slot test-"

SLOT0 = getslotaddr(0)
SLOT1 = getslotaddr(1)
SLOT2 = getslotaddr(2)
SLOT3 = getslotaddr(3)

print SLOT0
print SLOT1
print SLOT2
print SLOT3

sleep 10000
fnx SLOT1,2

end

 実行結果は以下の通り。f:id:tsujiru:20190501202609p:plain

 スロットに設定した、アドレス3,51,4,22 と取得できました。

また18行目のfnxで、SLOT1(アドレス51)のロコが警笛を鳴らすのも確認できました。

 

以上で、 ある程度の動きを把握できたので、前回のアドレスベタ打ちコードをSlotベースに修正しつつ、2両を動かすコードを作ってみます。

 

つづく 

 

DSbasic 入門してみる(4)往復運転+1分岐

前回は単純な往復運転を自動化しました。

今回はポイント制御を追加し、往復するたびに検知区間①と②が入れ替わるようにします。

f:id:tsujiru:20190501161954p:plain

 

コードは以下の通り。

前回からの大きな差分は、検知区間③の処理にポイント(Adr:31)の制御(赤文字箇所)を追加したことで、これにより、検知区間①/②へ順番こに入線するようにしました。

screen(7)
s88start

sleep 5000
pwr 1
print "START S88 Control -Shuttle-"
acc 31,1
acc 41,1
prePos = 0
sleep 4000

dir 51,1
fnc 51,0,1
fnc 51,1,1
sleep 2000
fnx 51,2
sleep 2000
spd 51,200

while 1

if s88get(1)=1 then
if prePos = 1 then
else
print "S88.1 Detected"
prePos = 1
sleep 1000
spd 51,0
sleep 10000
dir 51,2
sleep 2000
fnx 51,2
sleep 2000
spd 51,200
end if
end if

if s88get(2)=1 then
if prePos = 2 then
else
print "S88.2 Detected"
prePos = 2
sleep 500
spd 51,0
sleep 10000
dir 51,2
sleep 2000
fnx 51,2
sleep 2000
spd 51,200
end if
end if

if s88get(3)=1 then
if prePos = 3 then
else
print "S88.3 Detected"
if getacc(31) = 0 then
acc 31,1
end if
if getacc(31) = 1 then
acc 31,0
end if
prePos = 3
spd 51,0
sleep 10000
dir 51,1
sleep 2000
fnx 51,2
sleep 2000
spd 51,200
end if
end if

wend

end

 

上記を実行すると、検知区間に進入して検知されたタイミングに「S88.X Detected」と表示されるので、処理状況をある程度把握できます。

f:id:tsujiru:20190501194410p:plain

デバッグ中などは、print文による出力粒度を上げることで、切り分け作業が楽になります。

 

ということで、実際に動きはこちらの動画をどうぞ。


DSbasic 自動往復運転 + 1分岐

 

おわり

DSbasic 入門してみる(3)往復運転

これまでの(1)(2)の記事で、DSbasicで自動運転を行うための準備体操が終わりました。

今回から、いよいよ実際の自動運転処理を試してみます。

 

往復運転

まず最初は、検知区間②~③を行ったり来たりする単純な往復運転を自動化してみよう!

f:id:tsujiru:20190430221412p:plain

この往復運転については、Yaasanさんのブログでサンプルプログラムを提供してくれています。

 

これはもうパクって参考にさせてもらうしかないですよね!
記事内の「s88test.zip」がそうです。ただ、私とやーさんのS88構成は異なりますので、それを修正してみよー。

 

と気軽に始めたものの、全然意図した動きにならない。。。

 具体的には以下のような挙動に悩まされました。

  • 在線時、s88getのIF条件が繰り返し実行されてしまう。
    よく考えたら当たり前の挙動なんだけど、2つのif文をwhile で永久ループさせているため、end if までの処理が在線検知している間ずっとループしちゃってる。

 ●以下はダメな例

screen(7)
s88start

pwr 1
print "START S88 Control -Shuttle-"
acc 31,1
acc 41,1
sleep 10000

dir 51,1
fnc 51,0,1
fnc 51,1,1
fnx 51,2
spd 51,200

while 1

if s88get(2)=1 then
print "S88.2 Detected"
spd 51,0
sleep 10000

dir 51,2
fnx 51,2
spd 51,200
end if

if s88get(3)=1 then
print "S88.3 Detected"
spd 51,0
sleep 10000

dir 51,1
fnx 51,2
spd 51,200
end if

wend

end

 上記例だと、検知区間②に在線している間はずっと、赤文字箇所がループ実行されちゃう。

これを回避するため、「prePos」という変数を定義し、検知区間に入って最初の一回だけ折り返し処理を実行するようにした。

 

●以下はそれなりにOKな例

'以下の2行はおまじないとして必要。

screen(7)
s88start

 

'DCC電源投入と、ポイント状態や変数を初期化してます。
pwr 1
print "START S88 Control -Shuttle-"
acc 31,1
acc 41,1
prePos = 0
sleep 4000

 

'アドレス51の車両に対して、FWD方向でF0/F1をON、2秒待って汽笛(F2)を鳴らし、2秒待って速度200で発進。

dir 51,1
fnc 51,0,1
fnc 51,1,1
sleep 2000
fnx 51,2
sleep 2000
spd 51,200

'赤文字の while~wend 内を永久ループ

while 1

'検知区間②で在線検知、かつ、prePosが2でない、つまりこの区間で1回目の検知である場合のみ、print文以降の処理を実施。この中でprePos に2を投入しているので、繰り返し処理とならない。

if s88get(2)=1 then
  if prePos = 2 then
  else
  print "S88.2 Detected"
  prePos = 2
  spd 51,0
  sleep 10000
  dir 51,2
  sleep 2000
  fnx 51,2
  sleep 2000
  spd 51,200
  end if
end if

'検知区間③の処理で、上述の②と同様の処理を記述。

if s88get(3)=1 then
  if prePos = 3 then
  else
  print "S88.3 Detected"
  prePos = 3
  spd 51,0
  sleep 10000
  dir 51,1
  sleep 2000
  fnx 51,2
  sleep 2000
  spd 51,200
  end if
end if

wend

end

 

上記対応で定義した「prePos」、要は列車の位置を監視するための変数であり、今後複数の編成を走らせる場合、かなり重要になりそう。。。

なお、dir、fnc、fnx、spd あたりの命令を連続して記述すると、動作が不安定になることがあったため、適宜 sleep 処理を追加しています。

 

ということで、実際に動かしてみた動画です。


DSbasic 単純な自動往復運転

 

 

つづく 

DSbasic 入門してみる(2)S88センサの動作確認

さて本題のDSbasicです。

基本的な情報は、以下のサイトを参照して勉強しましょう。

https://desktopstation.net/wiki/doku.php/dsair2_basic

http://powerele.sblo.jp/article/185553068.html

 

DSbasic の動作確認

そもそも、自分のDSair2環境で、DSbasicが正常に動作するか確認してみましょう。

まずはDSbasic画面を表示し、左側のコンソールに以下を入力しましょう。

screen(7)
s88start
print "s88 detecting test"
end

入力できたら、画面右側のブラウン管画面下部の再生ボタンをクリック。

下図のように「s88 detecting test」と表示されたら、DSbasicが正常に実行されたと考えて大丈夫かと。

f:id:tsujiru:20190430195313p:plain

 

S88センサー情報取得の動作確認

上述の「s88start」を実行することで、DSairのS88機能が動作し始めます。逆に言うと、このコマンドを実行しない限り、DSairはS88センサの情報取得を行わないようです。

f:id:tsujiru:20190430195316p:plain

具体的には、上画面内の下記表記がS88センサの状態を出力した箇所ですが、いつまでたっても全chがゼロのままです。

S88 data: (1-> ) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0( <-16)

「s88start」を実行することで、上画面内のように検知しているセンサーchが "1" と検出されるようになりました。

ちなみに私が利用しているS88センサは、NuckyさんのS88-N Train Detector(16ch) です。

 

DSbasicでのS88センサ検知情報取得

今回のレイアウトですが、以前に記事にしていた以下のレイアウトです。

f:id:tsujiru:20180828233748p:plain

図内の検知区間①~⑦ が、S88 Detectorの ch1~7 に該当します。

で、これらのセンサーが正常に動作しているかを確認するため、以下のようなbasicを書いて実行しました。(2秒ごとにS88センサのch1~16状態を表示)

screen(7)
s88start
print "s88 detecting test"
FOR i = 0 TO 3000
  CLS
  FOR j=1 to 16
    print "s88(" + j + ")" + s88get(j)
  NEXT j
  sleep 2000
NEXT i
end

下図のように、センサ検知しているch5が "1" と表示されてます。

f:id:tsujiru:20190430195324p:plain

 

車両を動かすと、"1" となっているセンサchも変化しているのが分かります。下図ではch4が検知している状態。

f:id:tsujiru:20190430195328p:plain

 

同様に、ch3が検知している状態。

f:id:tsujiru:20190430195334p:plain

 

ということで、DSbasicからS88センサ状態の取得ができていることを確認できました。

次は、S88センサ状態をもとに、車両を動かす命令を書いていきます。

 

つづく