📌 پین اوت 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 همین است |
| VP | 36 | ADC1_CH0، RTC | ⚠️ فقط ورودی، بدون پولآپ داخلی؛ عالی برای سنسور آنالوگ |
| VN | 39 | ADC1_CH3، RTC | ⚠️ فقط ورودی، بدون پولآپ داخلی |
| D34 | 34 | ADC1_CH6، RTC | ⚠️ فقط ورودی؛ محبوبترین پایه برای پتانسیومتر |
| D35 | 35 | ADC1_CH7، RTC | ⚠️ فقط ورودی |
| D32 | 32 | ADC1_CH4، Touch9، RTC | ✅ ورودی و خروجی، آنالوگ حتی با وایفای |
| D33 | 33 | ADC1_CH5، Touch8، RTC | ✅ ورودی و خروجی، آنالوگ حتی با وایفای |
| D25 | 25 | ADC2_CH8، DAC1، RTC | ✅ خروجی آنالوگ واقعی با dacWrite |
| D26 | 26 | ADC2_CH9، DAC2، RTC | ✅ خروجی آنالوگ واقعی |
| D27 | 27 | ADC2_CH7، Touch7، RTC | ✅ امن |
| D14 | 14 | ADC2_CH6، Touch6، HSPI SCK | ⚠️ هنگام بوت چند پالس PWM بیرون میدهد |
| D12 | 12 | ADC2_CH5، Touch5، HSPI MISO | ⚠️ strapping؛ هنگام بوت باید LOW باشد |
| D13 | 13 | ADC2_CH4، Touch4، HSPI MOSI | ✅ امن |
| GND | — | زمین | 🔌 |
| VIN | — | ۵ ولت USB | 🔌 ورودی ۵ ولت (یا خروجی ۵ ولت وقتی با USB روشن است) |
ستون راست (از بالا به پایین)
| برچسب | GPIO | قابلیتها | وضعیت و نکته |
|---|---|---|---|
| D23 | 23 | VSPI MOSI | ✅ امن |
| D22 | 22 | I2C SCL پیشفرض | ✅ امن |
| TX0 | 1 | UART0 TX (سریال USB) | ⛔ سریال مانیتور و آپلود از اینجاست |
| RX0 | 3 | UART0 RX (سریال USB) | ⛔ هنگام بوت HIGH است؛ با آپلود تداخل دارد |
| D21 | 21 | I2C SDA پیشفرض | ✅ امن |
| D19 | 19 | VSPI MISO | ✅ امن |
| D18 | 18 | VSPI SCK | ✅ امن |
| D5 | 5 | VSPI SS (CS) | ⚠️ strapping؛ هنگام بوت باید HIGH باشد و PWM بیرون میدهد |
| TX2 | 17 | UART2 TX | ✅ امن (روی ماژولهای WROVER با PSRAM آزاد نیست) |
| RX2 | 16 | UART2 RX | ✅ امن (همان استثنای WROVER) |
| D4 | 4 | ADC2_CH0، Touch0، RTC | ✅ امن؛ فقط آنالوگش با وایفای کار نمیکند |
| D2 | 2 | ADC2_CH2، Touch2، LED آبی روی برد | ⚠️ strapping؛ برای آپلود باید LOW یا آزاد باشد |
| D15 | 15 | ADC2_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 | حالت لازم هنگام بوت | اگر رعایت نشود |
|---|---|---|
| 0 | HIGH برای اجرای برنامه، LOW برای حالت آپلود | برد بهجای اجرای برنامه منتظر آپلود میماند (دکمهی BOOT همین را LOW میکند) |
| 2 | LOW یا آزاد هنگام آپلود | آپلود با خطای Failed to connect متوقف میشود |
| 5 | HIGH (پیشفرض داخلی) | زمانبندی داخلی عوض میشود؛ بهعلاوه موقع بوت PWM بیرون میدهد |
| 12 | LOW | فلش ۱٫۸ ولتی فرض میشود و برد مدام ریست میشود یا اصلاً بالا نمیآید |
| 15 | HIGH (پیشفرض داخلی) | 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 روی پایههای آن یا خطا میدهد یا عدد بیمعنی برمیگرداند.
| واحد | پایهها روی برد سیپایه | با وایفای روشن |
|---|---|---|
| ADC1 | 32، 33، 34، 35، 36 (VP)، 39 (VN) | ✅ کار میکند |
| ADC2 | 4، 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 / SCL | 21 / 22 |
| VSPI (SPI پیشفرض) | MOSI / MISO / SCK / SS | 23 / 19 / 18 / 5 |
| HSPI | MOSI / MISO / SCK / SS | 13 / 12 / 14 / 15 |
| UART0 (Serial، USB) | TX / RX | 1 / 3 |
| UART2 (Serial2) | TX / RX | 17 / 16 |
برای عوض کردن پایهها کافی است در شروع، آنها را بدهی: Wire.begin(SDA, SCL) یا Serial2.begin(9600, SERIAL_8N1, RX, TX). در نسخههای قدیمی هسته، UART1 پیشفرض روی پایههای فلش (9 و 10) بود؛ پس اگر از Serial1 استفاده میکنی، همیشه پایههایش را خودت تعیین کن.
پایههای تغذیه: VIN، 3V3، GND و EN
- VIN: وقتی برد با USB روشن است، تقریباً ۵ ولت USB روی این پایه است و میشود یک سروو کوچک یا ماژول ۵ ولتی را از آن تغذیه کرد. اگر USB وصل نیست، میتوانی برد را با دادن ۵ ولت به همین پایه روشن کنی.
- 3V3: خروجی رگولاتور داخلی. برای سنسورهای ۳٫۳ ولتی عالی است، ولی خود ESP32 موقع ارسال وایفای جریان زیادی میکشد، پس بارهای سنگین را از آن نگیر.
- GND: دو پایهی زمین که داخل برد به هم وصلاند. زمین هر منبع تغذیهی بیرونی باید به همین وصل شود.
- EN: پایهی فعالسازی. LOW کردنش برد را ریست میکند؛ دکمهی 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 |
| سروو و PWM | 13، 18، 19، 23، 25، 26، 27 |
| نمایشگر و ماژول I2C | 21 (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);
}
}
SAFE_OUTفهرست پایههایی است که نه strapping هستند، نه سریال USB و نه فقطورودی. هر پایهای که در این فهرست است را میتوانی بیدغدغه خروجی کنی.analogReadResolution(12)دقت ADC را ۱۲ بیت نگه میدارد؛ این حالت پیشفرض ESP32 است و فقط برای روشن بودن موضوع نوشته شده.- اگر به پایهای از
INPUT_ONLYهیچ چیزی وصل نباشد، عددش بیدلیل بالا و پایین میرود. این همان پایهی «معلق» است و نشان میدهد چرا دکمه روی این پایهها مقاومت بیرونی میخواهد.
اجرا در شبیهساز
برد ESP32 تینکرکد فارسی همین سی پایه را با همین برچسبها دارد، پس میتوانی جدول بالا را مستقیم روی آن تمرین کنی: LED، پتانسیومتر و دکمه را بگذار، کد بالا را اجرا کن و ببین کدام پایه چه میکند. باز کردن و خواندن مثالها رایگان است و برای اجرای خود برد ESP32 به اشتراک Plus نیاز داری. یک شروع خوب، پروژهی آمادهی «سلام ESP32» و درس «سلام ESP32» است. اگر wokwi.com برایت کند است یا باز نمیشود، این شبیهساز روی سرور داخل ایران و روی اینترنت ملی هم کار میکند. معنی خود کلمهی «پایه» و انواعش را هم در واژهنامه: پین ببین.
اشتباههای رایج
- LED روی GPIO34 یا 35 روشن نمیشود: این پایهها فقط ورودیاند. LED را به یکی از پایههای ✅ ببر.
- دکمه روی GPIO35 خودبهخود فشرده و رها میشود:
INPUT_PULLUPاینجا کار نمیکند. مقاومت ۱۰ کیلو بیرونی بگذار یا دکمه را به پایهی دیگری ببر. - برد بعد از وصل کردن ماژول بالا نمیآید یا مدام ریست میشود: احتمالاً چیزی روی GPIO12 هنگام بوت HIGH است. آن را جابهجا کن.
- آپلود با «Failed to connect» شکست میخورد: اگر چیزی به GPIO2 یا GPIO0 وصل است، جدا کن و دوباره امتحان کن؛ راهحلهای بیشتر در رفع خطای آپلود ESP32 هست.
- سنسور آنالوگ بعد از وایفای عدد ۴۰۹۵ یا صفر میدهد: روی ADC2 است. به ADC1 منتقلش کن.
- سنسور ۵ ولتی را مستقیم به ESP32 بستهای: خروجی آن را با مقسم مقاومتی پایین بیاور؛ ماشینحساب مقسم ولتاژ مقدار مقاومتها را میدهد.
- Serial2 یا ماژول سریال کار نمیکند: روی ماژولهای WROVER پایههای 16 و 17 برای PSRAM گرفته شدهاند؛ پایههای دیگری انتخاب کن.
حالا که نقشهی پایهها را داری، اولین برنامه را بنویس: چشمکزن دو 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 است.