ESP8266でロータリエンコーダ「KY-040」からデータを入力します。
ESP8266とロータリエンコーダの接続
ロータリーエンコーダは回転を調べる装置です。次のような形状をしています。
デジタルピンDT、CLKを調べ、前回のDTの値と今回のDTの値が異なると回転したことが分かります。そして、CLKとDTを比較して異なると時計回り、一致すると反時計回りしたと判断します。
ESP8266とロータリエンコーダの接続を次に示します。
| ESP8266 | KY-040 |
|---|---|
| IO2 | CLK |
| IO0 | DT |
| IO16 | SW |
ESP8266とロータリエンコーダの接続画像を次に示します。
ロータリエンコーダ入力ソフトの作成
次のようにロータリエンコーダ入力ソフトを作成します。
rotary.ino
int pinA = 2; // KY-040のCLKにつなぐ
int pinB = 0; // KY-040のDTにつなぐ
int pinSW = 16; // KY-040のSWにつなぐ
int encoderPosCount = 0; //カウント数
int pinALast; //前回の最後のピンAの値(初期値)
int aVal;
boolean bCW;//時計回り(1)か、そうでないか(0)
void setup() {
pinMode (pinA,INPUT);
pinMode (pinB,INPUT);
pinMode (pinSW,INPUT);
pinALast = digitalRead(pinA); //ピンAの状態は前回の最後の位置を表す(初期値)
Serial.begin (9600);
}
void loop() {
aVal = digitalRead(pinA);//ピンAの状態を読み込む
if (aVal != pinALast){ // 読み込んだピンAの値が初期値と違う場合は回転している
// 回転方向を決めるためにピンBの状態を調べる
if (digitalRead(pinB) != aVal) {
// ピンBの値がピンAと異なる場合はピンAが先に値が変わったことになり、時計回りと判断される
encoderPosCount ++; //時計回りの場合はカウントを増やす
bCW = true; //時計回り
} else {// そうでなければ反時計回りと判断される
bCW = false; //反時計回り
encoderPosCount--; //反時計回りではカウントは減らす
}
Serial.print ("Rotated: ");
if (bCW){
Serial.println ("clockwise");
}else{
Serial.println("counterclockwise");
}
Serial.print("Encoder Position: ");
Serial.println(encoderPosCount);
}
pinALast = aVal;
Serial.print("SW: ");
Serial.println(digitalRead(pinSW));
delay(1000);
}
ロータリエンコーダ入力ソフトの実行
スイッチを押すと「SW: 0」と表示されます。ロータリエンコーダのノブを時計回り/反時計回りするとエンコードの位置が増減されます。
?HpI<・l$・b8薔SW: 1 SW: 1 SW: 1 SW: 1 SW: 0 SW: 1 SW: 1 Rotated: counterclockwise Encoder Position: -1 SW: 1 SW: 1 SW: 1 SW: 1 Rotated: counterclockwise Encoder Position: -2 SW: 1 Rotated: clockwise Encoder Position: -1 SW: 1 Rotated: counterclockwise Encoder Position: -2 SW: 1 SW: 1 Rotated: clockwise Encoder Position: -1 SW: 1 SW: 1 SW: 1 SW: 1 Rotated: counterclockwise Encoder Position: -2 SW: 1 Rotated: counterclockwise Encoder Position: -3 SW: 1 SW: 1 SW: 1 Rotated: clockwise Encoder Position: -2


