روبو لاعب كرة قدم من المبتدئين. المسابقات في MIPT. أندرويد واردوينو وبلوتوث

هذه المقالة هي عبارة عن شبه تكملة لأعمال الحب والموت والروبوتات ، "إن الجهاز القائم على Arduino والذي يتحكم فيه جهاز Android عبر البلوتوث هو دورة كاملة" ، ويتألف من جزأين ( واحد ، اثنان ). الأشياء الموصوفة هناك تم تعديلها قليلاً ، وإعادة بنائها ، وتحول الروبوت نفسه من آلة السفر إلى لاعب كرة قدم. بشكل عام ، هناك مواد مثيرة للاهتمام حول كيفية القيام بذلك.

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

الجزء المادي


بناءً على نفس المبادئ الموضحة في المقالة الأولى:

  • شطيرة من اردوينو أونو و موتور شيلد.
  • اثنين من المحركات متصلا الدرع المحرك.

وهنا التغييرات:

  • ظهر الجزء صدمة ، الغريب بما فيه الكفاية ، المسؤولة عن ضرب الكرة.
  • القضية الآن لي بالكامل ، مطبوعة على طابعة ثلاثية الأبعاد.

إسكان


الشكل عبارة عن دائرة يتناسب فيها كل من اللوحين والعجلات. تمديد للجزء حيث قوة التأثير ستقف.



عند تصميم هذا ، انتبه إلى:

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



والآن الهراء الرئيسي


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

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

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

الخيار الثاني - الملفات اللولبية تدفع جزء الصدمة ، وهنا يعتمد كل شيء على قوة (سرعة) الصدمة ، والتي بدورها تعتمد على خصائص الملف اللولبي.



جزء البرمجيات


وفقًا للتقاليد الجيدة ، التي تعد بالفعل مقالة واحدة ، سنقسم هذا القسم إلى جزأين. أول تطبيق Android ، ثم رسم Arduino.

الروبوت


اسمح لي أن أذكرك ، أن التطبيق كتبه من البداية. خلال الأشهر الستة الماضية ، فهمت أكثر من ذلك بقليل في هذه المسألة ، لذلك سوف أصف ما فكر في doper .

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

private void sendCommand(String speed, String angle) { String speedCommand = "#" + speed + "#"; //     String angleCommand = "@" + angle + "@"; try { outputStream.write(speedCommand.getBytes()); //   outputStream.write(angleCommand.getBytes()); } catch(Exception e) { e.printStackTrace(); } } 

يبدو الأمر النموذجي كما يلي: # 125 # @ 180 @ ، حيث 125 هي السرعة و 180 زاوية. بالطبع ، يمكن تبسيط هذا الأمر حتى الآن ، ولكن إحدى المهام كانت الحفاظ على الإضاءة والقراءة ، بحيث يمكن شرحها بسهولة فيما بعد ، بما في ذلك للأطفال.

لقد ظهر أمر sendHit () جديد ، والذي يتم تشغيله عند الضغط على زر "Hit". انها ترسل واحدة "/". نظرًا لأن bluetooth 2.0+ العادي لا يعاني من البيانات التي يتم تلقيها في الوقت نفسه ، أي أنه يعرف كيفية وضعها في قائمة الانتظار وعدم فقدها ، لسنا بحاجة للسيطرة على ذلك. إذا كنت ستعمل مع Bluetooth Low Energy 4.0+ (جيدًا ، فجأة) ، فهناك بالفعل قائمة الانتظار ستحتاج إلى تنظيم يدويًا ، وإلا ستفقد البيانات.

 ... bHit = findViewById(R.id.b_high_hit); //   bHit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { threadCommand.sendHit(); //     "" } }); ... private void sendHit() { try { outputStream.write("/".getBytes()); //   }catch (Exception e) { e.printStackTrace(); } } } 

اردوينو


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

bt.read () يقرأ حرف واحد. إذا كانت "#" ، تبدأ رموز السرعة. نقرأها حتى تظهر الحرف الختامي "#". لا يمكن استخدام حلقة for هنا ، لأن طول السرعة غير معروف مسبقًا (يمكن أن يكون رقمًا مكونًا من رقم واحد أو رقمين أو ثلاثة أرقام). تتم كتابة القيمة الناتجة إلى المتغير.

يحدث الشيء نفسه مع منعطف. بعد قراءة كل من السرعة والزاوية ، نقوم بتمرير كل شيء إلى الدوران الوظيفي (سرعة int ، زاوية int).

 void loop() { if(BTSerial.available() > 0) {//    char a = BTSerial.read(); //   if(a == '#') { //  sp=""; char b = BTSerial.read(); while( b != '#') { //   ,     sp+=b; b = BTSerial.read(); } } else if (a == '@') {//  val = ""; char b = BTSerial.read(); while(b != '@') { //    val+=b; //    b = BTSerial.read(); } turn(val.toInt(), sp.toInt()); //   ,   } else if (a == '/') { //,    Serial.println(a); servo.write(30); //  delay(150); servo.write(0); //    } lastTakeInformation = millis(); } else { if(millis() - lastTakeInformation > 150) { //     150 //  lastTakeInformation = 0; analogWrite(speedRight, 0); analogWrite(speedLeft, 0); } } delay(5); } 

تحدد الدالة turn () الاتجاه الذي يجب أن تتحرك (للأمام ، للخلف) وأين يجب الدوران (لليمين ، اليسار ، مستقيم). التقييد إذا كان (السرعة> 0 && السرعة <70) ضروريًا بحيث لا يتباطأ الروبوت إذا فقدت البايتات. واجهت هذا عندما قمت بزيادة سرعة الإرسال (لعبت مع تأخير 100-300ms بين الفرق) - في بعض الأحيان لم تصل قيمة السرعة وتحولت إلى 0 ، 40 (على الرغم من ذلك ، على سبيل المثال ، تم إرسال 240 بالفعل). عكاز ، لكنه يعمل.
يمكن أن يسمى "الحماية ضد العوامل التي لا يمكن السيطرة عليها."

 void turn(int angle, int speed) { if(speed >= 0 && speed < 70) return; if(speed > 0) { digitalWrite(dirLeft, HIGH); digitalWrite(dirRight, HIGH); } else if (sp < 0) { digitalWrite(dirLeft, LOW); digitalWrite(dirRight, LOW); } if(angle > 149) { analogWrite(speedLeft, speed); analogWrite(speedRight, speed - 65); //  } else if (angle < 31) { analogWrite(speedLeft, speed - 65); //  analogWrite(speedRight, speed); } else { analogWrite(speedLeft, speed); analogWrite(speedRight, speed); } } 

المسابقات في MIPT بدلاً من المجموع


مع روبوتنا ، ذهبنا إلى مسابقة كرة القدم الآلية ، التي تم تنظيمها وعقدها في معهد موسكو للفيزياء والتكنولوجيا ، Dolgoprudny ، 04/14/2019. تمكنا من الوصول إلى نهائيات 1 \ 4 ، لكننا لم نتقدم أكثر.



كانت العملية بحد ذاتها مثيرة للاهتمام بالنسبة لنا ، لكنني هنا سأصف الاستنتاجات التي تمكنا من استخلاصها من خلال النظر إلى الروبوت في الحقل:

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

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

Source: https://habr.com/ru/post/ar448080/


All Articles