ORANGE-4 でロータリーエンコーダを読み取ってみた。
今回は、ロータリーエンコーダとして Pmod ENC モジュールを用いた。
ロータリーエンコーダ
(今回扱う)ロータリーエンコーダは、軸を回転させるとA,Bの2本の信号がタイミングをずらして切り替わり、回転していることと回転の方向がわかるものである。
例えば、オシロスコープ FNIRSI-1013D の CH1 に Pmod ENC モジュールの出力Aを、CH2 に出力Bを接続し、軸を上から見て時計回りに回転させると、例えば以下の波形が得られた。
また、軸を上から見て反時計回りに回転させると、例えば以下の波形が得られた。
Pmod ENC では、A,Bが両方HIGHの状態で安定し、軸を次の安定する場所まで回すとA,Bがそれぞれ2回ずつ (合計4回) 変化して再び両方HIGHになる。
実装
ロータリーエンコーダの操作により2進LEDの点灯位置が変化するプログラムを作成することにした。
今回は、信号の変化のうち、「BがLOWのときのAの立ち上がりまたは立ち下がり」に注目して検出を行う。
BがHIGHのときは待機し、BがLOWのときにAが変化したらそれに応じて点灯位置を切り替える。
すなわち、以下のような状態遷移となる。
以下が作成したプログラムである。
MikeAssembler でアセンブルできる。
また、先頭の target orange4
を削除すれば ORANGE-4 IDE でもアセンブルできる。
ちなみに、MikeAssembler では最初に org
を使わない場合アドレスは0から始まるが、ORANGE-4 IDE (Ver 1.02) では後に書いた org
のアドレスから最初に書いたプログラムが配置されるようであった。
target orange4
; PORT1 : A
; PORT2 : B
org 0x00
; LEDの表示を初期化する
ldyi 0
scall 1
abyz
; PORT1とPORT2をデジタル入力に設定する
ldi 2
ldyi 1
ioctrl
ldyi 2
ioctrl
; B がLOWでない間、待機する
ldyi 2
b_high:
in
cpi 0
jmpf b_high
; B が LOWになった
ldyi 1
in
cpi 0
jmpf a_high
; A の LOW→HIGH の変化を待つ
a_low:
; B をチェックし、HIGHであれば終了
ldyi 2
in
cpi 0
jmpf b_high
; A をチェックし、HIGHになっていなければ待機継続
ldyi 1
in
cpi 1
jmpf a_low
; LEDの位置を1個左へ
abyz
scall 2
addyi 1
cpyi 7
jmpf led_inc_no_wrap
ldyi 0
led_inc_no_wrap:
scall 1
abyz
jmpf a_high
org 0x80
; A の HIGH→LOW の変化を待つ
a_high:
; B をチェックし、HIGHであれば終了
ldyi 2
in
cpi 0
jmpf b_high
; A をチェックし、LOWになっていなければ待機継続
ldyi 1
in
cpi 0
jmpf a_high
; LEDの位置を1個右へ
abyz
scall 2
addyi 0xf
jmpf led_dec_no_wrap
ldyi 6
led_dec_no_wrap:
scall 1
abyz
jmpf a_low
以下が、このプログラムの ORANGE-4 のモニタ用の表現である。
E00:A0E1282A1F70A2F7
E10:0A2F72C0F13A1F72
E20:C0F80A2F72C0F13A
E30:1F72C1F252E2B1D7
E40:F45A0E12F80
E80:A2F72C0F13A1F72C
E90:0F802E2BFF9EA6E1
EA0:2F25
Pmod ENC と ORANGE-4 を以下のように接続して実行する。
Pmod ENC | ORANGE-4 |
---|---|
A | PORT1 (ピン番号6) |
B | PORT2 (ピン番号7) |
BTN | - |
SWT | - |
GND | GND (ピン番号4) |
VCC | 3.3V (ピン番号1) |
ORANGE-4 の入出力ポートは、デフォルトでは出力モードになっているようである。
Pmod ENC では抵抗が入っているので最初から接続してよいが、その他のモジュールなどを用いる場合はプログラムを実行して入力モードに切り替えてから接続したほうがよい可能性がある。
ORANGE-4では、5Vトレラントの入出力ポートはPORT2のみのようであるため、VCCを5Vに接続してはいけない。
実行結果
ロータリーエンコーダの操作に合わせて2進LEDの点灯位置が変化している。