آموزش آردوینوپروژه های آردوینو

ربات دنبال کننده انسان با آردوینو و التراسونیک

در سال های اخیر ربات ها پیشرفت قول العاده ای داشتند و باعث شده اند ماشین های هوشمند بوجود بیاید که میتوانند با محیط تعامل داشته باشند. یکی از پروژه های رباتیک هیجان انگیز، ربات دنبال کننده انسان است. این ربات ها میتوانند انسان ها را شناسایی کنند و شخص را به صورت مستقل ردیابی و تعقیب کنند. این ربات ها در کمک به افراد در مناطق شلوغ، تبلیغات، پشتیبانی یا حتی به عنوان یک همراه مفید هستند.

در این مقاله نحوه ساخت یک ربات دنبال کننده انسان با استفاده از آردوینو را آموزش میدهیم. برای تعقیب انسان در این پروژه از 3 سنسور التراسونیک استفاده میشود و شما اگر بخواهید میتوانید تعداد سنسور ها را افزایش بدهید.

این ربات یک پروژه جالب است و چیزی که در این پروژه جذاب است، استفاده از 3 سنسور التراسونیک به جای 1 سنسور است. ما قبلا ربات های دنبال کننده انسان با یک التراسونیک و 2 سنسور مادون قرمز به علاوه یک سروو موتور را دیده ایم. ما با سنسور های التراسونیک خود فاصله ربات با اطراف را میفهمیم و زمانی که ربات به چیزی نزدیک شود به طرف همان چیز حرکت میکند تا فاصله خود را با آن کم کند و در نهایت یک ربات دنبال کننده انسان ایجاد میشود.

مدار ربات تعقیب کننده آدم با آردوینو

در تصویر زیر میتوانید شماتیک اتصالات ربات تعقیب کننده انسان با برد آردوینو را مشاهده کنید:

مدار ربات دنبال انسان آردوینو

این مدار شامل سه سنسور التراسونیک است که امکان اندازه گیری فاصله را در سه جهت جلو، چپ و راست به ما میدهند. این سنسور ها از طریق پین های GPIO آردوینو به برد متصل میشود. همچنین این مدار شامل دو موتور DC است که به یک ماژول موتور درایور L298n متصل میشود. این ماژول نیز با استفاده از پین های دیجیتال آردوینو کنترل میشود. برای تغذیه کل قطعات، از دو باتری 3.7 ولتی لیتیوم یوتی استفاده میشود که با استفاده از یک سوئیچ به موتور درایور متصل هستند.

در تصویر زیر تصویر واقعی اتصالات و ربات را میتوانید مشاهده کنید:

مدار ربات دنبال کننده انسان با آردوینو

توضیحات اتصالات مدار

اتصالات بین ماژول سنسور آلتراسونیک HC-SR04 و آردوینو:

ماژول حسگر اولتراسونیک HC-SR04

  • پایه VCC هر سنسور اولتراسونیک را به پایه 5 ولت برد آردوینو وصل کنید.
  • پایه GND هر سنسور اولتراسونیک را به پایه GND برد آردوینو وصل کنید.
  • پین ماشه (TRIG) هر سنسور اولتراسونیک را به پین های دیجیتال (2،4 و 6) برد آردوینو وصل کنید.
  • پین اکو (ECHO) هر اولتراسونیک را به پین های دیجیتال (3،5 و 7) برد آردوینو وصل کنید.

اتصالات بین آردوینو و ماژول درایور موتور:

  • پایه های دیجیتال آردوینو (8، 9، 10 و 11) را به پایه های ورودی (IN1، IN2، IN3، و IN4) در درایور موتور متصل کنید.
  • پین های ENA و ENB ماژول درایور موتور را با اتصالات مناسب High کنید.
  • پایه های OUT1، OUT2، OUT3 و OUT4 ماژول درایور موتور را به موتورها وصل کنید.
  • پایه های VCC (+5V) و GND ماژول درایور موتور را به ولتاژ مناسب (Vin) و زمین (GND) در آردوینو وصل کنید.

منبع تغذیه:

  • ترمینال مثبت منبع تغذیه را به ورودی +12 ولت ماژول درایور موتور وصل کنید.
  • ترمینال منفی منبع تغذیه را به پایه GND ماژول درایور موتور وصل کنید.
  • پایه GND آردوینو را به پایه GND ماژول درایور موتور وصل کنید.

قطعات مورد نیاز

  • برد آردوینو UNO 
  • سنسور اولتراسونیک ×3
  • درایور موتور L298N
  • شاسی ربات
  • موتورهای گیربکس × 2
  • چرخ × 2
  • باتری لیتیوم یون 3.7 ولت × 2
  • نگهدارنده باتری ×1
  • برد بورد
  • سیم سوئیچ و جامپر

کد آردوینو برای ربات دنبال کننده انسان

کد کامل پروژه در انتهای صفحه در فایل دانلودی قرار داده شده است. در اینجا قسمت های مهم کد را توضیح میدهیم.

سنسورهای التراسونیک روی ربات

این کد فواصل سه سنسور اولتراسونیک (“frontDistance”، “leftDistance” و “rightDistance”) را می خواند. سپس این فواصل را برای تعیین سنسور با کمترین فاصله مقایسه می کند. اگر فاصله زیر حد آستانه باشد، ربات را با استفاده از تابع های کنترل جهت موتور حرکت می دهد (‘moveForward()’, ‘turnLeft()’, ‘turnRight()’). اگر هیچ یک از فاصله ها زیر حد آستانه نباشد، موتور را با استفاده از “stop()” متوقف می کند.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

در ابتدا اتصالات پین سنسورهای اولتراسونیک و کنترل موتور را تعریف می کنیم. متغیرهای S1Trig، S2Trig، S3Trig نشان دهنده پایه های تریگر سه حسگر اولتراسونیک هستند و  S1Echo، S2Echo، S3Echo، نشان دهنده پین های اکو مربوط به سنسور های التراسونیک هستند.

متغیرهای LEFT_MOTOR_PIN1، LEFT_MOTOR_PIN2، RIGHT_MOTOR_PIN1 و RIGHT_MOTOR_PIN2 پایه‌هایی را برای کنترل موتورها تعریف می‌کنند.

متغیرهای MAX_DISTANCE و MIN_DISTANCE_BACK آستانه تشخیص موانع را تعیین می کنند.

// پایه های سنسور التراسونیک
#define S1Trig 2
#define S2Trig 4
#define S3Trig 6
#define S1Echo 3
#define S2Echo 5
#define S3Echo 7
// پایه های کنترل موتور
#define LEFT_MOTOR_PIN1 8
#define LEFT_MOTOR_PIN2 9
#define RIGHT_MOTOR_PIN1 10
#define RIGHT_MOTOR_PIN2 11
// حد آستانه
#define MAX_DISTANCE 40
#define MIN_DISTANCE_BACK 5

مطمئن شوید که مقادیر «MIN_DISTANCE_BACK» و «MAX_DISTANCE» را با توجه به نیازهای خاص خود و ویژگی‌های ربات خود تنظیم کرده‌اید.

مقادیر مناسب برای «MIN_DISTANCE_BACK» و «MAX_DISTANCE» به الزامات و ویژگی‌های خاص ربات دنبال‌کننده انسان شما بستگی دارد. شما باید عواملی مانند سرعت ربات خود، زمان پاسخ سنسورها و … را در نظر بگیرید.

در اینجا چند دستورالعمل کلی وجود دارد که به شما در انتخاب مقادیر مناسب کمک می کند.

MIN_DISTANCE_BACK این مقدار نشان‌دهنده فاصله‌ای است که ربات باید در آن هنگام که مانع یا چیزی مستقیماً در جلو تشخیص داده می‌شود به عقب برود. باید در فاصله ای تنظیم شود که به ربات اجازه دهد بدون برخورد با مانع یا دست، ایمن به عقب برگردد. یک مقدار مناسب می تواند حدود 5-10 سانتی متر باشد.

MAX_DISTANCE این مقدار نشان‌دهنده حداکثر فاصله‌ای است که ربات مسیر پیش رو را مستقیم می‌داند و می‌تواند به حرکت به جلو ادامه دهد. باید در فاصله ای تنظیم شود که فضای کافی برای حرکت ربات بدون برخورد با هیچ مانع یا دستی فراهم شود. اگر دست شما و موانع از این محدوده خارج شوند، ربات باید متوقف شود. یک مقدار معمولی می تواند حدود 30-50 سانتی متر باشد.

این مقادیر فقط پیشنهاد هستند و ممکن است لازم باشد آنها را بر اساس ویژگی های خاص ربات خود و محیطی که در آن کار می کند تنظیم کنید.

این خطوط محدودیت سرعت موتور را تعیین می کنند. MAX_SPEED حد آستانه برای سرعت موتور را نشان می‌دهد. مقادیر سرعت معمولاً در محدوده 0 تا 255 هستند و می‌توانند مطابق با نیازهای خاص ما تنظیم شوند.

#define MAX_SPEED 150
#define MIN_SPEED 75

تابع “setup()” یک بار در شروع کار اجرا می شود. در تابع setup()، پین‌های کنترل موتور (LEFT_MOTOR_PIN1، LEFT_MOTOR_PIN2، RIGHT_MOTOR_PIN1، RIGHT_MOTOR_PIN2) را به‌عنوان پایه‌های خروجی با استفاده از «pinMode()» تنظیم می‌کنیم. ما همچنین پایه های تریگر (S1Trig، S2Trig، S3Trig) سنسورهای اولتراسونیک را به عنوان پایه های خروجی و پایه های اکو (S1Echo، S2Echo، S3Echo) را به عنوان پایه های ورودی تنظیم کردیم. در نهایت، ما ارتباط سریال را با نرخ باود 9600 برای دیباگ کردن مقداردهی اولیه می کنیم.

void setup() {
  // تنظیم پایه های موتور روی خروجی
  pinMode(LEFT_MOTOR_PIN1, OUTPUT);
  pinMode(LEFT_MOTOR_PIN2, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN1, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN2, OUTPUT);
  //تنظیم تریگر روی خروجی
  pinMode(S1Trig, OUTPUT);
  pinMode(S2Trig, OUTPUT);
  pinMode(S3Trig, OUTPUT);
  //تنظیم اکو روی ورودی
  pinMode(S1Echo, INPUT);
  pinMode(S2Echo, INPUT);
  pinMode(S3Echo, INPUT);
  // شروع ارتباط سریال
  Serial.begin(9600);
}

این بلوک کد از سه تابع (“sensorOne()”، “sensorTwo()”، “sensorThree()”) تشکیل شده است که مسئول اندازه‌گیری فاصله با استفاده از حسگرهای اولتراسونیک هستند.

تابع “sensorOne()” فاصله را با استفاده از اولین سنسور اولتراسونیک اندازه گیری می کند. توجه به این نکته مهم است که تبدیل مدت زمان پالس به فاصله بر اساس این فرض است که سرعت صوت تقریباً 343 متر در ثانیه است. با نصف کردن نتیجه حاصل فاصله حدودا درست به دست می آید.

توابع «sensorTwo()» و «sensorThree()» به روشی مشابه کار می کنند اما به ترتیب برای حسگرهای اولتراسونیک دوم و سوم هستند.

// توابع محاسبه فاصله
int sensorOne() {
  //پالس خروحی
  digitalWrite(S1Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(S1Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(S1Trig, LOW);
  long t = pulseIn(S1Echo, HIGH);//دریافت پالس
  int cm = t / 29 / 2; //تبدیل به فاصله
  return cm; // خروجی میزان فاصله
}
int sensorTwo() {
 //پالس خروحی 
  digitalWrite(S2Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(S2Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(S2Trig, LOW);
  long t = pulseIn(S2Echo, HIGH);//دریافت پالس 
  int cm = t / 29 / 2; //تبدیل به فاصله
  return cm; // خروجی میزان فاصله
}
int sensorThree() {
 //پالس خروحی 
  digitalWrite(S3Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(S3Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(S3Trig, LOW);
  long t = pulseIn(S3Echo, HIGH);//دریافت پالس
  int cm = t / 29 / 2; //تبدیل به فاصله
  return cm; // خروجی میزان فاصله
}

در این بخش، تابع «loop()» با فراخوانی توابع «sensorOne()»، «sensorTwo()» و «sensorThree()» برای اندازه‌گیری فاصله از حسگرهای اولتراسونیک شروع می‌شود. سپس فاصله ها در متغیرهای “frontDistance”، “leftDistance” و “rightDistance” ذخیره می شوند.

در مرحله بعد از “Serial” برای چاپ مقادیر فاصله در سریال مانیتور برای اهداف دیباگینگ استفاده میشود.

void loop() {
  int frontDistance = sensorOne();
  int leftDistance = sensorTwo();
  int rightDistance = sensorThree();
  Serial.print("Front: ");
  Serial.print(frontDistance);
  Serial.print(" cm, Left: ");
  Serial.print(leftDistance);
  Serial.print(" cm, Right: ");
  Serial.print(rightDistance);
  Serial.println(" cm");

در این بخش از شرایط کد بررسی می‌کند که آیا فاصله جلویی کمتر از مقدار آستانه «MIN_DISTANCE_BACK» است یا خیر. اگر این شرط درست باشد، به این معنی است که فاصله جلو بسیار کم است و ربات باید برای جلوگیری از برخورد به عقب حرکت کند. در این حالت تابع “moveBackward()” فراخوانی می شود.

if (frontDistance < MIN_DISTANCE_BACK) {
    moveBackward();
    Serial.println("backward");

اگر شرط قبلی نادرست باشد، شرط دیگر بررسی می کند که فاصله جلو کمتر از فاصله چپ، کمتر از فاصله سمت راست و کمتر از آستانه «MAX_DISTANCE» باشد. اگر این شرط درست باشد، به این معنی است که فاصله جلو در بین سه فاصله کمتر است و همچنین کمتر از حداکثر آستانه فاصله است. در این حالت، تابع “moveForward()” فراخوانی می شود تا ربات به جلو حرکت کند.

else if (frontDistance < leftDistance && frontDistance < rightDistance && frontDistance < MAX_DISTANCE) {
    moveForward();
    Serial.println("forward");

اگر شرط قبلی نادرست باشد، این شرط بررسی می شود. بررسی می‌کند که آیا فاصله سمت چپ کمتر از فاصله راست و کمتر از آستانه «MAX_DISTANCE» باشد. این شرط نشان می دهد که فاصله سمت چپ در بین سه فاصله کمتر است و همچنین کمتر از حد آستانه فاصله است. بنابراین، تابع ()turnLeft فراخوانی می شود تا ماشین به چپ بپیچد.

else if (leftDistance < rightDistance && leftDistance < MAX_DISTANCE) {
    turnLeft();
    Serial.println("left");

اگر هیچ یک از شرایط قبلی برآورده نشد، این شرط بررسی می شود. این تضمین می کند که فاصله کمتر از آستانه “MAX_DISTANCE” باشد. این شرط نشان می دهد که فاصله مناسب در بین سه فاصله کمتر است و کمتر از آستانه حداقل فاصله است. سپس تابع “turnRight()” برای چرخش ماشین به راست فراخوانی می شود.

else if (rightDistance < MAX_DISTANCE) {
    turnRight();
    Serial.println("right");

اگر هیچ یک از شرایط قبلی درست نباشد، به این معنی است که هیچ یک از فاصله ها شرایط حرکت را برآورده نمی کند. بنابراین، تابع “stop()” برای توقف ربات فراخوانی می شود.

 else {
    stop();
    Serial.println("stop");

به طور خلاصه، این کد فواصل سه سنسور اولتراسونیک را بررسی می کند و بر اساس 3 سنسور اولتراسونیک با کمترین فاصله، جهت حرکت خودرو را تعیین می کند.

تست ربات دنبال کننده انسان

ساخت ربات تعقیب انسان با استفاده از آردوینو و سه حسگر اولتراسونیک، پروژه ای هیجان انگیز و مفید است که برنامه نویسی، الکترونیک و مکانیک را با هم ترکیب می کند. با تطبیق پذیری آردوینو و در دسترس بودن قطعات ارزان قیمت، ساخت آن کار ساده ای است.

ربات‌های دنبال‌کننده انسان طیف وسیعی از کاربردها در پروژه های مختلف دارند. این ربات ها را می‌توان در فروشگاه‌های خرده‌فروشی، مراکز خرید و هتل‌ها برای ارائه کمک‌های شخصی به مشتریان استفاده کرد. ربات های تعقیب انسان را می توان در سیستم های امنیتی و نظارتی برای ردیابی و نظارت بر افراد در فضاهای عمومی به کار گرفت. آنها را می توان در سرگرمی ها و رویدادها، مراقبت از سالمندان، راهنمای تور، تحقیق و توسعه، آموزش و تحقیق و روباتیک شخصی استفاده کرد.

این تنها چند نمونه از کاربردهای ربات تعقیب کننده انسان است. با پیشرفت تکنولوژی و پیشرفت روباتیک، می‌توان انتظار کاربردهای متنوع‌تر و خلاقانه‌تری را در آینده داشت.

موارد موجود در فایل : سورس کامل

4 (8 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

4 نظر

  1. سلام وقت بخیر برای کد گفته شده موتور گیربکس با چه دوری لازم هست تا ربات به درستی مثل ویدیو کار کند؟

  2. سلام منظور از سیم سویچ و سیم جامپر چیست ؟
    سیم جامپر یعنی نری به مادگی یا دقیقا کدوم میشه ؟
    و این که سیم سویچ چیه دقیقا ؟
    اگر در فروشگاه آرینکس برای این ربات مرتبط با سیم جامپر و سیم سویچ کالایی هست لطفا لینک خرید ارسال کنید.

    1. سلام عزیز
      از همان سیم جامپر نری به نری میتوانید استفاده کنید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *