SSブログ
ジョイスティック ブログトップ
- | 次の10件

電車でGoコントローラをS88規格につなげるための5番目の実験 [ジョイスティック]

 トレジャー様がNucky様のS88基板を使用して、ポイントの動作確認センサを作ってみたとのことです。
 私もトミックスのポイントの動作不良には悩まされておりますので、こういう形のセンサを使って、ちゃんとポイントが切り替わっていなかったらリトライするぐらいのデコーダを作るのもありか?と一瞬思いました。
 さて、本題ですが、先週の日曜日に注文した基板を本日受け取りました。OCSで送ってもらいましたがElecrowかなり速いです。まあ、
・長穴加工が斜めっているとか
・一部スルーホールのはんだが飛び散っているとか、
・宛先の会社名が入っていないから佐川急便のお兄さんに怒られたとか(担当者名に私の名前が入っているが、個人だから宛先会社名の所に私の個人名を入れておくべきなのか?それとも佐川のお兄さんの指摘がおかしいのか?)
など突っ込みたいポイントはありますが。
 プレステコントローラコネクタと合わせた写真です。
re_DSC01055.jpg
 とりあえず、よさそうです。でも、こんなに早く来るとは思っていなかったので、秋月電子の高価な液晶を買っていません。組み立ては、今週の後半になりそうです。

DCC/MM2基板、電車でGo!コントローラなどを使って4人で遊べるようにする [ジョイスティック]

 「DCC/MM2シールド基板と電車でGo!コントローラなどを使ってDCC車両を4人で動かして遊べるようにする。」をしてみた。

 まず、手持ちの電車でGo!コントローラは初代の2ハンドルタイプひとつだけなので、Amazonで「電車でGO!コントローラ ワンハンドルタイプ PS」を買った。DualShock2は2個すでに持っているので、これでコントローラは4つとなった。
 次に、「ELECOM製 JC-PS102UBK」(PSコントローラUSB変換2プレイヤーつなげるタイプ)を買った。これで、PS→USB変換機はもともと所有の「SANWA SUPPLY JY-PSUAD2」と合わせて、4個分の変換が可能となった。
 
 しかし、「ELECOM JC-PS102UBK」はBVEでの対応などの話どおり、「電車でGo!コントローラ」が使えなかった。
 理由は、以下のジョイスティックのプロパティー画面でわかる。
「ELECOM JC-PS102UBK」は以下のように12ボタン+アナログ2軸*2+HatSwitchとなる。これはWin7標準ドライバを入れても同じ構成だった。
ELECOM_JCPS102U.png
 これに対して、「SANWA SUPPLY JY-PSUAD2」は、(ドライバがなく、Win7では標準のジョイスティックとして認識されるが)以下のように、16ボタン+アナログ2軸*2+HatSwitchになる。
SANWA_SUPPLY_JY-PSUAD2.png
 大切なのは、13~16のボタンがあることで、ここが十字ボタンを独立ボタンとして、認識してくれるところだ。
 で、電車でGoコントローラの動作では、十字ボタン(13~16)を左右同時押しなどあり得ない組み合わせで押すため(過去記事のIO表参照)、ELECOM製 JC-PS102UBKでは、方向が定まらなく、いろいろなボタンが連打状態のバグった状態になる。Amazonのレビューでも特殊コントローラで、連打状態になり使えないと書いてあり、つまりそのコントローラも十字キーを独立ボタン使うタイプということか?
 よく、調べてから買えばよかった。勉強代1000円ってちょっと高いかも。
 でも、普通のDualShock2は使えるし、家には衝動買いした電車でGo!コントローラ 合計2個とDualShock2が2個があるので、4人で遊べるということで、2人で遊んでたソフトを改造する。
 列車によって、最高速、加速度や減速度を個別変更可能にした。ただし、やる気の問題でソース直書きでセーブ機能なし。
  あとは今日買ったELECOM製 JC-PS102UBKにもDualShock2だけ対応させる。(○×△□ボタンのボタン番号が微妙に違うので、そこを変える。)ついでに、ボタン機能もちょっとだけ変える。
○:正方向、□:負方向とした。
 「電車でGO!コントローラ ワンハンドルタイプ PS」だが、前のものとIOはほぼ同じで、非常ブレーキ内の刻みが少なくなっている、2ハンドルタイプは非常ブレーキは9~14まで6段あったのだが、こちらは9、12、14と3段しかない。ソフトは変える必要がなく良かった。
 できたソフトの概観は以下。
4人で遊ぶソフト画面.png
 前回のソフトからの改造ではあるのだが、何か、途中でやる気をなくしてしまったため、場当たり的なグダグダソフトに磨きがかかってしまった。
 ソフトを立ち上げたら
(1)DCC/MM2シールド基板接続のCOMの名前を”COM”に書いておく。
(2)Joystick数を実情に合わせる。(2個しかつながっていなくても4個とか書いても大丈夫なきもするが)
(3)”Open”ボタンを押す。JoystickとCOMを開き、DCC/MM2基板に最初の通信を送り、エラーが帰ってくる。
(4)各ジョイスティックの状態は左半分の4段分で、ここの設定を合わせる。(Joystickの列挙順がどうなるかは予想ができなく、手動であわせる)
具体的には、
(4-1)各チェックボックスで”SANWA"チェックボックスは、PS→USB変換アダプタの「SANWA SUPPLY JY-PSUAD2」を使用するときに入れる、ここをはずすと、「ELECOM製 JC-PS102UBK」モードになり、DualShock2だけ使用可能となる。
(4-2)「SANWA SUPPLY JY-PSUAD2」+「電車でGo!コントローラ PS」や「電車でGO!コントローラ ワンハンドルタイプ PS」を使用のときは、”Go Controler"のチェックボックスを入れる。
(4-3)各コントローラの制御列車は、"cont_loco_no"を0~3で選ぶ。番号が重複しているときは二つのコントローラから引っ張りあいをするのでどういう挙動になるかは不明。
(4-4)右側の4段は制御する各電車のパラメータが書いてあり、初期値はPublic Form1()という初期設定のところで適当な値を代入している。変えてしまえば、初期値が変わる。
各パラメータは
address:列車のアドレス
現在速度:今の設定速度(0~1023)。ここに何か書いても、速度は変わらない
方向:今の方向1,-1で表示。ここに何か書いても、速度は変わらない
最高速:速度の上限値設定。低くしておけば子供が恐怖の脱線スピードを出せなくなる大切なリミット。
加速度:マスコン1段、秒あたりの加速度。例えば、マスコンが3段目で、加速度が15なら、秒あたり速度が45増加する。(45=15*3)
減速度:ブレーキコントローラ1段、秒あたりの減速度、例えば、9段目で減速度が20なら、秒あたり速度が180減少する。(180=9*20)。ただし、ブレーキを14まで持ってくと、一瞬で速度を0にするソフトにしてある。
(4-5)パラメータ変更後は、列車設定変更ボタンを押すと、メモリ内の設定値を書き換えてくれる。
(5)”Power On"ボタンを押すと、DCC/MM2シールド基板から線路への給電がされる。
(6)途中で各コントローラの制御列車を変えたいときは、対応するcont_loco_noを0~3で書き換える。他のコントローラと重複すると、動かないかも。気をつけて。
(7)終わるときはWindow上の×ボタンを押すと、DCC/MM2シールド基板からの給電が止まり、ソフトも終了する。
 で、特に問題もなく動いた。子供3人に動かしてもらったが、ひとつの線路にすると絶対に追突事故を起こすので、三つのループ線にした。
4人で遊ぶ.JPG
 上の娘はすぐに飽きて、スマホのゲームやらせろと言ってきた。このソフト、作るのにほぼ今日一日かかったのに・・・。まあ息子は気に入ったようで、いつまでもやり続けていたけど。
 ソースは、これ
 開発環境はVC2013 Communityでビルドなど設定は過去記事参照のこと。
 今から、何か改造するなら、息子が5分ごとに言う、「今度はこっちの電車動かしたい攻撃」に耐えるよう、コントローラのどっかのボタンを押すと、制御列車を変える機能かなと思う。





DCC/MM2基板を電車でGo!コントローラーで操作 3 [ジョイスティック]

 自分の書いたプログラムを1週間程度で見返してみても、なんか忘れていることが多いので、説明を書いておく。
 説明は、今回のこれについて。

いじってるのはForm1.csだけ。
<変数の宣言>
・struct_locoは電車の速度、加速度、方向、番号、速度上限(500以上では速度が上がらなかったりするので)を保存する構造体。
struct_go_controlerは電車でGo!コントローラー用の構造体だったが、Dualshockでも使用。マスコン、ブレーキ、方向、各コントロール位置での加速度定数を保存する構造体。
クラスでは、
struct_locoを二つ(2列車)、struct_go_controlerを二つ(2P)、Device(DirectInputジョイスティック)を二つ宣言している。

<動作>
タイマー動作により動く。
・Timer1はジョイスティックの状態を掴む→マスコンの状態に変換→電車の速度、方向を計算する。一応の50msごと。
・Timer2は電車の速度、方向に変更があったらDCC/MM2基板に送る。一応の割り込みは300msごとで1P,2P交互。
(なので、どっちも操作していると600msごとにしか通信していなかったりする)

<関数>
・Form1()
Form1のイニシャライズ。
電車の初期値を入れている。(loco[0],loco[1])
また、適当にコントローラーの初期設定と加速度定数を作っている(go_cont[0],go_cont[1])
ブレーキ解除時もなんとなくスピードが落ちるようにしているのもここ。
・joystick_state
Timer1から呼ばれる関数で、
(1)ジョイスティックの状態を読んで、それを16ビットの値に変換後、マスコンの状態、ブレーキの状態、方向の状態に変換する。
(2)現在のマスコン、ブレーキの加速度から速度を計算する。方向が変わっていたら速度を0にする。
・timer1_Tick
Joystick1,2について、joystick_state関数を呼んで、速度、方向に変換しておく。
・button2_Click
引っ張ってきたサンプルの残骸。特に使っていない。
・ timer2_Tick
loco[0],loco[1]の速度、方向に変更があったら、DCC/MM2基板に送信する。P1,P2で交互に行う。
・Form1_FormClosing
Form1で×ボタンが押され、閉じられるときに、DCC/MM2基板に"setPower(0)"を送信し、電源を切る。
・serialPort1_DataReceived
シリアルポートの受信割り込み関数
・RcvDataToTextBox
serialPort1_DataReceivedから直接テキストボックスに書くと、マルチスレッド的にだめらしいので、この関数があるようだ。
・button1_Click
"Open"ボタンを呼ばれたときの関数で、
joystickを二つ見つけて、DCC/MM2基板のシリアルポートを開き、"SetPing()"している。
・ button1_Click_1
”Power On"ボタンが呼ばれたときで、DCC/MM2基板に"setPower(1)"を送信して、電源Onしているだけ。

DCC/MM2基板を電車でGo!コントローラーで操作 2 [ジョイスティック]

 で、先週作ったソフトを改造して、ジョイスティックを「電車でGo!コントローラー」、「DualShock」から選べるようにして、DualShock用の部分は「電車でGo!コントローラー」風にアナログスティック部分で動くように変更した。
 プロジェクトはここ
 使い方は、
(1)DCC/MM2基板をつないでおく。ジョイスティックもつないでおく。(「USB GAMEPAD CONVERTER JY-PSUAD2」+「電車でGo!コントローラー」など。
(2)ソフトを立ち上げる、プロジェクトからデバッグ実行するか、\directinput_test2\directinput_test\bin\Debug\directinput_test.exeを動かす。(VS2013CommunityとDirectXが入っていない場合、どのような挙動になるかわからないが。)
(3)画面は以下のとおりで右上の”COM”をAruduinoがつながっているCOMの名前に合わせる。Loco noも合わせる。電車でGo!コントローラーで動かすなら”Go Controler”のチェックをつけておく。付いていない場合はDualShock(アナログ仕様)になる。DualShockで動作させる場合はアナログボタン(赤いLED)をつけておくこと。
画面.jpg
(4)Openボタンを押す。ジョイスティック2個を開き、シリアルポートを開き、DCC/MM2基板と初めての通信をする。何か設定が間違ってればソフトがフリーズか?
(5)PowerOnボタンを押す。たぶんDCC/MM2基板からOKが帰ってくるはず。
(6)操作だが、
<電車でGo!コントローラー>
・左側のマスコン部分は切で惰性っぽい運転(ちょっとずつ遅くなる)、1はちょっとずつ速くなり、5はすごい勢いで速くなる。
・右側のブレーキ部分は1~14までで段階的にブレーキが強くなる。「非常」辺りになれば、どんなにマスコンを動かしても電車は動かない。
・Aボタンは負方向
・Cボタンは正方向
マスコン部分とブレーキ部分を電車によって全然違うため変える必要があるが、今回は、ソースの中に直書きしてしまっている。
<DualShock>
アナログボタンを点けている状態で、
・左アナログスティックはマスコンで下方向にしていくと、一番下でマスコンの5段目になるようにしている。(Y軸で操作なしが32000ぐらい。一番下(65535)でマスコンの場所で5相当になるようにしてある。)
・右アナログスティックはブレーキで右方向にしていくと一番右でブレーキの14段目になるようにしている。通常ブレーキの最大は8段目。(Z軸で操作なしが32000ぐらい。一番右(65535)でブレーキの場所で14相当になるようにしてある。)
dualshock2.jpg
・③キー(□)が負方向
・④キー(△)が正方向

で、こんなにいろいろと微妙な操作ができるようにしたにもかかわらず、子供に操作させてみたら、マスコンの5(最大加速)とブレーキの14(非常ブレーキの一番強いやつ)のみを駆使して運転していた・・・。
ちょっと寂しい。


DCC/MM2基板を電車でGo!コントローラーで操作 1 [ジョイスティック]

 「電車でGo!旅情編」のコントローラーが家にあったので、これで、鉄道模型を動かしてみようと思って、PCのUSB端子に接続してみた。不明なデバイスだった・・・。これはPCから見るとジョイスティックじゃないんだ・・・。
 検索してみると、UUSBD.DLLの使用でできそうだということはわかったが、Win64環境でのインストールはとてもやばそうな雰囲気だったので、あきらめた。
 でも、どうしても電車でGo!コントローラーで動かしたくなってしまったので、プレステのポートに接続できるタイプを買おうと思った。そうすれば、手持ちのPCへの変換アダプタ「USB GAMEPAD CONVERTER JY-PSUAD2」に接続できるので。
 なんかAmazonで2700円ぐらいからみたい。Yahooオークションでも似たような感じ。検索すると2010年ぐらいは105円で買ったとかいう自慢話がいっぱいだが、2015年現在、私は1週間かけてBookOffや近くの中古ゲーム屋さんなど6件を回ったが、そんなものは売っていなかった。で、Amazonの中古-良品をで3400円で買った・・・。

電車でGO!コントローラー PS

電車でGO!コントローラー PS

  • 出版社/メーカー: タイトー
  • メディア: Video Game


で、これを、手持ちの変換アダプタに通すと、ボタンは以下の写真のような割り当てになっていることがわかった。
面白いのが、ブレーキは全部で14段あり、青い通常領域が8段、赤い非常領域には、クリック間がないにもかかわらず6段割りついているということ。
電車でGoコントローラ写真.jpg
で、その詳細は以下の表のとおり。
ソフトの粗筋としては、先週作ったPSジョイパッド用のボタンをこっちのに付け替えてやれば、動きそう。

マスコン側

位置

4

13

14

15

16

合成Hex

0

1

1

1

1

0xf000

0

1

0

1

0

0x5000

1

1

1

1

1

0

0x7008

0

1

0

1

0

0x5000

2

0

1

1

1

0

0x7000

0

1

0

1

0

0x5000

3

1

1

0

1

1

0xd008

0

1

0

1

0

0x5000

4

0

1

0

1

1

0xd000

0

1

0

1

0

0x5000

5

1

1

0

1

0

0x5008



ブレーキ側

位置

5

6

7

8

合成Hex

解除

0

1

1

1

0xe0

1

1

1

1

0xf0

1

1

0

1

1

0xd0

1

1

1

1

0xf0

2

0

0

1

1

0xc0

1

1

1

1

0xf0

3

1

1

0

1

0xb0

1

1

1

1

0xf0

4

0

1

0

1

0xa0

1

1

1

1

0xf0

5

1

0

0

1

0x90

1

1

1

1

0xf0

6

0

0

0

1

0x80

1

1

1

1

0xf0

7

1

1

1

0

0x70

1

1

1

1

0xf0

8

0

1

1

0

0x60

間 非常

1

1

1

1

0xf0

9 非常

1

0

1

0

0x50

1

1

1

1

0xf0

10

0

0

1

0

0x40

1

1

1

1

0xf0

11

1

1

0

0

0x30

1

1

1

1

0xf0

12

0

1

0

0

0x20

1

1

1

1

0xf0

13

1

0

0

0

0x10

1

1

1

1

0xf0

14
非常 止まるところ

0

0

0

0

0x00

0

0

0

0

0x00

15
非常 止まるところ

0

0

0

0

0x00



A:

B:1

C:2

Select:9

Start:10




DCC/MM2基板をジョイスティックで操作(SerialPortのところ) [ジョイスティック]

 次に(2)DCC/MM2基板への通信(COMポート制御)だが、まず、DesktopStationのDCC/MM2基板への通信は、「ログ」タブをみると、私が使いそうなのは、
-------------------------
setPing()・・・はじめに通信ができているかの確認
setPower(1)・・・DCC/MM2基板から線路へ電源供給On
setPower(0)・・・DCC/MM2基板から線路へ電源供給Off
setLocoSpeed(49152+電車番号,スピード,2)・・・スピード設定。DCC128で決め打ち。
setLocoDirection(49152+電車番号,1 or 2)・・・電車の方向設定+停止か?
-------------------------
ということがわかった。
 C#のCOMポート制御は金澤ソフト設計さんのページを参考にした。
 シリアルポートをフォームに貼り付ければ大体完成だが、Readだけイベントをとらないといけないので、そこの部分については、説明を読むよりも、金澤ソフト設計さんのシリアルポートのサンプルプログラム自体をダウンロードして見たほうが早い。
 で、デバッグしていて気づいたのだが、(DesktopStationのページには書いてあったが)いままで、適当にAruduino1.6.0でDCC/MM2基板をコンパイルして使っていたのだが、なんか動作がおかしい・・・。
 方向が変わらなかったり、2,3個の命令が立て続けに出たりと。
 でAruduino1.0.6にしたらちゃんと動くようになった。怖い怖い。
 で、動かした動画が以下。


作ったプロジェクトはここ
うまくいけば(DirectXのランタイムなどが入っていればか?)
\directinput_test2\directinput_test\bin\Debug\directinput_test.exe
をダブルクリックすれば動く。
(1)ソフトのつくりは適当なので、ジョイスティックを2つつなげておく。
実行したら、画面は以下のとおりで、
di_test説明.jpg
(2)まず、COMをAruduinoがつながっているポートにあわせる。写真では”COM4"
(3)電車の番号(loco_no)も合わせておく。写真では4と3。
制御は決め打ちでDCC128になっている。
(4)Openボタンを押すとジョイスティック、Aruduinoへ接続される。
右側がSerialPortの通信内容でたぶん最初の通信はSerialReadにエラーが戻ってくる。
(5)次にPowerOnボタンを押す。DCC/MM2基板から線路に電源が供給される。
(6)あとはジョイスティックの1から4のボタンを使って二人で遊べる。
(7)終了はソフト右上の×ボタンを押す。DCC/MM2基板の線路への電源供給がとまる。

DCC/MM2基板をジョイスティックで操作(DirectInputのところ) [ジョイスティック]

 せっかく単線に複数電車を置けるようになったので、子供と一緒に遊べるようにジョイスティックで操作できるようにしようと考えた。
 Aruduino単独でやるのはきっと難しそうなので、PCを介することにした。
 やらなければいけないことは、
(1)PCへのジョイスティック入力(Win32APIかDirectInput)
(2)DCC/MM2基板への通信(COMポート制御)
(3)全体のソフトを何で作るか?
ぐらい。

 (1)ジョイスティック入力だが、Win32APIとDirectInputがあるようだが、Win32APIは遅延するとか書いてあるのでDirectInputにした。
 DirectInputのライブラリはC++で動くのだが、MSDNとか説明が宇宙語でわからない・・・。
 ということでいくつかのページを見た後、nanoblogさんのページを参考にC#で作ることにした。C#はやったことなかったが、C#入門のページで言うとおりに勉強すると、どうやら、使い勝手はVBのようで、言語がC++っぽいということがわかり、(3)の全体のソフトはC#でつくることに決めた。
で、DirectInputはnanoblogさんのところの言うとおりにやってみた。
ただし、私の環境は、
---------------------
OS:Win7 x64
開発環境:VS2013 Community
---------------------
とちょっと異なっている。
それでなのか、「.Net Frameworkのバージョンを3.5にして」も実行時にエラーが出た。
エラーを検索したら、Yahoo知恵袋に解決策があり、コンパイルはx64ではなく、x86でやると実行時エラーも出なくなった。(プロジェクト タブ→○○プロパティ→ビルド→プラットフォームターゲットのところ)
とりあえず、これでジョイスティックの入力をとれるようになった。
ジョイスティックは家に余っていたものを使ったのでPS2用のDualShock2が2個と、PCへの変換アダプタの「USB GAMEPAD CONVERTER JY-PSUAD2」というPSのコントローラ二つを入力できるもの。
コントロールパネル→デバイスとプリンター→「4axes 16keys Gamepad」を右クリックして「ゲームコントローラの設定」を開いてプロパティを開くと、どのボタンが何番かがわかる。今回は難しいことはしたくないので、
------------------
(1)加速
(2)減速
(3)正方向
(4)逆方向
------------------
のボタンだけで動くようにした。
dualshock2.jpg
なんか、とても制御しづらい。

- | 次の10件 ジョイスティック ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。