- Rotary Encoder และประเภทของมัน
- KY-040 Rotary Encoder Pinout และคำอธิบาย
- Rotary Encoder ทำงานอย่างไร
- ส่วนประกอบที่จำเป็น
- PIC16F877A แผนภาพวงจรเชื่อมต่อตัวเข้ารหัสแบบหมุน
- คำอธิบายรหัส
เข้ารหัสโรตารี เป็นอุปกรณ์ป้อนข้อมูลซึ่งจะช่วยให้ผู้ใช้สามารถโต้ตอบกับระบบ ดูเหมือนโพเทนชิออมิเตอร์วิทยุมากกว่า แต่จะส่งสัญญาณพัลส์ออกมาซึ่งทำให้แอปพลิเคชันไม่เหมือนใคร เมื่อหมุนลูกบิดของ Encoder จะหมุนในรูปแบบของขั้นตอนเล็ก ๆ ซึ่งจะช่วยให้ใช้สำหรับการควบคุมสเต็ปเปอร์ / เซอร์โวมอเตอร์นำทางตามลำดับของเมนูและการเพิ่ม / ลดค่าของตัวเลขและอื่น ๆ อีกมากมาย
ในบทความนี้เราจะได้เรียนรู้เกี่ยวกับ ความแตกต่างของโรตารีเข้ารหัสและวิธีการทำงานเราจะ เชื่อมต่อกับไมโครคอนโทรลเลอร์ PIC PIC16F877Aและควบคุมค่าของจำนวนเต็มโดยการหมุนตัวเข้ารหัสและแสดงค่าบนหน้าจอ LCD 16 * 2 ในตอนท้ายของบทช่วยสอนนี้คุณจะสบายใจกับการใช้ Rotary Encoder สำหรับโครงการของคุณ มาเริ่มกันเลย…
Rotary Encoder และประเภทของมัน
เข้ารหัสโรตารี่มักจะเรียกว่าการเข้ารหัสเพลาเป็นเครื่องแปลงสัญญาณไฟฟ้าซึ่งหมายความว่ามันแปลงการเคลื่อนไหวทางกลเป็นพัลส์อิเล็กทรอนิกส์หรืออีกนัยหนึ่งก็คือแปลงตำแหน่งเชิงมุมหรือการเคลื่อนที่หรือตำแหน่งเพลาเป็นสัญญาณดิจิตอลหรืออนาล็อก ประกอบด้วยลูกบิดซึ่งเมื่อหมุนจะเคลื่อนที่ไปทีละขั้นตอนและสร้างลำดับของพัลส์รถไฟที่มีความกว้างที่กำหนดไว้ล่วงหน้าสำหรับแต่ละขั้นตอน
มีหลายประเภทของตัวเข้ารหัสแบบหมุนในตลาดที่นักออกแบบสามารถเลือกได้ตามการใช้งานของเขา ประเภทที่พบบ่อยที่สุดมีดังต่อไปนี้
- ตัวเข้ารหัสที่เพิ่มขึ้น
- ตัวเข้ารหัสแบบสัมบูรณ์
- ตัวเข้ารหัสแม่เหล็ก
- ตัวเข้ารหัสแสง
- เครื่องเข้ารหัสเลเซอร์
ตัวเข้ารหัสเหล่านี้ถูกจัดประเภทตามสัญญาณเอาท์พุตและเทคโนโลยีการตรวจจับตัวเข้ารหัสแบบเพิ่มหน่วยและตัวเข้ารหัสแบบสัมบูรณ์ถูกจัดประเภทตามสัญญาณเอาท์พุตและตัวเข้ารหัสแม่เหล็กออปติคอลและเลเซอร์ถูกจัดประเภทตามเทคโนโลยีการตรวจจับ Encoder ใช้ที่นี่เป็นประเภท Encoder
ตัวเข้ารหัสแบบสัมบูรณ์จะเก็บข้อมูลตำแหน่งแม้ว่าจะถอดไฟออกแล้วก็ตามและข้อมูลตำแหน่งจะพร้อมใช้งานเมื่อเราใช้พลังงานอีกครั้ง
ประเภทพื้นฐานอื่น ๆตัวเข้ารหัสแบบเพิ่มหน่วยให้ข้อมูลเมื่อตัวเข้ารหัสเปลี่ยนตำแหน่ง ไม่สามารถจัดเก็บข้อมูลตำแหน่งได้
KY-040 Rotary Encoder Pinout และคำอธิบาย
พินเอาต์ของตัวเข้ารหัสแบบโรตารี่ KY-040 Incrementalแสดงอยู่ด้านล่าง ในโครงการนี้เราจะเชื่อมต่อ Rotary Encoder นี้กับไมโครคอนโทรลเลอร์ยอดนิยม PIC16F877A จากไมโครชิป
หมุดสองตัวแรก (กราวด์และ Vcc) ใช้เพื่อจ่ายไฟให้กับตัวเข้ารหัสโดยทั่วไปจะใช้แหล่งจ่ายไฟ + 5V นอกเหนือจากการหมุนปุ่มตามเข็มนาฬิกาและทิศทางทวนเข็มนาฬิกาแล้วตัวเข้ารหัสยังมีสวิตช์ (Active low) ซึ่งสามารถกดได้โดยกดปุ่มด้านใน สัญญาณจากสวิตช์นี้ได้มาจากขา 3 (SW) ในที่สุดก็มีพินเอาต์พุตสองตัว (DT และ CLK) ซึ่งสร้างรูปคลื่นตามที่กล่าวไว้แล้วด้านล่าง เราได้เชื่อมต่อ Rotary Encoder นี้กับ Arduino ก่อนหน้านี้
Rotary Encoder ทำงานอย่างไร
เอาต์พุตทั้งหมดขึ้นอยู่กับแผ่นทองแดงภายในซึ่งให้การเชื่อมต่อกับ GND และ VCC กับเพลา
Rotary Encoder มีสองส่วน ล้อเพลาซึ่งเชื่อมต่อกับเพลาและหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาขึ้นอยู่กับการหมุนของเพลาและฐานที่เชื่อมต่อไฟฟ้า ฐานมีพอร์ตหรือจุดที่เชื่อมต่อกับ DT หรือ CLK ในลักษณะที่เมื่อล้อเพลาหมุนมันจะเชื่อมต่อจุดฐานและให้คลื่นสี่เหลี่ยมบนพอร์ต DT และ CLK
ผลลัพธ์จะเป็นเหมือนเมื่อเพลาหมุน -
สองพอร์ตให้คลื่นสี่เหลี่ยม แต่เวลาต่างกันเล็กน้อย ด้วยเหตุนี้หากเรายอมรับเอาต์พุตเป็น 1 และ 0 อาจมีได้เพียงสี่สถานะคือ 0 0, 1 0, 1 1, 0 1 ลำดับของเอาต์พุตไบนารีจะกำหนดการหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกา เช่นถ้า Rotary Encoder ให้ 1 0 ในสภาพว่างและให้ 1 1 หลังจากนั้นหมายความว่าตัวเข้ารหัสเปลี่ยนตำแหน่งเป็นขั้นตอนเดียวไปยังทิศทางตามเข็มนาฬิกา แต่ถ้าให้ 0 0 หลังจากไม่มีการใช้งาน 1 0 หมายถึงเพลากำลังเปลี่ยนตำแหน่งในทิศทางทวนเข็มนาฬิกาด้วยขั้นตอนเดียว
ส่วนประกอบที่จำเป็น
ถึงเวลาระบุสิ่งที่เราต้องการเพื่อเชื่อมต่อ Rotary Encoder กับไมโครคอนโทรลเลอร์ PIC
- PIC16F877A
- ตัวต้านทาน 4.7k
- ตัวต้านทาน 1k
- หม้อ 10k
- 33pF ตัวเก็บประจุแผ่นเซรามิก - 2 ชิ้น
- คริสตัล 20Mhz
- จอแสดงผล 16x2
- ตัวเข้ารหัสแบบหมุน
- อะแดปเตอร์ 5V
- คณะกรรมการขนมปัง
- สายเชื่อมต่อ
PIC16F877A แผนภาพวงจรเชื่อมต่อตัวเข้ารหัสแบบหมุน
ด้านล่างนี้คือภาพของการตั้งค่าขั้นสุดท้ายหลังจากเชื่อมต่อส่วนประกอบตาม Circuit Diagram:
เราใช้ตัวต้านทาน 1K ตัวเดียวสำหรับความคมชัดของ LCD แทนที่จะใช้โพเทนชิออมิเตอร์ นอกจากนี้ตรวจสอบวิดีโอการทำงานฉบับเต็มที่ให้ไว้ในตอนท้าย
คำอธิบายรหัส
รหัส PIC ที่สมบูรณ์จะได้รับในตอนท้ายของโครงการนี้พร้อมวิดีโอสาธิตที่นี่เรากำลังอธิบายส่วนสำคัญบางส่วนของโค้ด หากคุณยังใหม่กับไมโครคอนโทรลเลอร์ PIC ให้ทำตามแบบฝึกหัด PIC ของเราตั้งแต่เริ่มต้น
ดังที่เราได้กล่าวไว้ก่อนหน้านี้เราจำเป็นต้องตรวจสอบผลลัพธ์และแยกความแตกต่างของเอาต์พุตไบนารีสำหรับทั้ง DT และ CLKดังนั้นเราจึงสร้างส่วน if-else สำหรับการดำเนินการ
ถ้า (Encoder_CLK! = ตำแหน่ง) { if (Encoder_DT! = ตำแหน่ง) { // lcd_com (0x01); เคาน์เตอร์ ++; // เพิ่มตัวนับซึ่งจะพิมพ์บนจอ lcd lcd_com (0xC0); lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, ตัวนับ); } else { // lcd_com (0x01); lcd_com (0xC0); เคาน์เตอร์--; // ลดตัวนับ lcd_puts (""); lcd_com (0xC0); lcd_bcd (1, ตัวนับ); // lcd_puts ("ซ้าย"); } }
เรายังต้องเก็บตำแหน่งในแต่ละขั้นตอนในการทำเช่นนี้เราใช้ตัวแปร "ตำแหน่ง" ซึ่งเก็บตำแหน่งปัจจุบัน
ตำแหน่ง = Encoder_CLK; // เป็นการจัดเก็บตำแหน่งนาฬิกาเข้ารหัสบนตัวแปร สามารถเป็น 0 หรือ 1
นอกจากนี้ยังมีตัวเลือกเพื่อแจ้งเตือนเกี่ยวกับการกดสวิตช์บนจอ LCD
ถ้า (Encoder_SW == 0) { sw_delayms (20); // debounce delay ถ้า (Encoder_SW == 0) { // lcd_com (1); // lcd_com (0xC0); lcd_puts ("กดสวิตช์"); // itoa (ตัวนับค่า 10); // lcd_puts (ค่า);
system_init ฟังก์ชั่นที่ใช้ในการเริ่มต้นขา I / O การทำงานแอลซีดีและการจัดเก็บตำแหน่ง Encoder โรตารี
เป็นโมฆะ system_init () { TRISB = 0x00; // PORT B เป็นเอาต์พุตพอร์ตนี้ใช้สำหรับ LCD TRISDbits.TRISD2 = 1; TRISDbits.TRISD3 = 1; TRISCbits.TRISC4 = 1; lcd_init (); // สิ่งนี้จะเริ่มต้น ตำแหน่ง LCD = Encoder_CLK; // กำหนดตำแหน่ง CLK ในการเริ่มต้นระบบก่อนที่ลูป while จะเริ่ม }
ฟังก์ชัน LCD ถูกเขียนบนไลบรารี lcd.c และ lcd.h ที่มีการประกาศ lcd_puts (), lcd_cmd ()
สำหรับการประกาศตัวแปรบิตการกำหนดค่าและข้อมูลโค้ดอื่น ๆ โปรดดูโค้ดทั้งหมดด้านล่าง