کوڈ تلاش کریں

سبق 26/31: سمارٹ کار حصہ 4: الٹراسونک سینسر کا استعمال کرتے ہوئے رکاوٹ سے بچنا | سن فاؤنڈر روبو جیکس

سبق 26/31: سمارٹ کار حصہ 4: الٹراسونک سینسر کا استعمال کرتے ہوئے رکاوٹ سے بچنا | سن فاؤنڈر روبو جیکس

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

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

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

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

یہ گائیڈ SunFounder 3-in-1 Arduino کٹ اور اس کے "Play with Ultrasonic Module" پروجیکٹ پر مبنی ہے۔ ہم وائرنگ کے ذریعے آگے بڑھیں گے، فیصلہ سازی کے کوڈ کی وضاحت کریں گے، اور کار کو عمل میں دکھائیں گے۔

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

رکاوٹ سے بچنے کی منطق کیسے کام کرتی ہے

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

  • اگر فاصلہ > 25 سینٹی میٹر: راستہ صاف ہے، اس لیے کار آگے بڑھتی ہے۔
  • اگر 10 سینٹی میٹر < فاصلہ <= 25 سینٹی میٹر: "احتیاطی زون" میں کوئی چیز پائی گئی ہے، اس لیے کار تصادم سے بچنے کے لیے رک جاتی ہے۔
  • اگر 2 سینٹی میٹر < فاصلہ <= 10 سینٹی میٹر: کوئی چیز خطرناک حد تک قریب ہے۔ کار زیادہ جگہ بنانے کے لیے پیچھے ہٹتی ہے۔
  • اگر فاصلہ <= 2 سینٹی میٹر: ریڈنگ ممکنہ طور پر غلط ہے (درست ناپنے کے لیے بہت قریب)، اس لیے کار حفاظتی اقدام کے طور پر رک جاتی ہے۔

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

اس پروجیکٹ کو بنانے کے لیے، آپ کو درج ذیل اجزاء کی ضرورت ہوگی، جو سب SunFounder 3-in-1 کٹ میں شامل ہیں۔

  • 1x Arduino Uno (یا مطابقت رکھنے والا بورڈ)
  • 1x سمارٹ کار چیسس دو گیئرڈ موٹرز کے ساتھ
  • 1x L298N موٹر ڈرائیور ماجیول
  • 1x HC-SR04 الٹراسونک فاصلہ سینسر
  • 1x بریڈ بورڈ
  • جمپر تار
  • کار کے لیے بجلی کی فراہمی (مثلاً بیٹری پیک)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

وائرنگ گائیڈ

وائرنگ موٹر ڈرائیور، الٹراسونک سینسر، اور Arduino کو جوڑتی ہے۔ موٹر ڈرائیور کار کے پہیوں کو کنٹرول کرتا ہے، جبکہ الٹراسونک سینسر اس کی "آنکھوں" کا کام کرتا ہے۔

یہاں SunFounder دستاویزات سے کنکشن خاکہ ہے:

آئیے کنکشنز کو تفصیل سے دیکھتے ہیں۔ پہلے، بریڈ بورڈ کے مثبت اور منفی ریلز کو Arduino کے 5V اور GND پنوں سے پاور کریں۔ الٹراسونک سینسر پھر درج ذیل طریقے سے جڑا ہوا ہے:

  • VCC (پاور): بریڈ بورڈ پر مثبت ریل سے جڑا ہوا۔
  • GND (گراؤنڈ): بریڈ بورڈ پر منفی ریل سے جڑا ہوا۔
  • Trig (ٹرگر): Arduino پر ڈیجیٹل پن 3 سے جڑا ہوا۔ یہ پن الٹراسونک پلس بھیجتا ہے۔
  • Echo (وصول): Arduino پر ڈیجیٹل پن 4 سے جڑا ہوا۔ یہ پن منعکس پلس وصول کرتا ہے۔

موٹر ڈرائیور کے کنکشن پچھلے اسباق کی طرح ہیں۔ چار کنٹرول پن (IN1, IN2, IN3, IN4) Arduino کے ڈیجیٹل پن 5، 6، 9، اور 10 سے جڑے ہوئے ہیں۔ یہ پن دو موٹرز کی رفتار اور سمت کو کنٹرول کرتے ہیں۔ یقینی بنائیں کہ موٹر ڈرائیور کی پاور اور گراؤنڈ بیٹری پیک اور Arduino کے گراؤنڈ سے صحیح طریقے سے جڑے ہوئے ہیں۔ (ویڈیو میں 02:24 پر)

کوڈ کی وضاحت

اس پروجیکٹ کا کوڈ الٹراسونک سینسر سے فاصلے کی ریڈنگ کی بنیاد پر کار کے رویے کو کنٹرول کرتا ہے۔ منطق سیدھی اور حسب ضرورت آسان ہے۔ آئیے اہم، صارف کے قابل ترتیب حصوں کو دیکھتے ہیں۔

1. پن تعریفیں

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

const int A_1B = 5;
  const int A_1A = 6;
  const int B_1B = 9;
  const int B_1A = 10;
  
  const int trigPin = 3;
  const int echoPin = 4;

یہاں، A_1A، A_1B، B_1A، اور B_1B L298N ڈرائیور کے ذریعے بائیں اور دائیں موٹرز کو کنٹرول کرتے ہیں۔ trigPin اور echoPin الٹراسونک سینسر کے لیے ہیں۔

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

مرکزی رویہ loop() فنکشن کے اندر کنٹرول کیا جاتا ہے۔ یہ وہ جگہ ہے جہاں آپ کار کی "شخصیت" کو ایڈجسٹ کر سکتے ہیں۔

void loop() { float distance = readSensorData(); if (distance > 25) { moveForward(200); } else if (distance < 10 && distance > 2) { moveBackward(200); } else { stopMove(); } }

یہاں اسے حسب ضرورت بنانے کا طریقہ ہے:

  • فاصلے کی حدیں: نمبر 25 اور 10 سینٹی میٹر میں "محفوظ" اور "خطرناک" زونز کی وضاحت کرتے ہیں۔ 25 بڑھائیں تاکہ کار پہلے رک جائے، یا اسے کم کریں تاکہ یہ رکاوٹوں کے قریب جا سکے۔ 2 ایک حفاظتی مارجن ہے تاکہ بہت قریب موجود اشیاء سے غلط ریڈنگز کو نظر انداز کیا جا سکے۔
  • موٹر کی رفتار: 200 جو moveForward() اور moveBackward() کو دیا گیا ہے، کار کی رفتار مقرر کرتا ہے۔ یہ قدر 0 سے 255 تک ہو سکتی ہے۔ کم قدر، جیسے 150، کار کو آہستہ اور زیادہ احتیاط سے چلائے گی۔

باقی کوڈ readSensorData() فنکشن پر مشتمل ہے، جو الٹراسونک سینسر کے ٹائمنگ کو سنبھال کر فاصلہ حساب کرتا ہے، اور moveForward()، moveBackward()، اور stopMove() فنکشنز، جو موٹر ڈرائیور کو کنٹرول کرتے ہیں تاکہ مطلوبہ عمل انجام دیا جا سکے۔

ایک عام غلطی کا حل

آپ کو ایسی غلطی مل سکتی ہے جیسے 'moveForward' was not declared in this scope۔ یہ اس لیے ہوتا ہے کیونکہ Arduino IDE کوڈ کو اوپر سے نیچے پڑھتا ہے۔ جب یہ loop() فنکشن تک پہنچتا ہے، تو اسے نیچے بیان کردہ فنکشنز کے بارے میں معلوم نہیں ہوتا۔ اسے ٹھیک کرنے کے لیے، آپ کو setup() فنکشن سے پہلے "فنکشن پروٹوٹائپس" شامل کرنی ہوں گی۔ یہ صرف فنکشن کے نام اور ریٹرن ٹائپ کے اعلانات ہیں، جو سیمی کولن پر ختم ہوتے ہیں۔

void moveForward(int speed);
  void moveBackward(int speed);
  void stopMove();
  float readSensorData();

یہ لائنیں شامل کرنے سے کمپائلر کو بتایا جاتا ہے، "یہ فنکشنز موجود ہیں اور بعد میں بیان کیے جائیں گے،" جس سے غلطی حل ہو جاتی ہے۔ (ویڈیو میں 09:21 پر)

سینسر کی استحکام میں بہتری

ٹیسٹنگ کے دوران، آپ دیکھ سکتے ہیں کہ کار رک جاتی ہے یا رک رک کر چلتی ہے چاہے راستہ صاف ہو۔ یہ اکثر اس لیے ہوتا ہے کہ لوپ بہت تیز چلتا ہے، اور الٹراسونک سینسر کو ایکو سگنل حاصل کرنے کے لیے کافی وقت نہیں ملتا، جس کے نتیجے میں 0 سینٹی میٹر کی ریڈنگ آتی ہے۔ اسے ٹھیک کرنے کے لیے، loop() فنکشن کے آخر میں ایک چھوٹی تاخیر شامل کریں تاکہ سینسر کو کام کرنے کا وقت ملے۔

void loop() {
    float distance = readSensorData();
    if (distance > 25) {
      moveForward(200);
    }
    else if (distance < 10 && distance > 2) {
      moveBackward(200);
    } else {
      stopMove();
    }
    delay(100); // مستحکم ریڈنگز کے لیے 100ms کی تاخیر شامل کریں
  }

100 ملی سیکنڈ کی تاخیر عام طور پر مستحکم اور یکساں فاصلے کی ریڈنگز حاصل کرنے کے لیے کافی ہوتی ہے۔ (ویڈیو میں 10:56 پر)

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

کوڈ اپ لوڈ ہونے کے بعد، سیریل مانیٹر کھولیں۔ آپ کو کار کی حالت ظاہر کرنے والا متن نظر آئے گا، جیسے "Forward"، "Reverse"، یا "Stop"۔

مظاہرے میں، کار کو ایک رکاوٹ کے سامنے رکھا گیا ہے۔ جب رکاوٹ 25 سینٹی میٹر سے زیادہ دور ہوتی ہے، کار آگے بڑھتی ہے۔ جیسے ہی آپ اپنا ہاتھ قریب لاتے ہیں، کار رک جاتی ہے جب فاصلہ 25 سینٹی میٹر سے کم ہو جاتا ہے۔ اگر آپ ہاتھ بہت قریب لاتے ہیں، 10 سینٹی میٹر کے اندر، کار پیچھے ہٹ جائے گی۔ یہ رویہ ویڈیو میں واضح طور پر نظر آتا ہے اور تصدیق کرتا ہے کہ رکاوٹ سے بچنے کی منطق درست طریقے سے کام کر رہی ہے۔ (ویڈیو میں 11:53 پر)

نتیجہ

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

ابواب

  • [00:00] رکاوٹ سے بچنے کا تعارف
  • [01:16] پروجیکٹ کا جائزہ اور ضروری شرائط
  • [02:24] الٹراسونک سینسر اور موٹر ڈرائیور کی وائرنگ
  • [04:56] پروجیکٹ کوڈ کھولنا
  • [05:12] کوڈ کی وضاحت: منطق اور فنکشنز
  • [08:34] کوڈ اپ لوڈ کرنا اور ابتدائی ٹیسٹ
  • [09:21] خرابی کا حل: فنکشن پروٹوٹائپس
  • [10:56] خرابی کا حل: استحکام کے لیے تاخیر شامل کرنا
  • [11:53] رکاوٹ سے بچنے کا لائیو مظاہرہ

تصاویر

27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 00.09.009
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 02.26.146
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
26 SunFounder Car 4 ultrasonic video snapshot 00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
زبان: C++
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor 
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA

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

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

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);
}

void loop() {
  float distance = readSensorData();
  if (distance > 25) {
    moveForward(200);
  }
  else if (distance < 10 && distance > 2) {
    moveBackward(200);
  } else {
    stopMove();
  }
}

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 stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

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

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

فائلیں📁

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