フォト
2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
無料ブログはココログ

« 豊四季 Tiny BASIC for Arduino STM32の動作テスト(1) - サーボモータの利用 | トップページ | Arduinoで半角カタカナのローマ字入力 »

2017年5月14日 (日)

豊四季 Tiny BASIC for Arduino STM32の動作テスト(2) - ゲームパッドの利用

現在取り組んでいる「豊四季 Tiny BASIC for Arduino STM32」の動作確認の続きです。

今回は、ファミコン用ゲームパッドを利用するプログラムを作成しての検証です。

Dscn6614

利用したのは、Aliexpressで入手したゲームパットです。350円くらいで入手しました。

01

ファミコン関連の周辺機器は"NES"で検索して探せますが、コネクタがUS版では
ちょっと異なります。今回はDSUB9ピンのものを利用しました。

Dscn6603

ファミコン用のゲームパッドのボタン状態の読み取りのプロトコルは、
シフトレジスタからのデータ取得の手順となります。

大まかな内部の回路は次のような感じになります。
シフトレジスタCD4021相当のプロトコルにてボタン情報の取得が行えます。
DSUB9ピンのうち、5ピン(GND、VCC、CLOCK、LATCH、DATA)を利用します。

回路図

Photo

Blue Pillボード(TinyBASIC)には、次の結線を行います。
  PB12 2: DATA(INPUT)
  PB13  3: LATCH(OUTPUT)
  PB14  4: CLOCK(OUTPUT)
  3.3V  6: 3.3V
  GND   8: GND

  Dscn6613

  ブレッドボードに接続して利用するために、次のような感じのコネクタを作成しました。

  Dscn6607

  D-SUBオスピンは秋月電子で入手しました。
  このコネクタ、端子がちょっと特殊で2.54ピッチの基板には乗りません。
 
  仕方がなく、1.27ピッチの基板に乗せました。ちょっと面倒でした。
  ブレッドボード用の変換基板があるので、それを買うべきでした。 

04


プログラム

ボタン情報を読み取り、各ボタンの状態0、1を表示します。
50行から100行がシフトレジスタから1ビットずづボタン情報を取得しています。
変数Rに読み取り結果をセットします。
110行でその変数Rの値を2進数で表示しています。

10 CLS
20 GPIO PB12,INPUT_FL
30 GPIO PB13,OUTPUT
40 GPIO PB14,OUTPUT
50 OUT PB13,HIGH:OUT PB13,LOW
60 R=0
70 FOR I=0 TO 7
80 R=R+IN(PB12)<<I
90 OUT PB14,HIGH:OUT PB14,LOW
100 NEXT I
110 LOCATE 0,0:?BIN$(R,8)
120 WAIT 100
130 GOTO 50


実行すると次のような感じになります。
ボタンを押している場合は0、離している場合は1となります。
ボタンは同時押しもOKです。

Dscn6617

画像のビットとボタンの関係は次の通りです。
10111111

左の上位ビットからゲームパッドのボタン⑦⑥⑤④③②①⓪に対応しています。
上のビット情報では⑥のボタンを押した状態です。

Dscn6609

ゲームパッド上にボタンは10個ありますが、
右上の2つはその下のボタンの連打(ターボ)用です。
連打ボタンを押し続けると、オン、オフを自動で繰り返します。

TinyBASICにはシフトレジスタから値を読み取るSHIFTIN()関数があります。
SHIFTIN()関数を使うと、プログラムがちょっと短くかつ処理の高速化が出来ます。

10 CLS
20 GPIO PB12,INPUT_FL
30 GPIO PB13,OUTPUT
40 GPIO PB14,OUTPUT
50 OUT PB13,HIGH:OUT PB13,LOW
60 R=SHIFTIN(PB12,PB14,LSB,LOW)
70 LOCATE 0,0:?BIN$(R,8)
80 WAIT 100
90 GOTO 50

SHIFTIN()関数を利用した記述すると、先ほどの60行~100行の5行は
50行~60行の2行に短縮出来ました。
10行から40行は初期設定なので、実質2行でボタン情報が取得できます。

今後、ゲームなんかに利用していくことにします。

さて、今回の検証でTinyBASICのSHIFTIN()関数の引数を追加しました。
当初、Arduinoのshiftin()と同じ機能そのまま実装したのですが
Arduinoのshiftin()の仕様ではCD4021には対応出来ません。

CD4021ではCLOCKがLOWの場合にデータ取得するのですが、
shiftin()はCLOCKがHIGHの場合にデータを取得にした対応していません。
その仕様が分からず、正しくデータが取得出来ないことにハマりました。

そのため、TinyBASICのSHIFTIN()では第4引数(省略時可能)、データ取得の
CLOCKの状態を指定出来るようにしました。

やはり、実際に利用してみないと問題点は気付かないですね。

« 豊四季 Tiny BASIC for Arduino STM32の動作テスト(1) - サーボモータの利用 | トップページ | Arduinoで半角カタカナのローマ字入力 »

arduino」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/65279768

この記事へのトラックバック一覧です: 豊四季 Tiny BASIC for Arduino STM32の動作テスト(2) - ゲームパッドの利用:

« 豊四季 Tiny BASIC for Arduino STM32の動作テスト(1) - サーボモータの利用 | トップページ | Arduinoで半角カタカナのローマ字入力 »