ESP32 มีขาต่อใช้งานทั้งหมด 34 ขา แต่ไม่ใช่ว่าทุกขาจะใช้งานได้ทุกฟังก์ชั่น เช่น บางขาเป็นขาที่ใช้อัพโหลดโปรแกรม หากต่อใช้งานอาจทำให้อัพโหลดโปรแกรมไม่เข้า หรือบอร์ดไม่ทำงาน หรือขา ADC แม้จะมีมากถึง 18 ขา แต่มีข้อจำกัดบางประการที่ทำให้ใช้จริงได้ไม่ครบ บทความนี้จึงมาสรุปรวมว่าขาไหนของ ESP32 ที่นำไปต่อใช้งานได้อย่างปลอดภัย พร้อมเทคนิคเล็กน้อย ๆ อย่างการแก้ไขโค้ดโปรแกรมเพื่อย้ายขาต่อใช้งานอินเตอร์เฟสต่าง ๆ อีกด้วย
บทความนี้ใช้บอร์ด IOXESP32+ เป็นบอร์ดอ้างอิงการเรียงตำแหน่งขา และบอกตำแหน่งอ้างอิงขาบนอุปกรณ์จริง หากผู้อ่านใช้บอร์ด ESP32 รุ่นอื่น ๆ มีความจำเป็นต้องดู Pinout diagram ของบอร์ดที่ท่านใช้ด้วยตนเองประกอบบทความด้วย
รูปที่ x แผนภาพรายละเอียดขาต่อใช้งานของ IOXESP32+
สรุปจบใน 1 ตาราง
ตารางที่ x รายละเอียดขาต่อใช้งานของ ESP32
GPIO | Digital Input | Digital Output | Analog Input | PWM | I2C / SPI / UART / CAN / I2S |
IO36 | |||||
IO39 | |||||
IO34 | |||||
IO35 | |||||
IO32 | |||||
IO33 | |||||
IO25 | |||||
IO26 | |||||
IO27 | |||||
IO14 | |||||
IO12 | |||||
IO13 | |||||
IO9 | |||||
IO10 | |||||
IO11 | |||||
IO6 | |||||
IO7 | |||||
IO8 | |||||
IO15 | |||||
IO2 | |||||
IO0 | |||||
IO4 | |||||
IO16 | |||||
IO17 | |||||
IO5 | |||||
IO18 | |||||
IO19 | |||||
IO21 | |||||
RX | |||||
TX | |||||
IO22 | |||||
IO23 |
= ใช้งานได้ = ใช้งานไม่ได้ = ควรอ่านรายละเอียดด้านล่างก่อนใช้งาน
ขาที่เป็นอินพุตอย่างเดียว
ขา GPIO34, GPIO35, GPIO36, GPIO39 เป็นอินพุตอย่างเดียว ไม่มีวงจร Pull-up, Pull-down รองรับคำสั่ง analogRead(), digitalRead() เท่านั้น คำสั่งอื่น เช่น digitalWrite(), PWM ไม่รองรับ
Strapping Pins
Strapping Pins เป็นขาเกี่ยวข้องกับการทำงานของ ESP32 ในระหว่างการบูตโปรแกรม แบ่งเป็นขาที่ใช้งานแล้วอาจทำให้ ESP32 ไม่สามารถทำงานได้ กับขาที่ใช้งานได้ปกติแต่อาจมีสัญญาณรบกวนออกมาระหว่างบูตโปรแกรม
ขาที่ไม่ควรนำมาใช้งานเลย ประกอบด้วยขา GPIO0, GPIO2 ซึ่งเกี่ยวข้องกับการบูตโปรแกรม
ขาที่ใช้งานได้ปกติแต่อาจมีสัญญาณรบกวนออกมาระหว่างบูตโปรแกรม ประกอบด้วยขา GPIO12, GPIO15, GPIO5 ไม่ควรนำไปใช้ต่อกับอุปกรณ์ I2C เพราะอาจทำให้เกิดการทำงานผิดปกติของอุปกรณ์ I2C ได้
ขาที่ต่อชิป Flash และ PSRAM
ขาที่ต่อชิป Flash เป็นขาที่ห้ามนำมาใช้เด็ดขาดเพราะกระทบกับการอ่านโปรแกรมที่เคยอัพโหลดไว้ หรือทำให้อัพโหลดโปรแกรมไม่เข้า ประกอบด้วยขา GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8
ขาที่ต่อชิป PSRAM เป็นขาที่เมื่อนำมาใช้จะไม่สามารถใช้งาน PSRAM ได้ ซึ่ง PSRAM จะมีในบอร์ดที่ระบุอย่างชัดเจนว่ามี PSRAM หากบอร์ดไม่มี PSRAM อยู่แล้วก็ไม่จำเป็นต้องสนใจ แต่หากบอร์ดมี PSRAM ต้องไม่นำขา GPIO16, GPIO17 มาใช้งาน หากนำมาใช้ต้องแน่ใจว่าโปรแกรมที่เขียนไม่เรียกใช้ PSRAM
ขาอัพโหลดโปรแกรม
นอกจากขา Strapping Pins ที่เกี่ยวข้องกับการอัพโหลดโปรแกรมและการบูตโปรแกรม ยังมีขา RX, TX ที่ใช้ในการอัพโหลดโปรแกรม หากนำขาดังกล่าวไปใช้ จะทำให้อัพโหลดโปรแกรมไม่ได้ (แต่โปรแกรมที่เคยอัพโหลดไว้ยังทำงานได้ปกติ)
ขา Digital Input
ขาที่ใช้อ่านค่าดิจิทัลได้ (ใช้คำสั่ง digitalRead() ได้) คือทุกขาที่ ไม่ใช่ Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX ใช้ไม่ได้ ที่เหลือใช้ได้หมด
อ่านรายละเอียดการอ่านค่าแอนะล็อกบน ESP32 ได้ที่บทความ ESP32 เบื้องต้น :: บทที่ 6 การควบคุมอินพุตเอาต์พุตพื้นฐาน
ขา Digital Output
ขาที่เขียนค่าดิจิทัลได้ (ใช้คำสั่ง digitalWrite() ได้) คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
อ่านรายละเอียดการอ่านค่า/เขียนค่าดิจิทัลบน ESP32 ได้ที่บทความ ESP32 เบื้องต้น :: บทที่ 6 การควบคุมอินพุตเอาต์พุตพื้นฐาน
ขา Analog Input
ขาที่อ่านค่าแอนะล็อกได้ (ใช้คำสั่ง analogRead() ได้) อ่านค่าได้ 0 ถึง 3.3V แบ่งขาออกเป็น 2 ชุด คือ ADC1 และ ADC2 โดย ADC1 สามารถใช้งานได้เลย ไม่มีเงื่อนไขอะไร ส่วน ADC2 จะใช้งานได้เมื่อปิดใช้ WiFi เท่านั้น
ADC1 ใช้งานได้เลย ประกอบด้วยขา GPIO36, GPIO39, GPIO34, GPIO35, GPIO32, GPIO33
ADC2 ต้องปิด WiFi จึงจะใช้งานได้ ประกอบด้วยขา GPIO25, GPIO26, GPIO27, GPIO14, GPIO12, GPIO13, GPIO15, GPIO4
อ่านรายละเอียดการอ่านค่าแอนะล็อกบน ESP32 ได้ที่บทความ ESP32 เบื้องต้น :: บทที่ 6 การควบคุมอินพุตเอาต์พุตพื้นฐาน
ขา PWM
ขาที่ใช้ PWM ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
ขา I2C
I2C แบ่งเป็น 2 ชุด คือ I2C0 และ I2C1 โดยปกติใช้เฉพาะ I2C0 ซึ่ง I2C0 ค่าเริ่มต้นกำหนดให้อยู่ที่ขา SDA = GPIO21, SCL = GPIO22 สามารถเปลี่ยนเป็นขาอื่นได้โดยกำหนดในคำสั่ง Wire.begin() ตัวอย่างการย้ายขา SCL ไปที่ GPIO4 และ SDA ไป GPIO5 มีดังนี้
Wire.begin(5, 4); // SCL, SDA
ขา SCL, SDA ที่ย้ายไปใช้ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
อ่านรายละเอียดการใช้ I2C บน ESP32 ได้ที่บทความ ESP32 เบื้องต้น :: บทที่ 7 การสื่อสารแบบอนุกรม
ขา SPI
SPI แบ่งเป็น 2 ชุด คือ HSPI และ VSPI โดยปกติใช้เฉพาะ VSPI ซึ่ง VSPI ค่าเริ่มต้นกำหนดให้อยู่ที่ขา CS = GPIO5, SCK = GPIO18, MISO = GPIO19, MOSI = GPIO23 สามารถเปลี่ยนเป็นขาอื่นได้โดยกำหนดในคำสั่ง SPI.begin() ตัวอย่างการย้ายขา VSPI ไปที่ SCK = GPIO25, MISO = GPIO26, MOSI = GPIO27 และ CS = GPIO15 มีดังนี้
SPI.begin(25, 26, 27, 15); // SCK, MISO, MOSI, CS
ขา SCK, MISO, MOSI, CS ที่ย้ายไปใช้ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
ขา UART
UART แบ่งเป็น 3 ชุด คือ Serial0, Serial1 และ Serial2 โดย Serial0 ใช้อัพโหลดโปรแกรมและสื่อสารกับคอมพิวเตอร์ อยู่ที่ขา TX, RX ไม่ควรนำมาใช้ต่ออุปกรณ์อื่น ส่วน Serial1 และ Serial2 ใช้งานได้อิสระ
Serial1 ค่าเริ่มต้นกำหนดให้อยู่ที่ขา RX = GPIO26, TX = GPIO27 เปลี่ยนขาได้โดยใช้คำสั่ง Serial1.setPins()
Serial2 ค่าเริ่มต้นกำหนดให้อยู่ที่ขา RX = GPIO4, TX = GPIO25 เปลี่ยนขาได้โดยใช้คำสั่ง Serial2.setPins()
ขา TX, RX ที่ย้ายไปใช้ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
อ่านรายละเอียดขา UART ได้ที่บทความ ESP32 กับการใช้ Serial1 Serial2 และการย้ายขา และ ESP32 เบื้องต้น :: บทที่ 7 การสื่อสารแบบอนุกรม
ขา CAN
CAN bus ขา TX, RX ไม่ได้ต่อกับขาใด ๆ เป็นค่าเริ่มต้น ก่อนเริ่มใช้งาน CAN bus ต้องกำหนดขา TX, RX ลงในโค้ดโปรแกรมก่อน โดยขา TX, RX ที่ใช้ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
อ่านรายละเอียดการใช้ CAN bus บน ESP32 ได้ที่บทความ CAN bus ตอนที่ 2 เรียนรู้ CAN ผ่าน ESP32
ขา I2S
I2S แบ่งเป็น 2 ชุด คือ I2S0 และ I2S1 โดยขา DIN, DOUT, BCLK, WS ไม่ได้ต่อกับขาใด ๆ เป็นค่าเริ่มต้น ก่อนเริ่มใช้งาน I2S ต้องกำหนดขาทั้งหมดลงในโค้ดโปรแกรมก่อน โดยขาที่ใช้ได้ คือทุกขาที่ ไม่ใช่ ขาที่เป็นอินพุตอย่างเดียว, Strapping Pins, ขาที่ต่อชิป Flash และ PSRAM, ขาอัพโหลดโปรแกรม โดยสรุปคือขา GPIO0, GPIO2, GPIO9, GPIO10, GPIO11, GPIO6, GPIO7, GPIO8, RX, TX, GPIO34, GPIO35, GPIO36, GPIO39 ใช้ไม่ได้ ที่เหลือใช้ได้หมด
ข้อมูลเพิ่มเติม
บทความนี้สรุปข้อมูลจาก ESP32 Datasheet มาย่อยให้เข้าใจง่ายมากขึ้น โดยอาจมีข้อมูลบางส่วนที่ถูกตัดทอนออก หากต้องการข้อมูลครบถ้วน (แต่เข้าใจยาก) สามารถอ่านได้จาก Datasheet