Rotary Encoder ทำงานอย่างไรและเชื่อมต่อกับ Arduino

Rotary Encoder Thangan Xyangri Laea Cheuxm Tx Kab Arduino



Rotary Encoder เป็นอุปกรณ์เครื่องกลไฟฟ้าที่สำคัญที่มีการใช้งานหลากหลายในด้านอิเล็กทรอนิกส์ บทความนี้จะอธิบายประเภทและการทำงานของโรตารีเอ็นโค้ดเดอร์พร้อมกับการเชื่อมต่อกับ Arduino

ตัวเข้ารหัสแบบหมุนคืออะไร

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









ประเภทของโรตารีเอ็นโค้ดเดอร์

ส่วนใหญ่มีโรตารีเอ็นโค้ดเดอร์อยู่สองประเภทที่ตัดสินใจโดยพิจารณาจากสัญญาณเอาต์พุตที่สร้างขึ้น ประเภทเหล่านี้มีชื่อว่า:



ตัวเข้ารหัสแบบหมุนส่วนเพิ่ม

ตัวเข้ารหัสประเภทนี้จะนับรอบการหมุนของปุ่มหมุนในรูปของพัลส์ เมื่อหมุนปุ่มหนึ่งครั้ง จะมีการสร้างพัลส์ สำหรับทุกพัลส์ ตัวนับจะเพิ่มขึ้นเพื่อระบุตำแหน่งเชิงมุมของเพลา





ตัวเข้ารหัสแบบหมุนสัมบูรณ์

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



การทำงานของโรตารีเอ็นโค้ดเดอร์

ตัวเข้ารหัสแบบหมุนประกอบด้วยแผ่นดิสก์ที่มีพื้นที่เว้นระยะห่างเท่าๆ กันซึ่งเชื่อมต่อกับขา C ทั่วไปที่มีการต่อลงดิน อีกสองพิน A และ B เป็นพินสัมผัสที่สัมผัสกับ C เมื่อหมุนปุ่มหมุน เมื่อพิน A หรือ B เชื่อมต่อกับกราวด์ สัญญาณจะถูกสร้างขึ้น สัญญาณเหล่านี้ที่สร้างจากขาเอาต์พุตอยู่ที่ 90° นอกเฟส นี่เป็นเพราะพิน A เชื่อมต่อกับกราวด์เมื่อหมุนลูกบิดตามเข็มนาฬิกา และพิน B จะเชื่อมต่อกับกราวด์ก่อนเมื่อหมุนลูกบิดทวนเข็มนาฬิกา ดังนั้น ทิศทางการหมุนของลูกบิดจึงถูกกำหนดผ่านการเชื่อมต่อเหล่านี้

ถ้าสถานะของ ไม่เท่ากับ จากนั้นหมุนลูกบิดตามเข็มนาฬิกา


หากสถานะของ B เท่ากับ A แสดงว่าปุ่มหมุนทวนเข็มนาฬิกา

การกำหนดค่าพินของโรตารีเอ็นโค้ดเดอร์

แผนภาพที่ให้ไว้ด้านล่างนี้แสดงพินเอาท์ของตัวเข้ารหัสแบบหมุนที่แสดงพินเอาต์พุต A และ B สวิตช์แบบหมุนที่สามารถใช้เป็นปุ่มกด และพินสำหรับแหล่งจ่ายไฟ

คำอธิบายพินของโรตารีเอ็นโค้ดเดอร์

ต่อไปนี้เป็นคำอธิบายที่กำหนดของพินเข้ารหัสแบบหมุนทั้งหมด

ออก B หรือ CLK

พินนี้ให้ผลลัพธ์ของจำนวนครั้งที่ลูกบิดหรือตัวเข้ารหัสแบบหมุนหมุน แต่ละครั้งที่หมุนปุ่ม CLK จะเสร็จสิ้นรอบสูงและต่ำ นับเป็นหนึ่งรอบ

ออก A หรือ DT

นี่คือเอาต์พุตขาที่สองของตัวเข้ารหัสแบบหมุนที่กำหนดทิศทางการหมุน มันล่าช้ากว่าสัญญาณ CLK 90° ดังนั้น หากสถานะไม่เท่ากับสถานะของ CLK ทิศทางการหมุนจะเป็นตามเข็มนาฬิกา มิฉะนั้น จะทวนเข็มนาฬิกา

สวิตช์

ขาสวิตช์ใช้เพื่อตรวจสอบว่าปุ่มกดถูกกดหรือไม่

วี.ซี.ซี

พินนี้เชื่อมต่อกับแหล่งจ่ายไฟ 5V

จีเอ็นดี

พินนี้เชื่อมต่อกับกราวด์

การเชื่อมต่อโรตารีเอ็นโค้ดเดอร์กับ Arduino

ตัวเข้ารหัสแบบหมุนมีห้าพิน VCC และ GND ของโรตารีเอ็นโค้ดเดอร์เชื่อมต่อกับ Arduino พินที่เหลือ CLK, DT และ SW เชื่อมต่อกับพินอินพุตดิจิทัลของ Arduino

รหัส Arduino สำหรับตัวเข้ารหัสแบบหมุน

// อินพุตตัวเข้ารหัสแบบหมุน
#กำหนด CLK_PIN 2
#กำหนด DT_PIN 3
#กำหนด SW_PIN 4
ตัวนับ int = 0 ;
int ปัจจุบันCLKState;
int สุดท้ายCLKState;
ทิศทางปัจจุบันของสตริง = '' ;
ไม่ได้ลงนาม long lastButtonPressTime = 0 ;
การตั้งค่าเป็นโมฆะ ( ) {
// ตั้งค่าพินตัวเข้ารหัส เช่น อินพุต
    โหมดพิน ( CLK_PIN, อินพุต ) ;
    โหมดพิน ( DT_PIN, อินพุต ) ;
    โหมดพิน ( SW_PIN, INPUT_PULLUP ) ;
// ตั้งค่าการตรวจสอบแบบอนุกรม
Serial.begin ( 9600 ) ;
// อ่านสถานะเริ่มต้นของ CLK
lastCLKState = digitalRead ( CLK_PIN ) ;
}
วนเป็นโมฆะ ( ) {
// อ่านสถานะปัจจุบันของ CLK
currentCLKState = ดิจิตอลอ่าน ( CLK_PIN ) ;
// ถ้า ล่าสุด และสถานะปัจจุบันของ CLK นั้นแตกต่างกัน แล้ว ชีพจรเกิดขึ้น
// ตอบโต้เท่านั้น 1 เปลี่ยนสถานะเพื่อหลีกเลี่ยงการนับซ้ำ
ถ้า ( ปัจจุบันCLKSสถานะ ! = CLKS สถานะล่าสุด && ปัจจุบันCLKSสถานะ == 1 ) {
// หากสถานะ DT แตกต่างจากสถานะ CLK แล้ว
// ตัวเข้ารหัสจะหมุนทวนเข็มนาฬิกา ดังนั้น การลดลง
ถ้า ( ดิจิตอลอ่าน ( DT_PIN ) ! = ปัจจุบัน CLKState ) {
เคาน์เตอร์--;
ทิศทางปัจจุบัน = 'คสช.' ;
} อื่น {
// ตัวเข้ารหัสกำลังหมุนตามเข็มนาฬิกา ดังนั้น เพิ่มขึ้น
เคาน์เตอร์ ++;
ทิศทางปัจจุบัน = 'ซีดับบลิว' ;
}
Serial.print ( 'ทิศทางการหมุน: ' ) ;
Serial.print ( ทิศทางปัจจุบัน ) ;
Serial.print ( ' | มูลค่าเคาน์เตอร์: ' ) ;
Serial.println ( เคาน์เตอร์ ) ;
}
// จำไว้ว่า ล่าสุด สถานะ CLK
lastCLKState = ปัจจุบันCLKState;
// อ่านสถานะของปุ่ม
int buttonState = digitalRead ( SW_PIN ) ;
// หากเราตรวจพบสัญญาณต่ำ ปุ่มจะถูกกด
ถ้า ( buttonState == ต่ำ ) {
// หากผ่านไป 50ms นับตั้งแต่ ล่าสุด ชีพจรต่ำก็หมายความว่า
// ปุ่มถูกกด ปล่อย และกดอีกครั้ง
ถ้า ( มิลลิวินาที ( ) - เวลากดปุ่มสุดท้าย > ห้าสิบ ) {
Serial.println ( 'กดปุ่ม!' ) ;
}
// จำไว้ว่า ล่าสุด เหตุการณ์การกดปุ่ม เวลา
lastButtonPressTime = มิลลิวินาที ( ) ;
}
// ใส่ ใน ความล่าช้าเล็กน้อย ช่วย ทำให้เสียการอ่าน
ล่าช้า ( 1 ) ;
}


ในรหัสที่ระบุข้างต้น สถานะของขา CLK จะถูกตรวจสอบในฟังก์ชัน loop() หากไม่เท่ากับสถานะก่อนหน้า แสดงว่าปุ่มหมุนหมุนแล้ว ตอนนี้เพื่อตรวจสอบทิศทางการหมุนของลูกบิด สถานะปัจจุบันของ CLK จะเปรียบเทียบกับสถานะของ DT หากทั้งสองสถานะไม่เท่ากัน แสดงว่าปุ่มหมุนตามเข็มนาฬิกาและค่าเพิ่มขึ้นตามเคาน์เตอร์เพื่อแสดงตำแหน่งของปุ่มหมุน ในกรณีตรงข้าม การลดลงที่สวนทางกัน

บทสรุป

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