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/