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

[WIP] إنشاء Drawbot يتحكم فيه Myo Armband: 11 خطوة
[WIP] إنشاء Drawbot يتحكم فيه Myo Armband: 11 خطوة

فيديو: [WIP] إنشاء Drawbot يتحكم فيه Myo Armband: 11 خطوة

فيديو: [WIP] إنشاء Drawbot يتحكم فيه Myo Armband: 11 خطوة
فيديو: Дизель Шоу – 94 НОВЫЙ ВЫПУСК – 28.05.2021 | ЮМОР ICTV 2024, يوليو
Anonim
[WIP] إنشاء Drawbot يتحكم فيه Myo Armband
[WIP] إنشاء Drawbot يتحكم فيه Myo Armband

اهلا جميعا!

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

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

  1. البرمجة من Myo إلى المحركات ، من خلال Arduino
  2. التصميم الكهربائي لترجمة بياناتنا إلى حركة
  3. تصميم ميكانيكي لإنشاء إطار بحجم معقول يسهل حركتنا

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

الخطوة الأولى: ما خططنا للقيام به

Image
Image

كان هدفنا هو الجمع بين هذين المنتجين بطريقة لم نشهد استخدامها من قبل. شرعنا في إجراء ترحيل مباشر بين شارة Myo ونسختنا الخاصة من تصميم مستوحى من AxiDraw من Evil Mad Scientist.

الخطوة 2: النموذج الأولي لقائمة المكونات

2 × 4 ألواح خشبية 1 حزام أو سلسلة قياس> = 65 بوصة 4 مسامير خشبية 3 تروس بأسنان تناسب الحزام أو السلسلة 4 ألواح مثقبة 3 × 8 فيكس 30 بوصة فواصل مطاطية 8 1 بوصة قطرها 1 بوصة خشبية وتد 1 'طويل 8 براغي Vex 1”8” براغي Vex 8 2”براغي Vex 8” فواصل مطاطية 48 صواميل Vex 1 ربطة سحاب صغيرة

الخطوة 3: [نموذج أولي] النجارة أذرعنا وداخل عربة النقل

[نموذج أولي] النجارة أذرعنا وداخل عربة النقل
[نموذج أولي] النجارة أذرعنا وداخل عربة النقل

لقد التقطنا قطعتين 2 × 4 وقمنا بتقطيعهما إلى أطوال متساوية (33 ¼ )

باستخدام منشار طاولة ، قمنا بعمل شق على طول الجانب الضيق من الألواح "عميقًا و" عرضًا في المنتصف

قطع وتد إلى 4 2 "قطع وحفر حفرة في منتصف وتد حوالي ¼" في القطر باستخدام مكبس الحفر

الخطوة 4: [نموذج أولي] صنع عربتنا

[نموذج أولي] صنع عربتنا
[نموذج أولي] صنع عربتنا
[نموذج أولي] صنع عربتنا
[نموذج أولي] صنع عربتنا
[نموذج أولي] صنع عربتنا
[نموذج أولي] صنع عربتنا

من الناحية المثالية ، سنستخدم قطعتين من الفولاذ المثقوب مقاس 7 × 7 ولكن كل ما كان متاحًا لنا هو الشرائط 2 × 7 لذا قمنا بتثبيتها معًا في تكوين "X"

قم بتكويم 5 من الفواصل المطاطية مقاس بوصة وثبّت زوايا الألواح الزائدة ببعضها البعض

قم بتثبيت المسامير الخشبية بشكل غير محكم كما هو موضح في الشكل 1 بحيث تدور بحرية مع وجود مسافة 2 بوصة بينها ، استخدم الصورة لمعرفة المكان الذي يجب أن توضع فيه التروس في هذه المرحلة ، استخدمنا الغسالات ولكننا اكتشفنا لاحقًا أن التروس البلاستيكية الدقيقة تعمل بشكل أفضل.

باستخدام المسامير اللولبية ½ "vex screw ،" الفواصل المطاطية والغسالات ذات القطر 1 بوصة تؤمن الغسالات في وضع مرتفع كما هو موضح في الشكل 1 (استخدمنا تروس بلاستيكية خضراء لأننا لم نتمكن من العثور على الغسالات الصحيحة) تأكد من أن الغسالات قادرة لتدور بسهولة وتتناسب مع حزوز اللوحة.

الخطوة 5: [نموذج أولي] وضع كل ذلك معًا

[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا
[نموذج أولي] وضع كل ذلك معًا

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

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

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

الخطوة 6: [نموذج أولي] منتهي ومتحرك

Image
Image

يجب أن يكون الأمر كذلك ، اسحب الحزام في مجموعات مختلفة وشاهد التأثيرات المختلفة له على الذراع!

الخطوة السابعة: ترجمة نموذجنا إلى تصميمنا النهائي

ترجمة نموذجنا إلى تصميمنا النهائي
ترجمة نموذجنا إلى تصميمنا النهائي
ترجمة نموذجنا إلى تصميمنا النهائي
ترجمة نموذجنا إلى تصميمنا النهائي

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

  1. مقياس

    1. كان نموذجنا الأولي ضخمًا وغير عملي ، مما جعله عرضة للانقلاب على حافة أذرعنا
    2. كانت العربة أكبر بكثير من اللازم ، وكان بها الكثير من المساحات الضائعة
    3. كان حزامنا (مداس خزان vex) أكبر بكثير من اللازم ، مما أدى إلى توفير مساحة زائدة بين الذراعين
  2. احتكاك

    1. لم يمر معالجنا المطاطي فوق بكرات المسامير الخشبية بسهولة في جميع النقاط
    2. جعل البلاستيك الموجود على الخشب العربة غير راغبة في الحركة في كثير من الحالات
  3. المكننة

    كنا بحاجة إلى جعل النظام قادرًا على توفير الطاقة

مع وضع هذه الأشياء في الاعتبار ، رسمنا خططنا للتصميم النهائي. أردنا التحكم في روبوت السحب باستخدام Myo عبر اردوينو ، وأردنا أن نجعل الإطار من الألومنيوم وأصغر حجمًا.

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

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

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

الخطوة 8: البرمجة

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

1. الحصول على البيانات من Myo (lua)

كنت أعلم أنني بحاجة إلى اكتشاف طريقة لجمع المعلومات من Myo. كان هذا هو الجزء الأول من التحدي الذي أردت التعامل معه. للقيام بذلك ، أردت أن أجعل المستخدم يعاير حجم قماشه قبل البدء في الرسم. سيسمح لي هذا بالحصول على حد للعمل منه. يمكنني بعد ذلك تطبيع البرنامج بين مستخدمين مختلفين عن طريق أخذ نسبة مئوية من الحد الأقصى للقماش كنقاط بياناتي لتمريرها. قررت أن يكون لدي حدث مكتوب من شأنه أن يقوم بفحص getOrientation كل نصف ثانية ، لأنه سيسمح للشيكات بعدم إجراء قفزة جامحة قد تحتاج إلى التخمين منها (على سبيل المثال ، إذا كان المستخدم يتأرجح بشدة و إيابا).

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

في هذا الوقت من التصميم تقريبًا ، بدأ العمل على الجانب الكهربائي ، وعلقت العمل في هذا الجانب من الكود. الهدف هو معرفة كيفية تفاعل محركاتنا مع اردوينو.

2. العمل حول Arduino (C ++)

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

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

الخطوة 9: الكهرباء

Image
Image
الكهرباء
الكهرباء

بينما كنت قد أخذت فصلًا في الإلكترونيات في الماضي ، وعملت بقدر لا بأس به مع اردوينو. لم أتعمق أبدًا في جعل اردوينو يتلقى معلومات من مصدر خارجي (myo) ، لدي خبرة فقط في إخراج المعلومات من خلال اردوينو. ومع ذلك ، فقد أخذت أسالك المحركات على روبوت السحب الخاص بنا ، وأعمل على كود لهم ليكونوا قادرين على العمل مع كود myo.

المواد التي استخدمتها:

2 × محركات متدرجة

1 × اللوح

1 × أردوينو (أونو)

عدد 2 سائق IC L293DE

40 × أسلاك توصيل

عدد 2 مراوح

1. توصيل محركات السائر والمروحة بلوحة التوصيل

باتباع مخطط الدائرة ، يمكننا توصيل محرك متدرج واحد للسائق على اللوح. بعد ذلك ، باتباع نفس الرسم البياني ، قم بتطبيق ذلك على المحرك الثاني والمحرك ، ومع ذلك ، يجب توصيل أسلاك العبور بمجموعة مختلفة من المسامير في اردوينو (نظرًا لأن المحرك الأول يشغل مساحة 4 آخرين).

تحذير / نصيحة:

المشغلات صغيرة جدًا والدبابيس قريبة جدًا من بعضها. سيكون من الحكمة أن تباعد بين السائقين حتى لا تتشوش الأسلاك.

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

2. كود اردوينو

هذا هو الجزء السهل!

افتح Arduino IDE ، انتقل إلى علامة التبويب "ملف" ، ثم انزل إلى علامة التبويب "مثال" والتي ستنزل إلى أبعد من ذلك وستظهر لك علامة تبويب "السائر" ثم تريد فتح "Stepper_OneStepAtATime"

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

الكود الذي استخدمته لجعل المحركين يتحركان في "مزامنة" أدناه:

//#يشمل

const int stepsPerRevolution = 200 ؛

Stepper myStepper1 (stepsPerRevolution ، 9 ، 10 ، 11 ، 12) ؛

Stepper myStepper2 (stepsPerRevolution ، 4 ، 5 ، 6 ، 7) ؛

عدد int stepCount = 0 ؛

إعداد باطل () {// تهيئة المنفذ التسلسلي: Serial.begin (9600) ؛ }

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

myStepper1.step (1) ،

Serial.print ("الخطوات:") ؛

Serial.println (stepCount) ؛

stepCount ++ ؛

تأخير (0.5) ؛

myStepper2.step (1) ، تأخير (0.5) ؛ }

3. المشاكل المحتملة

كانت المشكلات التي واجهتها أثناء هذه العملية هي عدم استخدام مثال الرمز الصحيح ، باستخدام سلك توصيل غير صالح ، واستخدام برنامج التشغيل الخاطئ IC.

تأكد من أن السائق الذي تستخدمه قادر على التحكم في المحرك

تحقق من الرقم التسلسلي وتحقق من مواصفاته

واجهت مشكلة في وجود سلك توصيل ميت ، مما تسبب في دوران محركاتي بشكل غريب

اضطررت إلى استخدام مقياس متعدد لفحص كل سلك

ودائمًا تحقق جيدًا من الشفرة بحثًا عن أخطاء صغيرة مثل عدم وجود نهاية "؛" أمر

الخطوة 10: ميكانيكي

ميكانيكي
ميكانيكي
ميكانيكي
ميكانيكي
ميكانيكي
ميكانيكي
ميكانيكي
ميكانيكي

1. المواد

بالنسبة لنموذج الإنتاج الكامل للأذرع ، يوصى بأن تكون مصنوعة من مادة قوية وخفيفة الوزن ، وشعرنا أن الألومنيوم كان مناسبًا تمامًا.

استخدمنا صفائح ألمنيوم قياس 032 مقطوعة إلى 9.125 "× 17.5" وتتبعنا النمط من الرسم الموضح في الخطوة السابقة.

2. التصنيع

باستخدام الهيمر (الآلة الزرقاء) ، أضفنا حوافًا تواجه اتجاهات متعاكسة بحيث عندما تنكسر القطعة وتطوى ، يتشابك الطرفان ليشكلان قطعة واحدة كاملة.

بالنسبة للانحناءات الكبيرة ، استخدمنا tennismith ، نظرًا لدقتها العالية.

الآن بالنسبة للانحناءات الأصغر ، سترغب في استخدام آلة ذات قدم أصغر ، وهذا هو المكان الذي تأتي فيه آلة مثل roto-die. وبسبب قدمها الأصغر ، فإنها تسمح بعمل فواصل أصغر ، لسوء الحظ ، كان قالب الروتو الذي في حوزتنا لا يزال كبيرًا جدًا بالنسبة للسكك الحديدية الخاصة بنا وكان مشوهًا.

** بدلاً من ذلك ، إذا لم يكن لديك إمكانية الوصول إلى المعدات أو الأدوات المناسبة ، فيمكن عندئذٍ إجراء بديل. **

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

3. الحزام

بالنسبة للأحزمة ، استخدمنا بعض أحزمة الطابعة ثلاثية الأبعاد القديمة التي تمكنا من إنقاذها.

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

تم استبدال التروس الخضراء والمسامير الخشبية بمحامل قرصية بحلقات عريضة إضافية تستخدم لمنع الحزام من الانزلاق من مكانه.

4. النقل

وأخيرًا ، تم صنع العربة من صفيحة 5 × 5 من الألومنيوم 032 ، مع ثقوب مثقوبة حيث من المفترض أن تذهب البراغي والغسالات المقابلة. ستختلف المسافة وفقًا لمدى عرض القضيب الخاص بك ومقدار الخلوص الذي لديك على غسالاتك.

الخطوة 11: تأملات

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

تعلم كل من عمل في المشروع المزيد عن الجوانب الأخرى للمشروع. جعل البرنامج يقوم بعمل معين شيء ، ثم جعل البرنامج يعمل مع الأجهزة شيء آخر. أود أن أقول إنه من المهم أن يكون كل من يعمل على جانب الترميز في هذا المشروع مألوفًا مثل مبرمج مشروعنا.

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

موصى به: