🔧 کد آردوینو کار نمی‌کند؟ ۱۵ علت رایج، از سیم‌کشی تا تغذیه، با راه‌حل هر کدام

✍️ تیم ووکوی فارسی ·

برنامه را نوشتی، آپلود شد و هیچ خطایی هم نگرفتی؛ ولی LED روشن نمی‌شود، دکمه جواب نمی‌دهد یا سریال مانیتور پر از حروف درهم است. کد آردوینو کار نمی‌کند و نمی‌دانی از کجا شروع کنی. این صفحه برای همین لحظه است: ۱۵ علت رایج را به شکل «نشانه ← علت ← راه‌حل» آورده‌ایم تا مشکل را از روی چیزی که می‌بینی پیدا کنی. اگر کد اصلاً کامپایل نمی‌شود و پیغام نارنجی می‌گیری، سراغ ارورهای رایج آردوینو و معنی‌شان برو. اگر هم مشکل این است که خود سایت wokwi.com باز نمی‌شود، جوابش در صفحه‌ی ووکوی باز نمی‌شود است. اینجا درباره‌ی کدی حرف می‌زنیم که اجرا می‌شود ولی کاری را که می‌خواهی انجام نمی‌دهد.

قبل از همه، سه سؤال ساده

  1. کامپایل و آپلود موفق بود؟ اگر نه، مشکل در کد یا اتصال USB است، نه در مدار.
  2. سریال مانیتور چیزی نشان می‌دهد؟ یک Serial.println("start"); اول setup بگذار. اگر چاپ شد، برنامه دارد اجرا می‌شود و باید دنبال اشکال منطقی یا سیم‌کشی بگردی.
  3. ساده‌ترین برنامه کار می‌کند؟ مثال Blink را آپلود کن. اگر حتی LED داخلی برد هم چشمک نمی‌زند، مشکل از برد، کابل یا تغذیه است، نه از کد تو.

۱۵ علت رایج و راه‌حل هر کدام

۱. پین کد با پین سیم‌کشی یکی نیست

۲. LED برعکس است یا مقاومتش اشتباه

۳. GND مشترک نیست

۴. pinMode فراموش شده

۵. = به‌جای ==

۶. سمی‌کالن بعد از if یا for

۷. delay همه‌چیز را قفل می‌کند

۸. سرعت سریال مانیتور با کد یکی نیست

۹. سریال خالی است یا پین ۰ و ۱ اشغال شده

۱۰. ورودی شناور (floating)

۱۱. پرش کنتاکت دکمه (bounce)

۱۲. نوع متغیر کوچک است یا تقسیم صحیح شده

۱۳. متغیر داخل loop هر بار صفر می‌شود

۱۴. analogWrite روی پینی که PWM ندارد

۱۵. تغذیه‌ی ناکافی

کد نمونه: چند درمان در یک برنامه

این برنامه با یک دکمه LED را روشن و خاموش می‌کند و هم‌زمان LED داخلی را چشمک می‌زند. چند علت بالا (۴، ۵، ۷، ۸، ۱۰، ۱۱ و ۱۲) در آن درست شده است. دکمه بین پین ۲ و GND است و LED با مقاومت ۲۲۰ اهم روی پین ۸.

// Button toggles an LED while the built-in LED blinks without delay().
// Fixes from this article: pinMode, INPUT_PULLUP, ==, millis, debounce.
const int BUTTON = 2;       // button between pin 2 and GND
const int LED = 8;          // LED + 220 ohm resistor to GND
const int BLINK_LED = 13;   // built-in LED

bool ledOn = false;
int lastReading = HIGH;
unsigned long lastChange = 0;   // unsigned long for millis(), never int
unsigned long lastBlink = 0;

void setup() {
  Serial.begin(9600);             // set the Serial Monitor to 9600 too
  pinMode(BUTTON, INPUT_PULLUP);  // no floating input: idle HIGH, pressed LOW
  pinMode(LED, OUTPUT);
  pinMode(BLINK_LED, OUTPUT);
  Serial.println("Ready");
}

void loop() {
  int reading = digitalRead(BUTTON);
  if (reading != lastReading && millis() - lastChange > 50) {  // 50 ms debounce
    lastChange = millis();
    lastReading = reading;
    if (reading == LOW) {         // == compares, a single = would assign
      ledOn = !ledOn;
      digitalWrite(LED, ledOn ? HIGH : LOW);
      Serial.print("LED is ");
      Serial.println(ledOn ? "ON" : "OFF");
    }
  }

  if (millis() - lastBlink >= 500) {   // blink without blocking the button
    lastBlink = millis();
    digitalWrite(BLINK_LED, !digitalRead(BLINK_LED));
  }
}

توضیح بخش‌های مهم

پیدا کردن باگ در شبیه‌ساز

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

برای اشکال‌های منطقی (علت‌های ۵، ۶، ۱۲ و ۱۳) ابزار بهتر دیباگر قدم‌به‌قدم است: کنار یک خط نقطه‌ی توقف بگذار، اجرا را بزن و وقتی برنامه همان‌جا ایستاد، مقدار متغیرها را ببین. اگر برنامه هیچ‌وقت به آن خط نرسید، شرطت غلط است. برای ورودی شناور هم نمودار سریال عالی است: مقدار پین شناور را به شکل یک خط پرنویز و لرزان می‌بینی. همه‌ی این ابزارها با آردوینو اونو و نانو رایگان‌اند. مدار دکمه و LED به‌صورت آماده هست: پروژه‌ی «دکمه + LED»، و درس خواندن دکمه با آردوینو pull-up را با تمرین یاد می‌دهد.

💡 یک تمرین خوب: در کد بالا عمداً INPUT_PULLUP را به INPUT تغییر بده و دکمه را جدا کن. حالا در نمودار سریال ببین ورودی شناور چه شکلی است، بعد درستش کن.

روش کلی: کوچک کن، چاپ کن، نصف کن

وقتی هیچ‌کدام از علت‌های بالا نبود، برنامه را تکه‌تکه امتحان کن. اول فقط بخش LED را نگه دار و بقیه را کامنت کن؛ اگر کار کرد، بخش بعدی را برگردان. جاهای حساس Serial.println بگذار تا ببینی برنامه از کدام مسیر رد می‌شود و متغیرها چه مقداری دارند. اگر برنامه بلند است، نصفش را غیرفعال کن و ببین مشکل در کدام نیمه است؛ چند بار نصف کردن، باگ را به چند خط محدود می‌کند. روش کامل کار با سریال در سریال مانیتور و نمودار سریال و کار با نقطه‌ی توقف در دیباگ کد آردوینو در شبیه‌ساز آمده است.

چک‌لیست سریع

  1. شماره‌ی پین‌ها در کد و سیم‌کشی یکی است؟
  2. همه‌ی GNDها به هم وصل‌اند؟
  3. برای هر خروجی pinMode نوشته‌ای؟ ورودی‌ها pull-up دارند؟
  4. در شرط‌ها == است و بعد از if سمی‌کالن نیست؟
  5. delay طولانی جلوی خواندن ورودی‌ها را نگرفته؟
  6. سرعت سریال مانیتور با Serial.begin یکی است؟
  7. زمان‌ها unsigned long هستند؟
  8. موتورها منبع جدا دارند؟

اگر کدت هنوز کامپایل نمی‌شود، معنی ارورهای آردوینو را ببین. پروژه‌های آماده‌ی بیشتر برای تمرین در صفحه‌ی آردوینو جمع شده‌اند.

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

سؤال‌های رایج

کد آردوینو بدون خطا آپلود می‌شود ولی هیچ اتفاقی نمی‌افتد؛ اول چه چیزی را چک کنم؟

اول مثال Blink را آپلود کن تا مطمئن شوی برد سالم است. بعد یک Serial.println در اول setup بگذار تا ببینی برنامه اجرا می‌شود یا نه. اگر هر دو درست بود، شماره‌ی پین در کد را با سیم‌کشی مقایسه کن؛ بیشتر مشکل‌ها همین‌جا پیدا می‌شوند.

چرا دکمه‌ی آردوینو بدون فشار دادن هم روشن و خاموش می‌شود؟

پین ورودی شناور است و نویز را می‌خواند. pinMode را INPUT_PULLUP کن و دکمه را بین پین و GND بگذار؛ در این حالت دکمه‌ی فشرده LOW خوانده می‌شود.

چرا وقتی سروو یا موتور حرکت می‌کند آردوینو ریست می‌شود؟

موتور جریان زیادی می‌کشد و ولتاژ ۵ ولت برد افت می‌کند. موتور را با منبع جدا تغذیه کن و فقط GND منبع را به GND آردوینو وصل کن.

مقاله‌های مرتبط

🐞

ارورهای رایج آردوینو و معنی‌شان: از was not declared in this scope تا avrdude

📈

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

🐞

دیباگ قدم‌به‌قدم کد آردوینو در شبیه‌ساز آنلاین: بریک‌پوینت و دیدن متغیرها

⚖️

ESP32 یا ESP8266؟ مقایسه‌ی کامل دو برد وای‌فای و راهنمای انتخاب

همه‌ی آموزش‌های برنامه‌نویسی و عیب‌یابی آردوینو ← · همه‌ی مقاله‌ها