スレッドの評価:
  • 回答数:0 平均:0
  • 1
  • 2
  • 3
  • 4
  • 5
yaasanDSbasic (DSair用BASIC) 相談室
#21
こんばんは
スマホでDSbasicを書き進めてます。
今日は初代iPadを購入した頃に一緒に買ったApple Wireless Keyboardを出してきました。
乾電池を入れてGalaxy S9とペアリングしたら使えました。
ソースコードの入力が格段に良くなりました。
先日のすれ違い運転に続いて、Wireless Key Boardでの操作プログラムを作りました。
・"l"でTrain、"p"でPoint、"o"でFunc. の3 Modeの入力切換え。
・"1"-"9"、"0"で各Modeの変数変更、Train Modeで"3"なら登録番号3の車両を選択。
 Func. Modeなら選択された車両のFNCをオン。 Point Modeならトグル切換え。
・"x"で選択された車両の登録された速度に設定、"z"で速度0に設定。
・"X"で前進、"Z"で後退に設定。
・文字入力はinkey$関数で読み込み、100msでループするプログラム。
なんとなく動いてます。 複数車両をパシパシと操作出来そう。

もうひとつのプログラムは各列車の位置をs88の入力から把握し、ポイントの
状態と先行車両の在線で前進、停止を制御する様に作成中です。
ポイントの状態を手動で操作するだけで車両を衝突させずに走らせる
事が出来るかなと、チャレンジです。
ここで配列の変数に車両の前と後ろがそれぞれ何処のs88でのセクションか
を入れて判断するプログラムです。&h431なら4と3に跨いで前進中という
具合で、4にあるacc(7)が1なら停止させるような判断プログラムです。
ここで変数の&h431を画面に表示してデバッグしたいのですが、wwwBasic
ではHEX$()が使えない... うーんMID$()などの文字列関数が無い?
今日はここまでです。
返信
#22
ようやくDSbasicでの自動運転が動くようになりました。
各車両のスタート位置を入力し、s88とaccの状態で位置を更新して次に進むセクションに車両がいる場合は停止する様にしました。
これでレイアウト画面でポイントを操作するだけで複数の車両を動かせました。
まだ6区間、4ポイント、3車両だけですが動かす様子の動画をアップしました。
DSbasicでは車両の位置に対して if 文で分岐可能な次のセクションのs88の状態を確認して、進行、停止を制御しました。

進行先のポイントが複数あると if 文の階層が深くなります。
誤り訂正のプログラムを書いている様な感じです。

引き続き14区間、8ポイント、8車両での自動運転のプログラムに拡張中です。

DSairFirmware_r2j_TEST13gを使用してます。
返信
#23
投稿&紹介ありがとうございます。HEX$は次のバージョンで追加します。MID$はちょっと素直に組めないので考えます。

私も簡単なものですが、皆様のご参考になればと、ポイントを組み合わせたBASICプログラムを作ってみました。
単純な1巡処理なので、参考にしやすいと思います。複数列車や、キーボード入力を組み合わせる場合は、イベントドリブン型の実装をしないといけないですが・・・。

使用したスケッチは、r2k2(最新版)です。

ブログ記事:
http://powerele.sblo.jp/article/185725380.html

動画:
返信
#24
SD_WLANの "wwwbasic.js" の中を見るとDSbasicで使えるコマンド等が
確認できました。
HEX$は自前で表示するようにしますので、手間でしたら無くても大丈夫
ですよ。 MID$は元々用意されているのかな? 試してみます。

私の自動運転もイベントドリブンで100msの巡回で8車両の状態を構造体
の配列で順に処理するようにしています。

車両数が多いと開始時の区画に車両を持ってくる作業が手間で、開始前に
各車両の在線区画を入力できるようにしようかと考えてます。
返信
#25
5車両 14区間 6ポイントで運転してみました。



プログラムとしてはこんな感じで書いてます。
do
 for tr=1 to 8
  select case tr
   case 531
    if gets88(3)=0 then
     if getacc(8)=0 and gets88(6)=0 then
      Train(tr).s88=551
      spd Train(tr).adr,Train(tr).spd
     end if
    end if
   case 551
    if gets88(6)=1 then
     Train(tr).s88=651
    end if
   end select
  next tr

  k$=inkey$
  if k$>="1" and k$<="9" then
   ac=k$-"0"
  acc ac,1-getacc(ac)
 end if
loop
返信
#26
皆様、こんにちは
Fujigaya2 S88 Detector 8ch の作成、動作確認、S88 RFID Decoderへの道など
でDSbasicでの自動運転の作業は止まってました。

Desktop StationのWikiで”DCC自動運転ガイド”をアップして頂いている様に
こちらも問題が発生してます。
1. 客車などで車内灯により列車の在線検出を電流で行なっているのですが
 集電不良により車両の後尾がギャップを越えていないのに、移動したと
 判断されてしまう。
2. 車両により速度0を実行してもゆっくり停止するDecoderを混在して使用
 しているので、停止位置にズレが生じる。 短いギャップの駅に正しく
 停車出来ない。
3. スマホでDSbasicをコーディングしているが、プログラムが大きくなって
 修正が困難になってきた。 コピペが出来ない、編集画面が小さい...

対策方法ですが
1. 車輪/集電板の掃除を行なうと共に、gets88wを複数回読み込みオフ判断を
 厳しくする。 以下の様にして100msで2回のs88の読み込みで判断する様にした。
  defint a-z
  do
   s88old=s88new
   s88new=gets88w(0)
   s88jdg=s88new and s88old
   j=s88jdg : for i=1 to 16 : s88(i)=j mod 2 : j=j/2 : next i

   if s88(1)=0 then
    spd ad,0
   end if

   sleep 100
  loop

2.の対策はまだ検討中。
 ・個々の車両の加減速の情報を配列変数に入れて処理する。
 ・タイマー処理を加えて停止位置を調整する。
  (Desktop Station Softwareでは速度の遅延機能を使ってました。)

3. スマホで書いていたDSbasicのコードをパソコンに移して作業した。
 ・スマホでBASIC Dataを"Save to File"で保存し、メールでパソコンに送付。
 ・パソコンで”dsair_userbas.bas”をDownloadし、秀丸エディタなどで編集。
 ・パソコンからDSair2にアクセスし、DSbasicにエディタからコピペ。
 ・パソコンでデバッグを終えたら、FlashAirのSD Cardに”dsair_userbas.bas”をコピー。
 ・スマホからDSair2にアクセスし、MP3サウンド再生リストで”dsair_userbas.bas”をオープン。
 ・スマホで更新されたプログラムを動作。
返信
#27
先週の続きを行いました。
timer命令で秒単位のタイマー処理を各車両に追加し、集電問題と停止位置問題
を調整できる様にしました。

ここまでで、車両の初期値/状態の配列、s88のチャッタ処理の配列で以下の変数
を使ってます。
defint a-z
TYPE val
 adr as INTEGER ’ 車両のDCCのアドレスの設定値
 sp2 as INTEGER ’ 車両の走行速度の設定値 
 sp1 as INTEGER ’ 車両の徐行速度の設定値
 s88 as INTEGER ’ 車両の位置/速度の状態
 spd as INTEGER ’ 車両の停止/徐行/走行の状態
 tim as INTEGER ’ 車両の遅延処理のタイマー値
END TYPE
DIM Train(1 to 10) as val ’ 上記の構造体で10車両までの配列確保
DIM s88(1 to 16) as INTEGER ’ s88のチャッタ処理した結果を保存

各車両でタイマー処理を確認しているところで、調整中。
また、ヤードへの入り口のポイントが開放されていたら後退して
ヤードに入って停止する自動運転も追加中ですが、これも苦戦中。
返信
#28
FNXファンクションの使い方を教えてください

FNX(LocAddr, FuncNo) FuncNo=0-28,ファンクションのOFF→ON→ON操作をします。
とのことですが
ちょっと使い方がよくわかりません。
返信
#29
FNXは、FNCを最低2回操作しないといけないのを、1回で行うための命令です。
OFFの状態から、FNCを使うと、ONとOFFの命令を出さないといけません。
FNXを使うと、1回に省略できます。

ただし、ONとOFFの操作で、ある程度の時間を待たせる必要がある場合は、使用できません。
返信
#30
キハ81&82に永末システムのデコーダDE33sx4_KH8x を実装しました。
モーター車の動きは非常に良いです。
DSbasicのプログラムでポイント切り換えの操作だけで車両の動きを制御出来るようにしてます。
ですが遅延動作のタイマが上手くいかず、オーバーランで状態ズレが発生。
最後はC56が止まらず、緊急停止。
返信


ページジャンプ:


このスレッドを閲覧中のユーザ: ゲスト: 1