JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

Arduino ロータリーエンコーダ その2

2020-12-23 07:41:53 | Arduino
 Arduinoの外部割込みを利用する方法です。この方法は、Si4735 DSP ラジオのスケッチにも使われています。

 Arduinoの外部割込みは、外部割込み0(ピン2)と外部割込み1(ピン3)です。
attachInterrupt()関数は、外部割込みがあった時に呼び出す関数を指定します。
使い方は、attachInterrupt(interrupt,function,mode);で、
interruptは、0または1です。
functionは、割込みがあった時に呼び出す関数です。
modeは、LOW,CHANGE,RISING,FALLINGのいずれかを指定します。

ロータリーエンコーダをピン2,3に接続し、回転方向をRight,Leftでシリアルモニタに表示させるスケッチです。
digitalPinToInterrupt()は、デジタルピンを割込み番号に変換する関数です。
ENC_A = 2,ENC_B = 3ですので、digitalPinToInterrupt(ENC_A)は0で、digitalPinToInterrupt(ENC_B)は1となります。interruptは、0,1と直接指定してもかまいません。
----------------------------------------------------------------------------
#include <Rotary.h>

#define ENC_A 2
#define ENC_B 3

Rotary r = Rotary(ENC_A,ENC_B);

void setup() {
r.begin();
attachInterrupt(digitalPinToInterrupt(ENC_A),rotary_encoder,CHANGE);
attachInterrupt(digitalPinToInterrupt(ENC_B),rotary_encoder,CHANGE);
// pinMode(ENC_A,INPUT_PULLUP);
// pinMode(ENC_B,INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Rotary Encoder test");
}

void loop() {
}

void rotary_encoder(){
unsigned char result = r.process();
if(result){
if(result == DIR_CW){
Serial.println("Right");
}else{
Serial.println("Left");
}
}
}
----------------------------------------------------------------------------

 setup()において、r.begin();で初期化すれば、2,3ピンをプルアップしてくれるので、コメントアウトした
pinMode(ENC_A,INPUT_PULLUP);
pinMode(ENC_B,INPUT_PULLUP);
は、なくとも動作します。
逆に、r.begin();を省略した場合は、上記のプルアップ設定が必要になります。

 以上、「ロータリーエンコーダその1」と「ロータリーエンコーダその2」で紹介した方法のいずれも非常に良く動作します。

 割込みを使わないで、簡単にロータリーエンコーダを利用したい場合は、polling.inoを利用します。どのピンでも動作します。

 ピン変化割込みを使う場合は、interrupt.inoを利用します。ただし、他のピンを使用する場合は、割込み設定を変更する必要があります。

 外部割込みを使う場合は、今回紹介したスケッチを利用します。ただし、使うピンは、2と3で変更できません。

 ということで、目的ケースに応じて、それぞれのスケッチを利用することにします。