Interface 360 Degree Rotary Encoder Switch with Arduino NANO

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

Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 1 เตรียมอุปกรณ์สำหรับการทดลองสวิตช์เข้ารหัสโรตารี่
Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 2 ลักษณะของสวิตช์เข้ารหัสโรตารี่ (Rotary Encoder Switch)

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

รูปที่ 3 แสดงสเปกสวิตช์เข้ารหัสโรตารี่รุ่น EC11E [Picture by Ref.5]

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

Datasheet for Rotary Encoder EC11E09244BS [Ref.5]

Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 4 การต่อสวิตช์เข้ารหัสโรตารี่เข้ากับบอร์ดควบคุม Arduino NANO (1)
Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 5 การต่อสวิตช์เข้ารหัสโรตารี่เข้ากับบอร์ดควบคุม Arduino NANO (2)

ในรูปที่ 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])

Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 6 แสดงผลที่ได้จากการทดลองผ่านหน้าต่าง Serial monitor

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

Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 7 การต่อวงจรสำหรับทดลองสวิตช์เข้ารหัสโรตารี่
Interface 360 Degree Rotary Encoder Switch with Arduino NANO
รูปที่ 8 ลักษณะของการทดลองสวิตช์เข้ารหัสโรตารี่

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

Reference

  1. https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/
  2. https://en.wikipedia.org/wiki/Rotary_encoder
  3. https://electronics.stackexchange.com/questions/280909/help-to-understand-incremental-rotary-encoders
  4. https://www.sunrom.com/p/rotary-encoder-ec11-shaft-20mm
  5. https://html.alldatasheet.com/html-pdf/794915/ALPS/EC11E09244BS/743/7/EC11E09244BS.html