صنع قارب RC RC بسيط

في بعض الأحيان على الإنترنت أرى أسئلة من المبتدئين الذين يريدون بناء quadrocopter من الصفر وكتابة البرامج الثابتة لذلك. أنا نفسي كذلك وللتدرب على إنشاء نماذج RC قررت البدء بشيء أبسط.



في المقالة بالتفصيل لأصغر وصف خوارزمية القارب ولوحة التحكم واختيار المكونات.

لماذا القارب الجوي؟


  1. بسيط
  2. رخيصة ؛
  3. ;
  4. , -.

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

منصات مثل هذه



( يوجد وصف أكثر تفصيلاً هنا).

يمكنهم فقط التحرك على طول سطح أملس اصطناعي في معظم الحالات ، وسيطرتهم مختلفة تمامًا.

ولكن على الماء ، يمكننا الإبحار في أي مكان ، وهو ما يمكن أن يمنحنا في المستقبل الفرصة لعمل طيار آلي باستخدام نظام تحديد المواقع العالمي (GPS). التصميم الكلاسيكي مع المروحة معقد بالنسبة لي من خلال وحدة خروج العمود من السكن - لا أستطيع أن أتخيل كيفية سدها.

المزيد من مزايا نظام دفع الهواء:
  1. يمكن وضعه على منصات مختلفة: قارب ، زلاجة ، قطعة من البوليسترين ...
  2. لا يمسك في القاع أو الطحالب.

من الضروري أن يدور الجهاز. هناك 3 خيارات:
  1. عجلة واحدة + عجلة قيادة للانعطاف ؛
  2. برغي واحد + نظام الخراطة الخاص به ؛
  3. برغيان ثابتان. الالتفاف بتغيير الرغبة الشديدة لديهم أسهل طريقة. استخدمه.


جهاز تحكم عن بعد


مبدأ العملية


1 عصا تحكم + مفاتيح متعددة. تتمثل مهمة جهاز التحكم عن بُعد في إرسال البيانات حول موضع مقبض عصا التحكم والتبديل عدة مرات في الثانية.

ماذا تفعل


أولاً ، أنت بحاجة إلى جهاز إرسال لاسلكي. الخيار الأرخص هو NRF24L01 + ، يكلف 0.85 دولار .

ثانيًا ، أنت بحاجة إلى عصا تحكم. دولار آخر .

عدة مفاتيح - 0.12 دولار .

حسنًا ، تم إصلاح كل هذا على قطعة من الكلور مقابل 0.13 دولار .

عدت بالفعل 2.1 دولار ، ولكن لا تزال بحاجة إلى MK والغذاء. كل شيء ليس واضحًا هنا.

بالنظر إلى المستقبل ، سأقول أن ATmega8 أو STM8S103F3P6 يكفي ، ولكن منذ أن بدأت هذا المشروع لفترة طويلة وكان هناك القليل من الخبرة ، لقد صدمته في لوحة تحكم Arduino Pro Mini ، وفي قارب Arduino Nano (ATmega32P في كل مكان).

في جهاز التحكم عن بعد لا تزال هناك حاجة:
  1. محول الطاقة 0.9 - 5 فولت -> 5 فولت لتشغيل Arduino مقابل 0.35 دولارًا (يمكن فصل موصل USB مع قطعة من اللوحة للدمج) ؛
  2. 3.3V مثبت AMS1117-3.3 لتشغيل وحدة الراديو ، يكلفون 0.03 دولار لكل وحدة ؛
  3. حجرة البطارية لبطارية إصبع واحد مقابل 0.15 دولار ؛

المجموع زائد 0.53 دولار. وبصرف النظر عن وحدة التحكم ، زوج من المكثفات والأسلاك ، فإن تكلفة مكونات وحدة التحكم هي 2.63 دولار.

تعبئة نموذج RC


مكونات


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

اشتريت هذه المحركات مع مراوح


مقابل 2.88 دولار لكل زوج .

أخذ L293D كسائق للسيارات - 0.35 دولار آخر .
وهنا كومة من المشاكل
L293D . , .

طعام. سنحتاج إلى ما يصل إلى ثلاث فولتات إمداد:
  1. 5 فولت لجميع الإلكترونيات باستثناء وحدة الراديو ؛
  2. 3.3 فولت لوحدة الراديو ؛
  3. للمحركات بقدر ما تحتاج (الألغام 4.2 فولت).

1 و 2 نحصل على نفس الموجود في لوحة التحكم ، وبالنسبة للمحركات ، نضع MT3608 مقابل 0.86 دولارًا .

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

أضف إلى هذا 0.4 دولارًا لحجرة البطارية لخلايا AA واحصل على مكونات 6.4 دولارًا بدون وحدة تحكم وأسلاك.

البرنامج


ومرة أخرى ، دعنا نذهب من المحركات. كل محرك من المحركات التي يقودها L293D قد يحفر أو لا :
  1. تدور إلى الأمام
  2. تدور مرة أخرى
  3. لا تلوي.

لتسهيل قراءة التعليمات البرمجية ، اكتب
6 وظائف
inline void motLeftStop(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftForward(){    
  PORTD |= 1 << MOT_LEFT_PLUS;
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftBackward(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD |= 1 << MOT_LEFT_MINUS;
}

inline void motRightStop(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightForward(){
  PORTD |= 1 << MOT_RIGHT_PLUS;
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightBackward(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD |= 1 << MOT_RIGHT_MINUS;
}


الآن نريد التحكم في سرعة دوران البراغي. بالطبع ، سنفعل ذلك باستخدام PWM. لا أعرف ما إذا كان يمكن إجراء مثل هذا PWM في الأجهزة ... لقد فعلت ذلك برمجيًا على المقاطعات. قم بتعريف زوج من المتغيرات العالمية
int8_t motLeft = 0, motRight = 0; // -127..+127

دع قيم هذه المتغيرات <0 تعني أنك بحاجة إلى الرجوع للخلف ، والقيم> 0 - إلى الأمام ، وإذا كانت 0 ، فأنت لست بحاجة إلى الالتواء.
سنكتب معالجات المقاطعة المؤقت
ISR(TIMER2_OVF_vect)
{
  if(motLeft > 0)
    motLeftForward();
  else if(motLeft < 0)
    motLeftBackward();
  if(motRight > 0)
    motRightForward();
  else if(motRight < 0)
    motRightBackward();
}

ISR(TIMER2_COMPA_vect)
{
  motLeftStop();
}

ISR(TIMER2_COMPB_vect)
{
  motRightStop();
}


الآن ، لتغيير سرعة دوران المروحة ، نحتاج إلى إجراءين:
  1. اكتب قيمة موجبة أو سالبة أو صفر في motLeft / motRight (الوحدة ليست مهمة) ؛
  2. سجل "سرعة الدوران" في OCR2A / OCR2B.

دعنا نكتب بضع وظائف أخرى لهذا الغرض
void setMotLeft(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motLeft = v;  
  OCR2A = abs(v) * 2;
}

void setMotRight(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motRight = v;
  OCR2B = abs(v) * 2;
}


if(abs(v) < 5) v = 0;

OCR2x 5 ( ).

الآن يبقى لتكوين دبابيس MK والمؤقت
void motInit(){
  DDRD |= (1 << MOT_LEFT_PLUS) | (1 << MOT_LEFT_MINUS) | (1 << MOT_RIGHT_PLUS) | (1 << MOT_RIGHT_MINUS);
  //TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // set up timer with prescaler = 1024.   16 
  //TCCR2B |= (1 << CS22)|(0 << CS21)|(0 << CS20); // set up timer with prescaler = 64.   1 
  TCCR2B |= (0 << CS22)|(1 << CS21)|(0 << CS20); // set up timer with prescaler = 8.  128 
  //TCCR2B |= (0 << CS22)|(0 << CS21)|(1 << CS20); // set up timer with prescaler = 1.  16 
  TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A)|(1 << OCIE2B); // enable overflow interrupt
  TCCR2A &= ~(3); // set WGM20 = 0, WGM21 = 0
  TCCR2B &= ~(1 << 3); // set WGM22 = 0
  setMotLeft(0);
  setMotRight(0);
  sei();
}


ويمكنك التحكم في المحركات ببساطة عن طريق استدعاء الوظائف setMotLeft (int8_t v) و setMotRight (int8_t v).

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

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

تدعم وحدة الراديو لدينا حزمًا تصل إلى 32 بايت. حتى لا نتذكر حالات النزوح ، سنستخدم السجل
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

على النحو التالي
    uint8_t packet[MAX_BUFF]; 
    memset(packet, 0, MAX_BUFF);    
    controlStatus.x = (int16_t)analogRead(1) - x0;
    controlStatus.y = (int16_t)analogRead(0) - y0;
    memcpy(packet, &controlStatus, sizeof(controlStatus));
    Mirf.send(packet);
    while(Mirf.isSending()){;};


على جانب المتلقي ، سنعلن نفس السجل بالضبط و
سنقوم بملئه
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


في وظائف setMotRot و setMotForward
اكتب القيم للمتغيرات العالمية motRot و motForward
void setMotRot(int16_t v){
  if(abs(v)<10) v = 0;
  motRot = (int32_t)v;
}
void setMotForward(int16_t v){
  if(abs(v)<10) v = 0;
  motForward = (int32_t)v;
}


ودعونا ننتقل إلى الأكثر إثارة للاهتمام. إلى كيفية تحويل "انعطف يسارًا بسرعة 5 درجات في الثانية ثم تقدم للأمام قليلاً!" إلى "ترك المحرك 10٪ إلى الوراء ، وإلى اليمين 20٪ إلى الأمام!". لقد كتب الكثير

حول ما هي وحدات تحكم PID . استخدمت مكونين فقط للتدوير:
  1. نسبي
  2. لا يتجزأ.

وللانتقال ذهابًا وإيابًا ، لم يستخدمه المنظم.

لنأخذ مثالاً:
int32_t iDeltaRot = 0;
void motTick(){
  int32_t rot = getRotAvg(); //     
  int32_t deltaRot = rot - motRot * rotMaxSpeed / 512;
  iDeltaRot += deltaRot;
  int32_t motRight = (int32_t)motForward * forwardMult - deltaRot * rotMult - iDeltaRot * iDeltaRotMult, 
          motLeft  = (int32_t)motForward * forwardMult + deltaRot * rotMult + iDeltaRot * iDeltaRotMult;  

  int32_t motMax = max(abs(motRight), abs(motLeft));
  if(motMax > 127){
    motRight = (int32_t)motRight * 127 / motMax;
    motLeft  = (int32_t)motLeft  * 127 / motMax;
  }
  
  setMotRight(motRight);
  setMotLeft(motLeft);
}

تم تبسيط الكود من أجل التركيز على الأجزاء المهمة ؛ سيحتوي الأرشيف على النسخة الكاملة.

ماذا نفعل هنا؟
  1. نحسب الفرق بين السرعة الحقيقية لدوران القارب (العفن) والسرعة المطلوبة (motRot * rotMaxSpeed) ؛
  2. نحسب سرعات الدوران المطلوبة للبراغي motRight و motLeft.
  3. إذا تجاوزت سرعات الدوران المطلوبة الحد الأقصى الممكن ، فنحن نخفضها مع الحفاظ على النسبة بينهما ؛
  4. نسمي setMotRight / setMotLeft مألوفة لنا بالفعل.

هذا كل شيء!

هذه هي خوارزمية التحكم في القارب بالكامل!

هل هو صعب؟ لا أعتقد ذلك. ولكن ، مع ذلك ، خلال الاختبارات والإعدادات نشأت مجموعة كاملة من المشاكل التي قد تؤدي إلى العديد من الحوادث إذا كانت طائرة.

هناك 4 معاملات في الوظيفة الموصوفة:
  1. forwardMult - الحساسية لحركة عصا التحكم للأمام / للخلف ؛
  2. rotMaxSpeed ​​- سرعة الدوران المرغوبة عند إمالة ذراع التحكم بالكامل إلى اليمين / اليسار ؛
  3. rotMult - معامل المكون النسبي (مدى تأثير انحراف سرعة الدوران الحالية عن العنصر المطلوب على الدوران) ؛
  4. iDeltaRotMult - معامل المكون المتكامل (مدى تأثير انحراف زاوية الدوران الحالية عن الزاوية المطلوبة على الدوران).

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

مؤشر الحالة


عند التصحيح / الضبط ، سيكون هناك ارتباك من السلسلة "لماذا يتفاعل القارب مع عصا التحكم وليس بالطريقة التي أريدها؟". يمكن تصحيح بعض النقاط عن طريق عرض معلومات تصحيح الأخطاء على جهاز كمبيوتر ، ولكن سيكون من الأنسب فهم ما يحدث على الفور. في البداية ، فكرت في خيارين:
  1. كمبيوتر محمول
  2. شاشات الكريستال السائل Nokia 5110


إن عيوبهما مفهومة: الكمبيوتر المحمول كبير وغير مريح للحمل معك ، ولن تسمح لك شاشة Nokia 5110 بعرض عدد كبير من معلمات حالة القارب في نفس الوقت.

التقطت بينهما: NX4827K043 المحسن - شاشة لمس HMI تعمل باللمس مقاس 4.3 بوصة . بفضل شاشة اللمس ، يمكنك ضبط معلمات القارب بسرعة وسهولة أثناء التنقل. هذا نوع من الكمبيوتر يتكون من:
  1. متحكم GD32F103R8T6 ؛
  2. SDRAM Winbond W9864G6KH-6 (8 ميجابايت) ؛
  3. ذاكرة فلاش Winbond W25Q256FVFG (32 ميجابايت ، 100000 دورة إعادة كتابة ، وهو أمر جيد جدًا) ؛
  4. FPGA Altera MAX II EPM570T144C5N.

يبدو كل شيء في التجميع مثل هذا (قابل للنقر): هذا الكمبيوتر / الشاشة عبارة عن صندوق أسود وموجه نحو التفاعل مع شخص. يتم زيادة حدة GPIO الحالية لتوصيل الأزرار والمؤشرات. كما أنها توسع مجلس يؤكد ذلك. لذلك ، سيفشل استخدام وحدة التحكم المدمجة كوحدة تحكم عن بُعد للقارب (قراءة عصا التحكم ، وتبادل البيانات مع وحدة الراديو NRF24L01 +). للتفاعل مع وحدة التحكم الدقيقة ، هناك UART و ... هذا كل شيء. حول كيفية وما يمكنك القيام به مع هذا العرض الذي يمكنك القيام به ، فقد تم كتابة مجموعة من + مقاطع الفيديو على Youtube. انظر ، على سبيل المثال ، هذا





- يظهر كل شيء بوضوح هناك. ولكن نظرًا لأن هذه الشاشة أكثر تكلفة من جميع المكونات الأخرى للقارب ووحدة التحكم مجتمعة ، فسأصف بمزيد من التفصيل انطباعاتي عن العمل معها. ربما سيساعد هذا شخصًا على فهم ما إذا كان هذا الخيار مناسبًا له أو ما إذا كان جهاز الكمبيوتر المحمول / شاشة Nokia 5110 سيكون الأفضل. مزايا NX4827K043 المحسنة للتالى:
  1. سهل الاستخدام للغاية. هناك وثائق بسيطة ، وأمثلة ، ومقاطع فيديو على Youtube ، ... في بضع ساعات يمكنك معرفة ذلك من الصفر. كل ما تحتاج إلى معرفته عنه تقريبًا موجود على صفحتين: صفحة wiki ومجموعة التعليمات
  2. تطور سريع للغاية. محرر مرئي مثل Visual Studio (أسهل فقط). رميت المكونات ويعمل كل شيء.
  3. مكونات عالية الجودة. نفس ذاكرة الفلاش لدورات إعادة الكتابة 100 ألف.
  4. مصحح أخطاء يمكنه محاكاة العرض باستخدام جهاز كمبيوتر والتواصل مع عضو الكنيست الخاص بك من خلال منفذ COM. يسمح لك بتطوير الجهاز بالكامل ، وتصحيح وشراء شاشة ، فقط إذا نجح كل شيء.
    على الرغم من وجود مشكلة معه
    . . , , .
  5. جهاز استشعار مقاوم يمكنك إنشاء عناصر تحكم صغيرة إلى حد ما وكزها بأظافر أصابعك أو أي قلم.

العيوب:
  1. السعر لا يزال 50 دولارًا أمريكيًا كبيرًا مقابل شاشة مقاس 4.3 بوصة.
  2. هناك عدد قليل من المكونات الموجودة ، وإعدادات المكونات قليلة ، وكيفية إنشاء الخاصة بك ليست واضحة. ويقابل ذلك جزئياً وظائف رسم البدائيين (خطوط ، مستطيلات ، دوائر ، ...).
  3. يومض مكون المقياس القياسي عند الترقية.
  4. لا (على الأقل لم أجد) الشفافية.
  5. متطلبات الطاقة: 4.75-7 فولت ومتوسط ​​التيار 250 مللي أمبير. عندما ينخفض ​​الجهد ، تبدأ الشاشة في الوميض.
  6. UART فقط. يمكن التواصل معه على SPI و I²C.
  7. إخراج GPIO فقط للحلقة (لا مشط 2.54 مم) ، لا ADC.


بشكل عام ، تعطي الشاشة انطباعًا عن منتج عالي الجودة للغاية ، وهو سهل وممتع للعمل معه.

يمكن للعرض تنفيذ مهمتين في وقت واحد:
  1. مؤشر الحالة. أنا مهتم بشكل أساسي بـ:
    • "سرعات دوران" البراغي ؛
    • قيمة متغير iDeltaRot هي مدى اختلاف زاوية الدوران المرغوبة عن المطلوب.
    • سرعة دوران القارب
    • زاوية دوران القارب ؛
    • تواتر استقبال الحزم من جهاز التحكم عن بعد ؛
    • تردد المكالمات إلى وظيفة motTick.

  2. ضبط المعلمات ، وهي المعلمات الموضحة أعلاه forwardMult و rotMaxSpeed ​​و rotMult و iDeltaRotMult.


صنع صفحتين (قابل للنقر لتقييم الجودة):
  1. مؤشرات:


  2. إعدادات المعلمات: أول 4 أعمدة من اليسار إلى اليمين: forwardMult و rotMult و iDeltaRotMult و rotMaxSpeed.






قارب اختبار فيديو على الأرض:



رد فعل القارب على تأثير خارجي يتكشف في مختلف iDeltaRotMult (معاملات متكاملة):



توضيح تأثير المعلمات على الماء:



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

الخصائص


  • قضيب 9 جم ؛
  • الوزن 115 جم ، منها البطاريات تزن 52 جمًا ؛
  • الحد الأقصى للتسارع هو 0.77 م / ثا ^ 2. للإنسان 5 كم / ساعة ، إذا لم تكن هناك مقاومة للماء ، فإن القارب سوف يتسارع في 1.8 ثانية ؛
  • تبلغ تكلفة المكونات حوالي 15 دولارًا إذا كنت تستخدم Arduino Nano في كل من وحدة التحكم عن بعد والقارب (بدون شاشة العرض والبطاريات).


الخلاصة


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

أرشفة بالمشاريع

وأخيرًا ، حتى يكون هناك شيء نسعى إليه ، إليك مقطع فيديو لجهاز مذهل:

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


All Articles