การใช้งาน Encoder Rotary Switch

ในยุคแห่งเทคโนโลยีดิจิทัลที่ทุกสิ่งรอบตัวล้วนขับเคลื่อนด้วยข้อมูลและคำสั่ง การมีกลไกควบคุมที่แม่นยำและใช้งานง่ายจึงเป็นสิ่งจำเป็นอย่างยิ่ง “Encoder Rotary Switch” หรือสวิตช์หมุนเข้ารหัส เป็นหนึ่งในอุปกรณ์สำคัญที่เข้ามาเติมเต็มช่องว่างนี้ ด้วยความสามารถในการแปลงการเคลื่อนที่เชิงกลเป็นการเปลี่ยนแปลงทางไฟฟ้าแบบดิจิทัล ทำให้ผู้ใช้งานสามารถควบคุมระบบต่างๆ ได้อย่างราบรื่นและมีประสิทธิภาพยิ่งขึ้น บทความนี้จะนำเสนอรายละเอียดเกี่ยวกับ Encoder Rotary Switch ตั้งแต่ที่มาและความสำคัญ โครงสร้างการทำงาน วิธีการใช้งาน ไปจนถึงข้อเสนอแนะและข้อควรระวัง เพื่อให้ผู้อ่านเข้าใจและสามารถนำไปประยุกต์ใช้ในงานต่างๆ ได้อย่างเต็มศักยภาพ
ที่มาและความสำคัญของ Encoder Rotary Switch
ก่อนที่จะก้าวเข้าสู่ยุคดิจิทัล การควบคุมอุปกรณ์อิเล็กทรอนิกส์มักอาศัยโพเทนชิออมิเตอร์ (Potentiometer) ซึ่งเป็นตัวต้านทานปรับค่าได้ ทำหน้าที่เปลี่ยนแปลงความต้านทานตามการหมุน เพื่อควบคุมระดับสัญญาณแอนะล็อก อย่างไรก็ตาม โพเทนชิออมิเตอร์มีข้อจำกัดในเรื่องความแม่นยำในการทำซ้ำและการสึกหรอของหน้าสัมผัสเมื่อใช้งานไปนานๆ รวมถึงไม่สามารถให้ข้อมูลตำแหน่งที่แน่นอนได้เมื่อไม่มีแรงดันไฟฟ้ามาเลี้ยง
การมาของ Encoder Rotary Switch จึงนับเป็นการพัฒนาที่สำคัญยิ่ง โดย Encoder Rotary Switch ไม่ได้ทำหน้าที่ปรับเปลี่ยนค่าความต้านทาน แต่จะส่งข้อมูลเป็นสัญญาณพัลส์ดิจิทัลเมื่อมีการหมุนแต่ละสเต็ป ทำให้สามารถระบุตำแหน่งการหมุนได้อย่างแม่นยำและไม่เกิดการคลาดเคลื่อนสะสม (Cumulative Error) นอกจากนี้ Encoder Rotary Switch ยังมีความทนทานสูง ไม่มีการสึกหรอจากการสัมผัสทางกลไกแบบที่พบในโพเทนชิออมิเตอร์ และที่สำคัญที่สุดคือให้ข้อมูลในรูปแบบดิจิทัลที่เข้ากันได้โดยตรงกับระบบประมวลผลสมัยใหม่ ทำให้ Encoder Rotary Switch กลายเป็นส่วนประกอบสำคัญในการควบคุมอุปกรณ์อิเล็กทรอนิกส์หลากหลายประเภท ไม่ว่าจะเป็นเครื่องเสียงดิจิทัล แผงควบคุมอุตสาหกรรม หุ่นยนต์ หรือแม้แต่เครื่องมือวัดทางวิทยาศาสตร์
โครงสร้างและการทำงานของ Encoder Rotary Switch
โดยพื้นฐานแล้ว Encoder Rotary Switch สามารถแบ่งออกได้เป็นสองประเภทหลัก ได้แก่ Incremental Encoder (Relative Encoder) และ Absolute Encoder
Incremental Encoder (Relative Encoder)
เป็นประเภทที่พบเห็นได้บ่อยที่สุด มีโครงสร้างภายในประกอบด้วยแผ่นดิสก์หมุนที่มีช่องเจาะหรือลวดลายโปร่งแสง และมีแหล่งกำเนิดแสง (เช่น LED) กับตัวรับแสง (เช่น Photodiode) อยู่คนละฝั่งของแผ่นดิสก์ เมื่อแผ่นดิสก์หมุน ช่องเจาะเหล่านี้จะบดบังหรือเปิดรับแสง ทำให้เกิดสัญญาณพัลส์ไฟฟ้าขึ้น สัญญาณที่ได้มักจะเป็นสัญญาณสองเฟส (Phase A และ Phase B) ที่มีเฟสต่างกัน 90 องศา สัญญาณ A และ B นี้เองที่ทำให้ไมโครคอนโทรลเลอร์สามารถตรวจสอบได้ทั้งทิศทางการหมุน (ตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา) และจำนวนสเต็ปที่หมุนไป คล้ายกับการนับก้าวเดินที่เราไม่รู้ว่าเริ่มต้นจากจุดใด แต่เรารู้ว่าเราเดินไปกี่ก้าวและเดินไปในทิศทางใด
ตัวอย่างโครงสร้างภายใน: ลองจินตนาการถึงวงล้อที่มีช่องเจาะเป็นระยะๆ และมีเซ็นเซอร์แสงสองตัววางเยื้องๆ กันเล็กน้อย เมื่อวงล้อหมุน ช่องเจาะจะทำให้เซ็นเซอร์ตัวแรกเห็นแสงก่อน จากนั้นเซ็นเซอร์ตัวที่สองจึงเห็นแสงตามมา หรือในทางกลับกัน ขึ้นอยู่กับทิศทางการหมุน การสลับกันของสัญญาณจากเซ็นเซอร์ทั้งสองนี้เองที่ใช้ในการคำนวณทิศทางและความเร็วในการหมุน
ช่องสัญญาณ: Encoder Rotary Switch โดยทั่วไปจะมีขาเชื่อมต่ออย่างน้อย 3 ขา ได้แก่ Common (GND), Phase A, และ Phase B บางรุ่นอาจมีขาเพิ่มขึ้นมาอีกหนึ่งขาคือ Switch (SW) ซึ่งเป็นปุ่มกดที่มักจะอยู่ตรงแกนหมุน เมื่อกดลงไปจะมีสัญญาณดิจิทัลส่งออกมา คล้ายกับการกดปุ่ม Enter หลังจากเลือกค่าต่างๆ
Absolute Encoder
แตกต่างจาก Incremental Encoder ตรงที่ Absolute Encoder จะให้ค่าตำแหน่งที่แน่นอนในแต่ละการหมุน ไม่ว่าจะเริ่มหมุนจากจุดใดก็ตาม เสมือนกับการที่เรามีเข็มทิศที่บอกทิศทางที่แน่นอนเสมอ ไม่ว่าเราจะเริ่มต้นการเดินทางจากจุดใดก็ตาม โครงสร้างภายในของ Absolute Encoder มักจะซับซ้อนกว่า โดยอาจใช้แผ่นดิสก์ที่มีลวดลายที่แตกต่างกันในแต่ละตำแหน่ง และใช้เซ็นเซอร์หลายตัวในการอ่านค่ารหัส ซึ่งอาจเป็นรหัสไบนารีหรือรหัสเกรย์โค้ด (Gray Code) เพื่อป้องกันข้อผิดพลาดในการอ่านค่าเมื่อมีการเปลี่ยนตำแหน่งพร้อมกันหลายบิต Absolute Encoder เหมาะสำหรับงานที่ต้องการความแม่นยำสูงและข้อมูลตำแหน่งที่ไม่มีการสูญหายเมื่อไฟฟ้าดับ
หลักการทำงานของ Incremental Encoder
เพื่อให้เห็นภาพที่ชัดเจนขึ้น เราจะเน้นไปที่ Incremental Encoder ซึ่งเป็นชนิดที่นิยมใช้งานมากที่สุด เมื่อผู้ใช้หมุนแกนของ Encoder สัญญาณพัลส์ที่ขา A และขา B จะเปลี่ยนแปลงไป โดยความแตกต่างของเฟสสัญญาณระหว่างขา A และขา B จะเป็นตัวบ่งบอกทิศทางการหมุน ตัวอย่างเช่น หากขา A นำหน้าขา B แสดงว่าหมุนตามเข็มนาฬิกา และหากขา B นำหน้าขา A แสดงว่าหมุนทวนเข็มนาฬิกา การนับจำนวนพัลส์ที่เกิดขึ้นจะบอกถึงจำนวนสเต็ปที่หมุนไป การรวมข้อมูลทั้งทิศทางและจำนวนสเต็ปนี้เองที่ทำให้เราสามารถควบคุมค่าต่างๆ ได้อย่างแม่นยำ ไม่ว่าจะเป็นการปรับระดับเสียง การเลื่อนเมนู หรือการกำหนดค่าพารามิเตอร์ต่างๆ
วิธีการใช้งาน Encoder Rotary Switch
การใช้งาน Encoder Rotary Switch กับไมโครคอนโทรลเลอร์ (เช่น Arduino, ESP32) เป็นที่นิยมอย่างมาก เนื่องจากมีไลบรารีและตัวอย่างโค้ดให้ศึกษามากมาย ขั้นตอนพื้นฐานในการใช้งานมีดังนี้:
1. การต่อวงจร
- ขา Common (GND): เชื่อมต่อกับขา GND ของไมโครคอนโทรลเลอร์
- ขา Phase A: เชื่อมต่อกับขา Digital Input ของไมโครคอนโทรลเลอร์ (อาจต้องมีตัวต้านทาน Pull-up หากไม่มีในตัว Encoder หรือไมโครคอนโทรลเลอร์)
- ขา Phase B: เชื่อมต่อกับขา Digital Input อีกขาหนึ่งของไมโครคอนโทรลเลอร์ (อาจต้องมีตัวต้านทาน Pull-up)
- ขา Switch (SW) (ถ้ามี): เชื่อมต่อกับขา Digital Input อีกขาหนึ่งของไมโครคอนโทรลเลอร์ และควรมีตัวต้านทาน Pull-up หรือใช้ Pull-up ภายในของไมโครคอนโทรลเลอร์
2. การเขียนโปรแกรม (Microcontroller Programming)
- การอ่านค่าสัญญาณ: ไมโครคอนโทรลเลอร์จะต้องอ่านสถานะของขา A และขา B อย่างต่อเนื่อง อาจใช้วิธี Polling (วนอ่านค่าตลอดเวลา) หรือ Interrupt (ให้ไมโครคอนโทรลเลอร์ทำงานเมื่อเกิดการเปลี่ยนแปลงที่ขาใดขาหนึ่ง) วิธี Interrupt มีประสิทธิภาพมากกว่า เนื่องจากไมโครคอนโทรลเลอร์ไม่จำเป็นต้องเสียเวลาวนอ่านค่าอยู่ตลอดเวลา แต่จะถูกเรียกให้ทำงานเมื่อมีเหตุการณ์สำคัญเกิดขึ้นเท่านั้น
- การตรวจสอบทิศทาง: เมื่อมีสัญญาณพัลส์เกิดขึ้น (เช่น ขา A เปลี่ยนสถานะ) โปรแกรมจะต้องตรวจสอบสถานะของขา B เพื่อกำหนดทิศทางการหมุน ตัวอย่างเช่น หาก A เปลี่ยนจาก Low เป็น High และ B มีค่า Low แสดงว่าหมุนไปทิศทางหนึ่ง หาก B มีค่า High แสดงว่าหมุนไปอีกทิศทางหนึ่ง
- การนับค่า: เมื่อทราบทิศทางแล้ว โปรแกรมจะทำการเพิ่มหรือลดค่าตัวแปรตามจำนวนสเต็ปที่หมุนไป ค่าตัวแปรนี้เองที่จะนำไปใช้ในการควบคุมฟังก์ชันต่างๆ
- การจัดการ Bounce Effect: ในบางครั้ง การเปลี่ยนสถานะของหน้าสัมผัสภายใน Encoder อาจทำให้เกิดสัญญาณรบกวนชั่วขณะที่เรียกว่า “Bounce” ซึ่งอาจทำให้การนับค่าคลาดเคลื่อนได้ การแก้ไขปัญหานี้สามารถทำได้โดยการหน่วงเวลา (Debounce) หลังจากตรวจพบการเปลี่ยนแปลงสถานะ หรือใช้ไลบรารีที่ออกแบบมาเพื่อจัดการกับปัญหานี้โดยเฉพาะ
ตัวอย่างการประยุกต์ใช้งาน
- เครื่องเสียงดิจิทัล: ใช้ในการปรับระดับเสียง เลือกเพลง หรือเลื่อนเมนู
- แผงควบคุมอุตสาหกรรม: ใช้ในการตั้งค่าพารามิเตอร์ของเครื่องจักร ควบคุมความเร็ว หรือเลือกโหมดการทำงาน
- หุ่นยนต์: ใช้ในการควบคุมการเคลื่อนที่ของข้อต่อหุ่นยนต์ หรือการระบุตำแหน่งของแขนกล
- เครื่องมือวัด: ใช้ในการปรับค่า Zero หรือตั้งค่าการวัดต่างๆ
- ระบบควบคุมแสงสว่าง: ใช้ในการหรี่ไฟ หรือเปลี่ยนโหมดสีของหลอดไฟอัจฉริยะ
ข้อเสนอแนะในการเลือกใช้งานและออกแบบระบบ
- เลือกประเภทที่เหมาะสม: พิจารณาความต้องการของงาน หากต้องการความแม่นยำสูงและไม่มีการสูญหายของข้อมูลเมื่อไฟฟ้าดับ ให้เลือก Absolute Encoder แต่หากเป็นการปรับค่าแบบ Relative ทั่วไป Incremental Encoder ก็เพียงพอแล้วและมีราคาถูกกว่า
- พิจารณาจำนวนพัลส์ต่อการหมุน: Encoder แต่ละรุ่นมีจำนวนพัลส์ (หรือสเต็ป) ต่อการหมุนที่แตกต่างกัน ค่านี้จะส่งผลต่อความละเอียดในการควบคุม หากต้องการการควบคุมที่ละเอียดมาก ควรเลือก Encoder ที่มีจำนวนพัลส์สูง
- พิจารณาคุณสมบัติเพิ่มเติม: บางรุ่นอาจมีปุ่มกดในตัว (Switch) หรือมีร่องบากสำหรับการติดตั้งที่สะดวก พิจารณาคุณสมบัติเหล่านี้ให้สอดคล้องกับการออกแบบ
- การออกแบบวงจรป้องกัน: แม้ว่า Encoder Rotary Switch จะทนทาน แต่การป้องกัน ESD (Electrostatic Discharge) และการกรองสัญญาณรบกวนในวงจรก็ยังคงมีความสำคัญ เพื่อให้การทำงานมีเสถียรภาพสูงสุด
- การเลือกใช้ไลบรารี: หากใช้งานกับไมโครคอนโทรลเลอร์ ควรใช้ไลบรารีที่ได้รับการพัฒนามาอย่างดี ซึ่งมักจะมีการจัดการกับ Bounce Effect และการอ่านค่าที่ซับซ้อนให้โดยอัตโนมัติ ทำให้การเขียนโปรแกรมง่ายขึ้นและลดข้อผิดพลาด
ข้อควรระวังในการใช้งาน
- การต่อสาย: ตรวจสอบการต่อสายให้ถูกต้องตาม Data Sheet ของ Encoder หากต่อสายผิดอาจทำให้ Encoder เสียหายหรือทำงานไม่ถูกต้อง
- แรงดันไฟฟ้า: ใช้แรงดันไฟฟ้าที่เหมาะสมกับ Encoder แต่ละรุ่น การจ่ายแรงดันไฟฟ้าเกินอาจทำให้ Encoder เสียหาย
- สภาพแวดล้อม: หลีกเลี่ยงการติดตั้งในสภาพแวดล้อมที่มีความชื้นสูง อุณหภูมิสูงเกินไป หรือมีฝุ่นละอองมาก ซึ่งอาจส่งผลต่ออายุการใช้งานและการทำงานของ Encoder
- การรบกวนทางไฟฟ้า: สัญญาณพัลส์จาก Encoder อาจอ่อนไหวต่อสัญญาณรบกวนทางไฟฟ้าจากอุปกรณ์ใกล้เคียง ควรเดินสายให้ห่างจากแหล่งกำเนิดสัญญาณรบกวน หรือใช้สายชีลด์ (Shielded Cable) ในกรณีที่จำเป็น
- การเขียนโปรแกรมที่ผิดพลาด: การเขียนโปรแกรมที่ผิดพลาด เช่น การอ่านค่าที่ไม่ถูกต้อง การไม่จัดการกับ Bounce Effect หรือการคำนวณทิศทางที่คลาดเคลื่อน อาจทำให้ระบบทำงานผิดพลาดหรือไม่ตอบสนองตามที่ต้องการ
ตัวอย่างการใช้งาน Encoder Rotary Switch กับ Arduino
Encoder Rotary Switch เป็นอุปกรณ์ยอดนิยมสำหรับการควบคุมค่าต่างๆ ในโปรเจกต์ Arduino เพราะมันให้ความแม่นยำสูงและใช้งานง่ายกว่าโพเทนชิออมิเตอร์ในหลายๆ กรณี เราจะมาดูตัวอย่างการเชื่อมต่อและการเขียนโค้ดเบื้องต้น เพื่อให้คุณสามารถนำไปประยุกต์ใช้ได้ทันที
อุปกรณ์ที่จำเป็น
- Arduino Uno (หรือบอร์ด Arduino รุ่นอื่น ๆ)
- Encoder Rotary Switch (แบบ Incremental)
- ส่วนใหญ่จะมี 5 ขา:
- CLK (Clock): ขาเอาต์พุตพัลส์เฟส A
- DT (Data): ขาเอาต์พุตพัลส์เฟส B
- SW (Switch): ขาสำหรับปุ่มกด (เมื่อกดแกนหมุนลงไป)
- + (VCC): ขาจ่ายไฟ
- GND: ขากราวด์
- บอร์ดทดลอง (Breadboard)
- สายไฟจัมเปอร์ (Jumper Wires)
- ตัวต้านทาน Pull-up (Optional): ค่า 10k โอห์ม 2-3 ตัว (บาง Encoder หรือบอร์ด Arduino มี Pull-up ภายในแล้ว)

การเชื่อมต่อวงจร
การเชื่อมต่อ Encoder Rotary Switch กับ Arduino นั้นค่อนข้างตรงไปตรงมา สิ่งสำคัญคือการเชื่อมต่อขา CLK, DT และ SW เข้ากับขา Digital Input ของ Arduino ส่วนขา VCC และ GND ก็เชื่อมต่อกับแหล่งจ่ายไฟและกราวด์ของ Arduino ครับ
- ขา CLK (Clock) ของ Encoder → เชื่อมต่อกับ Digital Pin 2 ของ Arduino
- ขา DT (Data) ของ Encoder → เชื่อมต่อกับ Digital Pin 3 ของ Arduino
- ขา SW (Switch) ของ Encoder → เชื่อมต่อกับ Digital Pin 4 ของ Arduino
- ขา + (VCC) ของ Encoder → เชื่อมต่อกับ 5V ของ Arduino
- ขา GND ของ Encoder → เชื่อมต่อกับ GND ของ Arduino
ข้อสังเกตเกี่ยวกับ Pull-up Resistor:
Encoder Rotary Switch ส่วนใหญ่จะให้สัญญาณแบบ Open Collector Output ซึ่งจำเป็นต้องมีตัวต้านทาน Pull-up เพื่อดึงสัญญาณให้เป็น High เมื่อไม่มีการเชื่อมต่อ หาก Encoder ของคุณไม่มี Pull-up ในตัว หรือคุณไม่ได้เปิดใช้งาน Internal Pull-up ของ Arduino คุณจะต้องเพิ่มตัวต้านทาน 10k โอห์มจากขา CLK, DT และ SW แต่ละขา ไปยังขา 5V ครับ
โค้ด Arduino สำหรับ Incremental Encoder
การอ่านค่าจาก Incremental Encoder จำเป็นต้องตรวจจับการเปลี่ยนแปลงสถานะของขา CLK และ DT เพื่อกำหนดทิศทางการหมุน และนับจำนวนสเต็ปที่หมุนไป การใช้ Interrupt เป็นวิธีที่มีประสิทธิภาพสูงสุดในการอ่านค่า Encoder เพราะ Arduino จะถูกกระตุ้นให้ทำงานเฉพาะเมื่อมีการเปลี่ยนแปลงสถานะที่ขาเท่านั้น ไม่ต้องเสียเวลาวนลูปตรวจสอบตลอดเวลา
นี่คือตัวอย่างโค้ดที่ใช้ Interrupt ในการอ่านค่า Encoder:
const int CLK_PIN = 2; // เชื่อมต่อกับขา CLK ของ Encoder
const int DT_PIN = 3; // เชื่อมต่อกับขา DT ของ Encoder
const int int SW_PIN = 4; // เชื่อมต่อกับขา SW ของ Encoder (ปุ่มกด)
// ตัวแปรสำหรับเก็บค่า Encoder
volatile int counter = 0; // ใช้ volatile เพราะค่านี้ถูกเปลี่ยนแปลงใน Interrupt Service Routine (ISR)
int lastClkState; // เก็บสถานะสุดท้ายของขา CLK
bool buttonPressed = false; // สถานะของปุ่มกด
void setup() {
Serial.begin(9600); // เริ่มต้น Serial Monitor เพื่อแสดงผล
// กำหนดขา Encoder เป็น INPUT_PULLUP
// Arduino จะเปิดใช้งาน Pull-up Resistor ภายในให้
pinMode(CLK_PIN, INPUT_PULLUP);
pinMode(DT_PIN, INPUT_PULLUP);
pinMode(SW_PIN, INPUT_PULLUP);
// อ่านสถานะเริ่มต้นของขา CLK
lastClkState = digitalRead(CLK_PIN);
// ตั้งค่า Interrupt สำหรับขา CLK_PIN และ DT_PIN
// เมื่อขา CLK_PIN หรือ DT_PIN เปลี่ยนสถานะ (CHANGE) ให้เรียกฟังก์ชัน readEncoder()
attachInterrupt(digitalPinToInterrupt(CLK_PIN), readEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(DT_PIN), readEncoder, CHANGE);
// ตั้งค่า Interrupt สำหรับขา SW_PIN
// เมื่อขา SW_PIN เปลี่ยนจาก HIGH เป็น LOW (FALLING) ให้เรียกฟังก์ชัน buttonPress()
// (ปกติปุ่มกดเมื่อไม่ถูกกดจะ HIGH เมื่อกดจะ LOW)
attachInterrupt(digitalPinToInterrupt(SW_PIN), buttonPress, FALLING);
Serial.println("Encoder Rotary Switch พร้อมใช้งานแล้ว");
}
void loop() {
// ใน loop() เราสามารถนำค่า 'counter' ไปใช้งานได้
// เช่น แสดงผลบนจอ LCD, ควบคุม LED, หรือปรับค่าต่างๆ
// แสดงผลค่า counter และสถานะปุ่มกดบน Serial Monitor
Serial.print("ค่า Encoder: ");
Serial.print(counter);
if (buttonPressed) {
Serial.println(" | ปุ่มถูกกด!");
// ทำสิ่งที่คุณต้องการเมื่อปุ่มถูกกด
// ตัวอย่าง: รีเซ็ตค่า counter
counter = 0; // รีเซ็ตค่า counter เมื่อกดปุ่ม
Serial.println("ค่า Encoder ถูกรีเซ็ตเป็น 0");
buttonPressed = false; // ตั้งค่ากลับเป็น false เพื่อรอการกดครั้งถัดไป
} else {
Serial.println(""); // ขึ้นบรรทัดใหม่
}
delay(100); // หน่วงเวลาเล็กน้อยเพื่อไม่ให้ Serial Monitor แสดงผลเร็วเกินไป
}
// ฟังก์ชัน ISR (Interrupt Service Routine) สำหรับอ่านค่า Encoder
void readEncoder() {
// อ่านสถานะปัจจุบันของขา CLK และ DT
int currentClkState = digitalRead(CLK_PIN);
int currentDtState = digitalRead(DT_PIN);
// ตรวจสอบว่าขา CLK เปลี่ยนสถานะหรือไม่
if (currentClkState != lastClkState) {
// หาก CLK เปลี่ยนสถานะ
if (currentClkState == HIGH) {
// CLK เปลี่ยนจาก LOW ไป HIGH
// ตรวจสอบสถานะของ DT เพื่อกำหนดทิศทาง
if (currentDtState == HIGH) {
// DT เป็น HIGH -> หมุนทวนเข็มนาฬิกา
counter--;
} else {
// DT เป็น LOW -> หมุนตามเข็มนาฬิกา
counter++;
}
}
// อัปเดตสถานะสุดท้ายของ CLK
lastClkState = currentClkState;
}
}
// ฟังก์ชัน ISR สำหรับปุ่มกด
void buttonPress() {
// ตรวจสอบการ Debounce ง่ายๆ เพื่อป้องกันการอ่านค่าผิดพลาดจากการกระเด้งของหน้าสัมผัส
// โดยตรวจสอบว่าปุ่มยังคงกดอยู่จริงหลังจากการหน่วงเวลาสั้นๆ
delay(50); // หน่วงเวลาเล็กน้อย (อาจต้องปรับค่าตาม Encoder ของคุณ)
if (digitalRead(SW_PIN) == LOW) { // ตรวจสอบอีกครั้งว่ายังคงเป็น LOW (กดอยู่)
buttonPressed = true;
}
}
คำอธิบายโค้ด
const int CLK_PIN = 2;
และขาอื่นๆ: กำหนดขา Digital Pin ที่เชื่อมต่อกับ Encodervolatile int counter = 0;
:counter
เป็นตัวแปรหลักที่จะเก็บค่าการหมุนของ Encoder ที่เพิ่มขึ้นหรือลดลงvolatile
สำคัญมากที่นี่ เพราะมันบอกคอมไพเลอร์ว่าตัวแปรนี้สามารถถูกแก้ไขได้โดยโค้ดที่อยู่นอกลำดับการทำงานปกติ (เช่น จาก Interrupt Service Routine หรือ ISR) ทำให้มั่นใจว่าค่าที่อ่านได้เป็นค่าล่าสุดเสมอpinMode(CLK_PIN, INPUT_PULLUP);
: กำหนดให้ขา Digital Pin เป็นINPUT_PULLUP
ซึ่งจะเปิดใช้งานตัวต้านทาน Pull-up ภายในของ Arduino ช่วยให้ไม่ต้องต่อตัวต้านทานภายนอกสำหรับ Encoder ที่ไม่มี Pull-up ในตัวattachInterrupt(digitalPinToInterrupt(CLK_PIN), readEncoder, CHANGE);
: นี่คือหัวใจของการอ่านค่า Encoder โดยใช้ InterruptdigitalPinToInterrupt(CLK_PIN)
: แปลงหมายเลข Digital Pin ให้เป็นหมายเลข Interrupt ที่ Arduino เข้าใจreadEncoder
: ชื่อฟังก์ชันที่จะถูกเรียกเมื่อ Interrupt เกิดขึ้นCHANGE
: ชนิดของ Interrupt หมายความว่าฟังก์ชันreadEncoder
จะถูกเรียกเมื่อขา CLK_PIN เปลี่ยนสถานะจาก HIGH ไป LOW หรือจาก LOW ไป HIGH- เราตั้ง Interrupt ทั้งขา CLK และ DT เพราะบางครั้งการหมุนอาจทำให้ขา DT เปลี่ยนสถานะก่อนขา CLK ซึ่งการตั้งทั้งสองขาจะช่วยให้การอ่านค่าแม่นยำขึ้น
void readEncoder()
: ฟังก์ชันนี้คือ ISR ที่จะถูกเรียกเมื่อมี Interrupt เกิดขึ้น- มันจะตรวจสอบสถานะปัจจุบันของขา CLK และ DT
- การเปรียบเทียบ
currentClkState
กับlastClkState
และcurrentDtState
ทำให้เราสามารถกำหนดได้ว่าเป็นการหมุนตามเข็มหรือทวนเข็มนาฬิกา (หลักการเดียวกับ Quadrature Encoder)
attachInterrupt(digitalPinToInterrupt(SW_PIN), buttonPress, FALLING);
: ตั้ง Interrupt สำหรับปุ่มกด (SW) โดยFALLING
หมายความว่าฟังก์ชันbuttonPress
จะถูกเรียกเมื่อขานั้นเปลี่ยนจาก HIGH เป็น LOW ซึ่งปกติคือตอนที่ปุ่มถูกกดลงvoid buttonPress()
: ฟังก์ชันสำหรับจัดการการกดปุ่ม มีการใช้delay(50)
เพื่อทำ Debounce อย่างง่ายๆ ช่วยลดปัญหาการอ่านค่าผิดพลาดจากการที่หน้าสัมผัสของปุ่มกระเด้งเมื่อถูกกด
วิธีการทำงาน
- คัดลอกโค้ดข้างต้นไปวางใน Arduino IDE
- เชื่อมต่อวงจรตามที่อธิบายไว้
- อัปโหลดโค้ดไปยังบอร์ด Arduino ของคุณ
- เปิด Serial Monitor ใน Arduino IDE (ตั้งค่า Baud Rate เป็น 9600)
- ลองหมุนแกนของ Encoder Rotary Switch คุณจะเห็นค่า “ค่า Encoder:” เปลี่ยนแปลงใน Serial Monitor
- หมุนตามเข็มนาฬิกา: ค่า
counter
จะเพิ่มขึ้น - หมุนทวนเข็มนาฬิกา: ค่า
counter
จะลดลง
- หมุนตามเข็มนาฬิกา: ค่า
- ลองกดแกนของ Encoder ลงไป คุณจะเห็นข้อความ “ปุ่มถูกกด!” และค่า
counter
จะถูกรีเซ็ตเป็น 0
ข้อแนะนำเพิ่มเติม
- Debounce ที่ดีกว่า: สำหรับโปรเจกต์ที่ซับซ้อนขึ้น ควรใช้ไลบรารี Debounce หรือใช้อัลกอริทึม Debounce ที่ซับซ้อนกว่าในโค้ด เพื่อให้การอ่านค่ามีความเสถียรสูงสุด
- ไลบรารี Encoder: มีไลบรารี Arduino สำหรับ Encoder Rotary Switch โดยเฉพาะ เช่น “Encoder” by Paul Stoffregen ซึ่งจัดการเรื่อง Interrupt และ Debounce ให้โดยอัตโนมัติ ทำให้โค้ดกระชับและเชื่อถือได้มากขึ้น การใช้ไลบรารีจะทำให้คุณไม่ต้องกังวลเรื่องรายละเอียดปลีกย่อยมากนัก
- การประยุกต์ใช้: ค่า
counter
ที่ได้จาก Encoder สามารถนำไปใช้ควบคุมอะไรก็ได้ในโปรเจกต์ของคุณ เช่น ปรับความสว่างของ LED, เลือกเมนูบนจอ LCD, ควบคุมความเร็วของมอเตอร์ หรือกำหนดค่าเวลาใน Timer เป็นต้น
สรุป
Encoder Rotary Switch เป็นส่วนประกอบที่ทรงพลังและยืดหยุ่นในการควบคุมระบบดิจิทัล ด้วยความสามารถในการแปลงการเคลื่อนที่เชิงกลเป็นการเปลี่ยนแปลงทางไฟฟ้าแบบดิจิทัลที่แม่นยำและเชื่อถือได้ ทำให้ Encoder Rotary Switch เข้ามาแทนที่กลไกควบคุมแบบเก่าและนำไปสู่การสร้างสรรค์นวัตกรรมใหม่ๆ ในหลากหลายอุตสาหกรรม การทำความเข้าใจในที่มา โครงสร้างการทำงาน วิธีการใช้งาน ตลอดจนข้อเสนอแนะและข้อควรระวัง จะช่วยให้นักพัฒนา และผู้ที่สนใจ สามารถนำ Encoder Rotary Switch ไปประยุกต์ใช้ในโครงการต่างๆ ได้อย่างมีประสิทธิภาพสูงสุด และเป็นส่วนหนึ่งในการขับเคลื่อนงานด้านต่างๆของไมโครอคนโทรลเลอร์