کوڈ تلاش کریں

سبق 28/31: کار-6 سن فاؤنڈر سیلف ڈرائیونگ آرڈوینو کار کا استعمال کرتے ہوئے | روبوجیکس

سبق 28/31: کار-6 سن فاؤنڈر سیلف ڈرائیونگ آرڈوینو کار کا استعمال کرتے ہوئے | روبوجیکس

اس پروجیکٹ میں، ہم ایک Arduino، ایک الٹراسونک سینسر، اور دو انفراریڈ سینسرز کا استعمال کرتے ہوئے ایک بنیادی خود ڈرائیونگ کار بنائیں گے۔ یہ خود مختار نیویگیشن، سینسر فیوژن، اور فیصلہ سازی کی منطق سیکھنے کے لیے ایک شاندار ابتدائی پروجیکٹ ہے۔ کار آگے، پیچھے حرکت کر سکتی ہے، اور رکاوٹوں سے بچنے کے لیے موڑ لے سکتی ہے، مؤثر طریقے سے اپنا راستہ خود تلاش کرتی ہے۔ یہ پروجیکٹ SunFounder 3-in-1 Arduino کٹ پر مبنی ہے اور Robojax کے Arduino کورس کا حصہ ہے۔

28-SunFounder-Car-6-Self-Driving-path

یہ پروجیکٹ صرف ایک کھلونا بنانے کے بارے میں نہیں ہے؛ یہ خود مختار روبوٹکس کے پیچھے بنیادی تصورات کا ایک عملی تعارف ہے۔ یہی منطق اور سینسرز حقیقی دنیا کی ایپلیکیشنز جیسے روبوٹک ویکیوم کلینر، گوداموں میں خودکار گائیڈڈ گاڑیاں، اور یہاں تک کہ زیادہ پیچیدہ روبوٹس کے نیویگیشن سسٹم میں استعمال ہوتے ہیں۔ یہ سمجھ کر کہ فاصلے کی پیمائش کو سادہ نیویگیشن قواعد کے ساتھ کیسے جوڑنا ہے، آپ مختلف قسم کے پروجیکٹ بنا سکتے ہیں، جیسے:

  • ایک چھوٹا روبوٹ بنانا جو کمرے میں گھوم سکے اور فرنیچر سے بچ سکے۔
  • ایک خودکار گاڑی بنانا جو سادہ راستے پر چل سکے یا کسی علاقے میں گشت کر سکے۔
  • بڑے روبوٹکس پروجیکٹس کے لیے بنیادی رکاوٹ سے بچنے کے الگورتھم کو نافذ کرنا سیکھنا۔

ہارڈویئر اجزاء

یہ پروجیکٹ SunFounder 3-in-1 کٹ کے اجزاء استعمال کرتا ہے۔ ضروری حصے یہ ہیں:

  • Arduino Uno بورڈ
  • SunFounder 2WD یا 3-in-1 کار چیسس موٹرز کے ساتھ
  • موٹر ڈرائیور ماجیول (مثلاً L298N یا اسی طرح کا)
  • HC-SR04 الٹراسونک فاصلہ سینسر
  • دو IR رکاوٹ سینسرز
  • جمپر تار اور موٹرز کے لیے پاور سورس

وائرنگ گائیڈ

car_7_8_28_self_driving

وائرنگ آپ کی خود ڈرائیونگ کار کو زندہ کرنے کا پہلا اہم قدم ہے۔ کنکشن سیدھے ہیں، لیکن اپنے اجزاء کو نقصان پہنچانے سے بچنے کے لیے ہر ایک کو دوبارہ چیک کرنا ضروری ہے۔ وائرنگ کے پیچھے منطق یہ ہے کہ Arduino کے کنٹرول پنوں کو موٹر ڈرائیور اور سینسرز سے جوڑا جائے، تاکہ Arduino ڈیٹا پڑھ سکے اور کمانڈ بھیج سکے۔

  • موٹر ڈرائیور پن (A-1B, A-1A, B-1B, B-1A): یہ پن دو موٹرز کی رفتار اور سمت کو کنٹرول کرتے ہیں۔ یہ Arduino پن 5، 6، 9، اور 10 سے جڑے ہوئے ہیں، جو PWM قابل ہیں، جس سے متغیر رفتار کنٹرول ممکن ہوتا ہے۔
  • الٹراسونک سینسر (Trig اور Echo): Trig پن الٹراسونک پلس بھیجتا ہے، اور Echo پن منعکس سگنل وصول کرتا ہے۔ Trig پن Arduino پن 3 سے جڑا ہوا ہے، اور Echo پن Arduino پن 4 سے جڑا ہوا ہے۔
  • IR سینسرز (بائیں اور دائیں): یہ سینسرز پتہ لگاتے ہیں کہ آیا کوئی رکاوٹ ان کے سامنے ہے۔ بایاں IR سینسر Arduino پن 8 سے جڑا ہوا ہے، اور دایاں IR سینسر پن 7 سے جڑا ہوا ہے۔ یہ کار کے اطراف کی جگہ چیک کرنے کے لیے استعمال ہوتے ہیں۔

تفصیلی بصری گائیڈ کے لیے، براہ کرم نیچے دیے گئے وائرنگ ڈایاگرام کا حوالہ دیں، جو ہر کنکشن کو واضح طور پر ظاہر کرتا ہے۔

کوڈ کی وضاحت

کوڈ Arduino پروگرامنگ زبان (C++) میں لکھا گیا ہے۔ مکمل پروگرام ویڈیو کی تفصیل میں دیے گئے ریسورس پیج سے ڈاؤن لوڈ کے لیے دستیاب ہے۔ آئیے اس اسکیچ کے اہم، صارف کے قابل ترتیب حصوں کو توڑ کر دیکھتے ہیں۔

پن تعریفیں

کوڈ کے اوپری حصے میں، آپ ان پنوں کی وضاحت کرتے ہیں جو Arduino کو مختلف اجزاء سے جوڑتے ہیں۔ اگر آپ اپنے بورڈ پر مختلف پن استعمال کر رہے ہیں تو آپ انہیں تبدیل کر سکتے ہیں۔

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

A_1B، A_1A، B_1B، اور B_1A پن H-bridge موٹر ڈرائیور کو کنٹرول کرتے ہیں۔ ان پنوں کو مختلف مجموعوں میں HIGH یا LOW سیٹ کرکے، آپ ہر موٹر کی سمت کو کنٹرول کر سکتے ہیں۔ echoPin اور trigPin الٹراسونک سینسر کے لیے ہیں، اور rightIR اور leftIR انفراریڈ سینسرز کے لیے ہیں۔

رویے کے متغیرات اور منطق

خود ڈرائیونگ رویے کی بنیادی منطق loop() فنکشن میں ہے۔ کار IR سینسرز اور الٹراسونک سینسر کی ریڈنگز کی بنیاد پر فیصلے کرتی ہے۔ کوڈ مخصوص فاصلے کی وضاحت کرتا ہے جو مختلف اعمال کو متحرک کرتے ہیں۔ مثال کے طور پر، distance متغیر سینٹی میٹر میں ماپا جاتا ہے۔ منطق اس طرح ہے:

  • اگر فاصلہ 50 سینٹی میٹر سے زیادہ ہے: سامنے کا راستہ صاف ہے، لہذا کار 200 کی رفتار سے آگے بڑھتی ہے۔
  • اگر فاصلہ 2 سینٹی میٹر اور 10 سینٹی میٹر کے درمیان ہے: کار رکاوٹ کے بہت قریب ہے۔ یہ ایک سیکنڈ کے لیے ریورس کرتی ہے، پھر نیا راستہ تلاش کرنے کے لیے آدھے سیکنڈ کے لیے بائیں پیچھے مڑتی ہے۔
  • اگر فاصلہ 10 سینٹی میٹر اور 50 سینٹی میٹر کے درمیان ہے: کار "احتیاطی زون" میں ہے۔ یہ آگے بڑھتی ہے، لیکن 150 کی سست رفتار سے۔

یہ حدیں (50 سینٹی میٹر، 10 سینٹی میٹر، اور 2 سینٹی میٹر) اور رفتار (200 اور 150) بنیادی متغیرات ہیں جنہیں آپ اپنی کار کے رویے کو تبدیل کرنے کے لیے ایڈجسٹ کر سکتے ہیں۔ مثال کے طور پر، اگر آپ کی کار تیز چل رہی ہے تو آپ "محفوظ" فاصلہ بڑھا کر 60 سینٹی میٹر کر سکتے ہیں۔

کسٹم فنکشنز

کوڈ میں کار کی حرکت کو کنٹرول کرنے کے لیے کئی کسٹم فنکشنز شامل ہیں۔ یہ مرکزی لوپ میں کوڈ کو صاف اور سمجھنے میں آسان بنانے کے لیے استعمال ہوتے ہیں۔

  • moveForward(int speed): یہ فنکشن موٹر پنوں کو کار کو آگے چلانے کے لیے سیٹ کرتا ہے۔ speed پیرامیٹر (0-255) کنٹرول کرتا ہے کہ موٹریں کتنی تیزی سے گھومتی ہیں۔
  • moveBackward(int speed): moveForward کی طرح، لیکن یہ موٹر کی سمت الٹ کر کار کو پیچھے چلاتا ہے۔
  • backLeft(int speed) اور backRight(int speed): یہ فنکشنز ایک موٹر کو الٹی سمت میں چلا کر اور دوسری کو روک کر کار کو موڑتے ہیں۔ یہ ایک محوری موڑ ہے جو کار کو مؤثر طریقے سے سمت تبدیل کرنے میں مدد دیتا ہے۔
  • stopMove(): یہ فنکشن تمام کنٹرول پنوں کو LOW پر سیٹ کر کے تمام موٹروں کو روکتا ہے۔
  • readSensorData(): یہ فنکشن الٹراسونک سینسر سے ایک پلس بھیجتا ہے اور ایکو کی واپسی میں لگنے والے وقت کی پیمائش کرتا ہے۔ پھر یہ سینٹی میٹر میں فاصلہ شمار کرتا ہے اور قدر واپس کرتا ہے۔

لائیو پروجیکٹ کا مظاہرہ

(ویڈیو میں 07:09 پر) مظاہرے میں، کار کو مختلف رکاوٹوں جیسے ڈبے اور دیواروں والے ماحول میں رکھا گیا ہے۔ کار کی منطق واضح ہے جب یہ چلتی ہے۔ جب الٹراسونک سینسر 50 سینٹی میٹر سے زیادہ دور دیوار یا رکاوٹ کا پتہ لگاتا ہے، تو یہ اعتماد سے آگے چلتی ہے۔ جیسے جیسے یہ قریب آتی ہے، اطراف کے IR سینسر کھلی جگہ کی جانچ کرتے ہیں۔

اگر بائیں جانب رکاوٹ کا پتہ چلتا ہے، تو کار اس سے بچنے کے لیے پیچھے دائیں موڑ لیتی ہے اور اس کے برعکس۔ جب کار خود کو تنگ جگہ میں پاتی ہے، جیسے میز کے نیچے (ویڈیو میں 07:49 پر)، تو یہ خود کو نکالنے اور صاف راستہ تلاش کرنے کے لیے اپنے ریورس اور موڑ کے فنکشنز استعمال کرتی ہے۔ کار مسلسل اپنے ماحول کو پڑھتی ہے اور فیصلے کرتی ہے، جو ایک ردعمل پر مبنی کنٹرول سسٹم کو ظاہر کرتی ہے جو پہلے سے منصوبہ بند راستے پر انحصار نہیں کرتا۔

ویڈیو ابواب

  • [00:00] خود ڈرائیونگ کار پروجیکٹ کا تعارف
  • [00:28] سن فاؤنڈر 3-ان-1 کٹ کے بارے میں
  • [01:32] کوڈ کھولنا اور جائزہ
  • [02:02] کوڈ کی ساخت اور نئے فنکشنز کی وضاحت
  • [03:11] سیٹ اپ فنکشن میں پنوں کو ترتیب دینا
  • [03:28] لوپ میں اہم فیصلہ سازی کی منطق
  • [05:41] لائیو مظاہرہ: کار عمل میں
  • [07:09] رکاوٹوں اور دیوار کی پیروی کے ساتھ مظاہرہ
  • [09:58] نتیجہ اور آخری خیالات

تصاویر

28 SunFounder Car 6 self-driving path
28 SunFounder Car 6 self-driving path
Car 7 8 28 self driving
Car 7 8 28 self driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
زبان: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}


void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);
}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

آپ کو جن چیزوں کی ضرورت ہو سکتی ہے

وسائل اور حوالہ جات

فائلیں📁

آرڈوینو لائبریریاں (زپ)