Basics of Interface Rotary Encoder with Arduino UNO

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 1 ลักษณะของโรตารีเอ็นโค้ดเดอร์

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 2 เนมเพลต (Name plate) แสดงข้อมูลด้านซ้าย
Interface A Rotary Encoder Using Arduino UNO
รูปที่ 3 เนมเพลต (Name plate) แสดงข้อมูลด้านขวา

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 4 การต่อวงจรกับบอร์ด Arduino UNO สำหรับทดลอง (1)
Interface A Rotary Encoder Using Arduino UNO
รูปที่ 5 การต่อวงจรกับบอร์ด Arduino UNO สำหรับทดลอง (2)

รูปที่ 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) ให้ทราบ และผู้อ่านสามารถนำโปรแกรมไปพัฒนาในการควบคุมแบบต่างๆ เพิ่มเติมได้ครับ

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 6 ลักษณะการวัดสัญญาณด้วยดิจิตองออสซิลโลสโคป

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 7 สัญญาณที่เกิดขึ้นเมื่อหมุนตามเข็มนาฬิกา

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 8 หน้าต่าง Serial monitor แสดงข้อมูลที่ได้เมื่อหมุนตามเข็มนาฬิกา

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 9 สัญญาณที่เกิดขึ้นเมื่อหมุนทวนเข็มนาฬิกา

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 10 หน้าต่าง Serial monitor แสดงข้อมูลที่ได้เมื่อหมุนทวนเข็มนาฬิกา

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 11 แสดงลักษณะของการทดลอง

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

Interface A Rotary Encoder Using Arduino UNO
รูปที่ 12 ลักษณะการต่อวงจรสำหรับการทดลอง

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

Reference

  1. www.omron-pro.ru/doc/sensor/encoder/e6b2.PDF
  2. https://www.ia.omron.com/support/guide/34/introduction.html
  3. www.mouser.com/ds/2/307/e6b2-c_ds_csm491-25665.pdf
  4. https://en.wikipedia.org/wiki/Rotary_encoder
  5. https://dronebotworkshop.com/rotary-encoders-arduino/
  6. https://electropeak.com/learn/how-to-interface-a-rotary-encoder-with-arduino/