実現したいこと
ロータリーエンコーダから来る値を読み取ってシリアル通信で表示する。
下記プログラムを実行するとロータリーエンコーダを触っていないにも関わらずA,Bの値が変化してしまいます。
ロータリーエンコーダを動かした時だけ、A,Bの値が変化するようにするにはどうしたらよいでしょうか?
ソースコード1
Arduino
1int EnPinA = 3; 2int EnPinB = 4; 3int ledPin12 = 12; 4int ledPin13 = 13; 5 6void setup() 7{ 8 pinMode(EnPinA, INPUT); 9 pinMode(EnPinB, INPUT); 10 pinMode(ledPin12, OUTPUT); 11 pinMode(ledPin13, OUTPUT); 12 Serial.begin(9600); 13} 14 15void loop() 16{ 17 int A = 0; 18 int B = 0; 19 20 A = digitalRead(EnPinA); 21 B = digitalRead(EnPinB); 22 23 Serial.print("A : "); 24 Serial.print(A); 25 Serial.print(" / "); 26 Serial.print("B : "); 27 Serial.println(B); 28 29 digitalWrite(ledPin12, A); 30 digitalWrite(ledPin13, B); 31 delay(100); 32}
回路
ロータリーエンコーダはD3,D4,GNDと繋がっている。
LEDは2つあり、1つ目はD12とGND、2つ目はD13とGNDと繋がっている(間に抵抗器あり)。
.【ロータリーエンコーダ】
. A B G
. │ │ │
. D3 D4 GND
.【 Arduino 】
. D12 GND D13 GND
. │ │ │ │
. 抵抗 │ 抵抗 │
. │ │ │ │
. 【LED 1】【LED 2】
追記1
申し訳ありません。実機が手元になくて動作確認できていません。
シリアル通信の速度は9600で大丈夫なのでしょうか?
追記2
ソースコードを改良致しました。
0,1の値が操作なしに変化することはなくなりました。
ありがとうございました。
ソースコード2
Arduino
1int EnPinA = 3; 2int EnPinB = 4; 3int pos = 0; 4void Position(int, int); 5 6void setup() 7{ 8 pinMode(EnPinA, INPUT_PULLUP); 9 pinMode(EnPinB, INPUT_PULLUP); 10 Serial.begin(57600); 11 Serial.print("pos : "); 12 Serial.println(pos); 13} 14 15void loop() 16{ 17 int A = 0; 18 int B = 0; 19 A = digitalRead(EnPinA); 20 B = digitalRead(EnPinB); 21 Position(A, B); 22} 23 24void Position(int A, int B) 25{ 26 static int bA = 1; 27 static int bB = 1; 28 static int bpos = 0; 29 30 if((bA == A) && (bB == B)) 31 { 32 // 何もしない 33 } 34 else 35 { 36 // bAbB == 00 or 11 37 if(bA == bB) 38 { 39 if((bA != A) && (bB == B)) 40 { 41 pos++; // 右 42 } 43 else if((bA == A) && (bB != B)) 44 { 45 pos--; // 左 46 } 47 } 48 // bAbB == 01 or 10 49 else 50 { 51 if((bA != A) && (bB == B)) 52 { 53 pos--; // 左 54 } 55 else if((bA == A) && (bB != B)) 56 { 57 pos++; // 右 58 } 59 } 60 61 if(bpos != pos) 62 { 63 Serial.print("pos : "); 64 Serial.print(pos); 65 if(bpos < pos) 66 { 67 Serial.println(" →"); 68 } 69 else 70 { 71 Serial.println(" ←"); 72 } 73 bpos = pos; 74 } 75 bA = A; 76 bB = B; 77 } 78}
エンコーダー信号のH/L切り替えの時間はどの程度でしょうか。エンコーダーの仕様がわかれば、シリアル通信の速度が十分かどうかが判断できます。1回転あたりのpulse数と1秒あたりの回転数から、1pulseの時間が算出できます。
恐らくこのロータリーエンコーダだと思います。(8F2ではなく、2H2と書かれている) http://akizukidenshi.com/catalog/g/gP-00292/

回答4件
あなたの回答
tips
プレビュー