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