บทที่ 5
GPIO ของไมโครคอนโทรลเลอร์ ESP32
GPIO (General Purpose Input/Output) บน ESP32 คือชุดของพินที่สามารถตั้งค่าให้เป็นได้ทั้ง Input (สำหรับรับค่าจากอุปกรณ์ เช่น เซ็นเซอร์หรือปุ่มกด) หรือ Output (สำหรับควบคุมอุปกรณ์ เช่น LED หรือรีเลย์) โดย ESP32 มี GPIO ที่รองรับการทำงานได้หลากหลาย
แต่ละขาสามารถกำหนดให้เป็นน Input หรือ Output ได้ด้วยการกำหนดในโปรแกรมใน Arduino IDE
แผนภาพขาของ ESP32 บนบอร์ด ESP32 DevKIT V1 ดังในรูป
การใช้งานขา GPIO แต่ละตำแหน่ง
แต่ละขา GPIO ของ ESP32 จะมีเลขหมายกำกับ เช่น GPIO14 ทำหน้าที่ได้ทั้งเป็น Input และ Output และยังมีหน้าที่พิเศษ คือ เป็นขาสำหรับการขับเอาท์พุตแบบ PWM ได่อีกด้วย โดยแต่ละขาจะมีหน้าที่การทำงานดังแสดงในตาราง
สำหรับบางขา GPIO ไม่สามารถเป็นเอาท์พุตได้ แต่เป็นไดเฉพาะอินพุตเท่านั้น คือขา GPIO34 ถึง GPIO39 (GPIO34,GPIO35,GPIO36,GPIO39) ซึ่งผู้ใช้ไม่ควรนำไปใช้สำหรับทำหน้าที่เป็นเอาท์พุต
บอร์ดพัฒนา ESP32 บางรุ่นมีการเปิดให้ใช้งานขา GPIO 6 ถึง GPIO 11 อย่างไรก็ตาม ขาเหล่านี้เชื่อมต่ออยู่กับหน่วยความจำ SPI flash ภายในชิป ESP-WROOM-32 จึงไม่แนะนำให้นำไปใช้งานอื่น ดังนั้น ไม่ควรนำขาเหล่านี้ไปใช้
Capacitive touch GPIOs
ESP32 มีเซ็นเซอร์ตรวจจับการสัมผัสแบบคาปาซิทีฟ (capacitive touch sensors) ภายในตัวชิปจำนวน 10 ชุด (T0-T9) เซ็นเซอร์เหล่านี้สามารถตรวจจับการเปลี่ยนแปลงของวัตถุที่เก็บประจุไฟฟ้าได้ เช่น ผิวหนังของมนุษย์ จึงสามารถตรวจจับสัญญาณที่เกิดขึ้นเมื่อใช้นิ้วสัมผัสที่ขา GPIO ได้ ขาเหล่านี้สามารถนำไปประยุกต์ใช้เป็นแผ่นสัมผัส (capacitive pads) เพื่อทดแทนปุ่มกดแบบกลไกทั่วไปได้อย่างง่ายดาย นอกจากนี้ ขาเซ็นเซอร์ดังกล่าวยังสามารถใช้เพื่อปลุก ESP32 ให้ตื่นจากการทำงานในโหมด Deep Sleep ได้อีกด้วย
โดยขาที่ทำหน้าที่เป็นแตะสำผัสแบบคาปาซิทีฟ ดังแสดงในรูป
Learn how to use the touch pins with Arduino IDE: ESP32 Touch Pins with Arduino IDE
การแปลงสัญญาณอนาล๊อกเป็นข้อมูลดิจิทัล
Analog to Digital Converter (ADC) เป็นขาสำหรับการแปลงสัญญาณแบบอนาล๊อก ให้เป็นข้อมูล หรือตัวเลขดิจิทัลเพื่อนำไปใช้ในการคำนวณภายในโปรแกรม โดย
ESP32 มีช่องสัญญาณอินพุต ADC ความละเอียด 12 บิต จำนวน 18 ช่อง (ในขณะที่ ESP8266 มี ADC ความละเอียด 10 บิต เพียงช่องเดียว) โดยขา GPIO ที่สามารถใช้งานเป็น ADC ได้และหมายเลขช่องสัญญาณ มีดังนี้
ช่องสัญญาณอินพุต ADC มีความละเอียดระดับ 12 บิต ซึ่งหมายความว่า สามารถอ่านค่าสัญญาณแอนะล็อกได้ในช่วง 0 ถึง 4095 โดยที่ค่า 0 เทียบเท่ากับ 0V และค่า 4095 เทียบเท่ากับ 3.3V (แรงดันอ้างอิง หรือไฟเลี้ยง) นอกจากนี้ ยังสามารถกำหนดค่าความละเอียดและช่วงการทำงานของ ADC ของช่องสัญญาณต่างๆ ได้ผ่านทางการเขียนโปรแกรม
Note
ช่อง ADC2 ไม่สามารถนำมาใช้งานได้ในขณะที่เปิดใช้งาน Wi-Fi ดังนั้น หากใช้งาน Wi-Fi ควรใช้ช่อง ADC อื่นแทน
การแปลงดิจิทัลเป็นสัญญาณอนาล๊อก
Digital to Analog Converter (DAC) สำหรับการแปลงข้อมูลดิจิทัลจากตัวแปรของโปรแกรมให้เป็นขนาดแรงดันไฟฟ้าแบบอนาล๊อก เช่นการสร้างสัญญาณไซน์เวฟ หรือสัญญาณเสียง เป็นต้น โดย
ESP32 มีช่องสัญญาณ DAC ขนาด 8 บิต จำนวน 2 ช่อง สำหรับแปลงสัญญาณดิจิทัลให้เป็นสัญญาณแรงดันไฟฟ้าแบบแอนาล็อก
RTC GPIO
RTC GPIO (Real-Time Clock General Purpose Input/Output) คือ ขาของไมโครคอนโทรลเลอร์ (เช่น ESP32) ที่เชื่อมต่อกับระบบย่อยพลังงานต่ำ สามารถทำงานได้แม้ในขณะที่ระบบหลักเข้าสู่โหมดประหยัดพลังงานขั้นสูง (Deep Sleep) เพื่อใช้ปลุก (Wake up) ให้ไมโครคอนโทรลเลอร์กลับมาทำงานปกติ โดย
- ปลุกอุปกรณ์จากโหมด Deep Sleep: ขา RTC GPIO ทำหน้าที่เป็นพิน Wake-up ที่รอรับสัญญาณอินพุต (เช่น การกดสวิตช์) เพื่อปลุกบอร์ดให้ตื่นจากการหลับลึก
- ทำงานขณะพัก (ULP Co-processor): รองรับการทำงานร่วมกับโปรเซสเซอร์พลังงานต่ำ (Ultra-Low Power co-processor) เพื่ออ่านค่าเซ็นเซอร์หรือประมวลผลเบื้องต้นในขณะที่ CPU หลักปิดการทำงาน
ตัวอย่างการใช้งาน
- อุปกรณ์ IoT ที่ใช้แบตเตอรี่: เช่น สมาร์ทโฮมหรือเซ็นเซอร์วัดอุณหภูมิที่ต้องประหยัดพลังงาน โดยจะหลับ (Deep Sleep) และตื่นขึ้นมาส่งข้อมูลเป็นระยะเมื่อถูกกระตุ้นผ่านขา RTC GPIO
- สวิตช์เปิด-ปิดการทำงาน: ใช้ปุ่มกดต่อเข้ากับขา RTC GPIO เพื่อปลุกให้ไมโครคอนโทรลเลอร์ทำงานเมื่อผู้ใช้งานต้องการ
ESP32 รองรับการใช้งาน RTC GPIO โดยขา GPIO ที่เชื่อมต่อกับระบบย่อย RTC แบบใช้พลังงานต่ำ (low-power subsystem) สามารถใช้งานได้ในขณะที่ ESP32 อยู่ในโหมด Deep Sleep ขา RTC GPIO เหล่านี้สามารถใช้เพื่อปลุก ESP32 ให้ตื่นจากโหมด Deep Sleep ได้ในขณะที่หน่วยประมวลผลร่วม Ultra Low Power (ULP) กำลังทำงานอยู่ ทั้งนี้ ขา GPIO ที่สามารถเป็นแหล่งสัญญาณภายนอกสำหรับปลุกระบบได้มีดังนี้
Learn how to use the RTC GPIOs to wake up the ESP32 from deep sleep
PWM
PWM ย่อมาจาก Pulse Width Modulation คือ เทคนิคการควบคุมกำลังไฟฟ้าหรือส่งสัญญาณข้อมูลแบบดิจิทัล โดยการเปิด-ปิดสัญญาณ (HIGH/LOW) สลับกันอย่างรวดเร็ว เพื่อจำลองการจ่ายแรงดันไฟแบบอนาล็อก
ESP32 มีช่องสัญญาณอิสระ 16 ช่อง ซึ่งสามารถกำหนดค่าเพื่อสร้างสัญญาณ PWM ที่มีคุณสมบัติแตกต่างกันได้ โดยขาทั้งหมดที่สามารถทำหน้าที่เป็นเอาต์พุตสามารถนำมาใช้เป็นขา PWM ได้ (ยกเว้น GPIO 34 ถึง 39 ที่ไม่สามารถสร้างสัญญาณ PWM ได้)
Learn how to use ESP32 PWM with Arduino IDE
I2C
I2C (อ่านว่า ไอ-สแควร์-ซี หรือ ไอ-ทู-ซี) ย่อมาจาก Inter-Integrated Circuit คือโปรโตคอลการสื่อสารแบบอนุกรม (Serial Communication) ที่พัฒนาโดยบริษัท Philips (ปัจจุบันคือ NXP Semiconductors) โดยนิยมใช้เชื่อมต่อไมโครคอนโทรลเลอร์กับอุปกรณ์อิเล็กทรอนิกส์อื่นๆ (เช่น เซ็นเซอร์, จอแสดงผล) ภายในบอร์ดเดียวกัน
ใช้สายสัญญาณเพียง 2 เส้น: ประกอบด้วยสาย SDA (Data - ส่งข้อมูล) และ SCL (Clock - สัญญาณนาฬิกา)
เชื่อมต่ออุปกรณ์ได้หลายตัว: สามารถต่ออุปกรณ์หลายชิ้นเข้ากับบัส (Bus) เส้นเดียวกันได้ โดยการกำหนด Address (ที่อยู่) เฉพาะของอุปกรณ์แต่ละตัว
การควบคุมแบบ Master/Slave: อุปกรณ์ตัวหลัก (Master เช่น บอร์ด Arduino) จะเป็นผู้สั่งการและปล่อยสัญญาณนาฬิกา ส่วนอุปกรณ์ตัวรอง (Slave) จะคอยรับคำสั่งและตอบกลับ
ESP32 มีช่องสัญญาณ I2C สองช่อง และสามารถตั้งค่าขาใดก็ได้เป็น SDA หรือ SCL ขาของ ESP32 ที่ใช้สำหรับ I2C คือ
UART
คุณสมบัติหลักและการทำงานของ UART
-ไม่มีสัญญาณนาฬิกา (Asynchronous): ฝั่งรับและฝั่งส่งไม่ต้องมีสายสัญญาณนาฬิกา (Clock) ร่วมกันเพื่อกำหนดจังหวะ แต่จะอาศัยการตั้งค่าความเร็วในการรับส่งข้อมูลให้เท่ากันล่วงหน้า ซึ่งเรียกว่า Baud rate (เช่น 9600, 115200 bps)
- แปลงข้อมูล ขนาน ↔ อนุกรม: ภายในตัวคอนโทรลเลอร์ (CPU) ข้อมูลจะถูกประมวลผลพร้อมกันแบบขนาน (Parallel) แต่เมื่อส่งผ่าน UART วงจรจะทำหน้าที่แปลงข้อมูลให้ไหลออกไปทีละบิตเรียงกันเป็นเส้นตรง (Serial) และฝั่งรับก็จะแปลงจากอนุกรมกลับมาเป็นขนานเพื่อให้วงจรปลายทางใช้งาน
- ใช้สายสัญญาณน้อย: การสื่อสารพื้นฐานใช้สายเพียง 2 เส้นหลัก คือ ขารับข้อมูล (RX) และขาส่งข้อมูล (TX) โดยต้องต่อไขว้กันระหว่างอุปกรณ์ (TX ของตัวแรก ต่อเข้า RX ของตัวที่สอง)
- สื่อสารได้สองทางพร้อมกัน (Full-Duplex): อุปกรณ์ทั้งสองฝั่งสามารถรับและส่งข้อมูลได้ในเวลาเดียวกัน
ESP32 รองรับอินเทอร์เฟซ UART สูงสุด 3 ชุด ได้แก่ UART0, UART1 และ UART2 ทั้งนี้ขึ้นอยู่กับรุ่นของบอร์ด ESP32 ที่ใช้งาน
โดยปกติแล้ว UART0 จะถูกสงวนไว้สำหรับการสื่อสารกับ Serial Monitor ในระหว่างการอัปโหลดและการดีบักโค้ด อย่างไรก็ตาม สามารถนำไปใช้สื่อสารกับอุปกรณ์อื่น ๆ ได้หลังจากอัปโหลดโค้ดเสร็จสิ้น หากไม่จำเป็นต้องใช้งาน Serial Monitor
UART1 และ UART2: สามารถใช้สื่อสารกับอุปกรณ์ภายนอกได้
ขา UART เหล่านี้สามารถกำหนดให้ใช้ขา GPIO ใดก็ได้บน ESP32 ทำหน้าที่เป็น UART แต่อย่างไรก็ตาม บอร์ดส่วนใหญ่จะมีการกำหนดขาเริ่มต้นไว้ให้แล้ว สำหรับบอร์ด ESP32 ส่วนใหญ่ การกำหนดขา UART เป็นดังนี้
GPIO of ESP32 by randomnerdtutorials