- 締切済み
ロータリーエンコーダがうまく動かない.
よろしくお願いします. 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 このサイトのやり方も参考に,同じように回路を組んで動作させてみたのですが, やはりインクリメントされません. 解決策ありましたら教えていただきたいです. よろしくお願いいたします.
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- koi1234
- ベストアンサー率53% (1866/3459)
両方とも使ったことはありませんので間違ってるかもしれません 間違ってたらごめんなさい }else{ // ロータリーエンコーダー回転停止 とそれに対する閉じかっこ } 不要だと思うんですが 時々インクリメントされることがあるってのがよくわからない rotRotEnc 関数内で A相 と B相の信号チェックして回転方向と パルス数カウントしてると思いますが 記載コードでは片方向(反転状態)でしかカウントしないように読めます その為にデクリメントでしかカウントしないってことだと思うんですが (インクリメント動くことがあるってのが逆にわからなかったり) 試に以下のコードで動きませんか? 見やすくするため大文字ネスとしているのでそのままコピーしてもエラーになります if(!digitalRead(dRotAPin)){ // 回転方向チェック if(digitalRead(dRotBPin)){ //右回転 m_nOldRot = 'R'; } else { //左回転 m_nOldRot = 'L'; } } else { // 回転方向異常(クリア) m_nOldRot = 0; } if(digitalRead(dRotBPin)){ if(m_nOldRot == 'L'){ // 左回転の時の処理 m_nValue--; } }else{ if(m_nOldRot == 'R'){ //右回転の時の処理 m_nValue++; } }
- theisman
- ベストアンサー率47% (56/119)
とりあえず、目についたのが、 volatile int m_nValue = 0; と宣言しておいて、 loop()関数の中で、 if(m_nValue == -0.5){ と、やっている(m_nValueってintでしょ?)から、比較がおかしくなっているん じゃないかな?と、思います。ただ、これデクリメント側ですしねぇ。 おかしいのがR_countがデクリメントされないことなら、ここだろうと思うんですが。