Basics of Interface Rotary Encoder with Arduino UNO

การทดลองนี้เป็นการนำโรตารีเอ็นโค้ดเดอร์ (Rotary Encoder) ของ OMRON รุ่น E6B2-CWZ6C มาเชื่อมต่อเข้ากับ Arduino UNO เพื่อตรวจจับความเร็วและทิศทางการหมุนที่เกิดขึ้น โดยจะใช้ตัวอย่างโปรแกรมรับค่าสัญญาณที่เกิดขึ้นจากโรตารีเอ็นโค้ดเดอร์ และส่งค่ามายังคอมพิวเตอร์ เพื่อบอกทิศทางการหมุนด้วยตัวอักษร CW หรือ CCW และแสดงค่าความเร็วที่หมุนสัมพันธ์กับความถี่ที่เกิดขึ้น เพื่อให้ผู้อ่านสามารถประยุกต์ใช้งานโรตารีเอ็นโค้ดเดอร์ กับการควบคุมความเร็วและทิศทางการหมุนให้กับมอเตอร์ต่างๆ เช่น ด้วยตัวควบคุม PID Control หรือ Fuzzy Logic Control ได้ง่ายขึ้น

รูปที่ 1 แสดงลักษณะของโรตารีเอ็นโค้ดเดอร์ที่ใช้ในการทดลอง ซึ่งจะมีตัวคัปปลิ้งให้เราต่อกับแกนมอเตอร์ได้ทันทีและสายไฟสำหรับรับไฟเลี้ยงและส่งสัญญาณเอ็นโค้ดเดอร์ออกมาเมื่อเกิดการหมุนขึ้น


รูปที่ 2 และรูปที่ 3 แสดงข้อมูลของตัวโรตารีเอ็นโค้ดเดอร์ทั้งหมด ซึ่งเราสามารถนำมาใช้งานได้ง่าย หรือเราสามารถค้นหาข้อมูลการใช้งานหลักการทำงานและรูปแบบสัญญาณที่เกิดขึ้นเพิ่มเติมได้ที่ (ข้อมูลของ OMRON รุ่น E6B2-CWZ6C)


รูปที่ 4 และรูปที่ 5 เป็นลักษณะของการต่อร่วมกันระหว่างบอร์ดควบคุม Arduino UNO และตัวโรตารีเอ็นโค้ดเดอร์ ซึ่งในการทดลองจะใช้แพรสายจั้มได้ทันทัน ทั้งนี้ในบอร์ด Arduino UNO จะมีไฟเลี้ยง +5V ไว้เรียบร้อยแล้วและที่ขาสัญญาณ A, B และ Z เราจะใช้หรือไม่ใช้ตัวต้านทานพูลอัพก็ได้ (Pullup Resistor) เนื่องจากภายในตัวชิฟประมวลผลสามารถใช้คำสั่งกำหนดการทำงานนี้ได้
/*
Program test for Rotary Encoder OMRON (E6B2-CWZ6C)
MCU : Arduino UNO
Dev by : www.electronicsdna.com
Date : 8-9-2021 (V.0)
*/
int val;
int encoder0PinA = 2;
int encoder0PinB = 3;
int Zsignal = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
int time_H;
int time_L;
float t_period;
float Frequency;
void setup() {
pinMode (encoder0PinA,INPUT_PULLUP);
pinMode (encoder0PinB,INPUT_PULLUP);
pinMode (Zsignal,INPUT_PULLUP);
Serial.begin (9600);
}
void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) { // Signal A and B Direction
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
Serial.print (" CW, "); // Direction CW
} else {
encoder0Pos++;
Serial.print (" CCW, "); // Direction CCW
}
//--------- Frequency Monitor ------------------
time_H = pulseIn(encoder0PinA,HIGH);
time_L = pulseIn(encoder0PinA,LOW);
t_period = time_H+time_L;
t_period = t_period/1000;
Frequency = 1000/t_period;
Serial.print(" F = ");
Serial.print(Frequency);
Serial.println(" Hz ");
delay(5);
}
encoder0PinALast = n;
}
ในส่วนของโปรแกรมทดลองการทำงานข้างบนนี้ เป็นตัวอย่างเบื้องต้นสำหรับใช้ในการทดสอบการทำงาน โดยจะสามารถแสดงข้อมูลความเร็วรอบในลักษณะของควาถี่ (Frequency = 1000/t_period;) ซึ่งจะเป็นสัดส่วนกับความเร็วรอบ อีกส่วนหนี่งจะแสดงทิศทางการหมุนในรูปแบบการหมุนตามหรือทวนเข็มนาฬิกา (CW) และ (CCW) ให้ทราบ และผู้อ่านสามารถนำโปรแกรมไปพัฒนาในการควบคุมแบบต่างๆ เพิ่มเติมได้ครับ

รูปที่ 6 แสดงลักษณะการวัดสัญญาณด้วยดิจิตองออสซิลโลสโคป โดยให้สายโพรบช่องวัดสัญญาณที่ 1 (CH1) วัดสัญญาณที่ขา 2 (D2) และสายโพรบช่องวัดสัญญาณที่ 2 (CH2) วัดสัญญาณที่ขา 3 (D3) เพื่อสังเกตสัญญาณที่เกิดขึ้น

รูปที่ 7 เป็นสัญญาณที่เกิดขึ้นเมื่อหมุนตามเข็มนาฬิกา เราจะสังเกตเห็นว่าสัญญาณที่ CH1 เลื่อนเฟสมาข้างหน้าประมาณ 90 องศา เพื่อให้เป็นที่สังเกตของทิศทางการหมุน

รูปที่ 8 เมื่อเราไปดูที่หน้าต่าง Serial monitor จะแสดงข้อความที่ได้จากการหมุนตามเข็มนาฬิกา (CW) จะสังเกตเห็นในกรอบสีส้มให้ทราบ

รูปที่ 7 เป็นสัญญาณที่เกิดขึ้นเมื่อหมุนทวนเข็มนาฬิกา ซึ่งจะเป็นในทางตรงข้ามกับการหมุนตามเข็มคือ เราจะสังเกตเห็นว่าสัญญาณที่ CH1 เลื่อนเฟสมาข้างหลังประมาณ 90 องศา เช่นกันเพื่อให้เป็นที่สังเกตของทิศทางการหมุน

รูปที่ 10 ผลที่ได้แสดงในหน้าต่าง Serial monitor จะเป็นข้อความที่ได้เมื่อหมุนทวนเข็มนาฬิกา (CCW) จะสังเกตเห็นในกรอบสีส้มให้ทราบ

รูแที่ 11 เป็นลักษณะของการทดลองด้วยเครื่องมือและอุปกรณ์พื้นฐานทั่วไป และคอมพิวเตอร์สำหรับแสดงผลในลักษณะข้อความเพื่อให้เข้าใจผลการทดลองได้ง่ายขึ้น

สำหรับการทดลองนี้เป็นโครงงานเล็กๆ ในการทดลองเชื่อมต่อระหว่างโรตารีเอ็นโค้ดเดอร์ (Rotary Encoder) ของ OMRON รุ่น E6B2-CWZ6C และบอร์ดควบคุม Arduino UNO โดยในการทดลองจะนำเสนอการต่อร่วมกันของอุปกรณ์ การทดลองการทำงานและการแสดผลที่ได้จากการทดลอง ซึ่งพอจะเป็นแนวทางให้ผู้อ่านสามารถนำไปต่อยอดเพื่อใช้งานในรูปแบบต่างๆ ได้นะครับ
Reference
- www.omron-pro.ru/doc/sensor/encoder/e6b2.PDF
- https://www.ia.omron.com/support/guide/34/introduction.html
- www.mouser.com/ds/2/307/e6b2-c_ds_csm491-25665.pdf
- https://en.wikipedia.org/wiki/Rotary_encoder
- https://dronebotworkshop.com/rotary-encoders-arduino/
- https://electropeak.com/learn/how-to-interface-a-rotary-encoder-with-arduino/