با کمک این انکودر میتوانید جهت چرخش و تعداد پالسهای چرخش را که در هر دور 20 عدد می باشد به دست بیاورید.
کلید روی انکودر در حالت آزاد 5 ولت ودر حالت فشرده شده صفر می شود.
از انکودرها استفاده های زیادی می شود مانند کنتول منو ها در نمایشگرهای غیر لمسی و یا با اتصال آن به موتورها برای شمارش تعداد چرخش و دور موتور
پینهای CLK و DT برای تشخیص تشخیص جهت چرخش و تعداد پالسهای چرخش که امکان محاسبه سرعت چرخش را میدهد
برای شمارش تعداد پالسها از پین CLK استفاده می کنیم
پرای تشخیص جهت حرکت از DT استفاده می کنیم. سیگنالهای این پین مانند CLK می باشد ولی با 90 درجه اختلاف فاز.
برای درک بهتر مانند شکل زیر انکودر را به دو دیود نورانی متصل کنید و انکودر را حرکت دهید.
میتوان مشاهده کرد که ال ای دی ها در هر جهت چرخش یکی از دیود ها اول روشن می شود و در جهت عکس دیود دیگر ابتدا روشن می شود.
به این ترتیب میتوان جهت چرخش را مشخص کرد
این ماژول نیاز به هیچ کتابخانه ای ندارد و به راحتی میتوان با آن کار کرد
مانند شکل زیر اتصالات را انجام داده و برنامه نمونه را بارگزاری کنید
نتیجه را بر روی پنجره سریال مشاهده کنید
// Rotary Encoder Inputs
#define CLK 2
#define DT 3
#define SW 4
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;
void setup() {
// Set encoder pins as inputs
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT_PULLUP);
// Setup Serial Monitor
Serial.begin(9600);
// Read the initial state of CLK
lastStateCLK = digitalRead(CLK);
}
void loop() {
// Read the current state of CLK
currentStateCLK = digitalRead(CLK);
// If last and current state of CLK are different, then pulse occurred
// React to only 1 state change to avoid double count
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
// If the DT state is different than the CLK state then
// the encoder is rotating CCW so decrement
if (digitalRead(DT) != currentStateCLK) {
counter --;
currentDir ="CCW";
} else {
// Encoder is rotating CW so increment
counter ++;
currentDir ="CW";
}
Serial.print("Direction: ");
Serial.print(currentDir);
Serial.print(" | Counter: ");
Serial.println(counter);
}
// Remember last CLK state
lastStateCLK = currentStateCLK;
// Read the button state
int btnState = digitalRead(SW);
//If we detect LOW signal, button is pressed
if (btnState == LOW) {
//if 50ms have passed since last LOW pulse, it means that the
//button has been pressed, released and pressed again
if (millis() - lastButtonPress > 50) {
Serial.println("Button pressed!");
}
// Remember last button press event
lastButtonPress = millis();
}
// Put in a slight delay to help debounce the reading
delay(1);
}