بسته ربات Vira Connect

بسته ربات Vira Connect

24 دیدگاه کاربران
24 نفر از خریداران ، این کالا را پیشنهاد کرده اند
قیمت :

4,700,000 تومان

گارانتی اصالت و سلامت فیزیکی کالا

توضیحات

معرفی بسته ربات ویرا کانکت (Vira Connect) 🎯🤖

آیا آماده‌اید که به دنیای شگفت‌انگیز رباتیک وارد شوید؟ بسته Vira Connect یک کیت آموزشی کامل است که از سطح مقدماتی تا پیشرفته طراحی شده و به شما این امکان را می‌دهد که در کنار یادگیری برنامه‌نویسی سخت‌افزار، چندین پروژه رباتیک جالب بسازید! 🚀

این بسته شامل انواع ربات‌ها با قابلیت‌های مختلف است:

ربات مسیریاب 🚦
تشخیص و دنبال کردن مسیر، اطمینان از حرکت در خطوط مشخص

ربات آتش‌نشان 🔥
شناسایی و خاموش کردن شعله‌های آتش

ربات نوریاب 💡
حرکت به سمت منابع نوری

ربات کنترل با تلفن همراه 📱
هدایت ربات از طریق اپلیکیشن موبایل

ربات ورزشکار
حرکات خودکار و واکنش به موانع


ویژگی‌های برجسته بسته Vira Connect 🔧🌟

🔹 مبتنی بر برنامه‌نویسی در محیط Arduino IDE 🎛️
یک تجربه برنامه‌نویسی جذاب و کاربرپسند با استفاده از Arduino IDE برای ساخت پروژه‌های واقعی.

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

🔹 نسخه‌های مختلف و مناسب برای سطوح مختلف آموزشی 📚
در رنج‌های قیمتی مختلف برای سطوح گوناگون، از مبتدی تا پیشرفته.

🔹 قابلیت‌های متعدد برای پروژه‌های متنوع
ساخت انواع ربات‌ها مانند ربات مسیریاب، نوریاب، آتش‌نشان و بسیاری دیگر. 🎮


ویژگی‌های اصلی بسته رباتیک Vira Connect 🎯🤖

🔹 ربات چندمنظوره:
ویرا کانکت یک ربات چندکاره است که می‌تواند در پروژه‌های مختلف مانند دنبال‌کننده خط 🚦، نوریاب 💡، آتش‌نشان 🔥، و ربات‌های اسپرت ⚽ استفاده شود.

🔹 آموزش برنامه‌نویسی ساده و جامع:
با بسته ویرا کانکت، به‌راحتی می‌توانید از نصب نرم‌افزار Arduino IDE 🖥️ تا تنظیم پورت‌ها و اتصال باتری 🔋 شروع کنید. این بسته شامل کدهای آماده برای:

  • LEDها 💡: راه‌اندازی و کنترل LEDها
  • ماژول بلوتوث 📶: کنترل ربات با موبایل
  • حسگرها (نور، فاصله‌یاب، IR) 🌡️: استفاده از حسگرهای مختلف برای ردیابی و شناسایی محیط
  • موتورها 🔧: حرکت ربات در مسیرهای مختلف
  • کلیدها 🔘: تنظیمات ورودی برای کنترل و خاموش/روشن کردن عملکردهای ربات

🔹 جامپرها و سوکت‌ها:
برای استفاده از قابلیت‌های مختلف ربات، باید جامپرها را به‌درستی تنظیم کنید. این تنظیمات به‌همراه برنامه‌نویسی پین‌ها و اتصال باتری در راهنمای بسته توضیح داده شده است.


مراحل راه‌اندازی و برنامه‌نویسی ربات ویرا کانکت 🚀

  1. نصب نرم‌افزار و درایور Arduino 💻
    ابتدا نرم‌افزار Arduino را نصب کرده و درایورهای لازم را بارگذاری کنید.

  2. تنظیم جامپرها و پورت‌ها 🔌
    برای هر کاربرد، جامپرها را تنظیم کنید. به عنوان مثال، برای راه‌اندازی LEDها، باید جامپرها را روی Mode1 قرار دهید.

  3. اتصال باتری و کابل USB 🔋📡
    باتری را به برد متصل کرده و از کابل USB برای آپلود کدهای برنامه‌نویسی استفاده کنید.

  4. دانلود و آپلود کدهای نمونه ⬇️
    کدهای آماده برای راه‌اندازی LEDها، ماژول بلوتوث، و حسگرها در لینک‌های ارائه شده در راهنما موجود است.


کنترل ربات با بلوتوث 📱📶

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

🔗 لینک دانلود ویرا کنترلر


آماده برای شروع؟ 🌟

با استفاده از دستورالعمل‌ها و نمونه کدهای موجود در ادامه توضیحات، می‌توانید ربات خود را بسازید و برنامه‌نویسی کنید. دنیای رباتیک منتظر شماست! 🚀

				
					const int buttonPin = 2;  
void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); }
void loop() { Serial.println(digitalRead(buttonPin)); delay(500); }

				
			
				
					const int ledPin = 13;  
void setup() { pinMode(ledPin, OUTPUT); }
void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }

				
			
				
					const int sensorPin = A0;
void setup() { Serial.begin(9600); }
void loop() { Serial.println(analogRead(sensorPin)); delay(500); }

				
			
				
					const int pwmPin = 9;  
void setup() { pinMode(pwmPin, OUTPUT); }
void loop() { analogWrite(pwmPin, 128); delay(1000); analogWrite(pwmPin, 255); delay(1000); }

				
			
				
					char myChar = 'A';  // ذخیره کاراکتر 'A'
void setup() {
    Serial.begin(9600);
    Serial.println(myChar);  // نمایش مقدار متغیر
}
void loop() {}

				
			
				
					int myInt = 100;  // ذخیره عدد صحیح 100
void setup() {
    Serial.begin(9600);
    Serial.println(myInt);  // نمایش مقدار متغیر
}
void loop() {}

				
			
				
					float myFloat = 3.14;  // ذخیره عدد اعشاری
void setup() {
    Serial.begin(9600);
    Serial.println(myFloat, 2);  // نمایش مقدار با 2 رقم اعشار
}
void loop() {}

				
			
				
					void setup() {
    Serial.begin(9600);
    for (int i = 0; i < 10; i++) {  // از 0 تا 9 تکرار می‌شود
        Serial.println(i);  // نمایش مقدار i
        delay(500);
    }
}

void loop() {}

				
			
				
					void setup() {
    Serial.begin(9600);  // راه‌اندازی ارتباط سریال برای نمایش خروجی
}

void loop() {
    int x = 10;  // مقداردهی متغیر

    // بررسی مقدار متغیر و انجام دستورات مناسب
    if (x > 10) {  
        Serial.println("x بزرگتر از 10 است.");
    } 
    else if (x == 10) {  
        Serial.println("x برابر با 10 است.");
    } 
    else {  
        Serial.println("x کوچکتر از 10 است.");
    }

    delay(2000);  // تاخیر ۲ ثانیه‌ای برای جلوگیری از تکرار سریع خروجی
}

				
			
				
					void setup() {
    pinMode(13, OUTPUT);  // تنظیم پایه 13 به‌عنوان خروجی
}

void loop() {
    digitalWrite(13, HIGH);  // روشن کردن LED
    delay(1000);             // مکث 1 ثانیه
    digitalWrite(13, LOW);   // خاموش کردن LED
    delay(1000);             // مکث 1 ثانیه
}

				
			
				
					void setup() {
    Serial.begin(9600);
    int i = 1;  // مقدار اولیه
    while (i <= 5) {  // حلقه تا زمانی که i <= 5 باشد، اجرا می‌شود
        Serial.println(i);
        i++;  // افزایش مقدار i
        delay(500);
    }
}

void loop() {}

				
			
				
					void setup() {
    Serial.begin(9600);  // شروع ارتباط سریال
}

void loop() {
    if (Serial.available() > 0) {  // بررسی وجود داده در بافر سریال
        int num = Serial.parseInt();  // خواندن عدد
        Serial.print("عدد دریافتی: ");
        Serial.println(num);
    }
}

				
			

آموزش ساخت ربات در ورژن های مختلف:

معرفی برد شیلد ربات:

کد های راه اندازی LED های برد:

				
					/*
   پروژه: رقص نور با برد Arduino و شیلد Pishro Khalaghyat
   توضیحات: این کد برای اجرای رقص نور طراحی شده و از چندین LED متصل به برد Arduino استفاده می‌کند.
   جامپرهای مورد استفاده مطابق جدول زیر تنظیم شده‌اند:

   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |   Mod2    |
   |   JP2   |   Mod2    |
   |   JP4   |     -     |
   |   JP5   |     -     |
   |   JP6   |     -     |
   |   JP7   |   Mod2    |
   |   JP8   |   Mod2    |
   -------------------------------------

   * پین‌های LED مطابق جدول زیر متصل شده‌اند:
   - پایه 0: ledPin1
   - پایه 1: ledPin2
   - پایه 13: ledPin3
   - پایه A2: ledPin4
   - پایه A3: ledPin5
*/

const int ledPin1 = 0;  // پایه 0
const int ledPin2 = 1;  // پایه 1
const int ledPin3 = 13; // پایه 13
const int ledPin4 = A2; // پایه A2
const int ledPin5 = A3; // پایه A3

void setup() {
  // تنظیم پایه‌ها به عنوان خروجی
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
}

void loop() {
  // رقص نور: روشن و خاموش کردن LED ها به ترتیب
  digitalWrite(ledPin2, HIGH);
  delay(200);
  digitalWrite(ledPin2, LOW);
  delay(200);

  digitalWrite(ledPin3, HIGH);
  delay(200);
  digitalWrite(ledPin3, LOW);
  delay(200);

  digitalWrite(ledPin1, HIGH);
  delay(200);
  digitalWrite(ledPin1, LOW);
  delay(200);

  digitalWrite(ledPin4, HIGH);
  delay(200);
  digitalWrite(ledPin4, LOW);
  delay(200);

  digitalWrite(ledPin5, HIGH);
  delay(200);
  digitalWrite(ledPin5, LOW);
  delay(200);
}

				
			

کد های راه اندازی حرکت موتور ها با از درگاه سریال:

				
					/*
   پروژه: کنترل ربات با بلوتوث - شیلد Pishro Khalaghyat
   توضیحات: این کد برای کنترل حرکت ربات با استفاده از دستورات دریافتی از بلوتوث طراحی شده است.
   **این نسخه از درگاه سریال سخت‌افزاری (Serial) بدون استفاده از Serial1 یا SoftwareSerial استفاده می‌کند.**
   
   جامپرهای مورد استفاده مطابق جدول زیر تنظیم شده‌اند:

   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |   1       |
   |   JP2   |   1       |
   |   JP4   |     -     |
   |   JP5   |     -     |
   |   JP6   |     -     |
   |   JP7   |     -     |
   |   JP8   |     -     |
   -------------------------------------

   * پین‌های موتور به ترتیب زیر متصل شده‌اند:
   - پایه 2: موتور چپ (M_left)
   - پایه 3: فعال‌سازی موتور چپ (EN)
   - پایه 4: جهت حرکت موتور چپ
   - پایه 5: موتور راست (M_right)
   - پایه 6: فعال‌سازی موتور راست (EN)
   - پایه 7: جهت حرکت موتور راست
*/

void setup() {
  Serial.begin(9600);  // تنها درگاه سریال برای ارتباط با بلوتوث و مانیتورینگ

  // تنظیم پایه‌های موتور چپ
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  // تنظیم پایه‌های موتور راست
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
  if (Serial.available()) { // بررسی دریافت داده از سریال
    char d = Serial.read(); // خواندن دستور حرکتی

    if (d == 'F') { // حرکت به جلو
      digitalWrite(3, HIGH); // فعال‌سازی موتور راست
      digitalWrite(2, HIGH);
      digitalWrite(4, LOW);

      digitalWrite(6, HIGH); // فعال‌سازی موتور چپ
      digitalWrite(5, HIGH);
      digitalWrite(7, LOW);
    } 
    
    else if (d == 'B') { // حرکت به عقب
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(4, HIGH);

      digitalWrite(6, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(7, HIGH);
    } 
    
    else if (d == 'L') { // چرخش به چپ
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(4, HIGH);

      digitalWrite(6, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(7, LOW);
    } 
    
    else if (d == 'R') { // چرخش به راست
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(4, LOW);

      digitalWrite(6, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(7, HIGH);
    } 
    
    else if (d == 'S') { // توقف کامل
      digitalWrite(3, LOW);
      digitalWrite(6, LOW);
    }
  }
}

				
			

کد های ویرایش تنظیمات ماژول بلوتوث:

				
					#include <SoftwareSerial.h>

/*
   پروژه: تنظیمات ماژول بلوتوث HC-05 - شیلد Pishro Khalaghyat
   توضیحات: این کد برای تغییر نام، رمز عبور (PIN) و نرخ بیت (Baud Rate) ماژول بلوتوث HC-05 از طریق سریال نرم‌افزاری (SoftwareSerial) استفاده می‌شود.
   **این نسخه تنها شامل دستورات AT برای تنظیم ماژول بلوتوث است و شامل کنترل ربات نمی‌باشد.**

   🔧 **راهنمای تغییر تنظیمات ماژول بلوتوث HC-05 (دستورات AT):**
   1️⃣ **بازنشانی تنظیمات کارخانه:**  `AT+DEFAULT`
   2️⃣ **مشاهده نسخه ماژول:**  `AT+VERSION`
   3️⃣ **تغییر نرخ انتقال داده (Baud Rate):**  `AT+BAUDx` (x مقدار نرخ انتقال است. مثلاً `AT+BAUD4` برای 9600)
   4️⃣ **تغییر نام ماژول:**  `AT+NAME=YourName`
   5️⃣ **تغییر رمز عبور (PIN):**  `AT+PIN=1234`
   6️⃣ **تنظیم نرخ انتقال داده سریال:**  `AT+UART=115200,0,0`

   🛠 **برای انجام تغییرات، ماژول باید در حالت AT Mode باشد.**
   
   ⚙ **جامپرهای مورد استفاده مطابق جدول زیر تنظیم شده‌اند:**
   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |   1       |
   |   JP2   |   1       |
   |   JP4   |     -     |
   |   JP5   |     -     |
   |   JP6   |     -     |
   |   JP7   |     -     |
   |   JP8   |     -     |
   -------------------------------------
*/

// تعریف سریال نرم‌افزاری برای ارتباط با ماژول بلوتوث
SoftwareSerial SoftSerial(10, 11); // RX | TX

int BAUDRATE = 9600; // نرخ بیت پیش‌فرض

void setup() {
  pinMode(9, OUTPUT);  // تنظیم پین 9 برای ورود ماژول به حالت AT Mode
  // digitalWrite(9, HIGH); // در صورت نیاز، این خط را فعال کنید
  
  SoftSerial.begin(BAUDRATE);  // مقداردهی اولیه سریال نرم‌افزاری
  Serial.begin(9600);  // مقداردهی اولیه سریال سخت‌افزاری
  
  Serial.println("🔹 AT Mode فعال است. دستورات AT را برای تنظیم ماژول ارسال کنید.");
  Serial.println("🔹 برای مشاهده نسخه ماژول، دستور AT+VERSION را ارسال کنید.");
  Serial.println("🔹 برای تغییر نام ماژول، از AT+NAME=YourName استفاده کنید.");
  Serial.println("🔹 برای تغییر رمز عبور، از AT+PIN=1234 استفاده کنید.");
  Serial.println("🔹 برای تنظیم نرخ انتقال داده، از AT+BAUDx استفاده کنید (مثلاً AT+BAUD4 برای 9600).");
  Serial.println("🔹 برای بازنشانی تنظیمات کارخانه، دستور AT+DEFAULT را ارسال کنید.");
}

void loop() {
  if (SoftSerial.available()) { // بررسی دریافت داده از ماژول بلوتوث
    Serial.write(SoftSerial.read()); // نمایش داده‌های دریافتی از بلوتوث در سریال مانیتور
  }

  if (Serial.available()) { // بررسی دریافت داده از سریال مانیتور
    SoftSerial.write(Serial.read()); // ارسال داده‌های ورودی به ماژول بلوتوث
  }
}

				
			

کد های راه اندازی حرکت موتور ها از طریق بلوتوث:

				
					#include <SoftwareSerial.h>

// تعریف پایه‌های ماژول بلوتوث
#define BT_RX 10 
#define BT_TX 11

SoftwareSerial bluetooth(BT_RX, BT_TX); // ایجاد پورت سریال مجازی برای ارتباط بلوتوث

/*
   پروژه: کنترل ربات با بلوتوث - شیلد Pishro Khalaghyat
   توضیحات: این کد برای کنترل حرکت ربات با استفاده از دستورات دریافتی از بلوتوث طراحی شده است.
   جامپرهای مورد استفاده مطابق جدول زیر تنظیم شده‌اند:

   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |   1       |
   |   JP2   |   1       |
   |   JP4   |     -     |
   |   JP5   |     -     |
   |   JP6   |     -     |
   |   JP7   |     -     |
   |   JP8   |     -     |
   -------------------------------------

   * پین‌های موتور به ترتیب زیر متصل شده‌اند:
   - پایه 2: موتور چپ (M_left)
   - پایه 3: فعال‌سازی موتور چپ (EN)
   - پایه 4: جهت حرکت موتور چپ
   - پایه 5: موتور راست (M_right)
   - پایه 6: فعال‌سازی موتور راست (EN)
   - پایه 7: جهت حرکت موتور راست
*/

void setup() {
  Serial.begin(9600); // برای مانیتورینگ در سریال مانیتور
  bluetooth.begin(9600); // برای ارتباط بلوتوثی

  // تنظیم پایه‌های موتور چپ
  pinMode(2, OUTPUT); 
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  // تنظیم پایه‌های موتور راست
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
  if (bluetooth.available()) { // بررسی دریافت داده از بلوتوث
    char d = bluetooth.read(); // خواندن دستور حرکتی

    if (d == 'F') { // حرکت به جلو
      digitalWrite(3, HIGH); // فعال‌سازی موتور راست
      digitalWrite(2, HIGH);
      digitalWrite(4, LOW);

      digitalWrite(6, HIGH); // فعال‌سازی موتور چپ
      digitalWrite(5, HIGH);
      digitalWrite(7, LOW);
    } 
    
    else if (d == 'B') { // حرکت به عقب
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(4, HIGH);

      digitalWrite(6, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(7, HIGH);
    } 
    
    else if (d == 'L') { // چرخش به چپ
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      digitalWrite(4, HIGH);

      digitalWrite(6, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(7, LOW);
    } 
    
    else if (d == 'R') { // چرخش به راست
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(4, LOW);

      digitalWrite(6, HIGH);
      digitalWrite(5, LOW);
      digitalWrite(7, HIGH);
    } 
    
    else if (d == 'S') { // توقف کامل
      digitalWrite(3, LOW);
      digitalWrite(6, LOW);
    }
  }
}

				
			

کد های راه اندازی حسگر های نور و نمایش روی درگاه سریال:

				
					/*
   پروژه: نمایش مقدار سنسورهای LDR - شیلد Pishro Khalaghyat
   توضیحات: این کد مقدار روشنایی اندازه‌گیری‌شده توسط سنسورهای LDR را از طریق سریال مانیتور نمایش می‌دهد.
   جامپرهای مورد استفاده مطابق جدول زیر تنظیم شده‌اند:

   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |     -     |
   |   JP2   |     -     |
   |   JP4   |   Mod2    |
   |   JP5   |   Mod2    |
   |   JP6   |     -     |
   |   JP7   |     -     |
   |   JP8   |     -     |
   -------------------------------------

   * پین‌های مرتبط با LDR:
   - LDR1 به ورودی آنالوگ A0 متصل است.
   - LDR2 به ورودی آنالوگ A1 متصل است.
   - مقدار هر سنسور در سریال مانیتور نمایش داده می‌شود.
*/

int LDR1;  // مقدار خوانده‌شده از سنسور LDR1
int LDR2;  // مقدار خوانده‌شده از سنسور LDR2

const int L1 = 7;  // پایه کنترلی سمت چپ
const int L2 = 5;  // پایه کنترلی سمت چپ
const int R1 = 4;  // پایه کنترلی سمت راست
const int R2 = 2;  // پایه کنترلی سمت راست

void setup() {
  Serial.begin(9600); // راه‌اندازی سریال برای نمایش مقادیر در مانیتور سریال
  pinMode(A0, INPUT); // تنظیم A0 برای خواندن مقدار از LDR1
  pinMode(A1, INPUT); // تنظیم A1 برای خواندن مقدار از LDR2

  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(R1, OUTPUT);
  pinMode(R2, OUTPUT);
}

void loop() {
  LDR1 = analogRead(A0); // خواندن مقدار LDR1
  LDR2 = analogRead(A1); // خواندن مقدار LDR2

  Serial.print("LDR1: ");
  Serial.print(LDR1); // نمایش مقدار LDR1
  Serial.print(" | LDR2: ");
  Serial.println(LDR2); // نمایش مقدار LDR2

  delay(500); // تأخیر برای جلوگیری از ارسال بیش از حد داده‌ها
}

				
			

کدراه اندازی شمارش کلید ورودی فشرده شده:

				
					int c1, c2 = 0; // شمارنده‌ها برای ذخیره وضعیت کلید
const int buzzerPin = 9; // پین بازر
const int buttonPin = 12; // پین کلید 
//کلید دو 12 می باشد
void setup() {
  pinMode(buzzerPin, OUTPUT); // تنظیم پین بازر به عنوان خروجی
  pinMode(buttonPin, INPUT_PULLUP); // تنظیم پین کلید با پول‌آپ داخلی
  Serial.begin(9600);
  Serial.println("🔹 سیستم آماده است. دکمه را فشار دهید.");
}

void loop() {
  c1 = digitalRead(buttonPin); // خواندن مقدار کلید

  if (c1 == 1) { // بررسی فشرده شدن کلید (LOW به دلیل پول‌آپ داخلی)
    c2++;
    Serial.print("🔹 تعداد دفعات فشرده شدن: ");
    Serial.println(c2);
    
    delay(300); // جلوگیری از چندین ثبت غیرمعتبر (debounce)
    
    if (c2 >= 5) { // اگر کلید 5 بار فشار داده شد
      Serial.println("🔔 هشدار: حد مجاز فشار دادن کلید رسید!");
      tone(buzzerPin, 1000, 500); // فعال‌سازی بازر با فرکانس 1000Hz برای 500 میلی‌ثانیه
      delay(500);
      c2 = 0; // بازنشانی شمارنده
      Serial.println("🔄 شمارنده ریست شد.");
    }
  }
}

				
			

کد شمارنده با فرشردن دو کلید ورودی(آموزش AND):

				
					int c1, c2, counter = 0; // متغیرهای شمارنده و وضعیت کلیدها
const int buzzerPin = 9;   // پین بازر
const int button1Pin = 8;  // پین کلید اول
const int button2Pin = 12; // پین کلید دوم

void setup() {
  pinMode(buzzerPin, OUTPUT);        // تنظیم پین بازر به عنوان خروجی
  pinMode(button1Pin, INPUT_PULLUP); // تنظیم پین کلید اول با پول‌آپ داخلی
  pinMode(button2Pin, INPUT_PULLUP); // تنظیم پین کلید دوم با پول‌آپ داخلی
  Serial.begin(9600);
  Serial.println("🔹 سیستم آماده است. برای شمارش، هر دو کلید را هم‌زمان فشار دهید.");
}

void loop() {
  c1 = digitalRead(button1Pin); // خواندن مقدار کلید اول
  c2 = digitalRead(button2Pin); // خواندن مقدار کلید دوم

  // بررسی شرط AND: تنها زمانی که هر دو کلید فشرده شده باشند، شمارش انجام می‌شود
  if (c1 == 1 && c2 == 1) { 
    counter++;
    Serial.print("✅ تعداد دفعات فشرده شدن هر دو کلید (AND): ");
    Serial.println(counter);
    
    delay(100); // جلوگیری از چندین ثبت غیرمعتبر (debounce)

    if (counter >= 5) { // اگر هر دو کلید 5 بار فشار داده شوند
      Serial.println("🔔 هشدار: حد مجاز فشار دادن کلیدها رسید!");
      tone(buzzerPin, 1000, 500); // فعال‌سازی بازر با فرکانس 1000Hz برای 500 میلی‌ثانیه
      delay(500);
      counter = 0; // بازنشانی شمارنده
      Serial.println("🔄 شمارنده ریست شد.");
    }
  }

  // بررسی فشرده شدن یک کلید به‌تنهایی (مغایرت با AND)
  else if (c1 == LOW && c2 == HIGH) {
    Serial.println("⚠️ تنها کلید اول فشار داده شده است. برای شمارش، هر دو کلید را هم‌زمان فشار دهید. (AND)");
    delay(30);
  } 
  else if (c2 == LOW && c1 == HIGH) {
    Serial.println("⚠️ تنها کلید دوم فشار داده شده است. برای شمارش، هر دو کلید را هم‌زمان فشار دهید. (AND)");
    delay(30);
  }
}

				
			

کد آموزشی کار با متغییر های ریاضی:

				
					/*
   پروژه: شمارنده و نمایش وضعیت LED - شیلد Pishro Khalaghyat
   توضیحات: این کد برای افزایش و کاهش مقدار شمارنده با فشردن کلیدها طراحی شده است.
   اگر مقدار شمارنده زوج باشد، LED متصل به A2 روشن می‌شود و اگر فرد باشد، LED متصل به A3 روشن خواهد شد.

   🔧 **جامپرهای مورد استفاده برای فعال‌سازی LED‌ها مطابق جدول زیر تنظیم شده‌اند:**
   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |   Mod1    |
   |   JP2   |   Mod1    |
   |   JP4   |     -     |
   |   JP5   |     -     |
   |   JP6   |     -     |
   |   JP7   |   Mod2    |
   |   JP8   |   Mod2    |
   -------------------------------------

   * پین‌های کلید و LED به ترتیب زیر متصل شده‌اند:
   - پایه 8: کلید افزایش مقدار (Increase)
   - پایه 12: کلید کاهش مقدار (Decrease)
   - پایه A2: LED برای نمایش مقدار زوج
   - پایه A3: LED برای نمایش مقدار فرد
*/

int count = 0; // مقدار شمارنده
const int buttonIncrease = 8; // کلید افزایش مقدار
const int buttonDecrease = 12; // کلید کاهش مقدار
const int ledEven = A2; // LED برای مقادیر زوج
const int ledOdd = A3; // LED برای مقادیر فرد

void setup() {
  pinMode(buttonIncrease, INPUT_PULLUP); // تنظیم کلید افزایش با پول‌آپ داخلی
  pinMode(buttonDecrease, INPUT_PULLUP); // تنظیم کلید کاهش با پول‌آپ داخلی
  pinMode(ledEven, OUTPUT); // تنظیم LED برای اعداد زوج
  pinMode(ledOdd, OUTPUT); // تنظیم LED برای اعداد فرد
  Serial.begin(9600);
  Serial.println("🔹 سیستم آماده است. از کلیدها برای افزایش یا کاهش مقدار استفاده کنید.");
}

void loop() {
  if (digitalRead(buttonIncrease) == 1) { // اگر کلید افزایش فشرده شد
    count++;
    Serial.print("➕ مقدار افزایش یافت: ");
    Serial.println(count);
    delay(300); // جلوگیری از تداخل چندبار فشردن کلید
  }

  if (digitalRead(buttonDecrease) == 1) { // اگر کلید کاهش فشرده شد
    count--;
    Serial.print("➖ مقدار کاهش یافت: ");
    Serial.println(count);
    delay(300);
  }

  // بررسی زوج یا فرد بودن مقدار و کنترل LED‌ها
  if (count % 2 == 0) {
    digitalWrite(ledEven, HIGH);
    digitalWrite(ledOdd, LOW);
    Serial.println("✅ مقدار زوج است. LED A2 روشن شد.");
  } else {
    digitalWrite(ledEven, LOW);
    digitalWrite(ledOdd, HIGH);
    Serial.println("⚠️ مقدار فرد است. LED A3 روشن شد.");
  }

  delay(100);
}

				
			

کد راه اندازی حسگر فاصله یاب و نمایش داده آن روی درگاه سریال:

				
					/*
 * Ultrasonic Simple with Buzzer Alert
 * Prints the distance read by an ultrasonic sensor in
 * centimeters and gives a sound alert when the distance
 * is less than 10 cm.
 *
 * The circuit:
 * * Module SRF-04 (four pins) or PING))) (and other with
 *   three pins), attached to digital pins as follows:
 * ---------------------    
 * | SRF04 | Arduino |    
 * ---------------------    
 * |   Vcc   |   5V(PL3)    |    
 * |   Trig  |   A5    | 
 * |   Echo  |   A4    |    
 * |   Gnd   |   GND   |    
 * ---------------------
 *
 * Additional information:
 * - Jumper settings for proper operation:
 * ------------------------------
 * | Jumper | Status   |
 * ------------------------------
 * | JP1    | Mod2     |
 * | JP2    | Mod2     |
 * | JP4    | -        |
 * | JP5    | -        |
 * | JP6    | Mod2     |
 * | JP7    | -        |
 * | JP8    | -        |
 * ------------------------------
 * - The sensor is connected to the following pins:
 *   - A5: Signal output of the ultrasonic sensor
 *   - A6: Reference for the sensor (if needed)
 *   - Pin 9: Sound alert (buzzer)
 */

#include <Ultrasonic.h>

// Create an Ultrasonic object using pins A4 and A5
Ultrasonic ultrasonic(A4, A5);

const int buzzerPin = 9; // Pin for the buzzer
const int distanceThreshold = 10; // Distance threshold for the alert

void setup() {
  pinMode(buzzerPin, OUTPUT);  // Set the buzzer pin as an output
  Serial.begin(9600); // Initialize serial communication
}

void loop() {
  // Read the distance from the ultrasonic sensor
  long distance = ultrasonic.distanceRead();
  
  // Print the distance to the serial monitor
  Serial.print("Distance in CM: ");
  Serial.println(distance);

  // Check if the distance is less than the threshold
  if (distance < distanceThreshold && distance !=0) {
    Serial.println("⚠️ Alert! Object detected too close!");
    tone(buzzerPin, 1000, 500); // Generate a 1000 Hz tone for 500 ms
  } else {
    noTone(buzzerPin); // Stop the buzzer sound if the distance is safe
  }

  delay(100); // Delay to avoid flooding the serial monitor
}

				
			

کد راه اندازی حسگر فاصله یاب با اموزش ساختار While:

				
					/*
 * Ultrasonic Simple with Buzzer Alert
 * Prints the distance read by an ultrasonic sensor in
 * centimeters and gives a sound alert when the distance
 * is less than 10 cm.
 *
 * The circuit:
 * * Module SRF-04 (four pins) or PING))) (and other with
 *   three pins), attached to digital pins as follows:
 * ---------------------    
 * | SRF04 | Arduino |    
 * ---------------------    
 * |   Vcc   |   5V(PL3)    |    
 * |   Trig  |   A5    | 
 * |   Echo  |   A4    |    
 * |   Gnd   |   GND   |    
 * ---------------------
 *
 * Additional information:
 * - Jumper settings for proper operation:
 * ------------------------------
 * | Jumper | Status   |
 * ------------------------------
 * | JP1    | Mod2     |
 * | JP2    | Mod2     |
 * | JP4    | -        |
 * | JP5    | -        |
 * | JP6    | Mod2     |
 * | JP7    | Mod2     |
 * | JP8    | Mod2     |
 * ------------------------------
 * - The sensor is connected to the following pins:
 *   - A5: Signal output of the ultrasonic sensor
 *   - A6: Reference for the sensor (if needed)
 *   - Pin 9: Sound alert (buzzer)
 */
/*
 * Ultrasonic Simple with While Loop and Buzzer Alert
 * This program demonstrates the use of a while loop to keep the system
 * running in setup until the ultrasonic sensor detects a distance
 * of less than 10 cm. Once that happens, LEDs on A2 and A3 will turn on
 * and a sound alert will be triggered.
 *
 * The circuit:
 * ---------------------    
 * | HC-SC04 | Arduino |    
 * ---------------------    
 * |   Vcc   |   5V    |    
 * |   Trig  |   A4    | 
 * |   Echo  |   A5    |    
 * |   Gnd   |   GND   |    
 * ---------------------
 *
 * The system will:
 * - Stay in a while loop in setup until the distance is less than 10 cm.
 * - Print distance and alert in the serial monitor.
 * - Turn on LEDs connected to A2 and A3 when the distance is less than 10 cm.
 */

#include <Ultrasonic.h>

// Initialize ultrasonic sensor on pins A4 (Trig) and A5 (Echo)
Ultrasonic ultrasonic(A4, A5);

const int buzzerPin = 9; // Pin for the buzzer
const int ledPinA2 = A2; // Pin for LED 1
const int ledPinA3 = A3; // Pin for LED 2
const int distanceThreshold = 10; // Distance threshold for alert in cm

void setup() {
  pinMode(buzzerPin, OUTPUT);  // Set the buzzer pin as an output
  pinMode(ledPinA2, OUTPUT);  // Set LED pin A2 as an output
  pinMode(ledPinA3, OUTPUT);  // Set LED pin A3 as an output

  Serial.begin(9600); // Start serial communication
  Serial.println("🔹 سیستم آماده است. اندازه‌گیری فاصله آغاز شد...");

  // Use a while loop to keep the system running until distance is less than 10 cm
  while (true) {
    // Read the distance from the ultrasonic sensor
    long distance = ultrasonic.distanceRead();
  
    // Print the measured distance to the serial monitor
    Serial.print("📏 فاصله اندازه‌گیری شده: ");
    Serial.print(distance);
    Serial.println(" cm");

    // Check if the distance is below the threshold
    if (distance < distanceThreshold) {
      // If distance is less than the threshold, break out of the while loop
      Serial.println("⚠️ هشدار! جسمی در فاصله کم شناسایی شد!");

      // Activate the buzzer for 500 ms at 1000 Hz
      tone(buzzerPin, 1000, 500);

      // Turn on LEDs on A2 and A3
      digitalWrite(ledPinA2, HIGH);
      digitalWrite(ledPinA3, HIGH);

      break; // Exit the while loop
    }

    delay(500); // Delay to avoid flooding the serial monitor
  }
}

void loop() {
  // The loop is empty because the while loop in setup handles everything
}

				
			

کد راه اندازی حسگر IR:

				
					/*
   پروژه: خواندن مقدار حسگرهای IR - شیلد Pishro Khalaghyat
   توضیحات: این کد مقدار حسگرهای IR متصل به PL2 را خوانده و روی سریال مانیتور نمایش می‌دهد. 
   همچنین تغذیه حسگرها از PL3 تأمین می‌شود و جامپرها باید مطابق جدول زیر تنظیم شوند.

   🔧 **تنظیم جامپرها برای فعال‌سازی حسگرهای IR:**
   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |     -     |
   |   JP2   |     -     |
   |   JP4   |   Mod1    |
   |   JP5   |   Mod1    |
   |   JP6   |   Mod2    |
   |   JP7   |   Mod1    |
   |   JP8   |   Mod1    |
   -------------------------------------

   * تنظیمات سخت‌افزاری:
   - حسگرها روی سوکت PL2 قرار دارند.
   - شماره ۱ روی PL2 نشان‌دهنده حسگر S1 است.
   - تغذیه حسگرها از PL3 تأمین می‌شود.
   - مقادیر حسگرها روی سریال مانیتور نمایش داده می‌شود.
*/

#include <Arduino.h>

const int S6 = A0;
const int S5 = A1;
const int S4 = A2;
const int S3 = A3;
const int S2 = A4;
const int S1 = A5; // حسگر جدید
const int TH = 50;

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

void loop() {
  int s1 = analogRead(S1);
  int s2 = analogRead(S2);
  int s3 = analogRead(S3);
  int s4 = analogRead(S4);
  int s5 = analogRead(S5);
  int s6 = analogRead(S6); // خواندن مقدار حسگر جدید

  Serial.print("S1: ");
  Serial.print(s1);
  Serial.print(" | S2: ");
  Serial.print(s2);
  Serial.print(" | S3: ");
  Serial.print(s3);
  Serial.print(" | S4: ");
  Serial.print(s4);
  Serial.print(" | S5: ");
  Serial.print(s5);
  Serial.print(" | S6: ");
  Serial.println(s6); // نمایش مقدار حسگر جدید

  delay(200); // تاخیر برای خواندن مقدار حسگرها
}
				
			

کد تنظیم دو حسگر IR:

				
					/*
   پروژه: تنظیم نهایی حسگرهای ربات مسیریاب - شیلد Pishro Khalaghyat
   توضیحات: این کد مقدار حسگرهای S5 (راست) و S6 (چپ) را خوانده و وضعیت را در سریال مانیتور نمایش می‌دهد.
   - اگر مقدار کمتر از 150 باشد، یعنی حسگر روی سطح سفید قرار دارد.
   - اگر مقدار بیشتر از 150 باشد، یعنی حسگر مشکلی دارد یا روی سطح تیره قرار گرفته است.
   
 همچنین تغذیه حسگرها از PL3 تأمین می‌شود و جامپرها باید مطابق جدول زیر تنظیم شوند.

   🔧 **تنظیمات سخت‌افزاری و جامپرها:**
   -------------------------------------
   |   جامپر  |   وضعیت   |
   |----------------------|
   |   JP1   |     -     |
   |   JP2   |     -     |
   |   JP4   |   Mod1    |
   |   JP5   |   Mod1    |
   |   JP6   |   Mod2    |
   |   JP7   |   Mod1    |
   |   JP8   |   Mod1    |
   -------------------------------------

   * تنظیمات سخت‌افزاری:
   - حسگر S6 در سمت چپ ربات نصب شود.
   - حسگر S5 در سمت راست ربات نصب شود.
*/

#include <Arduino.h>

const int S6 = A0; // حسگر سمت چپ
const int S5 = A1; // حسگر سمت راست
const int THRESHOLD = 150; // مقدار آستانه

void setup() {
  Serial.begin(9600);
  Serial.println("🔧 تنظیم حسگرهای ربات مسیریاب شروع شد...");
}

void loop() {
  int s5_value = analogRead(S5);
  int s6_value = analogRead(S6);

  Serial.print("S5 (راست): ");
  Serial.print(s5_value);
  Serial.print(" -> وضعیت: ");
  if (s5_value < THRESHOLD) {
    Serial.println("✅ سفید");
  } else {
    Serial.println("⚠️ مشکل حسگر!");
  }

  Serial.print("S6 (چپ): ");
  Serial.print(s6_value);
  Serial.print(" -> وضعیت: ");
  if (s6_value < THRESHOLD) {
    Serial.println("✅ سفید");
  } else {
    Serial.println("⚠️ مشکل حسگر!");
  }

  Serial.println("----------------------------"); // جداکننده برای خوانش بهتر در سریال مانیتور
  delay(200); // تاخیر برای خواندن مجدد مقدار حسگرها
}

				
			

کد ربات تعقیب خط دو حسگری:

				
					/*
   پروژه: ربات مسیریاب با استفاده از حسگرهای IR - شیلد Pishro Khalaghyat
   توضیحات: این کد مقدار حسگرهای S5 (راست) و S6 (چپ) را خوانده و بر اساس آن حرکت ربات را کنترل می‌کند.
   - اگر هر دو حسگر سفید باشند، ربات به جلو حرکت می‌کند.
   - اگر حسگر راست (S5) سیاه باشد، ربات به راست می‌چرخد.
   - اگر حسگر چپ (S6) سیاه باشد، ربات به چپ می‌چرخد.
   - اگر هر دو حسگر سیاه باشند، ربات متوقف می‌شود.

   🔧 **تنظیمات سخت‌افزاری:**
   - حسگر S6 در سمت چپ و حسگر S5 در سمت راست ربات نصب شوند.
   - موتور چپ و راست بر اساس جداول حرکتی کنترل می‌شوند.
*/

#include <Arduino.h>

// پایه‌های حسگرهای مادون قرمز
const int S6 = A0; // حسگر چپ
const int S5 = A1; // حسگر راست
const int THRESHOLD = 200; // مقدار آستانه برای تشخیص رنگ سیاه

// پایه‌های موتور چپ
const int L_PWM = 3;
const int L_IN1 = 2;
const int L_IN2 = 4;

// پایه‌های موتور راست
const int R_PWM = 6;
const int R_IN1 = 5;
const int R_IN2 = 7;

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

  // تنظیم پایه‌های موتور چپ
  pinMode(L_PWM, OUTPUT);
  pinMode(L_IN1, OUTPUT);
  pinMode(L_IN2, OUTPUT);

  // تنظیم پایه‌های موتور راست
  pinMode(R_PWM, OUTPUT);
  pinMode(R_IN1, OUTPUT);
  pinMode(R_IN2, OUTPUT);
}

void moveForward() {
  digitalWrite(L_IN1, HIGH);
  digitalWrite(L_IN2, LOW);
  digitalWrite(R_IN1, HIGH);
  digitalWrite(R_IN2, LOW);
  analogWrite(L_PWM, 150); // سرعت موتور چپ
  analogWrite(R_PWM, 150); // سرعت موتور راست
  Serial.println("⬆️ حرکت به جلو");
}

void turnRight() {
  digitalWrite(L_IN1, HIGH);
  digitalWrite(L_IN2, LOW);
  digitalWrite(R_IN1, LOW);
  digitalWrite(R_IN2, HIGH);
  analogWrite(L_PWM, 150);
  analogWrite(R_PWM, 150);
  Serial.println("➡️ چرخش به راست");
}

void turnLeft() {
  digitalWrite(L_IN1, LOW);
  digitalWrite(L_IN2, HIGH);
  digitalWrite(R_IN1, HIGH);
  digitalWrite(R_IN2, LOW);
  analogWrite(L_PWM, 150);
  analogWrite(R_PWM, 150);
  Serial.println("⬅️ چرخش به چپ");
}

void stopMotors() {
  digitalWrite(L_IN1, LOW);
  digitalWrite(L_IN2, LOW);
  digitalWrite(R_IN1, LOW);
  digitalWrite(R_IN2, LOW);
  Serial.println("⛔ توقف");
}

void loop() {
  int s5_value = analogRead(S5);
  int s6_value = analogRead(S6);

  Serial.print("S5 (راست): ");
  Serial.print(s5_value);
  Serial.print(" | S6 (چپ): ");
  Serial.println(s6_value);

  // تصمیم‌گیری برای حرکت ربات بر اساس مقدار حسگرها
  if (s5_value < THRESHOLD && s6_value < THRESHOLD) {
    moveForward(); // هر دو حسگر سفید -> حرکت مستقیم
  } 
  else if (s5_value >= THRESHOLD && s6_value < THRESHOLD) {
    turnRight(); // حسگر راست سیاه -> چرخش به راست
  } 
  else if (s5_value < THRESHOLD && s6_value >= THRESHOLD) {
    turnLeft(); // حسگر چپ سیاه -> چرخش به چپ
  } 
  else {
    stopMotors(); // هر دو حسگر سیاه -> توقف
  }

  delay(100); // تاخیر کوتاه برای پایدار ماندن حرکت
}

				
			

کد جامع ربات Vira Connect:

بخش کنترل ربات

1. حرکت ربات

دستورات این بخش برای حرکت مستقیم، توقف و چرخش ربات استفاده می‌شوند:

  • F (Forward): ربات را به سمت جلو حرکت می‌دهد.

    • کاربرد: برای جابه‌جایی ربات در مسیر مستقیم.

  • S (Stop): ربات را متوقف می‌کند.

    • کاربرد: برای جلوگیری از حرکت یا توقف اضطراری.

  • B (Backward): ربات را به سمت عقب حرکت می‌دهد.

    • کاربرد: برای تنظیم یا دور شدن از موانع.

  • L (Left): ربات را به سمت چپ می‌چرخاند.

    • کاربرد: برای چرخش یا تغییر مسیر به سمت چپ.

  • R (Right): ربات را به سمت راست می‌چرخاند.

    • کاربرد: برای چرخش یا تغییر مسیر به سمت راست.

 

2. بخش صداها (ملودی‌ها و هشدارها)

این بخش برای پخش صداها و ملودی‌های مختلف طراحی شده است:

  • M (Music 1): اجرای اولین ملودی از زنگ (Buzzer).

    • کاربرد: ایجاد تنوع یا اطلاع از عملکرد.

  • N (Music 2): اجرای دومین ملودی.

    • کاربرد: برای جلب توجه یا اعلام حالت جدید.

  • Y (Police Siren): شبیه‌سازی صدای آژیر پلیس.

    • کاربرد: برای حالت هشدار.

  • X (Relaxing Sound): اجرای یک ملودی آرام.

    • کاربرد: برای نشان دادن حالت عادی یا پایان عملیات.

 

بخش عملکردهای پیشرفته ربات

1. ردیابی آتش

  • O (Fire Detection): فعال‌سازی ماژول تشخیص آتش.

    • کاربرد: برای شناسایی منابع گرما و آتش در محیط.

 

2. ردیابی نور

  • I (Light Tracking): فعال‌سازی حالت دنبال کردن نور.

    • کاربرد: برای ربات‌هایی که می‌توانند منبع نور را تشخیص داده و به سمت آن حرکت کنند.

 

3. تعقیب خط

  • U (Line Tracking): فعال‌سازی حالت تعقیب خط.

    • کاربرد: برای ربات‌هایی که از خطوط مشکی یا سفید برای حرکت در مسیر خاص استفاده می‌کنند.

 

4. حل ماز (Maze Solver)

  • G (Maze Solver): فعال‌سازی حالت حل ماز.

    • کاربرد: ربات به‌طور خودکار مسیر خود را در یک ماز پیدا می‌کند.

 

بخش تست و تنظیمات

1. تست حسگرها

  • J (Sensor Test): فعال‌سازی حالت تست حسگرها.

    • کاربرد: نمایش مقادیر حسگرها برای اطمینان از عملکرد صحیح آن‌ها.

 

2. حرکت‌های رندوم (Remito)

  • K (Remito): فعال‌سازی حرکات تصادفی ربات و واکنش به موانع.

    • کاربرد: مناسب برای آزمایش حرکت و عکس‌العمل ربات.

 

3. کنترل دستی

  • H (Manual Control): بازگشت به حالت کنترل دستی.

    • کاربرد: برای خروج از عملکرد خودکار و کنترل کامل توسط کاربر.

    • ویژگی خاص: این حالت شامل رقص نور و اجرای ملودی برای اعلام خروج از سایر حالت‌ها است.

 

نکات مهم:

  • از طریق اپلیکیشن ویرا بوت دستورات را ارسال کنید.

  • اتصال بلوتوث بین ربات و اپلیکیشن را قبل از شروع بررسی کنید.

  • حین استفاده از دستورات پیشرفته مانند حل ماز یا ردیابی، دقت کنید محیط مناسبی برای عملکرد ربات فراهم باشد.

  • برای تست حسگرها، اطمینان حاصل کنید که شرایط محیطی ثابت و مناسب باشد

  • در ویدئوی زیر عملکرد ربات با این کد بررسی شده است
				
					#include <SoftwareSerial.h>
#include <Ultrasonic.h>

// پین‌های بلوتوث
SoftwareSerial BT(10, 11); // RX | TX

// پین‌های موتورها
const int motorLeft = 2;
const int motorRight = 5;
const int enableLeft = 3;
const int enableRight = 6;
const int dirLeft = 4;
const int dirRight = 7;

const int buttonPin1 = 12;
const int buttonPin2 = 8;

const int ledPin1 = 0;  // پایه 0
const int ledPin2 = 1;  // پایه 1
const int ledPin3 = 13; // پایه 13
const int ledPin4 = A2; // پایه A2
const int ledPin5 = A3; // پایه A3

// پین‌های حسگرها
const int ldr1 = A0;
const int ldr2 = A1;


const int ultrasonicTrig = A4;
const int ultrasonicEcho = A5;
const int buzzer = 9;

Ultrasonic ultrasonic(ultrasonicTrig, ultrasonicEcho);

void setup() {
  //Serial.begin(57600);
  BT.begin(57600);

  pinMode(motorLeft, OUTPUT);
  pinMode(motorRight, OUTPUT);
  pinMode(enableLeft, OUTPUT);
  pinMode(enableRight, OUTPUT);
  pinMode(dirLeft, OUTPUT);
  pinMode(dirRight, OUTPUT);
  // تنظیم پایه‌ها به عنوان خروجی
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  Serial.end();
  delay(10);


}

void loop() {

  if (BT.available()) {
    char command = BT.read();
    //Serial.println(command);
    executeCommand(command);
  }
}

void executeCommand(char cmd) {
  switch (cmd) {
    case 'F': moveForward(); break;
    case 'S': RobotStop(); break;
    case 'B': moveBackward(); break;
    case 'L': turnLeft(); break;
    case 'R': turnRight(); break;

    case 'M': playMusic1(); break;
    case 'N': playMusic2(); break;
    case 'Y': playPoliceSiren(); break;
    case 'X': playRelaxingSound2(); break;

    case 'O': fireDetection(); break;
    case 'I': lightTracking(); break;
    case 'U': lineTracking(); break;
    case 'G': mazeSolver(); break;

    case 'J': sensorTest(); break;
    case 'K': remito(); break;
    case 'H': manualControl(); break;
  }
}
void RobotStop() {
  analogWrite(enableLeft, 0);
  analogWrite(enableRight, 0);
}
void moveForward() {
  digitalWrite(motorLeft, 1);
  digitalWrite(dirLeft, 0);

  digitalWrite(motorRight, 1);
  digitalWrite(dirRight, 0);

  analogWrite(enableLeft, 255);
  analogWrite(enableRight, 255);
}

void moveBackward() {
  digitalWrite(motorLeft, 0);
  digitalWrite(dirLeft, 1);

  digitalWrite(motorRight, 0);
  digitalWrite(dirRight, 1);
  analogWrite(enableLeft, 255);
  analogWrite(enableRight, 255);
}

void turnLeft() {
  digitalWrite(motorLeft, 1);
  digitalWrite(dirLeft, 0);

  digitalWrite(motorRight, 0);
  digitalWrite(dirRight, 1);
  analogWrite(enableLeft, 250);
  analogWrite(enableRight, 250);
}

void turnRight() {
  digitalWrite(motorLeft, 0);
  digitalWrite(dirLeft, 1);

  digitalWrite(motorRight, 1);
  digitalWrite(dirRight, 0);
  analogWrite(enableLeft, 250);
  analogWrite(enableRight, 250);
}

void playMusic1() {
  char command;

  Serial.end(); // غیر فعال کردن سریال قبل از شروع

  do {
    if (BT.available()) {
      command = BT.read();
      if (command == 'S') { // توقف در صورت دریافت دستور
        noTone(buzzer);
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        digitalWrite(ledPin3, LOW);
        digitalWrite(ledPin4, LOW);
        digitalWrite(ledPin5, LOW);

        // فعال‌سازی مجدد سریال
        // Serial.begin(57600);
        BT.begin(57600);

        return;
      }
    }

    // 🎵 نت دو اکتاو بالا (523Hz) + رقص نور LED 1 و 3
    tone(buzzer, 523, 150);
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(150);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);

    // 🎵 نت لا (440Hz) + LED 2 روشن
    tone(buzzer, 440, 150);
    digitalWrite(ledPin2, HIGH);
    delay(150);
    digitalWrite(ledPin2, LOW);

    // 🎵 نت دو اکتاو بالا (523Hz) + LED 3 و 5 روشن
    tone(buzzer, 523, 150);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(150);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin5, LOW);

    // 🎵 نت فا (587Hz) + LED 4 روشن
    tone(buzzer, 587, 150);
    digitalWrite(ledPin4, HIGH);
    delay(150);
    digitalWrite(ledPin4, LOW);

    // 🎵 نت دو اکتاو بالا (523Hz) + LED 1 و 5 روشن
    tone(buzzer, 523, 150);
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(150);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin5, LOW);

    // 🎵 نت لا (440Hz) + LED 2 و 4 روشن
    tone(buzzer, 440, 150);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin4, HIGH);
    delay(150);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin4, LOW);

    // 🎵 نت دو اکتاو بالا (523Hz) طولانی‌تر + رقص نور همه LEDها
    tone(buzzer, 523, 300);
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(300);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin5, LOW);

    delay(200); // استراحت کوتاه بین تکرار

  } while (command != 'S');

  noTone(buzzer); // توقف صدا در صورت عدم دریافت دستور جدید
}


void playPoliceSiren() {
  char command;

  Serial.end();  // غیر فعال کردن سریال
  delay(100);    // تأخیر کوتاه برای اطمینان از آزاد شدن منابع

  while (true) {
    if (BT.available()) {
      command = BT.read();
      if (command == 'S') { // توقف آژیر در صورت دریافت دستور
        noTone(buzzer);
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        digitalWrite(ledPin3, LOW);
        digitalWrite(ledPin4, LOW);
        digitalWrite(ledPin5, LOW);

        delay(100);  // تأخیر کوتاه قبل از راه‌اندازی مجدد
        //  Serial.begin(57600);  // راه‌اندازی مجدد سریال
        BT.begin(57600);      // راه‌اندازی مجدد بلوتوث
        return;
      }
    }

    // 🚨 تغییر صدا و روشن/خاموش کردن LEDها مشابه آژیر پلیس
    tone(buzzer, 440, 500); // نت لا
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin5, HIGH);
    delay(500);

    tone(buzzer, 660, 500); // نت می بالا
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, LOW);
    delay(500);
  }
}


void playRelaxingSound2() {
  char command;

  Serial.end(); // غیر فعال کردن سریال برای جلوگیری از مشکلات ارتباطی

  while (true) {
    if (BT.available()) {
      command = BT.read();
      if (command == 'S') { // توقف موسیقی و LEDها در صورت دریافت دستور
        noTone(buzzer);
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        digitalWrite(ledPin3, LOW);
        digitalWrite(ledPin4, LOW);
        digitalWrite(ledPin5, LOW);

        // فعال‌سازی مجدد سریال
        // Serial.begin(57600);
        BT.begin(57600);

        return;
      }
    }

    // 🎵 آهنگ کودکانه "Twinkle Twinkle Little Star"
    int melody[] = {262, 262, 392, 392, 440, 440, 392, 349, 349, 330, 330, 294, 294, 262};
    int noteDurations[] = {500, 500, 500, 500, 500, 500, 1000, 500, 500, 500, 500, 500, 500, 1000};

    for (int i = 0; i < 14; i++) {
      tone(buzzer, melody[i], noteDurations[i] * 0.9);

      // 🔹 **رقص نور متنوع**
      if (i % 2 == 0) {
        digitalWrite(ledPin1, HIGH);
        digitalWrite(ledPin3, HIGH);
        digitalWrite(ledPin5, HIGH);
      } else {
        digitalWrite(ledPin2, HIGH);
        digitalWrite(ledPin4, HIGH);
      }

      delay(noteDurations[i]);
      noTone(buzzer);

      // خاموش کردن LEDها بعد از هر نت
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
      digitalWrite(ledPin5, LOW);

      delay(50); // توقف کوتاه بین نت‌ها
    }

    // 🔹 **افکت چشمک زدن پس از پایان آهنگ**
    for (int j = 0; j < 3; j++) {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, HIGH);
      digitalWrite(ledPin4, HIGH);
      digitalWrite(ledPin5, HIGH);
      delay(300);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
      digitalWrite(ledPin5, LOW);
      delay(100);
    }
  }
}


void playMusic2() {
  char command;

  Serial.end(); // غیر فعال کردن سریال قبل از شروع

  while (true) {
    if (BT.available()) {
      command = BT.read();
      if (command == 'S') { // اگر دستور توقف دریافت شد، خروج از حلقه
        noTone(buzzer);
        digitalWrite(ledPin1, LOW);
        digitalWrite(ledPin2, LOW);
        digitalWrite(ledPin3, LOW);
        digitalWrite(ledPin4, LOW);
        digitalWrite(ledPin5, LOW);

        // فعال‌سازی مجدد سریال
        //  Serial.begin(57600);
        BT.begin(57600);

        return;
      }
    }

    // 🎵 اجرای موسیقی با رقص نور هماهنگ
    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin1, HIGH);
    delay(500);
    digitalWrite(ledPin1, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin2, HIGH);
    delay(500);
    digitalWrite(ledPin2, LOW);

    tone(buzzer, 294, 500); // نت ر
    digitalWrite(ledPin3, HIGH);
    delay(500);
    digitalWrite(ledPin3, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin4, HIGH);
    delay(500);
    digitalWrite(ledPin4, LOW);

    tone(buzzer, 349, 500); // نت فا
    digitalWrite(ledPin5, HIGH);
    delay(500);
    digitalWrite(ledPin5, LOW);

    tone(buzzer, 330, 1000); // نت می
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(1000);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin2, HIGH);
    delay(500);
    digitalWrite(ledPin2, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin4, HIGH);
    delay(500);
    digitalWrite(ledPin4, LOW);

    tone(buzzer, 294, 500); // نت ر
    digitalWrite(ledPin5, HIGH);
    delay(500);
    digitalWrite(ledPin5, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(500);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin5, LOW);

    tone(buzzer, 440, 500); // نت لا
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin4, HIGH);
    delay(500);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin4, LOW);

    tone(buzzer, 440, 1000); // نت لا
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(1000);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin5, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin1, HIGH);
    delay(500);
    digitalWrite(ledPin1, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin2, HIGH);
    delay(500);
    digitalWrite(ledPin2, LOW);

    tone(buzzer, 294, 500); // نت ر
    digitalWrite(ledPin3, HIGH);
    delay(500);
    digitalWrite(ledPin3, LOW);

    tone(buzzer, 262, 500); // نت دو
    digitalWrite(ledPin4, HIGH);
    delay(500);
    digitalWrite(ledPin4, LOW);

    tone(buzzer, 349, 500); // نت فا
    digitalWrite(ledPin5, HIGH);
    delay(500);
    digitalWrite(ledPin5, LOW);

    tone(buzzer, 330, 1000); // نت می
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin3, HIGH);
    delay(1000);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin3, LOW);
  }
}






void fireDetection() {
  while (true) {
    // بررسی دریافت کاراکتر H از BT.Serial
    if (BT.available()) {
      char command = BT.read();
      if (command == 'H') {
        //  Serial.println("Exiting fireTracking...");
        RobotStop(); // توقف ربات
        return; // خروج از تابع
      }
    }

    // خواندن مقادیر حسگرهای نور
    int lightLDR1 = analogRead(ldr1);
    int lightLDR2 = analogRead(ldr2);

    // نمایش مقادیر حسگرها در مانیتور سریال
    //    Serial.print("LDR1: ");
    //    Serial.println(lightLDR1);
    //    Serial.print("LDR2: ");
    //    Serial.println(lightLDR2);

    // تعریف مقدار آستانه نور
    const int threshold = 400;

    // تصمیم‌گیری حرکت بر اساس شدت نور
    if (lightLDR1 < threshold && lightLDR2 < threshold) { // هر دو کمتر از آستانه
      // Serial.println("Stopping the robot, insufficient light...");
      RobotStop(); // توقف ربات
    } else if (abs(lightLDR1 - lightLDR2) <= 65) { // اگر نور دو حسگر تقریباً برابر باشد (تلورانس 40)
      // Serial.println("Moving forward...");
      moveForward(); // حرکت مستقیم
    } else if (lightLDR1 > lightLDR2) { // اگر نور بیشتری در سمت چپ باشد
      // Serial.println("Turning left...");
      turnRight(); // چرخش به چپ
    } else { // اگر نور بیشتری در سمت راست باشد
      // Serial.println("Turning right...");
      turnLeft(); // چرخش به راست
    }


    delay(100); // تاخیر کوتاه برای پایدارسازی عملکرد
  }
}



// تابع نوریاب
void lightTracking() {
  while (true) {
    // بررسی دریافت کاراکتر H از BT.Serial
    if (BT.available()) {
      char command = BT.read();
      if (command == 'H') {
        // Serial.println("Exiting lightTracking...");
        RobotStop(); // توقف ربات
        return; // خروج از تابع
      }
    }

    // خواندن مقادیر حسگرهای نور
    int lightLDR1 = analogRead(ldr1);
    int lightLDR2 = analogRead(ldr2);

    // نمایش مقادیر حسگرها در مانیتور سریال
    //    Serial.print("LDR1: ");
    //    Serial.println(lightLDR1);
    //    Serial.print("LDR2: ");
    //    Serial.println(lightLDR2);

    // تعریف مقدار آستانه نور
    const int threshold = 400;

    // تصمیم‌گیری حرکت بر اساس شدت نور
    if (lightLDR1 < threshold && lightLDR2 < threshold) { // هر دو کمتر از آستانه
      //Serial.println("Stopping the robot, insufficient light...");
      RobotStop(); // توقف ربات
    } else if (abs(lightLDR1 - lightLDR2) <= 65) { // اگر نور دو حسگر تقریباً برابر باشد (تلورانس 40)
      // Serial.println("Moving forward...");
      moveForward(); // حرکت مستقیم
    } else if (lightLDR1 > lightLDR2) { // اگر نور بیشتری در سمت چپ باشد
      // Serial.println("Turning left...");
      turnRight(); // چرخش به چپ
    } else { // اگر نور بیشتری در سمت راست باشد
      // Serial.println("Turning right...");
      turnLeft(); // چرخش به راست
    }


    delay(100); // تاخیر کوتاه برای پایدارسازی عملکرد
  }
}


// تابع تعقیب خط
void lineTracking() {
  // آستانه برای هر حسگر
  int thresholdLeft = 300;  // آستانه حسگر سمت چپ
  int thresholdRight = 300; // آستانه حسگر سمت راست
  // تعریف حسگرهای خط
  const int lineSensorLeft = A0; // حسگر خط سمت چپ
  const int lineSensorRight = A1; // حسگر خط سمت راست
  while (true) {
    // بررسی داده‌های دریافتی از BT.Serial
    if (BT.available()) {
      char command = BT.read();
      if (command == 'H') { // بررسی دریافت کاراکتر H برای خروج
        //Serial.println("Exiting lineTracking mode...");
        RobotStop(); // توقف ربات
        return; // خروج از تابع
      }
    }

    // خواندن مقادیر از حسگرهای خط
    int lineLeft = analogRead(lineSensorLeft); // خواندن مقدار حسگر سمت چپ
    int lineRight = analogRead(lineSensorRight); // خواندن مقدار حسگر سمت راست

    // نمایش مقادیر حسگرها در مانیتور سریال
    //    Serial.print("Line Sensor Left: ");
    //    Serial.println(lineLeft);
    //    Serial.print("Line Sensor Right: ");
    //    Serial.println(lineRight);

    // مقایسه مقادیر حسگرها با آستانه‌ها برای تصمیم‌گیری
    if (lineLeft < thresholdLeft && lineRight < thresholdRight) { // هر دو حسگر روی خط مشکی
      //  Serial.println("Moving forward...");
      moveForward(); // حرکت مستقیم
    } else if (lineLeft < thresholdLeft) { // حسگر چپ روی خط مشکی
      //Serial.println("Turning left...");
      turnLeft(); // چرخش به سمت چپ
    } else if (lineRight < thresholdRight) { // حسگر راست روی خط مشکی
      // Serial.println("Turning right...");
      turnRight(); // چرخش به سمت راست
    } else { // هر دو حسگر خارج از خط مشکی
      //Serial.println("Stopping, no line detected...");
      RobotStop(); // توقف
    }

    delay(100); // تأخیر کوتاه برای پایداری
  }
}

void mazeSolver() {
  //Serial.println("Solving Maze...");

  while (true) {
    // بررسی دستورات دریافتی از BT.Serial
    if (BT.available()) {
      char command = BT.read();
      if (command == 'H') { // دریافت فرمان توقف از بلوتوث
        //  Serial.println("Exiting mazeSolver...");
        RobotStop(); // توقف ربات
        return; // خروج از تابع
      }
    }

    // خواندن وضعیت حسگرهای دیجیتال ضربه
    int impactLeft = digitalRead(A0);  // حسگر ضربه سمت چپ
    int impactRight = digitalRead(A1); // حسگر ضربه سمت راست

    // تصمیم‌گیری براساس مقدار حسگرها
    if (impactLeft == LOW && impactRight == LOW) { // هر دو حسگر ضربه را دریافت کرده‌اند
      // Serial.println("Moving forward...");
      moveForward(); // حرکت مستقیم
    } else if (impactLeft == LOW) { // حسگر سمت چپ ضربه را دریافت کرده است
      // Serial.println("Turning left...");
      turnLeft(); // چرخش به سمت چپ
    } else if (impactRight == LOW) { // حسگر سمت راست ضربه را دریافت کرده است
      // Serial.println("Turning right...");
      turnRight(); // چرخش به سمت راست
    } else { // هیچ حسگری ضربه‌ای را دریافت نکرده است
      //  Serial.println("Stopping, no impact detected...");
      RobotStop(); // توقف ربات
    }

    delay(100); // تأخیر کوتاه برای پایداری
  }
}


void sensorTest() {
  //Serial.begin(9600); // فعال‌سازی Serial برای شروع
  delay(10);
  //Serial.println("شروع تست حسگر...");

  // بیلینک اولیه برای اطلاع‌رسانی
  for (int i = 0; i < 3; i++) {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, HIGH);
    digitalWrite(ledPin5, HIGH);
    delay(300);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    digitalWrite(ledPin5, LOW);
    delay(300);
  }

  Serial.end(); // غیرفعال‌سازی Serial برای ادامه تست

  char command = '\0';

  // تنظیم جامپرها برای کلیدها
  digitalWrite(ledPin5, HIGH);
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == LOW) {
    delay(100);
  }
  digitalWrite(ledPin5, LOW);

  // تست کلید 1
  while (digitalRead(buttonPin1) == LOW) {
    delay(100);
  }
  tone(buzzer, 1000, 200);
  delay(500);

  // تست کلید 2
  while (digitalRead(buttonPin2) == LOW) {
    delay(100);
  }
  tone(buzzer, 1000, 200);
  delay(500);
  digitalWrite(ledPin2, HIGH);

  // تنظیم جامپرها برای LDR
  digitalWrite(ledPin5, HIGH);
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == LOW) {
    delay(100);
  }
  digitalWrite(ledPin5, LOW);

  // تست LDR 1
  while (analogRead(ldr1) < 500) {
    delay(100);
  }
  tone(buzzer, 1000, 200);
  delay(500);

  // تست LDR 2
  while (analogRead(ldr2) < 500) {
    delay(100);
  }
  tone(buzzer, 1000, 200);
  delay(500);
  digitalWrite(ledPin1, HIGH);

  // تنظیم جامپر برای حسگر اولتراسونیک
  digitalWrite(ledPin5, HIGH);
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == LOW) {
    delay(100);
  }
  digitalWrite(ledPin5, LOW);

  // تست حسگر اولتراسونیک
  while (true) {
    digitalWrite(ultrasonicTrig, LOW);
    delayMicroseconds(2);
    digitalWrite(ultrasonicTrig, HIGH);
    delayMicroseconds(10);
    digitalWrite(ultrasonicTrig, LOW);

    long duration = pulseIn(ultrasonicEcho, HIGH);
    long distance = duration * 0.034 / 2;
    if (distance < 10) {
      tone(buzzer, 1000, 200);
      break;
    }
    delay(100);
  }
  digitalWrite(ledPin3, HIGH);

  // تنظیم جامپر برای حسگرهای خط
  digitalWrite(ledPin5, HIGH);
  while (digitalRead(buttonPin1) == LOW && digitalRead(buttonPin2) == LOW) {
    delay(100);
  }
  digitalWrite(ledPin5, LOW);

  // تست حسگرهای خط
  const int lineSensorPin1 = A0;
  const int lineSensorPin2 = A1;
  bool sensor1White = false, sensor1Black = false;
  bool sensor2White = false, sensor2Black = false;

  while (true) {
    int sensorValue1 = analogRead(lineSensorPin1);
    int sensorValue2 = analogRead(lineSensorPin2);

    if (sensorValue1 < 300) {
      sensor1White = true;
      tone(buzzer, 1000, 30);
    } else {
      sensor1Black = true;
    }

    if (sensorValue2 < 300) {
      sensor2White = true;
      tone(buzzer, 1000, 30);
    } else {
      sensor2Black = true;
    }

    // بررسی اینکه هر دو حسگر هم سفید و هم مشکی را تشخیص داده‌اند
    if (sensor1White && sensor1Black && sensor2White && sensor2Black) {
      digitalWrite(ledPin4, HIGH); // روشن شدن LED4 بعد از بررسی کامل
    }

    if (BT.available() > 0) {
      command = BT.read();
      if (command == 'H') {
        break;
      }
    }
    delay(500);
  }

  // خاموش کردن همه LEDها و فعال‌سازی مجدد Serial
  delay(1000);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, LOW);

  //Serial.begin(57600); // فعال‌سازی مجدد Serial برای ادامه برنامه
}



void remito() {
  Serial.end(); // غیرفعال کردن Serial برای این تابع
  unsigned long lastActionTime = millis(); // زمان آخرین حرکت
  unsigned long actionInterval = 50; // بازه زمانی برای بررسی فاصله

  while (true) {
    // بررسی دریافت داده از بلوتوث
    if (BT.available()) {
      char command = BT.read();
      if (command == 'H') { // دریافت 'H' برای خروج
        noTone(buzzer); // توقف صدا
        RobotStop(); // توقف ربات
        // Serial.println("Exiting remito...");
        break; // خروج از حلقه
      }
    }

    // بررسی بازه زمانی و اجرای حرکات
    if (millis() - lastActionTime >= actionInterval) {
      lastActionTime = millis(); // به‌روزرسانی زمان

      long distance = getUltrasonicDistance(); // خواندن فاصله از سنسور

      if (distance < 25) {
        // **واکنش به مانع: توقف + عقب رفتن + صدای هشدار 🚨**
        RobotStop();
        playWarningSound(); // صدای هشدار
        moveBackward();
        delay(500); // اینجا نیاز به تأخیر کوتاه وجود دارد
        RobotStop();
      } else {
        // **حرکت‌های مشخص (بدون وابستگی به نور)**
        moveForward();
        playMovementSound();

        // تغییر مسیر به صورت غیرمسدودکننده
        if (millis() - lastActionTime >= 3000) {
          turnLeft();
          playTurnSound();
          lastActionTime = millis(); // به‌روزرسانی زمان پس از چرخش
        }
        if (millis() - lastActionTime >= 2000) {
          turnRight();
          playTurnSound();
          lastActionTime = millis(); // به‌روزرسانی زمان پس از چرخش
        }
      }
    }
  }

  // Serial.begin(57600); // فعال‌سازی مجدد Serial پس از خروج از تابع
}


// دریافت فاصله از سنسور اولتراسونیک
long getUltrasonicDistance() {
  digitalWrite(ultrasonicTrig, LOW);
  delayMicroseconds(2);
  digitalWrite(ultrasonicTrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(ultrasonicTrig, LOW);
  return pulseIn(ultrasonicEcho, HIGH) * 0.034 / 2;
}

// صدای هشدار 🚨
void playWarningSound() {
  for (int i = 0; i < 3; i++) {
    tone(buzzer, 1000, 200);
    delay(300);
  }
}

// صدای حرکت 🚗
void playMovementSound() {
  tone(buzzer, 800, 300);
  delay(350);
  tone(buzzer, 1000, 300);
  delay(350);
}

// صدای چرخش 🔄
void playTurnSound() {
  tone(buzzer, 1200, 200);
  delay(250);
  tone(buzzer, 1400, 200);
  delay(250);
}


void manualControl() {
  RobotStop();
  // اجرای رقص نور با LEDها
  for (int i = 0; i < 5; i++) {
    digitalWrite(ledPin1, HIGH);
    delay(50);
    digitalWrite(ledPin1, LOW);

    digitalWrite(ledPin2, HIGH);
    delay(50);
    digitalWrite(ledPin2, LOW);

    digitalWrite(ledPin3, HIGH);
    delay(50);
    digitalWrite(ledPin3, LOW);

    digitalWrite(ledPin4, HIGH);
    delay(50);
    digitalWrite(ledPin4, LOW);

    digitalWrite(ledPin5, HIGH);
    delay(50);
    digitalWrite(ledPin5, LOW);
  }

  // اجرای ملودی با زنگ (Buzzer)
  tone(buzzer, 1000, 500); // فرکانس 1000Hz به مدت 500ms
  delay(100);
  tone(buzzer, 800, 300);  // فرکانس 800Hz به مدت 300ms
  delay(100);
  tone(buzzer, 1200, 700); // فرکانس 1200Hz به مدت 700ms
  delay(50);


}

				
			

گالری تصاویر:

توضیحات تکمیلی

وزن 0.6 کیلوگرم
ابعاد 21.5 × 14.5 × 12 سانتیمتر
سطح دوره

رباتیک پیشرفته

برنامه نویسی

آموزش زبان برنامه‌نویسی ++Cبرای آردوینو

نوع دوره

پک رباتیک

رده سنی

گروه سنی ۱۲ تا ۱۹ سال

  • امیر پرهام

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

  • محمد صالح

    سلام من از این ربات بسیار راضی هستم و همچنین از استاد رضایی و شیوه ی تدریس ایشان محمد صالح ترکزاده

  • ایلیا

    سلام
    من از این ربات بسیار راضی هستم و همچنین از استاد که بسیار خوب تدریس می کند
    ایلیا معادی فر

  • علیرضا

    باسلام خدمت شما دوستان عزیز این ربات خوبه استاد هم بسیار عالی

محصولات مشابه

    بسته ربات Vira Mechanic

    بدون امتیاز 0 رای
    2,300,000 تومان

    🤖 روباتیک را بدون محدودیت تجربه کنید! 🔧✨ آیا تا به حال رباتی با سازه‌های مکانیکی 🛠️ ساخته‌اید و دوست داشتید آن را برنامه‌نویسی کنید ولی ابزار لازم را نداشتید؟ 🤯 این بسته فوق‌العاده، همه‌چیز را در اختیار شما قرار می‌دهد! 🎁 با این مجموعه، می‌توانید انواع سازه‌های رباتیکی را بسازید و با بلاک‌کدینگ حرفه‌ای مثل اسکرچ 🖥️، آن را از طریق تلفن همراه 📱 و حتی به زبان فارسی 🇮🇷 برنامه‌نویسی کنید! 🎮🔥 یک قدم به دنیای رباتیک پیشرفته نزدیک‌تر شوید! 🚀🔋

    174
    2,300,000 تومان

    بسته ربات Vira Analog

    بدون امتیاز 0 رای
    850,000 تومان

    Vira Analog یک ربات آنالوگ نوریاب و مسیریاب است که بدون نیاز به برنامه‌نویسی، به‌صورت خودکار مسیرها را دنبال کرده و از موانع عبور می‌کند. 🤖✨ این ربات با استفاده از دو حسگر نوری و موتورهای DC 6 ولتی، نور و خطوط را تشخیص داده و حرکت می‌کند. ⚡🛤️ بدنه‌ی آن از چوب سبک و مقاوم ساخته شده و مانند یک ماشین اسباب‌بازی طراحی شده است. 🚗🪵 منبع تغذیه آن باطری 6 ولتی است، اما امکان استفاده از رگولاتور 7805 برای ولتاژ بالاتر نیز وجود دارد. 🎛️🔋 این ربات گزینه‌ای عالی برای آموزش مفاهیم اولیه‌ی رباتیک و الکترونیک است و تجربه‌ای جذاب و عملی را برای کودکان و مبتدیان فراهم می‌کند. 🎓🚀

    3
    850,000 تومان

    موبایل ربات Vira walker

    بدون امتیاز 0 رای
    850,000 تومان

    🤖 Vira Walker یک ربات قدم‌زن هوشمند با قابلیت حرکت طبیعی، برنامه‌ریزی آسان و کنترل بی‌سیم از طریق بلوتوث است! 🚶‍♂️📡 این ربات مخصوص کودکان و مبتدیان طراحی شده و با بلاک‌های تصویری فارسی به‌راحتی برنامه‌ریزی می‌شود. 🎨📲 بدنه‌ی مقاوم، موتورهای پرقدرت و حسگرهای تعاملی آن، تجربه‌ای جذاب از یادگیری و سرگرمی را فراهم می‌کند. 🎮✨ Vira Walker را بسازید، برنامه‌ریزی کنید و به حرکت درآورید! 🚀

    0
    850,000 تومان
enemad-logo