エレ玩 Konyaの開発記録

アクセスカウンタ

zoom RSS EGP01でロータリーエンコーダを使う1

<<   作成日時 : 2013/03/24 22:08   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 5 / トラックバック 0 / コメント 0

ロータリーエンコーダを使います。
秋月の2色LED付スイッチ付ロータリーエンコーダ(赤・緑)ツマミ付セットがゲームの操作にいい感じです。

軸を押し込むスイッチ付きのため、クルクル廻しながらスイッチを押す操作、チャンネルスイッチやローリングスイッチのような操作が期待できそうです。
赤と緑のLEDもゲームの演出に使えるのではないでしょうか?

早速、EGP01のオプションボードとして作成しました。
左側にはいつもの4方向ジョイスティック、右側にロータリーエンコーダを実装しています。
画像


本体に取り付けると...
ロータリーエンコーダがデカイ!!
無駄に存在感があります!!
画像
画像


回路図です。
ロータリーエンコーダの接続のみ記載しています。
それ以外はEGP01スタートアップガイドの回路図を参照ください。
ロータリーエンコーダのA、B端子とスイッチはPIC内部でプッルアップしています。

画像


オプションボードの実装、配線図です。
画像


ロータリーエンコーダは軸を回転させることで、
内部のスイッチ(上記回路図参照)がONになります。
A、B端子はPIC内部でプルアップしているため、通常"High"でスイッチONで"Low"になります。

下図のように時計回りでは、A端子が先にON、少し遅れてB端子がONになります。
反時計回りではB端子が先にON、遅れてA端子がONになります。
A、B端子の状態を組み合わせて見ることで回転方向が分かります。
画像

このロータリーエンコーダは、マウスのセンターホイールのように廻すとクリック感があるタイプで、
1クリックで15度回転、1周に24クリック分あります。
上図は1クリック分の波形で、廻した分(クリックの数)だけ連続でパルス出力されます。

マイコンはA、B端子の状態変化、時計回りでは"0,1"⇒"0,0"⇒"1,0"⇒"1,1"の4状態を読み取り、1クリック分の回転を判定します。
しかし、4状態をチェックするのは面倒なため、A端子立下り時のB端子の状態だけで時計/反時計回りを判定することにします。
利点は判定処理が簡単になることですが、ノイズでA端子が"0"になると誤判定します。
ゲームにもよりますが、多少判定ミスしても問題と思います。
チャタリング対策は必須で、一定間隔でA、B端子を読み取り、状態が連続したときに"1"、"0"を確定することにします。
画像



A端子の変化で割り込むプログラムにすれば、ロータリーエンコーダの回転を取りこぼすことは無いかと思いますが、ゲームプログラムとしては、廻すたびに割り込まれるのは面倒です。

私のゲームプログラムは下図左のように自キャラ、敵キャラの移動、その移動結果の表示をループ処理しています。
この1ループの処理時間が変わらないようにタイマーで処理時間をチェックし、ウェイト処理で調整します。
ウェイト処理が無いと、例えば敵キャラが10匹⇒5匹に減ったとき、ゲーム速度がかなり上がってしまいます。

このウェイト処理期間でロータリーエンコーダのA、B端子をチェックすることにします。
当然、ウェイト処理期間外での操作は取りこぼしてしまいますし、
敵キャラが大量に増える等でウェイト処理期間が短くなると取りこぼしの割合が増えます。
ゲームによっては、この方式は使えないことでしょう。
画像


上記方式でプログラムしてみました。
ロータリーエンコーダ時計回りで液晶表示のカウンタ値が増え、赤LEDが点灯。
画像

反時計回りで値が減り、緑LEDが点灯。
画像

また、軸スイッチを押し込むと赤、緑の両LEDが点灯しオレンジに光ります。
画像


今回のテストプログラムでは、自キャラや敵キャラの移動がなく、処理が軽いため回転の取りこぼしはありませんでした。
また、回転していないのにカウンタが変化することや、クリック数以上の増減がないことから、ノイズによる誤判定はないようです。
処理の軽いゲームなら、この方式で充分のようですね。

最後にプロジェクトファイル一式を公開します。

 EGP01_RETest.zip

 プログラムファイル一覧

  EGP01.c      : メインプログラム
  EGP01_Asm.s   : アセンブラ記述のサブルーチン集
  EGP01_Asm.h   : アセンブラ記述の外部変数/関数の定義
  ChrData.inc    : 個別キャラクタ グラフィックデータ(数字フォント大)
  ChrDataCmn.inc : 共通キャラクタ グラフィックデータ(文字フォント等)
  SndData.inc    : 個別サウンドデータ  


次回はロータリーエンコーダを使ったゲームを作ります。
以上です。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 5
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
EGP01でロータリーエンコーダを使う1 エレ玩 Konyaの開発記録/BIGLOBEウェブリブログ
文字サイズ:       閉じる