📌 پین اوت ESP32 به زبان ساده: جدول کامل پایه‌های DevKit سی‌پایه و این‌که کدام‌ها امن‌اند

✍️ نویسنده: ·

اولین بار که یک برد ESP32 را دست می‌گیری، سی پایه با اسم‌های عجیب می‌بینی: D34، VP، TX2، EN و… و خیلی زود می‌فهمی که برخلاف آردوینو اونو، همه‌ی پایه‌ها مثل هم نیستند. بعضی فقط ورودی‌اند، بعضی اگر هنگام روشن شدن به چیزی وصل باشند برد اصلاً بالا نمی‌آید، و بعضی وقتی وای‌فای روشن است دیگر آنالوگ نمی‌خوانند. این راهنمای پین اوت ESP32 همه‌ی این‌ها را یک‌جا، با یک جدول کامل و دلیل هر قانون، توضیح می‌دهد تا قبل از سیم‌کشی بدانی هر قطعه را به کدام پایه وصل کنی.

مرجع ما رایج‌ترین برد بازار است: ESP32 DevKit V1 سی‌پایه (معروف به DOIT) با ماژول ESP32-WROOM-32. برد ESP32 در شبیه‌ساز فارسی هم دقیقاً همین چیدمان و همین برچسب‌ها را دارد و اگر با ووکوی (Wokwi) کار کرده باشی، این برد برایت آشناست. پس هرچه این‌جا می‌خوانی، هم روی برد واقعی درست است و هم در شبیه‌ساز.

اول یک قرارداد: GPIO، حرف D و برچسب روی برد

روی برد کنار هر پایه چیزی مثل D23 نوشته شده است. این «D» هیچ معنای خاصی ندارد؛ D23 یعنی GPIO23 و در کد فقط عدد را می‌نویسی: pinMode(23, OUTPUT). چند پایه اسم دیگری دارند: VP همان GPIO36 است، VN همان GPIO39، TX0 و RX0 همان GPIO1 و GPIO3، و TX2 و RX2 همان GPIO17 و GPIO16. برخلاف اونو، این‌جا پایه‌های جدا با اسم A0 تا A5 نداری؛ هر پایه‌ای که ADC دارد با همان شماره‌ی GPIO آنالوگ می‌خواند.

نکته‌ی مهم دیگر ولتاژ است. همه‌ی پایه‌های ESP32 با ۳٫۳ ولت کار می‌کنند. HIGH یعنی ۳٫۳ ولت، نه ۵ ولت، و هیچ پایه‌ای ۵ ولت ورودی را تحمل نمی‌کند. جریان هر پایه را هم زیر ۲۰ میلی‌آمپر نگه دار؛ یک LED با مقاومت مشکلی ندارد، ولی موتور، رله و سروو را هرگز مستقیم از پایه تغذیه نکن.

برای خواندن جدول، برد را طوری بگیر که ماژول فلزی (آنتن) بالا و سوکت USB پایین باشد. ستون چپ از بالا به پایین با EN شروع می‌شود و به VIN می‌رسد، و ستون راست با D23 شروع می‌شود و به 3V3 می‌رسد.

جدول کامل پایه‌های ESP32 DevKit سی‌پایه

علامت‌ها: ✅ با خیال راحت استفاده کن، ⚠️ قابل استفاده ولی با شرط، ⛔ برای کار عمومی استفاده نکن، 🔌 تغذیه.

ستون چپ (از بالا به پایین)

برچسبGPIOقابلیت‌هاوضعیت و نکته
EN—ریست تراشه🔌 LOW شدنش برد را ریست می‌کند؛ دکمه‌ی EN همین است
VP36ADC1_CH0، RTC⚠️ فقط ورودی، بدون پول‌آپ داخلی؛ عالی برای سنسور آنالوگ
VN39ADC1_CH3، RTC⚠️ فقط ورودی، بدون پول‌آپ داخلی
D3434ADC1_CH6، RTC⚠️ فقط ورودی؛ محبوب‌ترین پایه برای پتانسیومتر
D3535ADC1_CH7، RTC⚠️ فقط ورودی
D3232ADC1_CH4، Touch9، RTC✅ ورودی و خروجی، آنالوگ حتی با وای‌فای
D3333ADC1_CH5، Touch8، RTC✅ ورودی و خروجی، آنالوگ حتی با وای‌فای
D2525ADC2_CH8، DAC1، RTC✅ خروجی آنالوگ واقعی با dacWrite
D2626ADC2_CH9، DAC2، RTC✅ خروجی آنالوگ واقعی
D2727ADC2_CH7، Touch7، RTC✅ امن
D1414ADC2_CH6، Touch6، HSPI SCK⚠️ هنگام بوت چند پالس PWM بیرون می‌دهد
D1212ADC2_CH5، Touch5، HSPI MISO⚠️ strapping؛ هنگام بوت باید LOW باشد
D1313ADC2_CH4، Touch4، HSPI MOSI✅ امن
GND—زمین🔌
VIN—۵ ولت USB🔌 ورودی ۵ ولت (یا خروجی ۵ ولت وقتی با USB روشن است)

ستون راست (از بالا به پایین)

برچسبGPIOقابلیت‌هاوضعیت و نکته
D2323VSPI MOSI✅ امن
D2222I2C SCL پیش‌فرض✅ امن
TX01UART0 TX (سریال USB)⛔ سریال مانیتور و آپلود از این‌جاست
RX03UART0 RX (سریال USB)⛔ هنگام بوت HIGH است؛ با آپلود تداخل دارد
D2121I2C SDA پیش‌فرض✅ امن
D1919VSPI MISO✅ امن
D1818VSPI SCK✅ امن
D55VSPI SS (CS)⚠️ strapping؛ هنگام بوت باید HIGH باشد و PWM بیرون می‌دهد
TX217UART2 TX✅ امن (روی ماژول‌های WROVER با PSRAM آزاد نیست)
RX216UART2 RX✅ امن (همان استثنای WROVER)
D44ADC2_CH0، Touch0، RTC✅ امن؛ فقط آنالوگش با وای‌فای کار نمی‌کند
D22ADC2_CH2، Touch2، LED آبی روی برد⚠️ strapping؛ برای آپلود باید LOW یا آزاد باشد
D1515ADC2_CH3، Touch3، HSPI SS⚠️ strapping؛ هنگام بوت PWM بیرون می‌دهد
GND—زمین🔌
3V3—خروجی رگولاتور ۳٫۳ ولت🔌 برای تغذیه‌ی سنسورهای ۳٫۳ ولتی

دو چیز در این جدول نیست و عمداً نیست: GPIO0 که روی برد سی‌پایه فقط به دکمه‌ی BOOT وصل است و پایه‌ی بیرونی ندارد، و GPIO6 تا GPIO11 که به حافظه‌ی فلش وصل‌اند. در نسخه‌ی ۳۸ پایه‌ی DevKit این‌ها هم بیرون آمده‌اند (با برچسب‌هایی مثل CLK، SD0، SD1، CMD) و همین باعث دردسر خیلی‌ها می‌شود؛ پایین‌تر توضیح می‌دهیم چرا.

پایه‌های فقط ورودی: ۳۴، ۳۵، ۳۶ (VP) و ۳۹ (VN)

این چهار پایه در داخل تراشه اصلاً مدار خروجی ندارند. یعنی digitalWrite رویشان هیچ اثری ندارد و LED وصل‌شده به آن‌ها هرگز روشن نمی‌شود. مقاومت پول‌آپ و پول‌داون داخلی هم ندارند، پس INPUT_PULLUP رویشان کار نمی‌کند و اگر دکمه وصل می‌کنی، باید یک مقاومت ۱۰ کیلو اهم بیرونی بگذاری؛ وگرنه پایه «معلق» می‌ماند و عدد تصادفی می‌خواند.

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

Strapping pins: پایه‌های ۰، ۲، ۵، ۱۲ و ۱۵

ESP32 در لحظه‌ی روشن شدن یا ریست، ولتاژ چند پایه را «نگاه می‌کند» تا تصمیم بگیرد چطور بالا بیاید: برنامه‌ی تو را اجرا کند یا منتظر آپلود بماند، حافظه‌ی فلش را با چه ولتاژی راه بیندازد و پیام‌های بوت را چاپ کند یا نه. به این پایه‌ها strapping pins می‌گویند. بعد از بوت، این پایه‌ها مثل بقیه کار می‌کنند؛ مشکل فقط وقتی است که قطعه‌ای که به آن‌ها وصل کرده‌ای، در لحظه‌ی روشن شدن ولتاژ را به سمت اشتباه بکشد.

GPIOحالت لازم هنگام بوتاگر رعایت نشود
0HIGH برای اجرای برنامه، LOW برای حالت آپلودبرد به‌جای اجرای برنامه منتظر آپلود می‌ماند (دکمه‌ی BOOT همین را LOW می‌کند)
2LOW یا آزاد هنگام آپلودآپلود با خطای Failed to connect متوقف می‌شود
5HIGH (پیش‌فرض داخلی)زمان‌بندی داخلی عوض می‌شود؛ به‌علاوه موقع بوت PWM بیرون می‌دهد
12LOWفلش ۱٫۸ ولتی فرض می‌شود و برد مدام ریست می‌شود یا اصلاً بالا نمی‌آید
15HIGH (پیش‌فرض داخلی)LOW بودنش فقط پیام‌های بوت سریال را ساکت می‌کند؛ موقع بوت PWM هم دارد

قانون عملی ساده است: دکمه، سنسوری که خروجی دارد، یا ماژولی که موقع روشن شدن ولتاژ می‌دهد را به 12 وصل نکن. پایه‌های 2، 5 و 15 برای LED و خروجی‌های ساده مشکلی ندارند، ولی رله یا موتور را به آن‌ها نبند؛ چون در همان چند میلی‌ثانیه‌ی بوت ممکن است بی‌دلیل یک لحظه روشن شوند. پایه‌های 14 و 1 و 3 هم چنین رفتاری دارند.

پین‌های فلش ۶ تا ۱۱: اصلاً دست نزن

برنامه‌ای که آپلود می‌کنی روی یک تراشه‌ی حافظه‌ی فلش جدا داخل ماژول فلزی ذخیره می‌شود و ESP32 مدام از طریق GPIO6 تا GPIO11 آن را می‌خواند. اگر به یکی از این پایه‌ها LED یا سیم وصل کنی یا در کد pinMode رویشان بزنی، ارتباط با حافظه قطع می‌شود و برد در لحظه کرش می‌کند و ریست می‌شود. روی برد سی‌پایه خوشبختانه بیرون نیامده‌اند؛ روی برد ۳۸ پایه آن‌ها را نادیده بگیر.

ADC1 و ADC2: چرا وای‌فای آنالوگ را خراب می‌کند؟

ESP32 دو مبدل آنالوگ به دیجیتال دارد. هر دو ۱۲ بیتی هستند، یعنی analogRead عددی بین ۰ تا ۴۰۹۵ برمی‌گرداند (نه ۰ تا ۱۰۲۳ مثل اونو). تفاوت مهم این است که ADC2 با رادیوی وای‌فای مشترک است. به محض این‌که WiFi.begin یا WiFi.softAP را صدا بزنی، ADC2 در اختیار وای‌فای قرار می‌گیرد و analogRead روی پایه‌های آن یا خطا می‌دهد یا عدد بی‌معنی برمی‌گرداند.

واحدپایه‌ها روی برد سی‌پایهبا وای‌فای روشن
ADC132، 33، 34، 35، 36 (VP)، 39 (VN)✅ کار می‌کند
ADC24، 2، 15، 13، 12، 14، 27، 25، 26⛔ کار نمی‌کند

پس در هر پروژه‌ی اینترنت اشیا، سنسورهای آنالوگ را روی ADC1 بگذار. اگر پروژه‌ات وای‌فای ندارد، ADC2 هم کاملاً قابل استفاده است. جزئیات بیشتر، کالیبره کردن و حذف نویز را در آموزش analogRead در ESP32 نوشته‌ایم.

پین‌های لمسی (Touch)

ده پایه‌ی ESP32 می‌توانند لمس انگشت را بدون هیچ قطعه‌ای حس کنند؛ کافی است یک سیم یا تکه فویل به آن‌ها وصل کنی و با touchRead بخوانی. شماره‌ها این‌ها هستند: T0=GPIO4، T2=GPIO2، T3=GPIO15، T4=GPIO13، T5=GPIO12، T6=GPIO14، T7=GPIO27، T8=GPIO33 و T9=GPIO32. T1 روی GPIO0 است که روی برد سی‌پایه بیرون نیامده. بهترین انتخاب‌ها 4، 13، 27، 32 و 33 هستند چون strapping نیستند. ساخت کلید لمسی را در آموزش پین لمسی ESP32 ببین.

DAC: خروجی آنالوگ واقعی روی ۲۵ و ۲۶

PWM فقط وانمود می‌کند ولتاژ وسط دارد؛ در واقع پایه تند تند صفر و ۳٫۳ ولت می‌شود. ولی GPIO25 و GPIO26 یک مبدل دیجیتال به آنالوگ (DAC) هشت‌بیتی دارند که ولتاژ واقعی بین صفر تا حدود ۳٫۳ ولت می‌سازد: dacWrite(25, 128) تقریباً ۱٫۶ ولت ثابت روی پایه می‌گذارد. برای تولید صدای ساده یا ساختن ولتاژ مرجع به کار می‌آید.

PWM و وقفه روی تقریباً همه‌ی پایه‌ها

برخلاف اونو که فقط شش پایه‌ی PWM دارد، در ESP32 هر پایه‌ای که خروجی می‌شود (یعنی همه به‌جز ۳۴ تا ۳۹) می‌تواند با واحد ledc موج PWM بسازد؛ تا ۱۶ کانال مستقل. وقفه (attachInterrupt) هم روی همه‌ی GPIOها کار می‌کند. نحوه‌ی کار با ledc در آموزش PWM روی ESP32 آمده است.

I2C، SPI و UART پیش‌فرض

ESP32 می‌تواند تقریباً هر پروتکلی را روی هر پایه‌ای ببرد، ولی کتابخانه‌ها وقتی پایه‌ای مشخص نکنی، از پایه‌های پیش‌فرض استفاده می‌کنند. اگر از همین‌ها استفاده کنی، کد نمونه‌ها بدون تغییر کار می‌کنند:

رابطسیگنالGPIO پیش‌فرض
I2C (کتابخانه‌ی Wire)SDA / SCL21 / 22
VSPI (SPI پیش‌فرض)MOSI / MISO / SCK / SS23 / 19 / 18 / 5
HSPIMOSI / MISO / SCK / SS13 / 12 / 14 / 15
UART0 (Serial، USB)TX / RX1 / 3
UART2 (Serial2)TX / RX17 / 16

برای عوض کردن پایه‌ها کافی است در شروع، آن‌ها را بدهی: Wire.begin(SDA, SCL) یا Serial2.begin(9600, SERIAL_8N1, RX, TX). در نسخه‌های قدیمی هسته، UART1 پیش‌فرض روی پایه‌های فلش (9 و 10) بود؛ پس اگر از Serial1 استفاده می‌کنی، همیشه پایه‌هایش را خودت تعیین کن.

پایه‌های تغذیه: VIN، 3V3، GND و EN

خلاصه: برای هر کار کدام پایه؟

کارپایه‌ی پیشنهادی
LED و خروجی ساده4، 13، 16، 17، 18، 19، 23، 25، 26، 27، 32، 33
دکمه (با INPUT_PULLUP)4، 13، 16، 17، 18، 19، 23، 27، 32، 33
سنسور آنالوگ (با وای‌فای)34، 35، 36، 39، 32، 33
سروو و PWM13، 18، 19، 23، 25، 26، 27
نمایشگر و ماژول I2C21 (SDA)، 22 (SCL)
ماژول SPI (کارت SD، RFID)23، 19، 18 و 5
رله یا هر چیزی که نباید موقع بوت تکان بخورداز 1، 3، 5، 12، 14 و 15 دوری کن

کد تست: پایه‌های امن را یکی‌یکی امتحان کن

این برنامه یک «پین‌گرد» است: پایه‌های امن خروجی را به نوبت HIGH می‌کند (اگر LED را روی هر کدام بگذاری، در نوبت خودش روشن می‌شود) و هم‌زمان عدد چهار پایه‌ی فقط‌ورودی را در سریال مانیتور چاپ می‌کند. برای پیدا کردن سیم شل یا پایه‌ی اشتباه خیلی به کار می‌آید.

// ESP32 DevKit (30 pins): walk one HIGH through the safe output pins
// and print the four input-only ADC1 pins. Handy for checking wiring.
const int SAFE_OUT[] = {4, 13, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33};
const int OUT_COUNT = 14;
const int INPUT_ONLY[] = {34, 35, 36, 39};   // ADC1, no pull-ups, cannot drive
const int IN_COUNT = 4;

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < OUT_COUNT; i++) {
    pinMode(SAFE_OUT[i], OUTPUT);
    digitalWrite(SAFE_OUT[i], LOW);
  }
  analogReadResolution(12);                  // 0..4095
  Serial.println("ESP32 pin walker ready");
}

void loop() {
  for (int i = 0; i < OUT_COUNT; i++) {
    digitalWrite(SAFE_OUT[i], HIGH);         // an LED on this pin lights now
    Serial.print("GPIO");
    Serial.print(SAFE_OUT[i]);
    Serial.print(" HIGH | ADC1: ");
    for (int j = 0; j < IN_COUNT; j++) {
      Serial.print(INPUT_ONLY[j]);
      Serial.print("=");
      Serial.print(analogRead(INPUT_ONLY[j]));
      Serial.print("  ");
    }
    Serial.println();
    delay(400);
    digitalWrite(SAFE_OUT[i], LOW);
  }
}
💡 یک تمرین: یک LED با مقاومت ۲۲۰ اهم را به GPIO34 وصل کن و عدد 34 را به SAFE_OUT اضافه کن. LED هرگز روشن نمی‌شود؛ حالا با چشم خودت دیدی «فقط ورودی» یعنی چه.

اجرا در شبیه‌ساز

برد ESP32 تینکرکد فارسی همین سی پایه را با همین برچسب‌ها دارد، پس می‌توانی جدول بالا را مستقیم روی آن تمرین کنی: LED، پتانسیومتر و دکمه را بگذار، کد بالا را اجرا کن و ببین کدام پایه چه می‌کند. باز کردن و خواندن مثال‌ها رایگان است و برای اجرای خود برد ESP32 به اشتراک Plus نیاز داری. یک شروع خوب، پروژه‌ی آماده‌ی «سلام ESP32» و درس «سلام ESP32» است. اگر wokwi.com برایت کند است یا باز نمی‌شود، این شبیه‌ساز روی سرور داخل ایران و روی اینترنت ملی هم کار می‌کند. معنی خود کلمه‌ی «پایه» و انواعش را هم در واژه‌نامه: پین ببین.

اشتباه‌های رایج

حالا که نقشه‌ی پایه‌ها را داری، اولین برنامه را بنویس: چشمک‌زن دو LED با ESP32. اگر با رزبری پای پیکو هم کار می‌کنی، پین اوت پیکو را کنار این بگذار تا تفاوت‌ها را ببینی. همه‌ی آموزش‌های این برد در صفحه‌ی ESP32 جمع شده‌اند.

برد ESP32 را در تینکرکد فارسی باز کن 📌

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

کدام پین‌های ESP32 برای شروع از همه امن‌ترند؟

پایه‌های GPIO4، 13، 16، 17، 18، 19، 21، 22، 23، 25، 26، 27، 32 و 33 هیچ نقشی در بوت ندارند و هم ورودی و هم خروجی می‌شوند. برای سنسور آنالوگ هم پایه‌های ADC1 یعنی 32 تا 39 بهترین انتخاب‌اند.

چرا analogRead روی GPIO4 بعد از روشن شدن وای‌فای کار نمی‌کند؟

GPIO4 روی واحد ADC2 است و وقتی وای‌فای روشن است، ADC2 در اختیار رادیوی وای‌فای قرار می‌گیرد. سنسور آنالوگ را به یکی از پایه‌های ADC1 (32، 33، 34، 35، 36 یا 39) ببر.

آیا پایه‌های ESP32 ولتاژ ۵ ولت را تحمل می‌کنند؟

نه. منطق ESP32 سه و سه‌دهم ولت است و ۵ ولت روی یک GPIO می‌تواند تراشه را برای همیشه خراب کند. برای ماژول‌های ۵ ولتی از مقسم مقاومتی یا مبدل سطح منطق استفاده کن.

چرا وقتی چیزی به GPIO12 وصل است برد بوت نمی‌شود؟

GPIO12 یک strapping pin است و اگر هنگام روشن شدن HIGH باشد، تراشه ولتاژ حافظه‌ی فلش را ۱٫۸ ولت فرض می‌کند و بالا نمی‌آید. آن قطعه را به پایه‌ی دیگری ببر یا مطمئن شو موقع روشن شدن LOW است.

درباره‌ی نویسنده:

مربی رباتیک با پانزده سال سابقه در آموزش رباتیک، روبوکاپ و فیراکاپ و بنیان‌گذار آموزشگاه نوین ذهن.

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

🛠️

نصب ESP32 در آردوینو IDE: از آدرس Board Manager تا درایور CP2102 و CH340 و اولین آپلود

🎛️

analogRead در ESP32: خواندن پتانسیومتر با ADC دوازده‌بیتی و تبدیل به ولتاژ

👆

پین لمسی ESP32: ساخت کلید لمسی بدون هیچ قطعه‌ای با touchRead

⏱️

Timer در میکروپایتون: چند کار هم‌زمان روی رزبری پای پیکو بدون sleep

همه‌ی آموزش‌های ESP32 و اینترنت اشیا ← · همه‌ی مقاله‌ها