جدول المحتويات:

حل دوار كامل من Arduino: 5 خطوات
حل دوار كامل من Arduino: 5 خطوات

فيديو: حل دوار كامل من Arduino: 5 خطوات

فيديو: حل دوار كامل من Arduino: 5 خطوات
فيديو: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, يوليو
Anonim
حل متكامل من Arduino Rotary
حل متكامل من Arduino Rotary

المشفرات الدوارة عبارة عن مقابض تحكم قابلة للدوران للمشاريع الإلكترونية ، وغالبًا ما تستخدم مع متحكمات عائلة Arduino. يمكن استخدامها لضبط المعلمات والتنقل بين القوائم وتحريك الكائنات على الشاشة وتعيين القيم من أي نوع. إنها بدائل شائعة لمقاييس الجهد ، لأنها يمكن تدويرها بشكل أكثر دقة وبشكل لا نهائي ، فهي تزيد أو تنقص قيمة منفصلة واحدة في كل مرة ، وغالبًا ما تتكامل مع مفتاح قابل للنفاذ لوظائف نوع التحديد. تأتي في جميع الأشكال والأحجام ، ولكن من الصعب التعامل مع أقل نطاق سعري كما هو موضح أدناه.

هناك عدد لا يحصى من المقالات حول تفاصيل العمل وأنماط الاستخدام لمشفرات الروتاري ، والعديد من نماذج الرموز والمكتبات حول كيفية استخدامها. المشكلة الوحيدة هي أن أيا منها لا يعمل بدقة 100٪ مع الوحدات الدوارة الصينية ذات النطاق السعري الأدنى.

الخطوة 1: التشفير الدوارة بالداخل

التشفير الدوارة بالداخل
التشفير الدوارة بالداخل
التشفير الدوارة بالداخل
التشفير الدوارة بالداخل
التشفير الدوارة بالداخل
التشفير الدوارة بالداخل

يحتوي الجزء الدوار من المشفر على ثلاثة دبابيس (واثنان آخران لجزء التبديل الاختياري). أحدهما أرضية مشتركة (أسود GND) ، والآخران لتحديد الاتجاه عند تدوير المقبض (غالبًا ما يطلق عليهما CLK الأزرق و DT الأحمر). كلاهما متصلان بدبوس إدخال PULLUP في وحدة التحكم الدقيقة ، مما يجعل المستوى مرتفعًا في القراءة الافتراضية. عندما يتم إدارة المقبض للأمام (أو في اتجاه عقارب الساعة) ، ينخفض CLK الأزرق أولاً إلى المستوى LOW ، ثم يتبعه DT الأحمر. بالعودة إلى أبعد من ذلك ، يرتفع CLK الأزرق مرة أخرى إلى HIGH ، ثم عندما يترك تصحيح GND المشترك كلا دبابيس التوصيل ، يرتفع DT الأحمر أيضًا إلى HIGH. وبالتالي إكمال علامة واحدة كاملة FWD (أو في اتجاه عقارب الساعة). نفس الشيء يسير في الاتجاه الآخر BWD (أو عكس اتجاه عقارب الساعة) ، ولكن الآن يسقط اللون الأحمر أولاً ، بينما يرتفع اللون الأزرق أخيرًا كما هو موضح في الصورتين على التوالي.

الخطوة الثانية: البؤس الذي يسبب الألم الحقيقي للكثيرين

البؤس الذي يسبب ألما حقيقيا للكثيرين
البؤس الذي يسبب ألما حقيقيا للكثيرين
البؤس الذي يسبب ألما حقيقيا للكثيرين
البؤس الذي يسبب ألما حقيقيا للكثيرين
البؤس الذي يسبب ألما حقيقيا للكثيرين
البؤس الذي يسبب ألما حقيقيا للكثيرين

مشكلة شائعة لهواة Arduino ، أن وحدات التشفير الدوارة الرخيصة ترتد تغييرات إضافية في مستويات الإخراج ، مما يتسبب في قراءات إضافية وخاطئة لعدد الاتجاهات. هذا يمنع العد الخالي من العيوب ويجعل من المستحيل دمج هذه الوحدات في مشاريع دوارة دقيقة. تحدث هذه الارتدادات الإضافية بسبب الحركات الميكانيكية للبقع الموجودة فوق دبابيس التوصيل ، وحتى استخدام المكثفات الإضافية لا يمكن إزالتها تمامًا. يمكن أن تظهر الارتدادات في أي مكان في دورات التجزئة الكاملة ، ويتم توضيحها من خلال سيناريوهات الحياة الحقيقية على الصور.

الخطوة 3: حل آلة الحالة المحدودة (FSM)

حل آلة الحالة المحدودة (FSM)
حل آلة الحالة المحدودة (FSM)

تُظهر الصورة مساحة الحالة الكاملة لتغييرات المستوى المحتملة للمسامرين (CLK الأزرق و DT الأحمر) ، لكل من الارتداد الصحيح والخطأ. بناءً على آلة الحالة هذه ، يمكن برمجة حل كامل يعمل دائمًا بدقة 100 ٪. نظرًا لعدم وجود تأخيرات في التصفية ضرورية في هذا الحل ، فهو أيضًا أسرع وقت ممكن. فائدة أخرى لفصل مساحة حالة المسامير عن وضع العمل هي أنه يمكن للمرء تطبيق كل من أوضاع الاقتراع أو المقاطعة حسب رغبته. يمكن أن يكتشف الاستقصاء أو المقاطعات تغييرات المستوى على المسامير وسيقوم الروتين المنفصل بحساب الحالة الجديدة بناءً على الحالة الحالية والأحداث الفعلية لتغييرات المستوى.

الخطوة 4: كود اردوينو

كود اردوينو
كود اردوينو

يحسب الكود أدناه علامات FWD و BWD على الشاشة التسلسلية ويدمج أيضًا وظيفة التبديل الاختيارية.

// بيتر كسورجاي 2019-04-10

// تم تعيين دبابيس الروتاري لمنافذ Arduino

# تعريف SW 21 # تعريف CLK 22 # تعريف DT 23

// القيمة الحالية والسابقة للعداد المضبوط بواسطة الدوار

انحناء كثافة العمليات = 0 ؛ int prevVal = 0 ؛

// سبع حالات من ولايات ميكرونيزيا الموحدة (آلة الحالة المحدودة)

#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) ؛ pinMode (CLK ، INPUT_PULLUP) ، pinMode (DT ، INPUT_PULLUP) ؛ // سيقوم كل من CLK و DT بتشغيل المقاطعات لجميع تغييرات المستوى attachInterrupt (digitalPinToInterrupt (CLK) أو rotaryCLK أو CHANGE) ؛ attachInterrupt (digitalPinToInterrupt (DT) ، rotaryDT ، أختر) ؛ }

حلقة فارغة() {

// معالجة المفتاح الاختياري المدمج في بعض المشفرات الدوارة إذا (digitalRead (SW) == LOW) {Serial.println ("Pressed") ؛ بينما (! digitalRead (SW)) ؛ } // يتم عرض أي تغيير في قيمة العداد في Serial Monitor إذا (curVal! = prevVal) {Serial.println (curVal)؛ prevVal = curVal ؛ }}

// انتقالات آلة الحالة لتغييرات مستوى CLK

دورة باطلة CLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01 ؛ وإلا إذا (state == SCLK_10) state = SCLK_00 ؛ وإلا إذا (state == SDT_10) state = SDT_00 ؛ } else {if (state == SCLK_01) state = IDLE_11 ؛ وإلا إذا (state == SCLK_00) state = SCLK_10 ؛ وإلا إذا (state == SDT_00) state = SDT_10 ؛ وإلا إذا (state == SDT_01) {state = IDLE_11 ؛ curVal-- ؛ }}}

// انتقالات آلة الحالة لتغييرات مستوى DT

rotaryDT () باطل {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10 ؛ وإلا إذا (state == SDT_01) state = SDT_00 ؛ وإلا إذا (state == SCLK_01) state = SCLK_00 ؛ } else {if (state == SDT_10) state = IDLE_11 ؛ وإلا إذا (state == SDT_00) state = SDT_01 ؛ وإلا إذا (state == SCLK_00) state = SCLK_01 ؛ وإلا إذا (state == SCLK_10) {state = IDLE_11 ؛ curVal ++ ؛ }}}

الخطوة الخامسة: تكامل لا تشوبه شائبة

يمكنك التحقق في الفيديو المرفق من أن حل FSM يعمل بدقة وسرعة حتى في حالة وجود أجهزة تشفير دوارة ذات نطاق منخفض مع تأثيرات ارتداد متفرقة متنوعة.

موصى به: