استمرار المقال حول كتابة البرامج الثابتة الخاصة بك لطابعة فوتوبوليمير LCD ثلاثية الأبعاد.
في هذا الجزء ، سأستمر في وصف مراحل مشروعي:
2. العمل باستخدام محرك أقراص فلاش USB وملفات عليه
3. التحكم في محرك متدرج لتحريك المنصة.
- الجزء الأول: 1. واجهة المستخدم.
- الجزء 2: 2. العمل مع نظام الملفات على محرك أقراص فلاش USB. 3. التحكم في محرك متدرج لحركة المنصة.
- الجزء 3: 4. عرض صور الطبقات على شاشة الإضاءة الخلفية. 5. كل شيء صغير ، مثل التحكم في الإضاءة والمراوح ، وتحميل وحفظ الإعدادات ، إلخ. 6. ميزات إضافية للراحة والملاءمة.
2. العمل باستخدام محرك أقراص فلاش USB والملفات الموجودة عليه
لم أعمل مطلقًا مع مضيف USB على ميكروكنترولر من قبل. كجهاز USB - لقد صنعت برنامجًا ثابتًا مع كل من فئة CDC (محاكاة منفذ COM) وفئة HID ، ولكنها لم تعمل مع المضيف. لذلك ، لتسريع العملية ، قمت بإنشاء كل تهيئة هذا الجهاز المحيطي في STM32CUBE. نتيجة لذلك ، حصلت على مضيف يعمل في وضع USB FS الذي يدعم أجهزة التخزين كبيرة السعة. في نفس المكعب ، قمت على الفور بتوصيل مكتبة FatFS للعمل مع نظام الملفات والملفات. ثم كان عليك فقط نسخ المصادر المستلمة في مشروعك ومعرفة كيفية العمل معها. اتضح أنه سهل وليس هناك الكثير لوصفه هنا. يحتوي ملف usb_host.c من كوبا على متغير عالمي Appli_state من النوع ApplicationTypeDef:
typedef enum {
APPLICATION_IDLE = 0,
APPLICATION_START,
APPLICATION_READY,
APPLICATION_DISCONNECT
}ApplicationTypeDef;
في أحداث مختلفة لطرف مضيف USB (في المقاطعات) ، يمكن أن يأخذ هذا المتغير إحدى الحالات المدرجة ، مما يشير إلى الحالة الحالية للمضيف. في الحلقة الرئيسية للبرنامج ، يبقى تتبع التغييرات في هذا المتغير والتفاعل وفقًا لذلك. على سبيل المثال ، إذا تغيرت قيمتها إلى APPLICATION_READY ، فإن محرك الأقراص المحمول أو قارئ البطاقات متصلان وتم تهيئتهما بنجاح ، يمكنك قراءة الملفات منهما.
لا توجد أيضًا صعوبات مع FatFS - يقوم Cube بالفعل بتكوينه بالكامل و "يتصل" بمضيف USB ، لذلك فور توصيل محرك الأقراص المحمول ، يمكنك الوصول إلى وظائف هذه المكتبة للعمل مع الملفات. صحيح أن المكعب المحدث حديثًا يتضمن مكتبة الإصدار القديم. بعد تحديث ملفاته إلى إصدار جديد ، اضطررت إلى إصلاح أسماء المعرفات من تكوين FatFS في بعض الأماكن في الكود المصدري الكوبي ، لأن لقد تغيروا في الإصدار الجديد. لكن التحديث لم يجلب أي مشاكل معينة ، كل شيء سار بسرعة وسهولة.
لكن لكي يعمل تطبيق FatFS مع السيريلية في أسماء الملفات والأدلة ، كان عليّ أن أتدخل قليلاً. لكي يقرأ FatFS الأسماء السيريلية بشكل صحيح ، تحتاج إلى تمكين Unicode في تكوينه ، وبعد ذلك يجب أن تكون جميع السلاسل المرتبطة بـ FatFS فقط في هذا الترميز - أسماء محركات الأقراص ، أسماء الملفات ، إلخ. في نفس الوقت ، يدعم محرر النصوص في IDE و FatFS Unicode بمواضع مختلفة من البايت العالي - أحدهما مع Little Endian والآخر مع Big Endian ، لذلك من المستحيل كتابة المصادر بنصوص Unicode. ولا أريد أن أكون صادقًا. كان ذلك عندما اضطررت إلى كتابة محولات من ANSI و UTF-8 إلى Unicode والعكس بالعكس ، بالإضافة إلى العديد من الوظائف للعمل مع سلاسل من ترميزات مختلفة في مجموعات مختلفة. على سبيل المثال ، انسخ سلسلة UTF-8 إلى سلسلة Unicode ، أو قم بإلحاق سلسلة ANSI بسلسلة Unicode. ومع ذلك ، يبدو أن سلاسل ANSI كذلكلم يبق في أي مكان ، تم تحويل جميع المصادر بالكامل إلى ترميز UTF-8.
لذا ، فإن فتح ملف باسم معين يبدو الآن على النحو التالي:
tstrcpy(u_tfname, UsbPath); // (Unicode) (Unicode)
tstrcat_utf(u_tfname, SDIR_IMAGES); // (Unicode) (UTF-8)
tstrcat_utf(u_tfname, (char*)"\\"); // (Unicode) (UTF-8)
tstrcat(u_tfname, fname); // (Unicode) (Unicode)
عندما كان كل شيء يعمل بسرعة ، أردت التحقق من سرعة قراءة الملفات من محرك أقراص فلاش. أظهرت قراءة ملف 10 ميجابايت في كتل 4 كيلوبايت أن سرعة حوالي 9 ميجابت في الثانية ، والتي ، بشكل عام ، كانت جيدة جدًا ومناسبة لي.
حاولت دراسة مسألة نقل هذه الحالة إلى DMA ، لكن اتضح أن الأجهزة الطرفية لمضيف USB ببساطة لا يمكنها الوصول إلى DMA. حسنًا ، أو لم أجده :) لذلك ، يبدو من المنطقي تنظيم جميع مخازن القراءة / الكتابة المؤقتة لملفات USB في CCM (Core Coupled Memory) - مساحة ذاكرة وصول عشوائي (RAM) بسعة 64 كيلوبايت لا تحتوي أيضًا على إخراج DMA. في نفس منطقة الذاكرة ، من المنطقي وضع المتغيرات / المصفوفات الأخرى التي لا تعمل مع DMA ، فقط لترك ذاكرة أكبر في ذاكرة الوصول العشوائي العادية. بالمناسبة ، بدا لي أن النواة نفسها تعمل مع هذه الذاكرة أسرع قليلاً من الذاكرة العادية.
2.1 واجهة مستخدم الملف
تعرض طابعة Anycubic Photon S التي أمتلكها قائمة بالملفات كرموز معاينة ، 4 لكل شاشة. ومن حيث المبدأ ، إنه مناسب تمامًا - يمكنك رؤية اسم الملف ، في صورة المعاينة ، يمكنك رؤية نوع النموذج تقريبًا. لذلك ، اتبعت نفس المسار - يتم عرض الملفات 4 قطع في كل صفحة في شكل معاينة الصور مع اسم الملف.
يتم رسم المجلد الأصفر المألوف على أيقونات الدليل ، ويتم رسم الترس على ملفات الإعدادات. يتم عرض فقط تلك الملفات التي يندرج الامتداد الخاص بها ضمن أحد الملفات المعروفة. حاليًا ، هذه هي ملفات .pws (ملفات أعدتها أداة تقطيع الشرائح للطباعة) وملفات .acfg (ملفات نصية بإعدادات الطابعة).
نظرًا لأن البرنامج الثابت يعمل أيضًا مع الدلائل التي يمكن للمستخدم إدخالها ، فقد وضعت سطرًا فوق قائمة الملفات التي تمت كتابة المسار الحالي فيها. تظهر الأزرار الخاصة بمغادرة الدليل الحالي أو التمرير لأسفل ولأعلى فقط عندما يكون لها معنى - أي عندما يمكنك ترك الدليل الحالي أو التمرير لأسفل أو لأعلى القائمة.
اقترح صديقي ، الذي عرضت عليه كل هذا أثناء كتابة البرنامج الثابت ، خيارًا آخر لإخراج الملفات - في شكل قائمة ، جدول. أولاً ، ثم يتم احتواء المزيد من الملفات في الصفحة ، وثانيًا ، يتم عرض القائمة بشكل أسرع ، حيث لا تحتاج إلى قراءة معاينة الصور من الملفات ورسمها مع تغيير الحجم على الشاشة ، وثالثًا ، في شكل جدولي ، يمكنك أيضًا العرض بالإضافة إلى الاسم والوقت الذي تم فيه آخر تعديل للملف ، والذي يكون أحيانًا مناسبًا جدًا. من الخطيئة رفض فكرة جيدة ، لذلك أضفت قائمة بالجدول ، وفي نفس الوقت زر للتبديل بين طريقتي عرض "الرمز" و "الجدول". يتم تمييز الدلائل في شكل جدول بخلفية صفراء ويتم كتابة السطر "DIR" بدلاً من time-date:
بالمناسبة ، ليس هناك دسيسة حول صور المعاينة التي يتم رسمها للملفات في وضع الرمز. لا يقوم البرنامج الثابت بتحليل الملف بأكمله لإنشاء صورة من نموذج ثلاثي الأبعاد ، كما يعتقد البعض :) يتم حفظ هذه الصورة في ملف الطباعة بواسطة أداة التقطيع نفسها ، بتنسيق مشابه لـ BMP - مجموعة من قيم الألوان 16 بت بكسل. يتم تخزين حجم صورة المعاينة في حقول خاصة داخل الملف. لذلك كل شيء بسيط للغاية.
الشيء الوحيد الذي يجب على البرنامج الثابت إجهاده هو تغيير حجم الصورة من الملف إلى حجم الرمز الموجود على الشاشة. يقوم البرنامج الثابت بإجراء القياس بطريقة بسيطة للغاية: يتم حساب عامل التحجيم k(الرقم الكسري) - يتم تقسيم عرض الصورة الأصلية على عرض منطقة الإخراج على الشاشة (يتم أيضًا حساب معامل الارتفاع ويتم أخذ أكبر القيمتين في العمل) ثم يتم أخذ وحدات البكسل والخطوط من الصورة الأصلية لعرضها على الشاشة بخطوة ك .
بهذه الطريقة ، يمكنك قياس كل من موجب وناقص. بطبيعة الحال ، فإن جودة النتيجة التي تم قياسها تترك الكثير مما هو مرغوب فيه ، حيث لا يتم إجراء أي استيفاء ، ولكن على مثل هذا العرض الصغير وغير عالي الجودة ، يكون الأمر غير محسوس ، لكن سرعة هذه الخوارزمية عالية جدًا.
عند النقر فوق رمز أو سطر ملف .pws ، يتم فتح شاشة لعرض معلومات حول الملف مع إمكانية بدء طباعته. إذا تم النقر فوق ملف .acfg ، فسيُطلب من المستخدم تحميل الإعدادات من هذا الملف. حسنًا ، إذا تم الضغط على دليل ، فسيصبح حاليًا ويتم تحديث قائمة الملفات.
2.2 عرض معلومات الملف قبل الطباعة
كما لاحظت بشكل صحيح في التعليقات على الجزء السابق ، ليس لدى Anycubic أي معلومات حول الملف عند تحديده. تظهر الأزرار لبدء الطباعة وحذفها فقط. وهذا غير مريح للغاية - لمعرفة وقت الطباعة المقدر ، أو عدد الطبقات ، أو معلمات أخرى لهذا الملف ، تحتاج إلى البدء في طباعته. قررت عدم تكرار هذا العيب ، وعندما أنقر على ملف القطع ، تفتح شاشة تحتوي على أكثر المعلومات اكتمالاً حول هذا العيب:
اسم الملف وحجمه ووقت آخر تعديل وجميع معلمات الطباعة تقريبًا. هنا ، ومع ذلك ، فإن حقيقة أن شاشة MKS DLP لها دقة 480x320 في يدي ، في حين أن Enikubiks لديها شاشة أصغر - 320x240 ، في هذه الشاشة لا يمكنك التأرجح مع مجموعة من النصوص.
2.2.1 سأكتب بشكل منفصل بخصوص حساب وقت الطباعة.
لا يتم تخزين هذا المؤشر في الملف ، على عكس جميع المعلمات الأخرى. يجب أن تحسب طابعه بشكل مستقل ، بناءً على المعلومات التي يعرفها. نفس Anycubic Photon S لديه عادة التجاوز مع هذا الحساب ، ولأسفل - على سبيل المثال ، يعد بـ 5 ساعات من الطباعة ، بينما في الواقع يطبع 6 ساعات. وتتغير Longer Orange 30 هذه المرة ذهابًا وإيابًا مرتين تقريبًا أثناء الطباعة. قررت تناول هذه النقطة بعناية قدر الإمكان. مما تتكون هذه المرة؟- الوقت الذي يستغرقه النظام الأساسي للنزول بسرعة معينة إلى ارتفاع الطبقة التالية.
- وقت الإيقاف المؤقت قبل بدء التعريض الضوئي.
- وقت تعرض الطبقة.
- الوقت الذي تستغرقه المنصة للارتفاع إلى ارتفاع معين بسرعة معينة بعد تعرض الطبقة.
يتم تلخيص هذه المعلمات الأربعة ، مضروبة في عدد الطبقات ويتم الحصول على إجمالي وقت الطباعة. إذا كان كل شيء أساسيًا مع أوقات التوقف والتوهج - يتم صيانتها بدقة ملي ثانية ، ولكن مع حركة النظام الأساسي ، يكون كل شيء بالفعل أكثر تعقيدًا.
النظام الأساسي لا يلتقط السرعة المحددة على الفور ، بل لديه بعض التسارع ، والذي تم ضبطه في الإعدادات. علاوة على ذلك ، عند الطباعة ، يعد هذا تسارعًا ضئيلًا إلى حد ما ، حيث يجب أن تبدأ المنصة في الارتفاع بسلاسة شديدة بحيث تخرج آخر طبقة تمت معالجتها دون ألم من الفيلم الموجود في قاع الحمام (نعم ، يلتصق البوليمر بالفيلم أيضًا ، لسوء الحظ).
اتضح أن حركة المنصة تتكون من ثلاثة مكونات - التسارع حتى الوصول إلى سرعة معينة ، والحركة المنتظمة بسرعة معينة ، والتباطؤ إلى التوقف الكامل. وهنا تبدأ الخيارات - على سبيل المثال ، لا يسمح التسارع المحدد وارتفاع الرفع للمنصة بالوصول إلى السرعة المحددة ، فهي لا تزال تتسارع في الوقت الذي تحتاج فيه بالفعل إلى البدء في التباطؤ من أجل التوقف عند الارتفاع المحدد. أو أن التسارع والارتفاع كافيان للمنصة لتسريع السرعة المحددة والسير في جزء من المسار في حركة ثابتة قبل البدء في التباطؤ. نحن بحاجة إلى التحقق من كل هذا ، وحساب الأوقات والمسافات لكل مكون.
لأكون صريحًا ، كان رأسي يدور عندما كتبت الوظيفة لحساب وقت الطباعة :) ونتيجة لذلك ما زلت أواجه خطأ بسيطًا. على سبيل المثال ، وقت الطباعة الفعلي هو 07:43:30 بدلاً من 07:34:32 المقدر.
أو 05:48:43 بدلاً من 05:43:23 المحسوبة.
لكن هذا الخطأ يناسبني من حيث المبدأ. حاولت العثور على خطأ في الحسابات ، ولكن يبدو أن كل شيء صحيح هناك. على الأرجح ، لا يتوافق التسارع الفعلي بشكل طفيف مع التسارع المحدد بسبب خصائص التحكم في محرك السائر. بسلاسة وصلنا إلى المرحلة التالية :)
3. التحكم في محرك متدرج لحركة المنصة.
في البداية كان لدي فكرة لكتابة التحكم في محرك السائر الخاص بي. ليس الأمر صعبًا على الإطلاق ، وجود سائق عادي على اللوحة - اضبط اتجاه الدوران على دبوس واحد وقاد نبضات الخطوات إلى الدبوس الآخر. تحتاج إلى الدوران بسرعة - ترفع تردد النبض ، وتحتاج إلى التدوير ببطء - تقوم بتقليله.
لكن عندما بدأت في تناول هذه المشكلة بشكل أكثر تحديدًا ، أدركت أن بساطتها مخادعة. لا ، يمكنك كتابة ما تريد ، وسوف تنجح ، لكن الكتابة بطريقة تعمل بشكل جيد مهمة كبيرة إلى حد ما. لا تحب المحركات السائر المخالفات في الخطوات كثيرًا ، لذلك من الضروري ضمان التوحيد الجيد لنبضات الخطوة في نطاق تردد عريض إلى حد ما - من بضع هرتز إلى عشرات الكيلو هرتز. من الضروري ضمان زيادة ونقصان سلسان في وتيرة النبضات من أجل التسارع والتباطؤ. من الضروري حساب النبضات المتولدة بدقة من أجل ضمان معرفة المكان الذي توجد فيه المنصة الآن. من الضروري حساب عدد النبضات وفترة تغيير ترددها في فترة زمنية محددة بدقة من أجل توفير التسارع المطلوب.
وباختصار ، فإن المهمة ، على الرغم من إمكانية تنفيذها ، ضخمة جدًا جدًا ، وقد تستغرق أكثر من يوم واحد. لذلك قررت سحب وظائف إدارة المحرك من Marlin . اعتقدت أنه سيكون سهلاً ...
أولاً ، أخذت ملف stepper.cpp من مصادر Marlin - التحكم مباشرة في محرك السائر. ومع ذلك ، اتضح أن عمله يعتمد بشكل كبير على مخطط الحركة من ملف planner.cpp ، لذلك كان علي أن آخذه أيضًا. حسنًا ، إلى الكومة ، أخذت أيضًا ملف endstops.cpp من هناك - معالجة مفاتيح حد المحور ، لأنني ما زلت بحاجة إلى معالجة الأحداث منها ، وهنا كان المجدول والتحكم في المحرك مرتبطين بالفعل بهذا الملف لمفاتيح الحد.
لقد قضيت وقتًا طويلاً جدًا في محاولة إزالة جميع الملفات غير الضرورية من هذه الملفات وفك ربطها ببقية نظام Marlin البيئي. الحقيقة هي أن مارلين يتم شحذها تحت سيطرة 6 أو 7 خطوات في نفس الوقت ، في حين أن عملهم قد يعتمد على درجة حرارة العديد من السخانات ، على معايير البلاستيك ، إلخ. النظام معقد حقًا هناك. اضطررت إلى إجراء الكثير من الإعادة ، بشكل أساسي إزالة المحاور غير الضرورية وأجهزة البثق غير الضرورية والتخلص من مجموعة كاملة من وحدات الماكرو التي كانت مفيدة في الإصدار الأصلي ، ولكنها مزعجة للغاية بالنسبة لي. فقط للفهم - تم تقليل حجم المصادر التي أخذتها من Marlin من 346 كيلوبايت إلى 121 كيلوبايت. وكان لابد من حذف كل سطر بحذر.
بطبيعة الحال ، في عملية هذا التقليم الصعب ، تعمقت قليلاً في عمل النظام بأكمله ، كيف يعمل. لتحريك المحور ، يتم نقل الموضع المستهدف للمحور إلى المجدول من خلال إحدى وظائفه (يتم تخزين الموضع الحالي بواسطة المجدول). يحسب المجدول عدد الخطوات ومعلماتها للتسريع وحركة الخط المستقيم والتباطؤ ويشكل من هذه البيانات حزمة بيانات خاصة لوظيفة التحكم المباشر في المحرك (السائر). يمكن أن يكون هناك العديد من هذه الحزم ، يقوم المجدول بحساب وإنشاء حزمة جديدة تالية لكل مهمة جديدة.
يطلب Stepper ، الذي يعمل في مقاطعة مؤقت ، في حالة مجانية ، حزمة البيانات التالية من المجدول. إذا كان المجدول لديه حزمة معدة ، فإنه يعطيها بعيدًا ويعتبرها منتهية. يأخذ Stepper الحزمة المستلمة إلى العمل ويبدأ في عمل خطوات المحرك وفقًا للبيانات الواردة منه. حتى اكتمالها ، لا يتم طلب الحزمة التالية.
ما يثير الفضول في تطبيقه في السائر هو أنه عند السرعات المنخفضة يصدر نبضة خطوة واحدة في كل مقاطعة ، مع ضبط المؤقت بحيث تحدث المقاطعة التالية بعد الفترة الزمنية المطلوبة. عندما يتجاوز معدل الخطوة المطلوب قيمة معينة ، يبدأ السائر في إصدار عدة خطوات في كل مقاطعة. في الوقت نفسه ، يتم اختيار جميع التوقيتات بشكل جيد بحيث يكون توحيد الخطوات جيدًا جدًا ، من أجل الفضول نظرت إلى الذبذبات.
يعرف المجدول أيضًا كيفية "ربط" الحزم المجاورة. ماذا يعني هذا: إذا كان المجدول لديه بالفعل حزمة معدة للسائق ثم تأتي مهمة جديدة إليه ، فإنه يقوم بتشكيل الحزمة التالية وتغيير الحزمة السابقة بحيث يتم الحصول على حركة سلسة واحدة نتيجة المعالجة المتسلسلة لهاتين الحزمتين بواسطة السائر.
اسمحوا لي أن أشرح بمثال. المخطط مجاني ، يتلقى مهمة لتحريك المحور للأمام بمقدار 20 مم بسرعة 30 مم / ثانية. يولد المخطط الحزمة الأولى ، التي يصف فيها التسارع من صفر إلى 30 مم / ثانية ، وحركة الخط المستقيم بهذه السرعة والتباطؤ من هذه السرعة إلى الصفر. إذا ، قبل أن يأخذ السائر هذه الحزمة من المجدول ، يتم تكليف المجدول بمهمة جديدة لتحريك هذا المحور بمقدار 50 مم إلى الأمام ، ولكن بسرعة 40 مم / ثانية ، فلن يقوم المجدول فقط بإنشاء حزمة جديدة مع تسريع من الصفر ، ولكن يغير الحزمة الأولى عن طريق إزالة التباطؤ وتوسيع حركة الخط المستقيم بمسافتها ، وفي الحزمة الثانية التي تم إنشاؤها ، لن يبدأ التسارع من الصفر ، ولكن من سرعة الحزمة السابقة.
ستكون النتيجة حركة واحدة يتسارع فيها المحور إلى 30 مم / ثانية ، ويتحرك 20 مم ، ثم يتسارع مرة أخرى إلى 40 مم / ثانية ويقطع 50 مم أخرى ، ويتباطأ إلى الصفر في النهاية. ولكن هذا فقط إذا لم يتمكن السائر من التقاط الحزمة السابقة ، وإلا ستتم معالجة هاتين المهمتين كحركتين منفصلتين مع صفر سرعة أولية ونهائية في كل منهما. لذلك ، بالمناسبة ، في الطابعات ذات التحكم اليدوي في المنصة ، إذا ضغطت على المصعد عدة مرات متتالية بزيادات 10 مم ، ستتوقف المنصة بعد أول رفع 10 مم ثم تستمر في التحرك دون التوقف إلى الارتفاع الكامل بالنقر فوق الزر.
في الإصدار الجديد من Marlin ، ظهر بالفعل علاج ضد مثل هذه الحركة "المتشنجة" - الآن لا يعطي المجدول حزمة الخطوة لفترة معينة بعد تشكيلها إذا كانت هذه الحزمة هي الوحيدة الجاهزة. يتم تخصيص هذا الوقت للانتظار - هل ستصل المهمة التالية حتى تتمكن من تثبيتها بالمهمة الحالية.
3.1 واجهة التحكم في حركة المنصة
هنا ، بشكل عام ، كل شيء قياسي ومألوف لطابعات فوتوبوليمير. في الأعلى تحديد خطوة حركة المحور ، وعلى اليمين توجد الأزرار لتحريك المحور لأعلى أو لأسفل بالخطوة المحددة.
يتم استخدام زر "الصفحة الرئيسية" لإلغاء المنصة (وقوف السيارات ، المنزل) ، عند الضغط عليه ، تبدأ المنصة في التحرك نحو مفتاح حد "المنزل". بعد الوصول إليها ، تتوقف المنصة ، وتتحرك للخلف قليلاً ثم ببطء (لمزيد من الدقة) تعمل في مفتاح الحد. بعد ذلك ، تعرف البرامج الثابتة بالتأكيد ارتفاع الرفع الحالي للمنصة.
زر "تعيين" يتم استخدام Z = 0 "لمعايرة ارتفاع المنصة فوق الشاشة. يتم استخدام نظام المعايرة هذا ، على سبيل المثال ، في طابعات Anycubic ، عندما تكون نقطة الصفر للمنصة (ارتفاعها الأمثل فوق الشاشة) أقل من 1-2 مم من تشغيل مفتاح حد "المنزل". ويبدو لي أن نظام المعايرة هذا أكثر صحة من الأنظمة التي أصبحت شائعة مؤخرًا ، عندما يكون ارتفاع تشغيل مفتاح الحد في نفس الوقت الارتفاع الصفري للمنصة.
حسنًا ، الزر الأخير هو "توقف!" هو وقف فوري وغير مشروط لحركة المنصة. بالمناسبة ، أثناء تشغيل النظام الأساسي ، لا يمكنك مغادرة هذه الشاشة ، ولن يعمل زر "رجوع". يتم ذلك فقط بحيث يكون زر الإيقاف متاحًا على الفور أثناء تحرك المنصة.
3.2 نقاط أخرى حول حركة المنصة
هناك العديد من الأشياء التي تزعجني بشكل رهيب في Anycubic Photon.
الأول هو لماذا تحدث الحركة اليدوية للمنصة بنفس تسارع الحلزون كما في وضع الطباعة؟ عند الكتابة ، يكون مثل هذا التسارع الصغير مفيدًا ، ولكن عند التحكم يدويًا في المحور ، فإنه يتسارع لمدة ثانيتين - إنه مجرد كابوس. وسرعة الحركة كذلك.
النقطة الثانية - لماذا ، عند إيقاف الطباعة مؤقتًا ، ترتفع المنصة إلى ذروة الإيقاف المؤقت بالسرعة المحددة في معلمات الطباعة؟ الجحيم ، الانتظار لمدة 15 ثانية حتى ترتفع المنصة سنتيمترين (فقط) هو أمر غير جيد. لكن شكرا على النهوض. في Orange 30 ، لا يعني التوقف المؤقت رفع المنصة ولو بمقدار ملليمتر ، لذلك ليس من الواضح سبب وجودها على الإطلاق.
واللحظة الثالثة ، التي تثير غضبًا - بعد انتهاء الطباعة ، ترتفع المنصة إلى القمة. بنفس السرعة التي تم تحديدها في معلمات الطباعة - 1 مم / ثانية. يستغرق الصعود من ارتفاع 5 سم 100 ثانية!
لذلك ، في البرنامج الثابت الخاص بي ، قمت بإجراء سرعات وتسارعات قابلة للتعديل بشكل منفصل لوضع الطباعة وبشكل منفصل للتحكم اليدوي في المنصة. لكن مع حدين:
- حتى يتم إعادة ضبط المحور بواسطة زر الصفحة الرئيسية ، سيتم تقليل سرعة السفر بمقدار ثلاث مرات. هذا لأنه في حين أن الطابعة لا تعرف بالضبط ارتفاع المنصة الحالية ، فهناك خطر سحق الشاشة دون أن يكون لديك وقت للتوقف عند السرعة العالية (القصور الذاتي ، هكذا) أو إتلاف محور المحور العلوي. بعد وضع الصفر على المحور ، تعرف الطابعة بالفعل بالضبط موضع النظام الأساسي وتدخل حدود ارتفاع البرنامج حيز التنفيذ ، والتي يتم تعيينها أيضًا في الإعدادات.
- عند ارتفاع أقل من 30 مم ، يتم تقليل السرعة أيضًا بمقدار ثلاث مرات ، بغض النظر عما إذا كان المحور صفريًا أم لا. هذا لمنع فوتوبوليمير من الرش خارج الحمام عندما يتم إنزال المنصة بسرعة كبيرة فيه. أو عند الخروج منه بسرعة كبيرة.
بالطبع ، هناك معلمات محور قياسية أخرى في الإعدادات - عدد الخطوات لكل 1 مم ، واتجاه الحركة ، وعمل مفاتيح الحد ، إلخ. إذا كان أي شخص مهتمًا ، فهناك ملف تكوين نصي يحتوي على جميع المعلمات المدعومة تحت المفسد. يتم تناول مثل هذا الملف بامتداد .acfg بواسطة البرامج الثابتة مباشرة من قائمة الملفات ، وتحميل المعلمات ، وحفظها في EPROM وتطبيقها على الفور ، دون إعادة التشغيل:
تكوين محتوى ملف
# Stepper motor Z axis settings
[ZMotor]
# .
# : 0 1. : 1.
# .
invert_dir = 1
# .
# : -1 1. : -1.
# -1,
# , . 1
# .
home_direction = -1
# Z . ,
# 0, - .
home_pos = 0.0
# .
# : -32000.0 32000.0.
# : -3.0
# .
# , .
min_pos = -3.0
# .
# : -32000.0 32000.0.
# : 180.0
# .
# , .
max_pos = 180.0
# .
# : 0 1. : 1.
# ,
# 1, - 0.
min_endstop_inverting = 1
# .
# : 0 1. : 1.
# ,
# 1, - 0.
max_endstop_inverting = 1
# 1 .
steps_per_mm = 1600
# ,
# , /. : 6.0.
homing_feedrate_fast = 6.0
# ,
# , /. : 1.0.
homing_feedrate_slow = 1.0
# , /2.
acceleration = 0.7
# , /.
feedrate = 5.0
# ( ,
# ..), /2.
travel_acceleration = 25.0
# ( ,
# ..), /. 30
# ,
# 5 /.
travel_feedrate = 25.0
# , .
current_vref = 800.0
# , .
current_hold_vref = 300.0
# ,
# . . 0
# .
hold_time = 30.0
# ,
# . .
# hold_time. 0 .
# , .
off_time = 10.0
# General settings
[General]
# (0.001 )
# .
# : 0 15000. : 700 (0.7 ).
buzzer_msg_duration = 700
# (0.001 )
# , .
# : 0 15000. : 70 (0.07 ).
buzzer_touch_duration = 70
# 180 .
# .
# : 0 1. : 0.
rotate_display = 0
# , .
# LCD-. -
# .
# : 0 15000. : 10. 0 .
screensaver_time = 10
وبهذا سأنتهي من هذا الجزء ، وهناك بالفعل الكثير من النصوص :)
كما في السابق ، سأكون سعيدًا بالإجابة على الأسئلة وقبول التعليقات.
- الجزء الأول: 1. واجهة المستخدم.
- الجزء 2: 2. العمل مع نظام الملفات على محرك أقراص فلاش USB. 3. التحكم في محرك متدرج لحركة المنصة.
- الجزء 3: 4. عرض صور الطبقات على شاشة الإضاءة الخلفية. 5. كل شيء صغير ، مثل التحكم في الإضاءة والمراوح ، وتحميل وحفظ الإعدادات ، إلخ. 6. ميزات إضافية للراحة والملاءمة.
الروابط
مجموعة MKS DLP على
مصادر البرامج الثابتة الأصلية من Aliexpress من الشركة المصنعة في
مخططات GitHub من الشركة المصنعة لنسختين من اللوحة على GitHub
مصادري على GitHub