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.

GMC-4 / ORANGE-4Advent Calendar 2022

Day 6

ORANGE-4 でロータリーエンコーダを読み取る

Posted at

ORANGE-4 でロータリーエンコーダを読み取ってみた。
今回は、ロータリーエンコーダとして Pmod ENC モジュールを用いた。

ロータリーエンコーダ

(今回扱う)ロータリーエンコーダは、軸を回転させるとA,Bの2本の信号がタイミングをずらして切り替わり、回転していることと回転の方向がわかるものである。
例えば、オシロスコープ FNIRSI-1013D の CH1 に Pmod ENC モジュールの出力Aを、CH2 に出力Bを接続し、軸を上から見て時計回りに回転させると、例えば以下の波形が得られた。
Pmod ENC の出力例(時計回り)
また、軸を上から見て反時計回りに回転させると、例えば以下の波形が得られた。
Pmod ENC の出力例 (反時計回り)

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の点灯位置が変化している。

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?