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