ロータリーエンコーダがうまく動かない.
よろしくお願いします.
arduino UNOと秋月で購入したロータリーエンコーダ(RE-160F-40E3-(L)A-24P)を用いて,
シリアルモニタ上で数値のインクリメント・デクリメントを見ようとしています.
初心者のため,
http://www.ct-robo.sakura.ne.jp/371
を参考にまずはやっています.
配線は同じ,ソースはほんの少しだけいじっていますが,
デクリメントされるのに,インクリメントされません.
ソースはこんなかんじです.
// ロータリーエンコーダーの配線に合わせる
int dRotAPin = 2;
int dRotBPin = 4;
int R_count = 0;
//時刻表示
int minute = 0;
int second = 0;
int msecond = 0;
// ロータリーエンコーダーの状態を記憶する
// 割り込み中に変化する変数はvolatileはをつけて宣言する
volatile int m_nOldRot = 0;
volatile int m_nValue = 0;
void setup()
{
// ピンの設定
// INPUTモードにします。
pinMode(dRotAPin, INPUT);
pinMode(dRotBPin, INPUT);
// プルアップを有効にします
digitalWrite(dRotAPin, HIGH);
digitalWrite(dRotBPin, HIGH);
// 外部割り込みを設定します
// D2ピンが 変化 した時にrotRotEnd()を呼び出します
attachInterrupt(0, rotRotEnc, CHANGE);
//シリアル通信速度
Serial.begin(9600);
}
void loop()
{
//シリアルモニター角度表示
if(m_nValue == 1){
R_count++;
m_nValue = 0;
//if(R_count == 12){
// R_count = -11;
//}
}
if(m_nValue == -0.5){
R_count--;
m_nValue = 0;
//if(R_count == -12){
// R_count = 11;
//}
}
//Serial.println(R_count);
//delay(10);
Serial.print("m_nValue:");
Serial.print(m_nValue);
Serial.print("---m_nOldRot:");
Serial.println(m_nOldRot);
//delay(500);
}
// 外部割り込みから呼び出される変数
void rotRotEnc(void){
if(!digitalRead(dRotAPin)){ // ロータリーエンコーダー回転開始
if(digitalRead(dRotBPin)){
//右回転
m_nOldRot = 'R';
}else{
//左回転
m_nOldRot = 'L';
}
}else{ // ロータリーエンコーダー回転停止
if(digitalRead(dRotBPin)){
if(m_nOldRot == 'L'){
// 左回転の時の処理
m_nValue--;
}
}else{
if(m_nOldRot == 'R'){
//右回転の時の処理
m_nValue++;
}
}
// ここでロータリーエンコーダーの状態をクリア
m_nOldRot = 0;
}
}
完全にインクリメントされないわけではなく,
何回か回している時に何度かだけはインクリメントされるときがあります.
http://just-k.mydns.jp/blog/?p=6619
このサイトのやり方も参考に,同じように回路を組んで動作させてみたのですが,
やはりインクリメントされません.
解決策ありましたら教えていただきたいです.
よろしくお願いいたします.
お礼
お忙しいところ有難うございました。 どうもメーカーのホームページも読みにくく、解決までは行きませんでした。 もう少しこちらで、調べてみます。 有難うございました。