1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

IchigoJamAdvent Calendar 2022

Day 6

ロータリーエンコーダで操作するかわくだりゲーム

Posted at

かわくだりゲーム は、IchigoJam の代表的なサンプルプログラムである。[要出典]
今回は、このかわくだりゲームを矢印キーのかわりにロータリーエンコーダで操作できるようにする。
今回は、ロータリーエンコーダとして Pmod ENC モジュールを使用する。

ロータリーエンコーダ

(今回扱う種類の)ロータリーエンコーダはA,Bの2個の出力信号を持ち、軸を回転させると以下のようにずれたタイミングで信号のオン/オフが切り替わる。

ロータリーエンコーダの出力信号

この切り替わりの様子から、軸が回転していることと回転の方向を読み取ることができる。
今回用いる Pmod ENC モジュールでは、カチッとなる1段階回すと信号が4回 (A, Bそれぞれ2回ずつ) 切り替わる。
さらに、ロータリーエンコーダの軸を押し込むことで回転とは別の信号を入力することができる。

予備実験1:ロータリーエンコーダの状態の取得

IchigoJam に Pmod ENC モジュールを以下のように接続する。

Pmod ENC IchigoJam
A IN1
B IN2
BTN -
SWT -
GND GND
VCC VCC

以下のプログラムにより、状態が変化したときその状態を出力する。

10 P=-1
20 S=IN(1)*2+IN(2)
30 IF S<>P ?S;:P=S
40 GOTO 20

ロータリーエンコーダの軸を上から見て時計回りに回すと 2013 が、反時計回りに回すと 1023 が出力された。
時々 2013232013 のように意図しない戻りが発生するようだった。

予備実験1 実行結果

予備実験2:ロータリーエンコーダの状態の変化の解釈

予備実験1の結果をもとに、変化前と変化後の S の値と回す方向の関係を以下に示す。
なお、上から見て時計回りを「→」、反時計回りを「←」と表記している。

変化前\変化後 0 1 2 3
0
1
2
3

この表をもとに、変化前と変化後の S の値と回す方向の関係を配列に格納し、変換に用いる。
上から見て時計回りを 1、反時計回りを -1 で表す。

10 LET[0],0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0
20 P=3
30 CLT:C=0
40 S=IN(1)*2+IN(2):C=C+[P*4+S]:P=S:IF TICK()<3 GOTO 40
50 IF C<-1 ?CHR$(#E0);
60 IF 1<C ?CHR$(#E1);
70 GOTO 30

このプログラムにより、回した方向が左右の矢印で表示される。

予備実験2 実行結果

かわくだりゲームに組み込む

予備実験の結果をもとに、かわくだりゲームの入力をロータリーエンコーダに置き換えた。
さらに、ロータリーエンコーダを持っているのに毎回RUNを打ち込むのは面倒だったので、ロータリーエンコーダを押し込むとゲームを再スタートできるようにした。
このため、Pmod ENC モジュールの BTN 端子を IchigoJam の IN4 端子に追加で接続し、以下の接続とする。

Pmod ENC IchigoJam
A IN1
B IN2
BTN IN4
SWT -
GND GND
VCC VCC

以下が今回実装したプログラムである。

10 ' ロータリーエンコーダ デ カワクダリ
20 ' Pmod ENC ヲ イカノヨウニ セツゾク
30 ' A-IN1 B-IN2 BTN-IN4
40 LET[0],0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0
50 P=3:T=1:' T = カイテン シキイチ
60 CLS:X=15
70 LC X,5:?"O"
80 LC RND(32),23:?"*"
90 CLT:C=0
100 S=IN(1)*2+IN(2):C=C+[P*4+S]:P=S:IF TICK()<3 GOTO 100
110 X=X-(C<-T)+(C>T)
120 IF SCR(X,5)=0 GOTO 70
130 IF IN(4) END
140 ?"OUCH!"
150 IF !IN(4) GOTO 150
160 IF IN(4) GOTO 160 ELSE GOTO 60

ゲームオーバー時、IN(4)1 の場合は、ボタン入力が接続されていないとみなし、そのままゲームを終了する。
そうでない場合は、「OUCH!」を出力し、ボタンが押されたらゲームを再スタートする。

かわくだりゲーム 実行結果

なお、改造元の かわくだりゲーム は、以下のライセンスとなっている。

CC BY IchigoJamプリント http://ichigojam.net/print/ IchigoJam®jig.jp

おわりに

IchigoJamはjig.jpの登録商標です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?