สารบัญ:

ตัวถอดรหัสโรตารี่อย่างง่าย: 4 ขั้นตอน
ตัวถอดรหัสโรตารี่อย่างง่าย: 4 ขั้นตอน

วีดีโอ: ตัวถอดรหัสโรตารี่อย่างง่าย: 4 ขั้นตอน

วีดีโอ: ตัวถอดรหัสโรตารี่อย่างง่าย: 4 ขั้นตอน
วีดีโอ: เช็คมากีต้าของแท้/ปลอม ดูได้จากจุดไหนบ้าง 2024, กรกฎาคม
Anonim
Image
Image
ตัวถอดรหัสโรตารี่อย่างง่าย
ตัวถอดรหัสโรตารี่อย่างง่าย

คำแนะนำนี้อธิบายวิธีง่ายๆ ในการถอดรหัสตัวเข้ารหัสแบบโรตารี่ตามลำดับโดยใช้ Arduino Uno R3

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

มีโค้ดเวอร์ชันอินเตอร์รัปต์และแบบไม่อินเตอร์รัปต์ให้

โค้ดเวอร์ชันขัดจังหวะต้องการเพียงพินอินเทอร์รัปต์เดียวเท่านั้น

รูปภาพ:

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

ขั้นตอนที่ 1: แผนภาพวงจร

แผนภูมิวงจรรวม
แผนภูมิวงจรรวม

แผนภาพการเดินสายเอ็นโค้ดเดอร์แสดงในรูปที่ 1

สายจัมเปอร์ถูกบัดกรีโดยตรงกับหมุดตัวเข้ารหัส

สลับสายสีน้ำเงินสองเส้นหากทิศทางการนับกลับด้าน

ขั้นตอนที่ 2: รายการชิ้นส่วน

ส่วนต่อไปนี้ได้มาจากhttps://www.aliexpress.com/

  • 1 เท่านั้น Arduino UNO R3 พร้อมสาย USB
  • 1 เครื่องเข้ารหัสแบบหมุนตามลำดับเท่านั้น (EC11 หรือเทียบเท่า) พร้อมสวิตช์
  • 1 ลูกบิดเท่านั้นเพื่อให้เหมาะกับเพลา
  • 3 สายจัมเปอร์ Arduino ตัวผู้ต่อตัวผู้เท่านั้น

ขั้นตอนที่ 3: ทฤษฎี

ทฤษฎี
ทฤษฎี

ตัวเข้ารหัสแบบหมุนตามลำดับสร้างคลื่นสี่เหลี่ยมสองคลื่นซึ่งแต่ละคลื่นเคลื่อนที่ 90 องศาดังแสดงในรูปที่ 1

รูปแบบลอจิกที่จุดสัมผัส A และจุดสัมผัส B จะแตกต่างกันเมื่อหมุนเพลาตามเข็มนาฬิกา (CW) และทวนเข็มนาฬิกา (CCW) ผ่านตำแหน่ง 1 ถึง 6

วิธีการทั่วไปในการกำหนดทิศทางการหมุน ได้แก่

  • ฮาร์ดแวร์
  • แฝดขัดจังหวะ
  • ตารางค้นหาลวดลาย

โปรเจ็กต์นี้ใช้วิธีซอฟต์แวร์ที่ไม่ต้องการตารางค้นหา [1]

ทิศทาง

แทนที่จะดูรูปแบบเอาต์พุตจาก Contact A และ Contact B ให้เน้นที่ Contact A

หากเราสุ่มตัวอย่างผู้ติดต่อ B หลังจากการเปลี่ยนผู้ติดต่อ A เราจะสังเกตว่า:

  • ผู้ติดต่อ A และผู้ติดต่อ B มีสถานะตรรกะที่ตรงกันข้ามเมื่อตัวเข้ารหัสถูกหมุนCW
  • ผู้ติดต่อ A และผู้ติดต่อ B มีสถานะตรรกะเดียวกันเมื่อหมุนตัวเข้ารหัส CCW

รหัสจริง:

// ----- นับช่วงการเปลี่ยนภาพ

CurrentStateA = stateContactA(); ถ้า (CurrentStateA! = LastStateA) { CurrentStateB = digitalRead (ContactB); ถ้า (CurrentStateA == CurrentStateB) นับ ++; ถ้า (CurrentStateA != CurrentStateB) นับ--; LastStateA = CurrentStateA; }

วิธีนี้มีข้อดีดังต่อไปนี้:

  • ไม่จำเป็นต้องใช้ตารางค้นหา
  • ต้องการเพียงบรรทัดเดียวขัดจังหวะ

Debounce

เครื่องเข้ารหัสเชิงกลทั้งหมดได้รับผลกระทบจาก "การตีกลับ"

หากหน้าสัมผัสสวิตช์ไม่สร้าง/แตกหัก สถานะตรรกะจะสั่นอย่างรวดเร็วจากสูงเป็นต่ำจนกว่าหน้าสัมผัสสวิตช์จะตกลง ส่งผลให้นับเท็จ

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

ข้อเสียของแนวทางนี้คือ อาจพลาดการเปลี่ยนภาพหากเพลาตัวเข้ารหัสถูกหมุนอย่างรวดเร็ว

ซอฟต์แวร์เปิดตัว

วิธีนี้ใช้ตัวนับสองตัว (เปิด, ปิด) ที่ตั้งค่าเป็นศูนย์ [2]

เมื่อตรวจพบการเปลี่ยนแปลงในผู้ติดต่อ A:

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

รหัสจริง:

// ----- Debounce ติดต่อ A

ในขณะที่ (1) { ถ้า (digitalRead (ContactA)) { // ----- ContactA เปิดอยู่ ปิด = 0; // ตัวรวมตรงข้ามว่างเปล่า Open++; // รวมถ้า (เปิด > MaxCount) กลับสูง; } else { // ----- ContactA ถูกปิด Open = 0; // ว่างเปล่าตรงข้าม integrator Closed++; // Integrate ถ้า (ปิด > MaxCount) คืนค่า LOW; } }

ไม่จำเป็นต้องยกเลิก Contact B เนื่องจากการเปลี่ยน Contact A และ Contact B ไม่ตรงกัน

นับ

“การกักขัง” ทางกลจะเพิ่มการนับของคุณเป็นสองเท่าอย่างมีประสิทธิภาพเนื่องจากมีการลงทะเบียนการนับสองครั้งระหว่างการคลิก (ดูรูปที่ 1)

จำนวนของ “กักขัง” อาจถูกกำหนดโดยใช้เลขคณิตโมดูโล 2 ดังที่แสดงด้านล่าง

รหัสจริง:

// ----- นับ "กักขัง"

ถ้า (นับ % 2 == 0) { Serial.print ("จำนวน: "); Serial.println(จำนวน / 2); }

อ้างอิง

สามารถดูข้อมูลเพิ่มเติมได้ที่:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

ขั้นตอนที่ 4: ซอฟต์แวร์

โปรเจ็กต์นี้ต้องการ Ardino Uno R3 IDE เวอร์ชันล่าสุด (สภาพแวดล้อมการพัฒนาแบบรวม) ซึ่งหาได้จาก

ดาวน์โหลดสเก็ตช์ Arduino สองแบบต่อไปนี้ (แนบมาด้วย)

  • rotary_encoder_1.ino (เวอร์ชั่นโพล)
  • rotary_encoder_2.no (เวอร์ชันขัดจังหวะ)

ดับเบิลคลิกที่เวอร์ชันที่คุณต้องการและทำตามคำแนะนำบนหน้าจอ

สนุก …

คลิกที่นี่เพื่อดูคำแนะนำอื่น ๆ ของฉัน

แนะนำ: