انتقل إلى المحتوى

مركبة العجلات الدوارة

  • كيفية صنع مركبة صغيرة بعجلات ماكنام التي يمكن التحكم بها عن بُعد.

طلبت منا مادة نظم المضمنة تصميم هيكل سيارة صغيرة، لذا قمت بصنع سيارة صغيرة بعجلات ماكنام.


المبدأ

عجلات ماكنام:

ميزة العجلات المدفوعة بالماكنام هي القدرة على التحرك بسلاسة في جميع الاتجاهات والتكيف مع الأراضي الضيقة / الصعبة للمنعطفات؛ ولكن العيوب هي فقدان الطاقة الكبير والتكلفة العالية وصعوبة التصنيع والصيانة المعقدة وعمر الخدمة القصير نسبيًا.

مبدأ الدوران:

قائمة العناصر

الاسم الرابط المرجعي
هيكل سيارة صغيرة بعجلات ماكنام (مع محرك TT) الرابط
Arduino UNO لا
مشغل المحرك L293D لا
بلوتوث HC-06 لا
محرك السيرفو 9g لا
مستشعر الصوت HC-SR04 لا
بطارية ليثيوم 11.1V لا

تنفيذ الشفرة

تستخدم Arduino UNO كوحدة التحكم الرئيسية للسيارة.

ملف المشروع: My-Arduino-projects / مركبة العجلات الدوارة

ملف مكتبة L293D: AFMotor.rar

الشفرة:

//بواسطة YX Lin
#include <AFMotor.h> //ملف مكتبة تشغيل L293D
#include <Servo.h>//ملف مكتبة تشغيل السيرفو

#define SR04_Trig 11
#define SR04_Echo 12

int distance = 0;
int delay_time = 300;
int micro_delay_time = 100;
int pos = 0;
int motor_speed = 200;

AF_DCMotor motor1(1);
AF_DCMotor motor2(4);
AF_DCMotor motor3(3);
AF_DCMotor motor4(2);

Servo myservo;

void setup() {
  Serial.begin(9600);
  myservo.attach(2);
  motor1.setSpeed(motor_speed);
  motor2.setSpeed(motor_speed);
  motor3.setSpeed(motor_speed);
  motor4.setSpeed(motor_speed);
  pinMode(SR04_Trig, OUTPUT);
  pinMode(SR04_Echo, INPUT);
  //serve();
}
void loop() {
  if (Serial.available()) {
    Serial.println("مرحبًا");
    char x = Serial.read();
    if (x == 'W') move_forward();
    if (x == 'S') move_backward();
    if (x == 'D') move_right();
    if (x == 'A') move_left();
    if (x == 'E') right_front();
    if (x == 'Q') left_front();
    if (x == 'C') rotate_right();
    if (x == 'Z') rotate_left();
    if (x == 'X') off();

    if (x == 'F') serve();
    if (x == 'V')sr04(); //قياس المسافة بالموجات فوق الصوتية

    Serial.println("حسنًا");
  }
  delay(5);
}

void move_forward() {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
  delay(delay_time);
  off();
}
void move_backward() {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
  delay(delay_time);
  off();
}
void move_right() {
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
  delay(delay_time);
  off();
}
void move_left() {
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(FORWARD);
  delay(delay_time);
  off();
}
void right_front() {
  motor1.run(FORWARD);
  motor2.run(RELEASE);
  motor3.run(FORWARD);
  motor4.run(RELEASE);
  delay(delay_time);
  off();
}
void left_front() {
  motor1.run(RELEASE);
  motor2.run(FORWARD);
  motor3.run(RELEASE);
  motor4.run(FORWARD);
  delay(delay_time);
  off();
}
void rotate_right() {
  motor1.run(FORWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(FORWARD);
  delay(micro_delay_time);
  off();
}
void rotate_left() {
  motor1.run(BACKWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(BACKWARD);
  delay(micro_delay_time);
  off();
}
void off() {
  motor1.run(RELEASE);
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}
void serve() {
  for (pos = 0; pos <= 180; pos += 5) { // يتحرك من 0 درجة إلى 180 درجة
    // بخطوات 1 درجة
    myservo.write(pos);              // يخبر السيرفو بالذهاب إلى الموضع المحدد في المتغير 'pos'
    delay(15);                       // ينتظر 15 مللي ثانية حتى يصل السيرفو إلى الموضع
  }
  for (pos = 180; pos >= 0; pos -= 5) { // يتحرك من 180 درجة إلى 0 درجة
    myservo.write(pos);              // يخبر السيرفو بالذهاب إلى الموضع المحدد في المتغير 'pos'
    delay(15);                       // ينتظر 15 مللي ثانية حتى يصل السيرفو إلى الموضع
  }
}
void sr04() {
  digitalWrite(SR04_Trig, LOW); // يرسل إشارة منخفضة إلى Trig
  delayMicroseconds(2);    // ينتظر 2 ميكرو ثانية
  digitalWrite(SR04_Trig, HIGH); // يرسل إشارة مرتفعة إلى Trig
  delayMicroseconds(10);    // ينتظر 10 ميكرو ثانية
  digitalWrite(SR04_Trig, LOW); // يرسل إشارة منخفضة إلى Trig
  distance = ((float(pulseIn(SR04_Echo, HIGH)) * 17 ) / 100); // يحسب الوقت المستغرق للإرجاع ويحسبه إلى مليمتر ويطرح الفرق في المسافة
}

إذا (distance < 9999 && distance > 0) { Serial.print("المسافة: "); Serial.println(distance); } else { Serial.println("المسافة كبيرة جداً"); } }

تحكم بلوتوث: قم بتنزيل تطبيق تحكم أردوينو عبر البلوتوث ، وقم بتعيين المفاتيح المناسبة وستتمكن من التحكم عن بُعد.

الأسئلة المتكررة

س: هل سيتم متابعة المشروع في المستقبل؟ ج: نعم ، أنا نعتزم نقل الشفرة إلى STM32 وتحقيق التحكم باستخدام يد تحكم PS2.

الاستنتاج

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

المراجع والشكر

عنوان النص: https://wiki-power.com/ يتم حماية هذا المقال بموجب اتفاقية CC BY-NC-SA 4.0، يُرجى ذكر المصدر عند إعادة النشر.

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