かわくだりゲーム は、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
のように意図しない戻りが発生するようだった。
予備実験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
このプログラムにより、回した方向が左右の矢印で表示される。
かわくだりゲームに組み込む
予備実験の結果をもとに、かわくだりゲームの入力をロータリーエンコーダに置き換えた。
さらに、ロータリーエンコーダを持っているのに毎回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の登録商標です。