أخيرًا ، توصلنا إلى نشر حزمة SDK الموعودة لمشروع OMower (منصة مفتوحة للبرمجيات والأجهزة للروبوتات ذات العجلات المستندة إلى وحدة تحكم ATSAM3X8E 32 بت مع دعم التطوير في Arduino IDE). مستوى إكمال البرنامج ليس جيدًا جدًا (على سبيل المثال ، لا توجد فئات لأجهزة استشعار الوفير والمطر والعشب ، وبعض الوظائف لا يتم تصحيحها بالكامل) ، ولكن حتى في شكلها الحالي يمكن للروبوت أن يقود بدقة عالية عبر RTK GPS ، فهو يدعم تقريبًا كل ما هو مطلوب من أجل المحشات - السونار ، المحيط السلكي ، البوصلة ونظام الملاحة GPS ، الشحن من محطة الشحن أو الألواح الشمسية.
مقالتي السابقة حول مشروع OMowerرمز SDK وملفات Kicad مع الدائرة وأسلاك اللوحة
تقع على جيثب .
لا يتم دعم سوى منصتين فقط - لوحة OMower v3 مع محركات محركات Polulu المزدوجة MC33926 ومجموعة من مشغلات المحركات Arduino Due + IHM12A1 (آلة اختبار على هيكل صغير بأربع عجلات). يمكن إضافة دعم Ardumower على أساس Arduino Due. من المستحسن للغاية أن يكون لديك لوحة IMU GY-80 ، بدونها ، لا يعمل التنقل ببساطة (على الرغم من أنه يمكنك إنشاء رجل جزازة بسيط يقود بدون قصد داخل محيط السلك).
في الإصدار الرابع الجديد من اللوحة ، من المخطط وضع IMU MPU9250 عليه وإضافة شريحة FRAM لحفظ إعدادات المستخدم غير الموجودة في الفلاش الداخلي لوحدة التحكم (والتي يتم إعادة ضبطها عند إعادة تحميل البرنامج الثابت) ، حسنًا ، يمكن تخزين جميع أنواع البطاقات فيه. أيضًا ، من المحتمل أن أقوم بزيادة أحجام مجموعات المقاوم والمكثفات ، حيث أن لحام 0402 "على الركبة" بمجفف شعر كان متعة أقل من المتوسط ، وزيادة المساحة للموصلات بحيث يمكنك وضع تلك التي تحتوي على مشابك ، وليس فقط دبابيس لاصقة.
تتم كتابة رمز API في شكل حفنة من الفئات (omower - *. H ملفات) تحتاج إلى تضمينها ككائنات في برنامجك (وبشكل اختياري ، تضمينها جميعًا ، يمكنك فقط أخذ تلك المطلوبة ، باستثناء الفئات الأساسية). لتبسيط الفهم والاختبار ، تمت
كتابة OMower_Simple ، والتي تنفذ مجموعة كبيرة إلى حد ما من الأوامر الصادرة عبر pfodApp من أي هاتف ذكي.
يتحكم SDK في جميع الوظائف ذات المستوى المنخفض ويعمل بشكل رئيسي على الانقطاعات ، مما يمنح مبرمج البرامج النهائي القدرة على كتابة البرامج بشكل مستقل عن التفاصيل المحددة لروبوت معين ، وبطريقة مجانية للغاية (يمكنك كتابة جهاز حالة ، أو يمكنك ببساطة استدعاء وظيفة بدء التشغيل وانتظر وصول الروبوت إلى النقطة المطلوبة). فقط إجراءات استدعاء وظائف التهيئة والتحكم في ركوب الروبوت تقع على عاتق المبرمج (تعليمات حول أين ، في الواقع ، للذهاب ومعالجة عمليات السونار وأجهزة الاستشعار الأخرى).
لتوصيل أجهزة خارجية إضافية على اللوحة (والدعم في SDK ، بالطبع) - هناك العديد من الموصلات الخارجية. على سبيل المثال ، يمكن لمحركات المؤازرة القياسية مع إدخال PPM توصيل ما يصل إلى أربع قطع (أو حتى ستة إذا رفضت محركين). هناك الكثير من أجهزة الاستشعار "القياسية" للجزازة ؛ هناك ما يصل إلى ستة من هذه السونارات ، وأربعة من أجهزة الاستشعار المحيطة. بالطبع ، في معظم الحالات ، ليس هناك حاجة إلى الكثير ويمكن استخدام جزء من موصلاتها لتوصيل بعض الأجهزة الأخرى (جميع مخرجات وحدة التحكم الدقيقة تقريبًا هي مخرجات). يتم تنفيذ الجزء الفكري (معالجة RTK GPS ، الاتصال مع wifi) بواسطة Orange PI Zero ، والذي يتم تثبيته في موصل خاص.
أعتذر مقدمًا عن المنحنى والرمز غير المكتمل في بعض الأماكن ، كان عليّ البحث في مشاريع أخرى ، وكشفت الكثير من جميع الصعوبات التي لم أتمكن من التعامل معها. لكنني تعلمت الكثير من الأشياء الجديدة ، على سبيل المثال ، أن انحناء القطع الناقص للأرض في أماكننا يبلغ 40 مترًا تقريبًا ، وتتجول أقطاب الأرض المغناطيسية على بعد عشرات الكيلومترات من عام لآخر (دون أخذ ذلك في الاعتبار ، ينتقل الروبوت من نقطة إلى أخرى بخطوط منحنية للغاية). في بعض الأحيان ، بدا لي أنني أقوم بإطلاق صاروخ فضائي ، وليس جز العشب. :)
حسنًا ، كمكافأة ، قمت أيضًا بتوضيح مصادر برنامجي الثابت لاردوينو مع Decawave DW1000 ، الذي ينظم شبكة صغيرة من هذه الأجهزة ويسمح للروبوت بتحديد موقعه في الداخل أو حيث لا يستطيع RTK GPS تحديد إحداثياته (مع دعم كمية لا حصر لها تقريبًا) العلامات وتقسيمها إلى غرف). لا يزال هذا
البرنامج الثابت خامًا جدًا ، ولكنه قد يكون مفيدًا لشخص ما.
تحديث ، قررت استكمال المقالة بقصة حول كيفية ترتيبها بالداخل:
يجب على مستخدم SDK تحديد جميع الكائنات التي يحتاجها ، واستدعاء وظيفة start () للجميع (تهيئة الأجهزة ، مرة واحدة فقط) ، ثم تعيين قيم معلماتها (بعد قراءتها من الفلاش أو القيم الافتراضية فقط) ، استدعاء init () للجميع (يمكن للوظيفة تُستخدم لإعادة ضبط الجهاز الذي يكون الكائن مسؤولاً عنه) ، وتعيين وظائف الخطاف لـ poll10 / poll20 / poll50 (10 و 20 و 50 مرة في الثانية) التي يجب من خلالها استدعاء وظائف الاستطلاع المقابلة * () لجميع الكائنات المستخدمة. من الناحية النظرية ، كان من الممكن أتمتة كل هذا في كود SDK نفسه ، لكنني قررت عدم القيام بذلك بسبب الاستهلاك الإضافي لموارد التحكم. مثال على الاستخدام الذي تحتاجه لإلقاء نظرة على OMower_Simple.ino
أحد الفئات الرئيسية هو كائن المحركات (omower-motors.h) ، الذي يتحكم في سائقي السيارات من وظيفته poll10 (). يقوم المستخدم ببساطة باستدعاء roll / move (الدوران والركوب بدون التنقل) أو rollCourse / moveCourse (الركوب مع التنقل / التصحيح بناءً على بيانات من كائن تابع لفئة التنقل التي تعطي ، من خلال وظائف readCourseError () ، قيمة الانحراف عن اتجاه القيادة المطلوب )
مشتقات navThing هي كائنات من فئات imu و GPS (omower-imu.h و omower-gps.h) ، الأول مسؤول عن قراءة وتحويل بيانات البوصلة / التسارع / الجيروسكوب إلى شكل مناسب (يعطي قيم البوصلة والإمالة بالدرجات على محورين ) الثاني - يعالج بيانات GPS ويوجه جسم المحركات في الاتجاه الصحيح إذا كنت بحاجة إلى القيادة بواسطة إحداثيات GPS أو RTK GPS (بالنسبة للأخير ، يتم حساب التصحيح عندما لا يتم وضع الهوائي في مركز جسم الروبوت والتصحيح قصير المدى بواسطة مستشعرات عداد المسافات). برنامج المستخدم مسؤول عن الاتصال بجهاز استقبال GPS نفسه وينقل سلاسل NMEA أو إحداثيات جاهزة إلى كائن GPS.
كائن جز (omower-mow.h) مسؤول عن محرك القص ورافعة المحرك بمحرك السائر (إن وجد). يقول المستخدم بأي سرعة تدور وما ارتفاع القطع المطلوب ضبطه.
يتحكم كائن pwmServo (omower-pwmservo.h) في مخرجات PWM-A / B / C / D / E / F / G / H (لا يمكن القيام بذلك من خلال مكتبات أخرى بسبب التعارضات المحتملة مع المؤقتات).
كائن الطاقة (omower-power.h) مسؤول عن التحكم في منظمات الشحن وتحويل قيم ADC إلى فولت وأمبيرات يفهمها الجميع. يجب أن يكتشف برنامج المستخدم حدوث الجهد على أقطاب الشحن ويستدعي وظيفة تشغيل الشحن ، ثم يلتقط دورات PWM للمنظمات لتتناسب مع تيار الشحن.
نظرًا لأن استخدام كائنات Arduin Serial * القياسية يمكن أن يقطع معالجة المقاطعة (انظر أدناه) ، فهناك كائن تسلسلي (omower-serial.h) لقراءة المنافذ التسلسلية ونقلها. لسوء الحظ ، توجد نفس المشكلة مع حافلات I2C ، ويجب استخدامها باستخدام الوظائف المحددة في block-i2c-blocking.h.
وظائف الكائنات الأخرى واضحة من أسمائها ، يمكنك فقط مشاهدة التعليقات في ملفات الرأس (omower-sonars.h ، omower-rtc.h ، omower-current * .h ، omower-odometry.h ، إلخ).
الآن عن المقاطعات في أدنى مستوى. يقوم كائن الهيكل (omower-chassis.h) بتكوين TIM7 بسرعة 100 مقاطعة في الثانية. في كل مقاطعة ، تتم قراءة 12 قناة من شريحة MAX11617 ADC (يتم إدخالها في صفيف خاص ، حيث تقرأ كائنات OMower SDK قيمها - max11617-adc-scan.h). في كل ثانية - يتم إنشاء مقاطعة ضعيفة لربط الدالة poll50 () ، في كل خامس - poll20 () ، في كل عاشر - poll10 (). كلهم يعملون بشكل غير متزامن (وهو أمر مناسب ، لكنه يفرض قيودًا على استخدام ناقل I2C ، وبعد ذلك أخطط لإضافة بعض المعاملات / الإشارات هناك).
تم ضبط مؤقت TIM5 أيضًا لإنشاء مقاطعات بتردد 38462 هرتز. من هذه المقاطعة ، تتم قراءة جميع قنوات وحدة تحكم ADC الداخلية وإدخالها في صفيف خاص (كما أنها تدعم إدخال كل قيمة مستلمة للمخزن المؤقت المحدد في المخزن المؤقت الحلقي ، والذي يتم ، على سبيل المثال ، بواسطة فئة المحيط ، وتصفية هذه العينات لاحقًا باستخدام تحويل فورييه).
توجد وظيفة debug () لإصدار معلومات تصحيح الأخطاء مع تعيين الحد الأدنى من الأولوية لإخراج الرسالة (أي ، أثناء عدم إجراء التصحيح ، لن يتم إخراج أي شيء إلى وحدة التحكم ، ولكن في أي وقت يمكنك تمكين الحد الأقصى على الأقل ، سيتم إرسال الرسائل غير المرغوب فيها). في تنسيقات قيم التصحيح (* تنسيق printf) ، يتم دعم أرقام الفاصلة العائمة (بخلاف وظائف Arduin القياسية).
تحديث: الإصدار الرابع الجديد من لوحة OMower ، حتى الآن فقط دائرة (في انتظار تصنيع ثنائي الفينيل متعدد الكلور). بالإضافة إلى ذلك ، يتضمن بوصلة / مقياس تسارع MPU9250 ، 128 كيلوبايت من F-RAM لحفظ الإعدادات والخرائط ونقاط الطرق وأشياء أخرى ، وجميع الموصلات المزودة بمزلاج (Molex 22-11-20x3 / 10-11-20x3 ، متوافقة مع الإصدار القديم من 2.54- دبابيس) ، 74HC4050 مترجم مستوى منطقي لأجهزة السونار وعدادات المسافات ، ومحولات طاقة أكثر قوة 3.3 / 5 فولت (حتى ثلاثة أمبير) ، ومخرجين آخرين PWM / PPM على الموصلات ، وخطوط منفصلة للتحكم المستقل في محرك السائر الثاني ، ومكثفات أكثر عازلة للاستقرار عناصر SMD كبيرة لسهولة التجميع تعديلات طفيفة.
