معرفی دوره:
در این دوره 🚀 به آموزش برنامهنویسی پیشرفته بردهای آردوینو 🛠️ میپردازیم. این دوره شامل ویدیوهای عملی 🎥 از اجرای پروژههای سختافزاری و نرمافزاری 💡 است که به شما در راهاندازی حسگرها 📡، ماژولها ⚙️ و سایر قطعات مرتبط با آردوینو کمک میکند.
✨ ویژگیهای منحصربهفرد این دوره:
✅ آموزش گامبهگام همراه با اجرای پروژههای واقعی 🔬
✅ یافتن و استفاده از کتابخانههای کاربردی 📚 در محیط برنامهنویسی آردوینو 💻
✅ نوشتن کد با کمک هوش مصنوعی 🤖 برای افزایش سرعت و دقت برنامهنویسی
✅ پشتیبانی حرفهای برای حل چالشهای شما در اجرای پروژهها 🆘
🎯 اگر میخواهید مهارتهای خود را در برنامهنویسی آردوینو به سطح بالاتری برسانید، این دوره دقیقاً برای شما طراحی شده است! ⏳💡
🔥 همین حالا ثبتنام کنید و اولین قدم را برای اجرای پروژههای حرفهای بردارید! 🔥
توابع در برنامه نویسی آردوینو:
توابع یکی از مهمترین مفاهیم در برنامهنویسی هستند که باعث افزایش خوانایی کد، کاهش تکرار و تسهیل در اشکالزدایی میشوند. در آردوینو، توابع به ما کمک میکنند که کدهای ماژولار و قابل استفاده مجدد داشته باشیم.
چرا از توابع استفاده کنیم؟
✅ کاهش تکرار کد: با تعریف یک تابع، میتوان همان عملیات را چندین بار در برنامه اجرا کرد بدون اینکه نیاز به نوشتن مجدد کد باشد.
✅ افزایش خوانایی کد: برنامههای طولانی به قسمتهای کوچکتر و منطقی تقسیم میشوند.
✅ اشکالزدایی سادهتر: اگر خطایی در برنامه رخ دهد، بررسی و اصلاح آن در یک تابع مشخص آسانتر خواهد بود.
✅ ماژولار بودن کد: استفاده از توابع باعث میشود که بتوان بخشهایی از برنامه را در پروژههای دیگر نیز استفاده کرد.
ساختار کلی تعریف تابع در آردوینو
یک تابع در آردوینو معمولاً به صورت زیر تعریف میشود:
نوع_بازگشتی نام_تابع(ورودیها) {
// بدنه تابع: دستورات اجرا شده
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 شروع میشوند).
ویژگیهای کلیدی آرایهها
آرایه میتواند شامل چندین مقدار از یک نوع داده مشابه باشد.
اندیس آرایه همیشه از 0 شروع میشود.
آخرین اندیس آرایه برابر است با اندازه آرایه – 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() {
}
توابع برای کار با آرایهها
در آردوینو، شما میتوانید توابعی بنویسید که به صورت خاص برای کار با آرایهها طراحی شدهاند. در اینجا چند نمونه آورده شده است:
محاسبه مجموع عناصر آرایه:
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() {
}
کار با رشتهها در آردوینو
در آردوینو، دو نوع رشته وجود دارد:
آرایه کاراکترها (رشته به سبک 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() {
}
اشیا در برنامهنویسی آردوینو
ایجاد و مقداردهی آسان: مانند یک متغیر تعریف میشود.
دارای توابع داخلی: شامل توابع از پیش ساختهشدهای است که عملیاتهایی مانند تغییر حروف به بزرگ، جایگزینی کلمات، و محاسبه طول رشته را انجام میدهد.
مزیت نسبت به آرایههای کاراکتری: راحتتر برای استفاده و کدنویسی است اما استفاده بیشتری از حافظه میکند.
مزایای استفاده از شیء 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 مگااهم در جلوی پین).ویژگیها:
به جریان بسیار کمی نیاز دارند تا وضعیت پین ورودی را تغییر دهند.
مناسب برای مواردی مانند پیادهسازی حسگرهای خازنی لمسی یا خواندن LED به عنوان فوتودیود.
اگر به این پینها چیزی متصل نباشد، حالت پینها ممکن است به دلیل نویزهای الکتریکی یا کوپل شدن خازنی به صورت تصادفی تغییر کند.
مقاومتهای پولآپ (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) قرار گیرد.
مثالها:
کلید فشاری (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.
ارسال سیگنال به دستگاههای دیگر برای انجام عملیات خاص.
مثالها:
روشن و خاموش کردن 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 پیشنهاد میشود.
خلاصه
ورودیها (INPUT):
خواندن داده از دستگاهها یا سنسورها.
نیاز به Pull-up برای پایداری در برخی موارد (مثلاً کلیدها).
خروجیها (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);
}
}
جدول خلاصه توابع ورودی و خروجی
تابع | کاربرد | مقادیر ورودی/خروجی |
---|---|---|
| خواندن مقدار از یک پین دیجیتال ورودی |
|
| تنظیم مقدار یک پین دیجیتال خروجی |
|
| خواندن مقدار از پین آنالوگ ورودی | ۰ تا ۱۰۲۳ |
| ارسال |
نکات مهم:
پینهای دیجیتال: مناسب برای دستگاههایی مانند کلیدها و LEDها که فقط دو حالت دارند (روشن یا خاموش).
پینهای آنالوگ: مناسب برای سنسورهایی که مقادیر پیوسته تولید میکنند، مانند دماسنجها یا سنسور نور.
PWM: استفاده از پینهای PWM (برای analogWrite) به شما امکان کنترل دقیقتری روی دستگاهها مانند سرعت موتور یا روشنایی LED را میدهد.
ارتباط سریال(ارسال داده ها و نمایش)
ارتباط سریال (UART) در آردوینو برای ارسال و دریافت داده بین آردوینو و کامپیوتر (یا دستگاههای دیگر) استفاده میشود. این ارتباط از طریق پورت سریال و به کمک توابع سریال در آردوینو پیادهسازی میشود.
مفاهیم اولیه:
Serial.begin(baudrate): این تابع نرخ انتقال داده (baud rate) را برای پورت سریال تنظیم میکند. مقدار
baudrate
تعداد بیتهای ارسال یا دریافت در ثانیه است (مانند 9600).Serial.print() و Serial.println(): این توابع برای ارسال داده به پورت سریال استفاده میشوند. تفاوت بین آنها این است که
Serial.println()
یک خط جدید اضافه میکند.Serial.read(): این تابع دادههای دریافتی از پورت سریال را میخواند.
Serial.write(): برای ارسال داده به پورت سریال استفاده میشود. این تابع داده را بهصورت خام (بایت به بایت) ارسال میکند.
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()); // داده دریافتی را بازگشت میدهد
}
}
توضیحات:
ارسال پیام ثابت: در مثال اول، با هر بار راهاندازی آردوینو، پیام مشخصی (“hello world”) به پورت سریال ارسال میشود.
بررسی ورودی و پاسخ به آن: در مثال دوم:
با دستور
Serial.available()
بررسی میشود که آیا دادهای برای خواندن وجود دارد یا خیر.داده دریافتی توسط
Serial.read()
خوانده میشود.سپس داده دریافتی با
Serial.write()
مجدداً ارسال میشود.
تفاوت و
Serial.print(): دادهها را بهصورت رشته ASCII ارسال میکند. مثلاً
Serial.print(65)
مقدار65
را ارسال میکند که در پورت سریال بهصورت عدد نمایش داده میشود.Serial.write(): دادهها را بهصورت خام (بایتها) ارسال میکند. مثلاً
Serial.write(65)
مقدارA
(کد ASCII برابر 65) را ارسال میکند.
کاربردها
ارتباط سریال در موارد زیر استفاده میشود:
دیباگ کردن کدها: ارسال پیام به سریال برای مشاهده وضعیت برنامه.
ارتباط با دستگاههای دیگر: ارسال و دریافت داده با ماژولهای سریالی مانند بلوتوث یا GSM.
تعامل با کاربر: دریافت ورودی از کاربر از طریق مانیتور سریال
پروژه ساخت و برنامه نویسی با آردوینو،1:
آموزش استفاده از تابع analogWrite() برای کمنور کردن LED در آردوینو:
این آموزش به شما نشان میدهد که چگونه از تابع analogWrite()
برای ایجاد اثر کمنور شدن (Fade) یک LED استفاده کنید. این تابع از مدولاسیون عرض پالس (PWM) استفاده میکند، که به معنای روشن و خاموش کردن سریع یک پایه دیجیتال با نسبتهای مختلف روشنایی و خاموشی است.
قطعات مورد نیاز که در تصویر زیر امده است:
برای این پروژه، به قطعات زیر نیاز دارید:
1 عدد بردبرد (Breadboard)
1 عدد آردوینو Uno R3
1 عدد LED
1 عدد مقاومت 330 اهم
2 عدد سیم جامپر

نحوه اتصال قطعات
از بردبرد برای اتصال قطعات استفاده کنید.
پایه بلندتر LED به عنوان پایه مثبت (آند) و پایه کوتاهتر به عنوان پایه منفی (کاتد) عمل میکند. پایه منفی را به مقاومت 330 اهم وصل کنید.
مقاومت را به پایه GND آردوینو متصل کنید.
پایه مثبت LED را به پایه دیجیتال 9 آردوینو وصل کنید.
تمامی اتصالات را طبق دیاگرام انجام دهید.
نکته: برای اطمینان از اتصال صحیح 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 برای پروژهها یا دستگاههایی که نیاز به تشخیص ورود یا خروج افراد از یک منطقه دارند، عالی هستند. برخی از کاربردهای آن عبارتاند از:
تشخیص حرکت در ورودیها و خروجیها: استفاده در چراغهای خودکار.
امنیت خانه و محیطهای کاری: فعالسازی آلارمها در صورت شناسایی حرکت.
اتوماسیون خانگی: روشن شدن دستگاهها در صورت ورود به اتاق.
محدودیتها
سنسور PIR نمیتواند تعداد افراد حاضر در محیط یا فاصلهی آنها از سنسور را مشخص کند.
لنز سنسور معمولاً به زاویهی خاصی تنظیم شده و ممکن است در اثر حرکت حیوانات خانگی تحریک شود.
مدار و کد نمونه برای استفاده از سنسور PIR
قطعات مورد نیاز:
1 عدد آردوینو (مثلاً Uno R3)
1 عدد سنسور PIR
3 عدد سیم جامپر
منبع تغذیه
اتصالات:
پایههای سنسور PIR:
VCC: به 5V آردوینو متصل کنید.
GND: به پایه GND آردوینو متصل کنید.
OUT: به یکی از پایههای دیجیتال آردوینو (مثلاً D2) متصل کنید.

کد نمونه
#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); // تاخیر برای پایداری
}
}
}
توضیحات کلی کد:
تعریف متغیرها:
متغیر
pirPin
پایه متصل به خروجی سنسور PIR را مشخص میکند.متغیرهای
lowIn
وpause
برای زمانبندی استفاده میشوند.متغیرهای
lockLow
وtakeLowTime
برای کنترل قفلها و حالتها در طول چرخهی اجرای کد هستند.
تابع
setup()
: تنظیم اولیه برای برقراری ارتباط سریال و پیکربندی پایه سنسور به حالت ورودی انجام میشود.تابع
loop()
: بهصورت مداوم تابعPIRSensor()
را فراخوانی میکند تا وضعیت سنسور بررسی شود.تابع
PIRSensor()
:اگر سنسور PIR حرکت تشخیص دهد (
HIGH
):مقدار
PIRValue
برابر ۱ میشود.پیام “تشخیص حرکت” چاپ میشود.
اگر سنسور PIR حرکت را متوقف کند (
LOW
):زمان توقف ثبت میشود.
اگر وقفهای بیش از مقدار تعریف شده (۵ ثانیه) سپری شود، پیام “پایان حرکت” چاپ میشود و مقادیر بازنشانی میشوند
پروژه ساخت و برنامه نویسی با آردوینو،3:
معرفی موتورهای پلهای (Stepper Motors) و کدنویسی آن با آردوینو
موتور پلهای چیست؟
موتورهای پلهای نوعی موتور بدون براش و همزمان هستند که یک چرخش کامل را به تعدادی پله تقسیم میکنند. برخلاف موتورهای DC که با ولتاژ ثابت به طور پیوسته میچرخند، موتور پلهای به صورت زاویههای گسسته حرکت میکند.
ویژگیها:
تعداد پلهها در هر دور چرخش موتور میتواند متفاوت باشد (مثلاً 12، 24، 72 و غیره).
زاویه هر پله بسته به طراحی موتور ممکن است 30، 15، 5، 2.5 و حتی 1.8 درجه باشد.
این موتور میتواند با یا بدون فیدبک کنترل شود.
کاربرد موتورهای پلهای
موتور پلهای در دستگاههایی که نیاز به حرکت دقیق دارند، استفاده میشود. برخی کاربردهای رایج:
پرینترها: حرکت دقیق برای چاپ خطوط متن یا تصاویر.
کنترلهای مکانیکی: حرکت محورها با اندازههای مشخص.
دستگاههای CNC: برای برشهای دقیق.
چگونگی کارکرد موتور پلهای
بر خلاف موتورهای DC معمولی که فقط در یک جهت میچرخند، موتور پلهای میتواند در زاویههای دقیق یا پلههای مشخص حرکت کند. این قابلیت به شما امکان کنترل کامل موتور را میدهد تا بتوانید آن را به محل دقیق منتقل کرده و در همان مکان ثابت نگه دارید.
چالش: باید موتور همیشه تغذیه شود تا در موقعیت مشخص باقی بماند، که ممکن است مصرف انرژی بیشتری داشته باشد.
مدار مورد نیاز
قطعات مورد نیاز:
1 عدد برد آردوینو Uno
1 عدد موتور پلهای کوچک دو قطبی
1 عدد IC درایور LM298
نحوه اتصال:
موتور پلهای را به IC درایور LM298 وصل کنید.
خروجیهای LM298 را به پایههای مشخص شده در برد آردوینو متصل کنید (پایههای 8، 9، 10 و 11).
تغذیه مناسب برای موتور و مدار فراهم کنید.
کدنویسی کنترل موتور پلهای
کد زیر برای کنترل موتور پلهای با استفاده از کتابخانه Stepper
است:
#include
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 میلیثانیه
}
در صورتی که قبلا این دوره را گذارنده اید و آزمون نهایی را با موفقیت پیش سر گذاشته اید با ثبت کد رهگیری دوره خود را بررسی کنید
درخواست مشاوره
برای کسب اطلاعات بیشتر درباره این دوره درخواست مشاوره خود را ارسال کنید و یا با ما در تماس باشید.
درخواست مشاورهدوره های مرتبط
دوره الکترونیک، مفاهیم و قوانین
با دورهای جذاب و ساده، مفاهیم الکترونیک، مدارها و نحوه اتصال قطعات را یاد بگیرید! 🌟 این دوره برای علاقهمندان به هوشمندسازی و دانشآموزان طراحی شده است. با مثالهای طبیعی، مفاهیم ولتاژ، جریان و مقاومت را به شکلی کاربردی درک کنید و با ساخت مدارها، انرژی را به نور، حرکت، صدا و گرما تبدیل کنید. 🚀
بسته خودرو کنترل دستی
🚛 بسته ربات وانت کنترلی یک شاسی مقاوم از MDF سه میل با طراحی جذاب شبیه وانت 🚚 است که برای ساخت رباتهای کنترلی و آموزشی ایدهآل میباشد. 🤖✨ مجهز به دو موتور DC پرقدرت ⚡ و هرزگرد جلویی 🔄 برای حرکت پایدار و چرخش نرم، این بسته گزینهای عالی برای پروژههای دانشآموزی و آموزشی است. 🎮📡🛠️
بسته ربات نوریاب
🚀 بدنه ربات نوریاب ساده یک شاسی مقاوم و اقتصادی برای ساخت انواع رباتهای آموزشی مانند نوریاب و مسیریاب است. 🤖✨ این بدنه از MDF سه میل برشخورده دقیق ساخته شده و با دو موتور DC پرقدرت ⚡ و یک هرزگرد جلویی 🔄 تعادل و حرکت روان را فراهم میکند. 🛤️ مناسب برای پروژههای دانشآموزی و آموزشی با قیمت مقرونبهصرفه! 💰🎓
نظرات
75,000 تومان

حسین رضایی
مدرس رباتیک، الکترونیک، برنامه نویسیمدیر موسسه پیشروخلاقیت آزاد مهر ویرا
