フォト
2017年5月
  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で半角カタカナのローマ字入力 »