Interface 360 Degree Rotary Encoder Switch with Arduino NANO

บทความนี้เป็นการทดลองใช้งานสวิตช์เข้ารหัสโรตารี่ (Rotary Encoder Switch) ซึ่งเดิมของเก่าจากบอร์ดควบคุมการทำงานเครื่องใช้ไฟฟ้าที่เสียแล้ว เลยนำอะไหล่บางส่วนที่ยังสามารถใช้งานได้มาศึกษาและเรียนรู้การทำงานภายในสวิตช์และการเชื่อมต่อสวิตช์กับบอร์ดควบคุม Arduino NANO ทั้งนี้สำหรับเป็นความรู้ในการนำสวิตช์ลักษณะนี้ไปใช้งานต่างๆ ต่อไป


รูปที่ 1 และรูปที่ 2 เป็นการเตรียมบอร์ดควบคุม Arduino NANO และสวิตช์เข้ารหัสโรตารี่ โดยในส่วนของสวิตช์เข้ารหัสโรตารี่ จะต้องเปลี่ยนหัวคอนเน็กเตอร์ใหม่ให้เป็นขา PIN Header เพื่อให้ต่อวงจรเข้ากับแผ่นเบรดบอร์ดได้สะดวก

รูปที่ 3 เป็นดาต้าชีตของสวิตช์เข้ารหัสโรตารี่รุ่น EC11E เพื่อดูโครงสร้างภายในสวิตช์, ตำแหน่งสัญญาณที่ได้จากสวิตช์ (Terminal A และ Terminal B), ลักษณะของสัญญาณที่เกิดขึ้น, สวิตช์กดติดปล่อยดับ, และตำแหน่งขาและขนาดต่างๆ ของตัวสวิตช์ ซึ่งโดยทั่วไปสวิตช์จะมัลักษณะภายในคล้ายกัน
Datasheet for Rotary Encoder EC11E09244BS [Ref.5]


ในรูปที่ 4 และรูปที่ 5 แสดงการต่อสวิตช์เข้ารหัสโรตารี่เข้ากับบอร์ดควบคุม Arduino NANO ซึ่งในการทดลองนี้จะใช้อุปกรณ์ไม่มานัก จึงใช้สายจั้มบนแผ่นเบรดบอร์ดในการเชื่อมต่อวงจรเข้าด้วยกันทั้งหมด
/* * Credit Arduino code by : Dejan Nedelkovski, www.HowToMechatronics.com * Dev by : www.electronicsdna.com */ #define outputA 6 #define outputB 7 const byte interruptPin = 2; int counter = 0; int aState; int aLastState; void setup() { pinMode (outputA,INPUT); pinMode (outputB,INPUT); Serial.begin (9600); aLastState = digitalRead(outputA); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { aState = digitalRead(outputA); if (aState != aLastState){ if (digitalRead(outputB) != aState) { counter ++; } else { counter --; } Serial.print(" Direction "); Serial.println(counter); } aLastState = aState; } void blink() { Serial.println(" SW Active "); delay(100); }
การทำงานของโปรแกรมอธิบายพอสังเขปดังนี้คือ โปรแกรมใช้การอ่านค่าลอจิกที่ขา D6 และ D7 ด้วยคำสั่ง if (aState != aLastState) และคำสั่ง if (digitalRead(outputB) != aState) เพื่อตรวจสอบทิศทางหมุนของสวิตช์ว่าเป็นลักษณะของทวนเข็มนาฬิกาหรือตามเข็มนาฬิกาและกำหนดการนำค่าตัวแปร counter ++ และ counter — ตามทิศทางการหมุน จากนั้นในส่วนการกดสวิตช์ติดดับจะใช้การอินเตอร์รัพท์ attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); ที่ขา D2 โดยเมื่อกดสวิตตัวนี้โปรแกรมก็จะแสดงข้อความ SW Active นั้นเอง (โปรแกรมนี้พัฒนาโดย Dejan Nedelkovski, www.HowToMechatronics.com [Ref.1])

ในรูปที่ 6 เป็นผลการทดลองที่ได้จากตัวอย่างโปรแกรมข้างบน ซึ่งจะสังเกตเห็นว่าในกรอบข้อความสีแดงจะเป็นการหมุนสวิตช์เข้ารหัสโรตารี่ไปตามเข็มนาฬิกาโดยผลที่ได้จะเป็นจำนวนนับขึ้น 123…5 จากนั้นทดลองกดสวิตช์ 1 ครั้งจะแสดงข้อความ SW Active ขึ้น 2 ข้อความ (กรอบข้อความสีเขียว) ที่เกิดจากคำสั่งอินเตอร์รัพท์ ต่อมาเป็นการหมุนสวิตช์เข้ารหัสโรตารี่ไปทวนเข็มนาฬิกาผลที่ได้จะเป็นจำนวนนับลง 432…1 ตามลำดับ จากนั้นทดลองกดสวิตช์ 1 ครั้งจะแสดงข้อความ SW Active ขึ้น 2 ข้อความ (กรอบข้อความสีเขียว) เช่นเดิม


สำหรับบทความนี้เป็นการใช้งานสวิตช์เข้ารหัสโรตารี่ ซึ่งอุปกรณ์อิเล็กทรอนิกส์อีกแบบหนึ่งที่นิยมนำมาใช้งานกับเครื่องใช้ไฟฟ้าหลายอย่าง และคิดว่าบทความนี้คงช่วยให้ผู้อ่านได้รู้และเข้าใจการทำงานของสวิตช์ในลักษณะนี้เพิ่มขึ้น รวมทั้งสามารถนำไปเป็นไอเดียหรือนำไปพัฒนาโครงงานใหม่ๆ ตามที่ต้องการ
Reference
- https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/
- https://en.wikipedia.org/wiki/Rotary_encoder
- https://electronics.stackexchange.com/questions/280909/help-to-understand-incremental-rotary-encoders
- https://www.sunrom.com/p/rotary-encoder-ec11-shaft-20mm
- https://html.alldatasheet.com/html-pdf/794915/ALPS/EC11E09244BS/743/7/EC11E09244BS.html