สารบัญ:

โซลูชั่น Arduino Rotary ที่สมบูรณ์: 5 ขั้นตอน
โซลูชั่น Arduino Rotary ที่สมบูรณ์: 5 ขั้นตอน

วีดีโอ: โซลูชั่น Arduino Rotary ที่สมบูรณ์: 5 ขั้นตอน

วีดีโอ: โซลูชั่น Arduino Rotary ที่สมบูรณ์: 5 ขั้นตอน
วีดีโอ: Rotary Encoder Incremental rotary Encoder How to use it with Arduino 2024, กรกฎาคม
Anonim
โซลูชั่น Arduino Rotary ที่สมบูรณ์
โซลูชั่น Arduino Rotary ที่สมบูรณ์

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

มีบทความมากมายเกี่ยวกับรายละเอียดการทำงานและโหมดการใช้งานของ Rotary encoders และโค้ดตัวอย่างมากมายและไลบรารีเกี่ยวกับวิธีการใช้งาน ปัญหาเดียวคือไม่มีใครทำงานได้อย่างถูกต้อง 100% กับโมดูลโรตารี่จีนช่วงราคาต่ำสุด

ขั้นตอนที่ 1: ตัวเข้ารหัสโรตารี่ Inside

ตัวเข้ารหัสโรตารี่ภายใน
ตัวเข้ารหัสโรตารี่ภายใน
ตัวเข้ารหัสโรตารี่ภายใน
ตัวเข้ารหัสโรตารี่ภายใน
ตัวเข้ารหัสโรตารี่ภายใน
ตัวเข้ารหัสโรตารี่ภายใน

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

ขั้นตอนที่ 2: ความทุกข์ยากที่ก่อให้เกิดความเจ็บปวดอย่างแท้จริงสำหรับหลาย ๆ คน

ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด
ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด
ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด
ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด
ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด
ความทุกข์ยากที่ทำให้หลายคนเจ็บปวด

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

ขั้นตอนที่ 3: โซลูชัน Finite State Machine (FSM)

ไฟไนต์สเตทแมชชีน (FSM) โซลูชั่น
ไฟไนต์สเตทแมชชีน (FSM) โซลูชั่น

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

ขั้นตอนที่ 4: รหัส Arduino

รหัส Arduino
รหัส Arduino

โค้ดด้านล่างนับการขีด FWD และ BWD บนจอภาพแบบอนุกรม และยังรวมฟังก์ชันสวิตช์เสริมอีกด้วย

// ปีเตอร์ เซอร์เกย์ 2019-04-10

// พินของโรตารีที่แมปกับพอร์ต Arduino

#define SW 21 #define CLK 22 #define DT 23

// ค่าปัจจุบันและค่าก่อนหน้าของตัวนับที่ปรับโดยการหมุน

int curVal = 0; int prevVal = 0;

// เจ็ดสถานะของ FSM (เครื่องสถานะ จำกัด)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

การตั้งค่าเป็นโมฆะ () {

Serial.begin(250000); Serial.println("เริ่ม…"); // ระดับ HIGH จะเป็นค่าเริ่มต้นสำหรับพิน pinMode ทั้งหมด (SW, INPUT_PULLUP); โหมดพิน (CLK, INPUT_PULLUP); โหมดพิน (DT, INPUT_PULLUP); // ทั้ง CLK และ DT จะทริกเกอร์การขัดจังหวะสำหรับการเปลี่ยนแปลงทุกระดับ AttachInterrupt(digitalPinToInterrupt(DT), rotaryDT, CHANGE); }

วงเป็นโมฆะ () {

// การจัดการสวิตช์เสริมที่รวมอยู่ในตัวเข้ารหัสแบบโรตารี่บางตัวหาก (digitalRead (SW) == LOW) { Serial.println ("Pressed"); ในขณะที่ (!digitalRead(SW)); } // การเปลี่ยนแปลงใดๆ ของค่าตัวนับจะแสดงใน Serial Monitor ถ้า (curVal != prevVal) { Serial.println (curVal); prevVal = curVal; } }

// สถานะการเปลี่ยนเครื่องสำหรับการเปลี่ยนแปลงระดับ CLK

ถือเป็นโมฆะ rotaryCLK() { if (digitalRead(CLK)==LOW) { if (state==IDLE_11) state = SCLK_01; อื่นถ้า (state==SCLK_10) สถานะ = SCLK_00; มิฉะนั้น ถ้า (state==SDT_10) สถานะ = SDT_00; } else { if (state==SCLK_01) state = IDLE_11; อื่นถ้า (state==SCLK_00) สถานะ = SCLK_10; อื่นถ้า (state==SDT_00) สถานะ = SDT_10; อื่นถ้า (รัฐ == SDT_01) { รัฐ = IDLE_11; เคิร์ฟ--; } } }

// สถานะการเปลี่ยนเครื่องสำหรับการเปลี่ยนแปลงระดับ DT

ถือเป็นโมฆะ rotaryDT () { ถ้า (digitalRead (DT) == LOW) { ถ้า (state == IDLE_11) สถานะ = SDT_10; อื่นถ้า (state==SDT_01) สถานะ = SDT_00; อื่นถ้า (state==SCLK_01) สถานะ = SCLK_00; } อื่น ๆ { if (state==SDT_10) state = IDLE_11; อื่นถ้า (state==SDT_00) สถานะ = SDT_01; อื่นถ้า (state==SCLK_00) สถานะ = SCLK_01; อื่นถ้า (รัฐ == SCLK_10) { รัฐ = IDLE_11; curVal++; } } }

ขั้นตอนที่ 5: การบูรณาการที่ไร้ที่ติ

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

แนะนำ: