جستجو برای:
  • صفحه اصلی
  • دوره ها
    • ثبت نام دوره رباتیک
    • ثبت نام دوره های کامپیوتر
  • مسابقات رباتیک
  • فروشگاه
  • خدمات پرینتر سه بعدی
  • دانلود نرم افزار
  • درباره ما
    • گالری تصاویر
    • درخواست همکاری
    • تماس با ما
 
  • 034-32515012
  • upnop.ir@gmail.com
پیشرو خلاقیت
دسته بندی‌ دوره‌ها
  • ثبت نام دوره رباتیک
    • ربات چند کاره کنترل دستی
    • ربات نوریاب
    • ساخت بردها
    • برنامه نویسی اسکرچ
    • برنامه نویسی برد آردینو با اسکرچ
    • آموزش نرم افزار پروتئوس شماتیک
    • آموزش نرم افزار پروتئوس PCB
    • ساخت ربات آپنوپ
    • برنامه نویسی ربات آپنوپ با اسکرچ
    • برنامه نویسی ربات آپنوپ با آردو بلاک
    • برنامه نویسی ربات آپنوپ با آردوینو
    • ساخت پروژه ها الکترونیک کاربردی
    • ساخت ربات مسیر یاب
    • ساخت ربات چهار کاره با AVR
    • ساخت سازه های مکانیکی ربات ها با نرم افزار کرل
  • ثبت نام دوره های کامپیوتر
    • آموزش مجموعه آفیس
    • آموزش اینترنت
    • آموزش سخت افزار
    • آموزش نرم افزار اتوکد
    • آموزش نرم افزار ایلستراتور
    • آموزش نرم افزار فتوشاپ
    • برنامه نویسی زبان سی مقدماتی
    • برنامه نویسی زبان سی متوسطه و پیشرفته
  • مسابقات رباتیک
    • ثبت نام مسابقات
0
ورود / ثبت نام
  • صفحه اصلی
  • دوره ها
    • ثبت نام دوره رباتیک
    • ثبت نام دوره های کامپیوتر
  • مسابقات رباتیک
  • فروشگاه
  • خدمات پرینتر سه بعدی
  • دانلود نرم افزار
  • درباره ما
    • گالری تصاویر
    • درخواست همکاری
    • تماس با ما

دوره آموزش آردوینو پیشرفته

خانهدوره های آموزشیدوره آموزش آردوینو پیشرفته
https://dl.video.robovira.ir/protuse/section0.mp4
حالت مطالعه

معرفی دوره:

در این دوره 🚀 به آموزش برنامه‌نویسی پیشرفته بردهای آردوینو 🛠️ می‌پردازیم. این دوره شامل ویدیوهای عملی 🎥 از اجرای پروژه‌های سخت‌افزاری و نرم‌افزاری 💡 است که به شما در راه‌اندازی حسگرها 📡، ماژول‌ها ⚙️ و سایر قطعات مرتبط با آردوینو کمک می‌کند.

✨ ویژگی‌های منحصربه‌فرد این دوره:
✅ آموزش گام‌به‌گام همراه با اجرای پروژه‌های واقعی 🔬
✅ یافتن و استفاده از کتابخانه‌های کاربردی 📚 در محیط برنامه‌نویسی آردوینو 💻
✅ نوشتن کد با کمک هوش مصنوعی 🤖 برای افزایش سرعت و دقت برنامه‌نویسی
✅ پشتیبانی حرفه‌ای برای حل چالش‌های شما در اجرای پروژه‌ها 🆘

🎯 اگر می‌خواهید مهارت‌های خود را در برنامه‌نویسی آردوینو به سطح بالاتری برسانید، این دوره دقیقاً برای شما طراحی شده است! ⏳💡

🔥 همین حالا ثبت‌نام کنید و اولین قدم را برای اجرای پروژه‌های حرفه‌ای بردارید! 🔥

توابع در برنامه نویسی آردوینو:

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


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

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

ساختار کلی تعریف تابع در آردوینو

یک تابع در آردوینو معمولاً به صورت زیر تعریف می‌شود:

				
					نوع_بازگشتی نام_تابع(ورودی‌ها) {
    // بدنه تابع: دستورات اجرا شده
    return مقدار_بازگشتی; // (در صورت وجود مقدار بازگشتی)
}

				
			

اجزای تابع:
1️⃣ نوع بازگشتی (Return Type): مشخص می‌کند که تابع چه نوع مقداری را بازمی‌گرداند (مثلاً int, float, void). اگر مقدار بازگشتی نداشته باشد، از void استفاده می‌شود.
2️⃣ نام تابع: یک نام یکتا که برای صدا زدن تابع استفاده می‌شود.
3️⃣ ورودی‌ها (پارامترها): مقادیری که هنگام فراخوانی تابع به آن ارسال می‌شوند. اگر نیازی به ورودی نباشد، پرانتزها خالی باقی می‌مانند.
4️⃣ بدنه تابع: شامل دستورات اجرایی تابع است.
5️⃣ return (در صورت نیاز): مقداری که تابع به عنوان خروجی بازمی‌گرداند. اگر مقدار بازگشتی وجود نداشته باشد، return حذف می‌شود.

نحوه استفاده از تابع

برای استفاده از یک تابع، آن را فراخوانی (call) می‌کنیم.

				
					int result = sum(5, 7); // مقدار خروجی تابع sum در متغیر result ذخیره می‌شود

				
			

در مثال بالا، تابع sum دو عدد را دریافت کرده و مقدار مجموع آن‌ها را بازمی‌گرداند. این مقدار در متغیر result ذخیره می‌شود.

انواع توابع در آردوینو :

1️⃣ تابعی که مقدار بازمی‌گرداند (مثال: جمع دو عدد)

✅ این تابع دو مقدار دریافت کرده و مجموع آن‌ها را محاسبه و بازمی‌گرداند.

				
					int sum(int a, int b) {  
    return a + b;  // محاسبه مجموع و بازگرداندن نتیجه
}

void setup() {
    Serial.begin(9600);  
    int result = sum(5, 7);  
    Serial.print("مجموع: ");
    Serial.println(result);  
}

void loop() { }

				
			

2️⃣ تابعی بدون مقدار بازگشتی (void) (مثال: تغییر وضعیت LED)

✅ این تابع مقدار خاصی بازنمی‌گرداند، بلکه مستقیماً وضعیت یک LED را تغییر می‌دهد.

				
					void toggleLED(int pin) {  
    digitalWrite(pin, !digitalRead(pin));  // تغییر وضعیت LED
}

void setup() {
    pinMode(13, OUTPUT);  
}

void loop() {
    toggleLED(13);  // تغییر وضعیت LED
    delay(1000);  
}

				
			

3️⃣ تابعی بدون ورودی و بدون مقدار بازگشتی (مثال: نمایش پیام در سریال مانیتور)

✅ این تابع فقط یک پیام را در سریال مانیتور نمایش می‌دهد و نیازی به مقدار بازگشتی یا ورودی ندارد.

 
				
					void printMessage() {
    Serial.println("سلام! این یک پیام از تابع است. 🚀");
}

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

void loop() { }

				
			

آرایه‌ها در آردوینو

آرایه مجموعه‌ای از داده‌ها از یک نوع مشخص است که به صورت پیوسته در حافظه ذخیره می‌شود. در برنامه‌نویسی آردوینو، از آرایه‌ها برای مدیریت و سازماندهی داده‌ها استفاده زیادی می‌شود. هر عنصر آرایه به کمک اندیس خود قابل دسترسی است (اندیس‌ها از 0 شروع می‌شوند).

ویژگی‌های کلیدی آرایه‌ها

  1. آرایه می‌تواند شامل چندین مقدار از یک نوع داده مشابه باشد.

  2. اندیس آرایه همیشه از 0 شروع می‌شود.

  3. آخرین اندیس آرایه برابر است با اندازه آرایه – 1.

مثال ساده از آرایه:

در این مثال:

  • یک آرایه به نام numbers با 5 عنصر تعریف شده است.

  • از یک حلقه for برای دسترسی و چاپ هر عنصر استفاده شده است.

 
				
					void setup() {
   Serial.begin(9600);
   int numbers[5] = {10, 20, 30, 40, 50}; // یک آرایه از اعداد صحیح
   for (int i = 0; i < 5; i++) {
      Serial.println(numbers[i]); // چاپ هر عنصر
   }
}

void loop() {
}

				
			

توابع برای کار با آرایه‌ها

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

  1. محاسبه مجموع عناصر آرایه:

				
					int sumArray(int arr[], int size) {
   int sum = 0;
   for (int i = 0; i < size; i++) {
      sum += arr[i];
   }
   return sum;
}

void setup() {
   Serial.begin(9600);
   int numbers[] = {5, 10, 15, 20, 25};
   int sum = sumArray(numbers, 5);
   Serial.print("مجموع عناصر: ");
   Serial.println(sum);
}

void loop() {
}

				
			

یافتن بزرگ‌ترین عنصر آرایه:

				
					int findMax(int arr[], int size) {
   int max = arr[0];
   for (int i = 1; i < size; i++) {
      if (arr[i] > max) {
         max = arr[i];
      }
   }
   return max;
}

void setup() {
   Serial.begin(9600);
   int numbers[] = {3, 8, 12, 5, 10};
   int max = findMax(numbers, 5);
   Serial.print("بزرگ‌ترین مقدار: ");
   Serial.println(max);
}

void loop() {
}

				
			

معکوس کردن آرایه:

				
					void reverseArray(int arr[], int size) {
   for (int i = 0; i < size / 2; i++) {
      int temp = arr[i];
      arr[i] = arr[size - 1 - i];
      arr[size - 1 - i] = temp;
   }
}

void setup() {
   Serial.begin(9600);
   int numbers[] = {1, 2, 3, 4, 5};
   reverseArray(numbers, 5);
   Serial.println("آرایه معکوس شده:");
   for (int i = 0; i < 5; i++) {
      Serial.println(numbers[i]);
   }
}

void loop() {
}

				
			

کار با رشته‌ها در آردوینو

در آردوینو، دو نوع رشته وجود دارد:

  1. آرایه کاراکترها (رشته به سبک C):

    • آرایه کاراکتر شامل رشته‌ای از کاراکترها است که با کاراکتر Null (\0) پایان می‌یابد.

    • مثال:

				
					void setup() {
   Serial.begin(9600);
   char greeting[] = "Hello, Arduino!";
   Serial.println(greeting);
}

void loop() {
}

				
			

شیء رشته (String):

  • یک شیء String امکان عملیات پیچیده‌تر بر روی متن را فراهم می‌کند.

  • مثال:

				
					void setup() {
   Serial.begin(9600);
   String message = "Hello, Arduino!";
   message += " Welcome to programming.";
   Serial.println(message);
}

void loop() {
}

				
			

تغییر و دست‌کاری آرایه‌ها و رشته‌ها

  • یک مثال عملی که ترکیبی از آرایه‌ها و رشته‌ها را نشان می‌دهد:

				
					void setup() {
   Serial.begin(9600);
   char sentence[30] = "I love Arduino programming";
   Serial.println(sentence);

   // جایگزین کردن "Arduino" با "coding"
   sentence[7] = 'c';
   sentence[8] = 'o';
   sentence[9] = 'd';
   sentence[10] = 'i';
   sentence[11] = 'n';
   sentence[12] = 'g';
   sentence[13] = '\0'; // خاتمه دادن به رشته
   Serial.println(sentence);
}

void loop() {
}

				
			

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

    1. ایجاد و مقداردهی آسان: مانند یک متغیر تعریف می‌شود.

    2. دارای توابع داخلی: شامل توابع از پیش ساخته‌شده‌ای است که عملیات‌هایی مانند تغییر حروف به بزرگ، جایگزینی کلمات، و محاسبه طول رشته را انجام می‌دهد.

    3. مزیت نسبت به آرایه‌های کاراکتری: راحت‌تر برای استفاده و کدنویسی است اما استفاده بیشتری از حافظه می‌کند.

    4. مزایای استفاده از شیء String

      • سادگی در استفاده: توابع داخلی آماده انجام بسیاری از عملیات‌ها هستند.

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

      معایب استفاده از شیء String

      • مصرف زیاد حافظه می‌تواند باعث کرش کردن یا هنگ کردن برد آردوینو شود. به همین دلیل باید در پروژه‌های کوچک‌تر و با محدودیت استفاده از اشیا، از String Object بهره برد.

      مثال و کدنویسی

      در اینجا مثالی آورده شده است که نحوه کار با یک شیء String را نشان می‌دهد:

      کد نمونه:

       

      یک شیء (Object) ساختاری است که هم شامل داده‌ها و هم توابع (یا به اصطلاح OOP، روش‌ها “methods”) می‌باشد. یک شیء از نوع رشته (String Object) می‌تواند همانند یک متغیر ایجاد شود و به آن مقدار یا رشته‌ای اختصاص داده شود. این اشیا شامل توابعی هستند که به صورت داخلی بر روی داده‌های رشته‌ای عملیات انجام می‌دهند.

      ویژگی‌های کلیدی شیء String

				
					void setup() { 
   String my_str = "This is my string."; // ایجاد شیء و مقداردهی اولیه
   Serial.begin(9600);

   // (1) چاپ رشته
   Serial.println(my_str);

   // (2) تبدیل رشته به حروف بزرگ
   my_str.toUpperCase();
   Serial.println(my_str);

   // (3) بازنویسی رشته
   my_str = "My new string.";
   Serial.println(my_str);

   // (4) جایگزینی کلمه در رشته
   my_str.replace("string", "Arduino sketch");
   Serial.println(my_str);

   // (5) محاسبه طول رشته
   Serial.print("String length is: ");
   Serial.println(my_str.length());
}

void loop() { 
}

				
			

رفتار پین در تغییر بین INPUT و OUTPUT

      • اگر مقاومت پول‌آپ در حالت INPUT فعال باشد و پین به حالت OUTPUT تغییر یابد، پین به طور خودکار در حالت HIGH تنظیم می‌شود.

      • عکس این موضوع نیز صادق است. یک پین خروجی که در حالت HIGH قرار دارد، در صورت تغییر به حالت INPUT، مقاومت پول‌آپ فعال خواهد بود.

      • پین‌های آردوینو در حالت INPUT

        پین‌های آردوینو به طور پیش‌فرض به عنوان ورودی (INPUT) تنظیم شده‌اند و نیازی به اعلام صریح آن‌ها با استفاده از pinMode() نیست. این پین‌ها در این حالت به اصطلاح در وضعیت امپدانس بالا (high-impedance) قرار دارند. این وضعیت باعث می‌شود که پین‌های ورودی بار بسیار کمی به مداری که نمونه‌گیری می‌کنند وارد کنند (معادل یک مقاومت سری با مقدار 100 مگااهم در جلوی پین).

        ویژگی‌ها:

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

        2. مناسب برای مواردی مانند پیاده‌سازی حسگرهای خازنی لمسی یا خواندن LED به عنوان فوتودیود.

        3. اگر به این پین‌ها چیزی متصل نباشد، حالت پین‌ها ممکن است به دلیل نویزهای الکتریکی یا کوپل شدن خازنی به صورت تصادفی تغییر کند.

        مقاومت‌های پول‌آپ (Pull-up Resistors)

        مقاومت‌های پول‌آپ برای نگه داشتن یک پین ورودی در حالت مشخص زمانی که ورودی‌ای وجود ندارد مفید هستند. این کار را می‌توان با اضافه کردن یک مقاومت پول‌آپ (به +5 ولت) یا یک مقاومت پول‌داون (به زمین) به ورودی انجام داد. مقدار مقاومت پیشنهادی برای این کار معمولاً 10 کیلو اهم است.

        استفاده از مقاومت پول‌آپ داخلی

        در میکروکنترلرهای AVR، مقاومت‌های پول‌آپ داخلی با استفاده از pinMode(pin, INPUT_PULLUP) فعال می‌شوند. با این کار، رفتار حالت INPUT معکوس می‌شود:

        • HIGH: سنسور خاموش است.

        • LOW: سنسور روشن است.

        مقدار این مقاومت پول‌آپ به نوع میکروکنترلر بستگی دارد. در بسیاری از بردهای AVR مقدار آن بین 20kΩ تا 50kΩ و در آردوینو Due بین 50kΩ تا 150kΩ است.

        مثال: اتصال یک سنسور با مقاومت پول‌آپ داخلی

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

        • وقتی کلید باز باشد، پین مقدار HIGH را می‌خواند.

        • وقتی کلید فشرده شود، پین مقدار LOW را می‌خواند.

         
				
					void setup() {
   pinMode(3, INPUT);          // تنظیم پین به ورودی بدون استفاده از مقاومت پول‌آپ داخلی
   pinMode(5, INPUT_PULLUP);   // تنظیم پین به ورودی با استفاده از مقاومت پول‌آپ داخلی
}

void loop() {
}

				
			
      • استفاده از ورودی و خروجی در آردوینو :

        در آردوینو، تصمیم‌گیری درباره اینکه از پین‌ها به‌عنوان ورودی یا خروجی استفاده کنیم، به نوع سخت‌افزار یا سنسور متصل به پین بستگی دارد. بیایید این موضوع را بررسی کنیم:

        پین‌های ورودی (INPUT)

        موارد استفاده: پین‌های ورودی برای دریافت داده‌ها یا سیگنال‌ها از سنسور، کلید یا دیگر دستگاه‌ها به آردوینو استفاده می‌شوند. در این حالت، پین به‌صورت پیش‌فرض در حالت امپدانس بالا (high-impedance) است و جریان بسیار کمی از مدار می‌کشد.

        دلیل استفاده از Pull-up: اگر به پین ورودی چیزی متصل نباشد یا اتصال ناپایدار باشد، حالت پین ممکن است به دلیل نویز الکتریکی به طور تصادفی تغییر کند. به همین دلیل، از مقاومت پول‌آپ داخلی یا خارجی استفاده می‌شود تا پین در یک حالت تعریف‌شده (HIGH) قرار گیرد.

        مثال‌ها:

        1. کلید فشاری (Push Button):

          • وقتی دکمه باز است: پین مقدار HIGH می‌خواند (به کمک پول‌آپ داخلی).

          • وقتی دکمه فشرده شود: پین مقدار LOW می‌خواند.

          کد:

				
					void setup() {
   pinMode(2, INPUT_PULLUP); // استفاده از مقاومت پول‌آپ داخلی
}

void loop() {
   if (digitalRead(2) == LOW) {
      Serial.println("Button Pressed!");
   }
}

				
			
      • سنسور دما یا نور:

        • داده‌های سنسور مانند مقدار دما یا شدت نور به پین ورودی ارسال می‌شوند.

        کد (خواندن داده از سنسور آنالوگ)

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

void loop() {
   int sensorValue = analogRead(A0); // خواندن مقدار از پین آنالوگ
   Serial.println(sensorValue);
}

				
			
      • پین‌های خروجی (OUTPUT)

        موارد استفاده: پین‌های خروجی برای ارسال سیگنال یا تغذیه دستگاه‌هایی مانند LED، رله، موتور یا نمایشگرها استفاده می‌شوند. در این حالت، پین به عنوان منبع یا تخلیه جریان برای دستگاه‌ها عمل می‌کند.

        دلایل استفاده:

        • کنترل دستگاه‌های متصل، مانند روشن یا خاموش کردن LED.

        • ارسال سیگنال به دستگاه‌های دیگر برای انجام عملیات خاص.

        مثال‌ها:

        1. روشن و خاموش کردن LED: کد:

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

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

				
			
      • کنترل موتور: با استفاده از یک ماژول درایور موتور، می‌توان موتور را با خروجی آردوینو کنترل کرد. کد:

				
					void setup() {
   pinMode(9, OUTPUT); // تنظیم پین PWM برای کنترل سرعت موتور
}

void loop() {
   analogWrite(9, 128); // ارسال سیگنال PWM با 50% توان
   delay(2000);         // انتظار به مدت 2 ثانیه
   analogWrite(9, 0);   // خاموش کردن موتور
   delay(2000);         // انتظار به مدت 2 ثانیه
}

				
			
      • چه زمانی از INPUT و چه زمانی از OUTPUT استفاده کنیم؟

        • اگر شما از سنسوری که داده ارسال می‌کند، مانند یک دماسنج یا کلید فشاری استفاده می‌کنید، پین را ورودی (INPUT) تنظیم کنید. اگر حالت پایدار نیاز است، INPUT_PULLUP پیشنهاد می‌شود.

        • خلاصه

          1. ورودی‌ها (INPUT):

            • خواندن داده از دستگاه‌ها یا سنسورها.

            • نیاز به Pull-up برای پایداری در برخی موارد (مثلاً کلیدها).

          2. خروجی‌ها (OUTPUT):

            • کنترل دستگاه‌های متصل، مانند LEDها یا موتورها.

              اگر بخواهید دستگاهی را کنترل کنید، مانند روشن کردن LED یا راه‌اندازی یک موتور، پین باید خروجی (OUTPUT) باشد.

           

				
					void setup() {
   pinMode(9, OUTPUT); // تنظیم پین PWM برای کنترل سرعت موتور
}

void loop() {
   analogWrite(9, 128); // ارسال سیگنال PWM با 50% توان
   delay(2000);         // انتظار به مدت 2 ثانیه
   analogWrite(9, 0);   // خاموش کردن موتور
   delay(2000);         // انتظار به مدت 2 ثانیه
}

				
			

معرفی توابع دیجیتال و آنالوگ ورودی و خروجی در آردوینو

      • در آردوینو، توابع متعددی برای مدیریت ورودی و خروجی دیجیتال و آنالوگ وجود دارد. هر یک از این توابع برای عملیات خاصی طراحی شده‌اند، مانند خواندن مقادیر از سنسورها یا کنترل دستگاه‌هایی مانند LEDها یا موتورها.

         

        توابع دیجیتال

        این توابع برای کار با پین‌هایی استفاده می‌شوند که در حالت دیجیتال (۰ یا ۱) عمل می‌کنند.

        1. digitalRead(pin)

        برای خواندن مقدار یک پین دیجیتال ورودی استفاده می‌شود. مقدار بازگشتی می‌تواند HIGH (۱) یا LOW (۰) باشد.

        مثال: خواندن وضعیت یک کلید فشاری

        مثال: خواندن وضعیت یک کلید فشاری

				
					void setup() {
   pinMode(2, INPUT); // تنظیم پین ۲ به عنوان ورودی
   Serial.begin(9600);
}

void loop() {
   int buttonState = digitalRead(2); // خواندن وضعیت کلید
   Serial.println(buttonState); // چاپ وضعیت (HIGH یا LOW)
}

				
			

2. digitalWrite(pin, value)

برای تنظیم مقدار یک پین دیجیتال خروجی استفاده می‌شود. مقدار می‌تواند HIGH (روشن کردن) یا LOW (خاموش کردن) باشد.

مثال: روشن و خاموش کردن LED

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

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

				
			

توابع آنالوگ

توابع آنالوگ برای پین‌هایی استفاده می‌شوند که می‌توانند مقادیر پیوسته (در محدوده خاصی) را بخوانند یا ارسال کنند.

1. analogRead(pin)

برای خواندن مقدار ورودی آنالوگ از سنسورهایی که به پین‌های آنالوگ متصل شده‌اند استفاده می‌شود. مقدار بازگشتی بین ۰ تا ۱۰۲۳ است.

مثال: خواندن مقدار سنسور دما

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

void loop() {
   int sensorValue = analogRead(A0); // خواندن مقدار از سنسور متصل به A0
   Serial.println(sensorValue);     // چاپ مقدار سنسور
   delay(500);
}

				
			

2. analogWrite(pin, value)

برای ارسال سیگنال آنالوگ از طریق پین PWM استفاده می‌شود. مقدار ورودی بین ۰ (خاموش) تا ۲۵۵ (روشن کامل) است.

مثال: کنترل روشنایی یک LED

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

void loop() {
   for (int brightness = 0; brightness <= 255; brightness++) { // افزایش روشنایی
      analogWrite(9, brightness);
      delay(20);
   }
   for (int brightness = 255; brightness >= 0; brightness--) { // کاهش روشنایی
      analogWrite(9, brightness);
      delay(20);
   }
}

				
			

جدول خلاصه توابع ورودی و خروجی

 
تابع
کاربرد
مقادیر ورودی/خروجی
digitalRead(pin)
خواندن مقدار از یک پین دیجیتال ورودی
HIGH یا LOW
digitalWrite(pin, value)
تنظیم مقدار یک پین دیجیتال خروجی
HIGH یا LOW
analogRead(pin)
خواندن مقدار از پین آنالوگ ورودی
۰ تا ۱۰۲۳
analogWrite(pin, value)
ارسال

نکات مهم:

  1. پین‌های دیجیتال: مناسب برای دستگاه‌هایی مانند کلیدها و LEDها که فقط دو حالت دارند (روشن یا خاموش).

  2. پین‌های آنالوگ: مناسب برای سنسورهایی که مقادیر پیوسته تولید می‌کنند، مانند دماسنج‌ها یا سنسور نور.

  3. PWM: استفاده از پین‌های PWM (برای analogWrite) به شما امکان کنترل دقیق‌تری روی دستگاه‌ها مانند سرعت موتور یا روشنایی LED را می‌دهد.

ارتباط سریال(ارسال داده ها و نمایش)

ارتباط سریال (UART) در آردوینو برای ارسال و دریافت داده بین آردوینو و کامپیوتر (یا دستگاه‌های دیگر) استفاده می‌شود. این ارتباط از طریق پورت سریال و به کمک توابع سریال در آردوینو پیاده‌سازی می‌شود.

مفاهیم اولیه:

  1. Serial.begin(baudrate): این تابع نرخ انتقال داده (baud rate) را برای پورت سریال تنظیم می‌کند. مقدار baudrate تعداد بیت‌های ارسال یا دریافت در ثانیه است (مانند 9600).

  2. Serial.print() و Serial.println(): این توابع برای ارسال داده به پورت سریال استفاده می‌شوند. تفاوت بین آن‌ها این است که Serial.println() یک خط جدید اضافه می‌کند.

  3. Serial.read(): این تابع داده‌های دریافتی از پورت سریال را می‌خواند.

  4. Serial.write(): برای ارسال داده به پورت سریال استفاده می‌شود. این تابع داده را به‌صورت خام (بایت به بایت) ارسال می‌کند.

  5. Serial.available(): تعداد بایت‌های موجود در ورودی سریال را برای خواندن برمی‌گرداند.

 

مثال 1: ارسال پیام به پورت سریال

این کد هنگام راه‌اندازی آردوینو پیام “hello world” را از طریق پورت سریال ارسال می‌کند:

 
				
					void setup() {
   Serial.begin(9600); // تنظیم نرخ انتقال داده به 9600
   Serial.println("hello world"); // ارسال پیام به پورت سریال
}

void loop() {
   // هیچ عملیات خاصی در اینجا انجام نمی‌شود
}

				
			

پس از آپلود کد، مانیتور سریال (Serial Monitor) را در آردوینو IDE باز کنید تا پیام نمایش داده شود.

 

مثال 2: دریافت داده از پورت سریال و بازگرداندن آن

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

 
				
					void setup() {
   Serial.begin(9600); // تنظیم نرخ انتقال داده به 9600
}

void loop() {
   if (Serial.available()) { // بررسی وجود داده در پورت سریال
      Serial.print("I received: "); // پیام "I received" را ارسال می‌کند
      Serial.write(Serial.read()); // داده دریافتی را بازگشت می‌دهد
   }
}

				
			

توضیحات:

  1. ارسال پیام ثابت: در مثال اول، با هر بار راه‌اندازی آردوینو، پیام مشخصی (“hello world”) به پورت سریال ارسال می‌شود.

  2. بررسی ورودی و پاسخ به آن: در مثال دوم:

    • با دستور Serial.available() بررسی می‌شود که آیا داده‌ای برای خواندن وجود دارد یا خیر.

    • داده دریافتی توسط Serial.read() خوانده می‌شود.

    • سپس داده دریافتی با Serial.write() مجدداً ارسال می‌شود.

 

تفاوت و

  • Serial.print(): داده‌ها را به‌صورت رشته ASCII ارسال می‌کند. مثلاً Serial.print(65) مقدار 65 را ارسال می‌کند که در پورت سریال به‌صورت عدد نمایش داده می‌شود.

  • Serial.write(): داده‌ها را به‌صورت خام (بایت‌ها) ارسال می‌کند. مثلاً Serial.write(65) مقدار A (کد ASCII برابر 65) را ارسال می‌کند.

 

کاربردها

ارتباط سریال در موارد زیر استفاده می‌شود:

  1. دیباگ کردن کدها: ارسال پیام به سریال برای مشاهده وضعیت برنامه.

  2. ارتباط با دستگاه‌های دیگر: ارسال و دریافت داده با ماژول‌های سریالی مانند بلوتوث یا GSM.

  3. تعامل با کاربر: دریافت ورودی از کاربر از طریق مانیتور سریال

پروژه ساخت و برنامه نویسی با آردوینو،1:

آموزش استفاده از تابع analogWrite() برای کم‌نور کردن LED در آردوینو:

این آموزش به شما نشان می‌دهد که چگونه از تابع analogWrite() برای ایجاد اثر کم‌نور شدن (Fade) یک LED استفاده کنید. این تابع از مدولاسیون عرض پالس (PWM) استفاده می‌کند، که به معنای روشن و خاموش کردن سریع یک پایه دیجیتال با نسبت‌های مختلف روشنایی و خاموشی است.

 

قطعات مورد نیاز که در تصویر زیر امده است:

Components on Breadboard

برای این پروژه، به قطعات زیر نیاز دارید:

  • 1 عدد بردبرد (Breadboard)

  • 1 عدد آردوینو Uno R3

  • 1 عدد LED

  • 1 عدد مقاومت 330 اهم

  • 2 عدد سیم جامپر

نکته به پایه های برخی از قطعات مانند ال ای دی باید دقت کرد که دارای قطب های جداگانه + و – می باشند، در تصویر راهنمای پایه ها انجام شده است:
LED

نحوه اتصال قطعات

  1. از بردبرد برای اتصال قطعات استفاده کنید.

  2. پایه بلندتر LED به عنوان پایه مثبت (آند) و پایه کوتاه‌تر به عنوان پایه منفی (کاتد) عمل می‌کند. پایه منفی را به مقاومت 330 اهم وصل کنید.

  3. مقاومت را به پایه GND آردوینو متصل کنید.

  4. پایه مثبت LED را به پایه دیجیتال 9 آردوینو وصل کنید.

  5. تمامی اتصالات را طبق دیاگرام انجام دهید.

نکته: برای اطمینان از اتصال صحیح LED، به شکل پایه‌ها دقت کنید. پایه کوتاه‌تر به سمت لبه صاف LED اشاره می‌کند و کاتد یا پایه منفی است.

کد برنامه:

				
					int ledPin = 9; // پایه‌ای که LED به آن متصل شده است

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

void loop() {
   // افزایش روشنایی
   for (int brightness = 0; brightness <= 255; brightness++) {
      analogWrite(ledPin, brightness); // تنظیم روشنایی با PWM
      delay(10); // کمی مکث برای ایجاد اثر نرم
   }
   
   // کاهش روشنایی
   for (int brightness = 255; brightness >= 0; brightness--) {
      analogWrite(ledPin, brightness); // تنظیم روشنایی با PWM
      delay(10); // کمی مکث برای ایجاد اثر نرم
   }
}

				
			

پروژه ساخت و برنامه نویسی با آردوینو،2:

سنسورهای مادون قرمز (IR) امکان تشخیص حرکت را فراهم می‌کنند. از این سنسورها برای شناسایی ورود یا خروج یک انسان از محدوده‌ی سنسور استفاده می‌شود. این سنسورها معمولاً در وسایل و گجت‌هایی که برای مصارف خانگی یا تجاری استفاده می‌شوند، یافت می‌شوند. برخی از نام‌های متداول این سنسورها عبارت‌اند از:

  • PIR (Passive Infrared)

  • Pyroelectric

  • IR Motion Sensors

 

چگونگی عملکرد PIR

سنسورهای PIR از حسگرهای پیروالکتریک ساخته شده‌اند. این حسگرها معمولاً به شکل یک استوانه‌ی فلزی با کریستال مستطیل‌شکلی در مرکز هستند که سطوح تابش مادون قرمز را شناسایی می‌کنند.

  • تابش مادون قرمز: همه اجسام مقدار کمی تابش از خود ساطع می‌کنند. هرچه دمای جسم بالاتر باشد، میزان تابش آن بیشتر است.

  • تقسیم سنسور به دو بخش: حسگر در سنسورهای حرکتی به دو قسمت تقسیم می‌شود تا تغییرات تابش را شناسایی کند، نه میانگین کلی آن. این دو نیمه به گونه‌ای طراحی شده‌اند که یکدیگر را خنثی کنند. اگر یکی از نیمه‌ها تابش بیشتری یا کمتری را دریافت کند، خروجی سنسور به حالت HIGH یا LOW تغییر می‌کند.

 

کاربردها

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

  1. تشخیص حرکت در ورودی‌ها و خروجی‌ها: استفاده در چراغ‌های خودکار.

  2. امنیت خانه و محیط‌های کاری: فعال‌سازی آلارم‌ها در صورت شناسایی حرکت.

  3. اتوماسیون خانگی: روشن شدن دستگاه‌ها در صورت ورود به اتاق.

 

محدودیت‌ها

  • سنسور PIR نمی‌تواند تعداد افراد حاضر در محیط یا فاصله‌ی آن‌ها از سنسور را مشخص کند.

  • لنز سنسور معمولاً به زاویه‌ی خاصی تنظیم شده و ممکن است در اثر حرکت حیوانات خانگی تحریک شود.

 

مدار و کد نمونه برای استفاده از سنسور PIR

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

  • 1 عدد آردوینو (مثلاً Uno R3)

  • 1 عدد سنسور PIR

  • 3 عدد سیم جامپر

  • منبع تغذیه

اتصالات:

  1. پایه‌های سنسور PIR:

    • VCC: به 5V آردوینو متصل کنید.

    • GND: به پایه GND آردوینو متصل کنید.

    • OUT: به یکی از پایه‌های دیجیتال آردوینو (مثلاً D2) متصل کنید.

PIR Sensor Circuit Connection

کد نمونه

				
					#define pirPin 2 // تعریف پایه‌ای که سنسور PIR به آن متصل است
int calibrationTime = 30; // زمان کالیبراسیون اولیه (بر حسب ثانیه)
long unsigned int lowIn; // ذخیره زمان شروع وضعیت "بدون حرکت" سنسور
long unsigned int pause = 5000; // مقدار وقفه (۵ ثانیه) قبل از تشخیص پایان حرکت
boolean lockLow = true; // قفل برای وضعیت LOW (بدون حرکت)
boolean takeLowTime; // کنترل برای ثبت زمان آغاز حالت LOW
int PIRValue = 0; // مقدار خروجی سنسور (۰: بدون حرکت، ۱: حرکت)

void setup() {
   Serial.begin(9600); // شروع ارتباط سریال با نرخ انتقال 9600
   pinMode(pirPin, INPUT); // تنظیم پایه سنسور PIR به عنوان ورودی
}

void loop() {
   PIRSensor(); // فراخوانی تابع برای بررسی وضعیت سنسور PIR
}

void PIRSensor() {
   if (digitalRead(pirPin) == HIGH) { // بررسی اینکه آیا سنسور حرکت تشخیص داده است
      if (lockLow) { // بررسی اینکه آیا وضعیت LOW قبلاً قفل شده است
         PIRValue = 1; // تنظیم مقدار سنسور به ۱ (حرکت تشخیص داده شده)
         lockLow = false; // باز کردن قفل وضعیت LOW
         Serial.println("Motion detected."); // نمایش پیام "تشخیص حرکت"
         delay(50); // تاخیر برای پایداری
      }
      takeLowTime = true; // تنظیم اینکه زمان LOW بعداً ذخیره شود
   }
   if (digitalRead(pirPin) == LOW) { // بررسی اینکه آیا سنسور در حالت "بدون حرکت" است
      if (takeLowTime) { // اگر زمان LOW باید ذخیره شود
         lowIn = millis(); // ذخیره زمان فعلی
         takeLowTime = false; // ذخیره زمان فقط یک‌بار انجام شود
      }
      if (!lockLow && millis() - lowIn > pause) { // اگر حرکت متوقف شده و وقفه ۵ ثانیه گذشته باشد
         PIRValue = 0; // تنظیم مقدار سنسور به ۰ (بدون حرکت)
         lockLow = true; // قفل وضعیت LOW دوباره فعال شود
         Serial.println("Motion ended."); // نمایش پیام "پایان حرکت"
         delay(50); // تاخیر برای پایداری
      }
   }
}

				
			

توضیحات کلی کد:

  1. تعریف متغیرها:

    • متغیر pirPin پایه متصل به خروجی سنسور PIR را مشخص می‌کند.

    • متغیرهای lowIn و pause برای زمان‌بندی استفاده می‌شوند.

    • متغیرهای lockLow و takeLowTime برای کنترل قفل‌ها و حالت‌ها در طول چرخه‌ی اجرای کد هستند.

  2. تابع setup(): تنظیم اولیه برای برقراری ارتباط سریال و پیکربندی پایه سنسور به حالت ورودی انجام می‌شود.

  3. تابع loop(): به‌صورت مداوم تابع PIRSensor() را فراخوانی می‌کند تا وضعیت سنسور بررسی شود.

  4. تابع PIRSensor():

    • اگر سنسور PIR حرکت تشخیص دهد (HIGH):

      • مقدار PIRValue برابر ۱ می‌شود.

      • پیام “تشخیص حرکت” چاپ می‌شود.

    • اگر سنسور PIR حرکت را متوقف کند (LOW):

      • زمان توقف ثبت می‌شود.

      • اگر وقفه‌ای بیش از مقدار تعریف شده (۵ ثانیه) سپری شود، پیام “پایان حرکت” چاپ می‌شود و مقادیر بازنشانی می‌شوند

پروژه ساخت و برنامه نویسی با آردوینو،3:

معرفی موتورهای پله‌ای (Stepper Motors) و کدنویسی آن با آردوینو

موتور پله‌ای چیست؟

LM298 driving IC

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

ویژگی‌ها:
  • تعداد پله‌ها در هر دور چرخش موتور می‌تواند متفاوت باشد (مثلاً 12، 24، 72 و غیره).

  • زاویه هر پله بسته به طراحی موتور ممکن است 30، 15، 5، 2.5 و حتی 1.8 درجه باشد.

  • این موتور می‌تواند با یا بدون فیدبک کنترل شود.

 

کاربرد موتورهای پله‌ای

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

  1. پرینترها: حرکت دقیق برای چاپ خطوط متن یا تصاویر.

  2. کنترل‌های مکانیکی: حرکت محورها با اندازه‌های مشخص.

  3. دستگاه‌های CNC: برای برش‌های دقیق.

 

چگونگی کارکرد موتور پله‌ای

بر خلاف موتورهای DC معمولی که فقط در یک جهت می‌چرخند، موتور پله‌ای می‌تواند در زاویه‌های دقیق یا پله‌های مشخص حرکت کند. این قابلیت به شما امکان کنترل کامل موتور را می‌دهد تا بتوانید آن را به محل دقیق منتقل کرده و در همان مکان ثابت نگه دارید.

چالش: باید موتور همیشه تغذیه شود تا در موقعیت مشخص باقی بماند، که ممکن است مصرف انرژی بیشتری داشته باشد.

 

مدار مورد نیاز

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

  • 1 عدد برد آردوینو Uno

  • 1 عدد موتور پله‌ای کوچک دو قطبی

  • 1 عدد IC درایور LM298

نحوه اتصال:

  1. موتور پله‌ای را به IC درایور LM298 وصل کنید.

  2. خروجی‌های LM298 را به پایه‌های مشخص شده در برد آردوینو متصل کنید (پایه‌های 8، 9، 10 و 11).

  3. تغذیه مناسب برای موتور و مدار فراهم کنید.Stepper Motor Connections

 

کدنویسی کنترل موتور پله‌ای

کد زیر برای کنترل موتور پله‌ای با استفاده از کتابخانه Stepper است:

				
					#include <Stepper.h>
const int stepsPerRevolution = 90; // تعداد پله‌ها در هر دور کامل موتور
// مقدار را بر اساس مشخصات موتور تنظیم کنید

// مقداردهی اولیه کتابخانه Stepper برای پایه‌های 8 تا 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
   // تنظیم سرعت موتور (دور در دقیقه):
   myStepper.setSpeed(5);
   // شروع ارتباط سریال:
   Serial.begin(9600);
}

void loop() {
   // یک دور کامل در جهت عقربه‌های ساعت:
   Serial.println("clockwise"); // چاپ جهت چرخش
   myStepper.step(stepsPerRevolution); // حرکت موتور به اندازه یک دور کامل
   delay(500); // انتظار 500 میلی‌ثانیه

   // یک دور کامل در جهت مخالف عقربه‌های ساعت:
   Serial.println("counterclockwise"); // چاپ جهت چرخش مخالف
   myStepper.step(-stepsPerRevolution); // حرکت موتور در جهت مخالف
   delay(500); // انتظار 500 میلی‌ثانیه
}

				
			

در صورتی که قبلا این دوره را گذارنده اید و آزمون نهایی را با موفقیت پیش سر گذاشته اید با ثبت کد رهگیری دوره خود را بررسی کنید

صفحه پیگیریشما قادر به شرکت در آزمون نیستید
برچسب: Arduino Programing UNO UnoArdoSim آپنوپ آردوسیم آردوینو برنامه نویسی ربات رباتیک روبوت شبیه سازی مدار

درخواست مشاوره

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

درخواست مشاوره
09133877046

نیاز به مشاوره دارید؟

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

درخواست مشاوره رایگان





    دوره های مرتبط

    دوره هوش مصنوعی با PICTOBLOX

    🚀 دوره جامع آموزش هوش مصنوعی با PictoBlox 🤖 💡 یادگیری هوش مصنوعی و یادگیری ماشین برای همه! بدون نیاز…

    هوش مصنوعی با MIT App Inventor

    دوره تخصصی هوش مصنوعی با MIT App Inventor 🤖📱 این دوره آموزشی ویژه، به طراحی و توسعه اپلیکیشن‌های هوشمند در…

    هوش مصنوعی با PICTOBLOX

    🚀✨ معرفی دوره آموزشی پایتون در محیط PictoBlox ✨🚀 🎯 این دوره به شما آموزش می‌دهد که چگونه برنامه‌نویسی با…

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

    🚗🤖 یک ربات جذاب برای شروع دنیای الکترونیک! 🔧⚡

    این بسته کامل 🎁 شامل بدنه مقاوم و تجهیزات الکترونیکی 🛠️ برای ساخت یک ربات آموزشی جذاب است! 😍 این ربات قابلیت استفاده از آداپتور، باتری قلمی 🔋 و باتری شارژی 🔌 را دارد. در این نسخه، ربات با آداپتور تغذیه می‌شود، بنابراین یک سیم بلند همراه آن است 🏆✨

    اگر به یادگیری الکترونیک علاقه دارید 🎓🔍 و می‌خواهید یک ربات بدون نیاز به برنامه‌نویسی 💡 ولی با سیم‌کشی فنی و کارگاهی 🛠️ بسازید، این بسته ایده‌آل شماست! 🚀 ربات شما به شکل یک خودروی کوچک و کاربردی 🏎️ طراحی شده تا با ساخت آن، مهارت‌های فنی خود را تقویت کنید! 💪🎯 شروع کنید و اولین ربات خود را بسازید! 🔥🚗

    نظرات

    لغو پاسخ

    برای ارسال نظر باید وارد حساب کاربری خود شده باشید.

    قیمت :

    75,000 تومان

    امتیاز
    0 از 0 رأی
    بدون امتیاز 0 رای
    75,000 تومان
    تعداد دانشجو : 313
    روش دریافت: دانلود فایل دروس
    8.9k بازدید 0 دیدگاه
    حسین رضایی
    حسین رضایی
    مدرس رباتیک، الکترونیک، برنامه نویسی

    مدیر موسسه پیشروخلاقیت آزاد مهر ویرا

    دسته: دوره های آموزشی
    جستجو برای:
    دسته بندی محصولات
    • آی سی ها
    • ابزار
    • اسباب بازی
    • ال ای دی (LED)
    • باتری ، شارژر باتری
    • بسته ساخت ربات
    • ترانزیستورها
    • خازن ها
    • دوره اموزشی ساخت ربات
    • دوره های آموزش رایگان
    • دوره های آموزشی
    • دیود
    • ربات های سفارشی
    • سوکت HA
    • سوکت HB
    • سوکت آی سی
    • قطعات الکترونیک
    • قطعات مکانیکی
    • کانکتور ها
    • ماژول ها
    • ماژول ها و بردها
    • مقاومت ها
    • موتور ها
    راه‌های ارتباطی
    • 09217802801
    • upnop.ir@gmail.com
    دسترسی سریع
    • قوانین و مقررات مسابقات
    • اینستاگرام
    • آپارات
    • دانلود نرم افزار
    تمامی حقوق برای مجموعه پیشرو خلاقیت محفوظ می باشد.
    طراحی سایت توسط گروه تاپ فرانت
    ورود
    استفاده از شماره تلفن
    Use آدرس ایمیل
    آیا هنوز عضو نشده اید؟ ثبت نام کنید
    بازیابی رمز عبور
    استفاده از شماره تلفن
    Use آدرس ایمیل
    ثبت نام
    قبلا عضو شده اید؟ ورود به سیستم
    Protected by   
    enemad-logo

    🔹 **پیشرو خلاقیت | رباتیک • برنامه‌نویسی • هوش مصنوعی** 🔹 ✨ آموزش، ابزار و نوآوری در یکجا! 🚀 رد کردن

    ورود

    رمز عبور را فراموش کرده اید؟

    هنوز عضو نشده اید؟ عضویت در سایت