توضیحات
معرفی بسته ربات ویرا کانکت (Vira Connect) 🎯🤖
آیا آمادهاید که به دنیای شگفتانگیز رباتیک وارد شوید؟ بسته Vira Connect یک کیت آموزشی کامل است که از سطح مقدماتی تا پیشرفته طراحی شده و به شما این امکان را میدهد که در کنار یادگیری برنامهنویسی سختافزار، چندین پروژه رباتیک جالب بسازید! 🚀
این بسته شامل انواع رباتها با قابلیتهای مختلف است:
✅ ربات مسیریاب 🚦
تشخیص و دنبال کردن مسیر، اطمینان از حرکت در خطوط مشخص
✅ ربات آتشنشان 🔥
شناسایی و خاموش کردن شعلههای آتش
✅ ربات نوریاب 💡
حرکت به سمت منابع نوری
✅ ربات کنترل با تلفن همراه 📱
هدایت ربات از طریق اپلیکیشن موبایل
✅ ربات ورزشکار ⚽
حرکات خودکار و واکنش به موانع
ویژگیهای برجسته بسته Vira Connect 🔧🌟
🔹 مبتنی بر برنامهنویسی در محیط Arduino IDE 🎛️
یک تجربه برنامهنویسی جذاب و کاربرپسند با استفاده از Arduino IDE برای ساخت پروژههای واقعی.
🔹 سختافزار توسعهیافته و پیشرفته برای آموزش رباتیک 🛠️
با کیفیت و امکانات پیشرفته، این بسته برای یادگیری و شرکت در مسابقات علمی و پژوهشی مناسب است.
🔹 نسخههای مختلف و مناسب برای سطوح مختلف آموزشی 📚
در رنجهای قیمتی مختلف برای سطوح گوناگون، از مبتدی تا پیشرفته.
🔹 قابلیتهای متعدد برای پروژههای متنوع
ساخت انواع رباتها مانند ربات مسیریاب، نوریاب، آتشنشان و بسیاری دیگر. 🎮
ویژگیهای اصلی بسته رباتیک Vira Connect 🎯🤖
🔹 ربات چندمنظوره:
ویرا کانکت یک ربات چندکاره است که میتواند در پروژههای مختلف مانند دنبالکننده خط 🚦، نوریاب 💡، آتشنشان 🔥، و رباتهای اسپرت ⚽ استفاده شود.
🔹 آموزش برنامهنویسی ساده و جامع:
با بسته ویرا کانکت، بهراحتی میتوانید از نصب نرمافزار Arduino IDE 🖥️ تا تنظیم پورتها و اتصال باتری 🔋 شروع کنید. این بسته شامل کدهای آماده برای:
- LEDها 💡: راهاندازی و کنترل LEDها
- ماژول بلوتوث 📶: کنترل ربات با موبایل
- حسگرها (نور، فاصلهیاب، IR) 🌡️: استفاده از حسگرهای مختلف برای ردیابی و شناسایی محیط
- موتورها 🔧: حرکت ربات در مسیرهای مختلف
- کلیدها 🔘: تنظیمات ورودی برای کنترل و خاموش/روشن کردن عملکردهای ربات
🔹 جامپرها و سوکتها:
برای استفاده از قابلیتهای مختلف ربات، باید جامپرها را بهدرستی تنظیم کنید. این تنظیمات بههمراه برنامهنویسی پینها و اتصال باتری در راهنمای بسته توضیح داده شده است.
مراحل راهاندازی و برنامهنویسی ربات ویرا کانکت 🚀
نصب نرمافزار و درایور Arduino 💻
ابتدا نرمافزار Arduino را نصب کرده و درایورهای لازم را بارگذاری کنید.تنظیم جامپرها و پورتها 🔌
برای هر کاربرد، جامپرها را تنظیم کنید. به عنوان مثال، برای راهاندازی LEDها، باید جامپرها را روی Mode1 قرار دهید.اتصال باتری و کابل USB 🔋📡
باتری را به برد متصل کرده و از کابل USB برای آپلود کدهای برنامهنویسی استفاده کنید.دانلود و آپلود کدهای نمونه ⬇️
کدهای آماده برای راهاندازی 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
/*
پروژه: تنظیمات ماژول بلوتوث 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
// تعریف پایههای ماژول بلوتوث
#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
// 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
// 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
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
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
// پایههای حسگرهای مادون قرمز
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
#include
// پینهای بلوتوث
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);
}
گالری تصاویر:






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