บทความนี้เป็นการเรียนรู้การใช้งานคลาส Pin ซึ่งเป็นคลาสย่อยในคลาส machine ของ Micropython เพื่อใช้งานกับไมโครคอนโทรลเลอร์ ESP8266 หรือ ESP32 พร้อมทั้งกล่าวถึงหน้าที่ของขาของชิพทั้ง 2 ที่ควรทราบก่อนใช้งาน
machine.Pin
ขาหรือ GPIO ของไมโครคอนโทรลเลอร์มีหน้าที่นำเข้าข้อมูลหรือนำออกข้อมูลเพื่อเชื่อมต่อกับอุปกรณ์หรือวงจรภายนอกตัวชิพซึ่งการเข้าถึงขาเหล่านี้ด้วย Micropython ต้องกระทำผ่านทางคลาส machine.Pin โดยขั้นตอนของการใช้งาน
- นำเข้าคลาส machine
- กำหนดบทบาทหน้าที่ของขา
- ใช้งาน (นำออก/นำเข้า)
การเรียกใช้คลาส Pin สามารถกระทำได้ 2 แบบ คือ เรียกผ่านคลาส machine ด้วย import machine หลังจากนั้นใช้ machine.Pin เป็นตัวเข้าถึงขา หรือระบุเพื่อเรียกใช้ Pin จาก from machine import Pin
คำสั่งสำหรับการกำหนดหน้าที่ของขามีรูปแบบของการใช้งานดังนี้ โดยโหมดทำงานมีค่าเป็น machine.Pin.IN สำหรับนำเข้าข้อมูล และ machine.Pin.OUT สำหรับส่งออกข้อมูล แต่ถ้าต้องการใช้วงจร Pullup หรือวงจรที่เชื่อมต่อมีการใช้ Pullup ให้ระยุ machine.Pin.PULLUP ประกอบในการสร้างวัตถุขาได้ นอกจากนี้ถ้าต้องการกำหนดค่าเริ่มต้นให้กับขาตั้งแต่เริ่มต้นทำงานสามารถกระทำโดยกำหนดโหมดเป็น machine.Pin.OUT และให้ value มีค่าเป็น 0 หรือ 1
วัตถุขา = machine.Pin( หมายเลขgpio, โหมดทำงาน )
วัตถุขา = machine.Pin( หมายเลขgpio, โหมดทำงาน, machine.Pin.PULLUP )
วัตถุขา = machine.Pin( หมายเลขgpio, machine.Pin.OUT, value=ค่าเริ่มต้น )
คำสั่งสำหรับอ่านค่าและกำหนดค่าให้กับขามีรูปแบบของคำสั่งดังนี้ โดยการสั่ง on() มีผลเหมือนกับการสั่ง value(1) และ off() มีผลเช่นเดียวกันกับการสั่งงาน value( 0 )
ตัวแปร = วัตถุขา.value()
วัตถุขา.on()
วัตถุขา.off()
วัตถุขา.value( ค่าของขา )
นอกจากการใช้เป็นส่วนของการนำเข้าและส่งออกข้อมูลแล้ว ผู้เขียนโปรแกรมสามารถใช้ขานำเข้าเป็นขาสำหรับเป็นขาของตัวกระตุ้นการทำงานแบบขัดจังหวะได้เช่นกันดังบทความที่ได้กล่าวถึงไปก่อนหน้านี้
คุณสมบัติของ GPIO
หน้าที่ของขา GPIO ของไมโครคอนโทรลเลอร์ esp8266 และ esp32 ที่ต้องทราบเป็นดังนี้
esp8266
- ขาที่ esp8266 เตรียมไว้ให้ผู้ออกแบบหรือนักพัฒนาใช้งาน คือ 0,1,2,3,4,5, 12, 13, 14, 15 และ 16
- ขา 1 และ 3 ทำหน้าที่ Tx และ Rx เมื่อใช้ในการสื่อสารอนุกรม (UART) บนระบบ REPL
- ขา 16 ใช้สำหรับการ wake up ในการทำงานของโหมดประหยัดพลังงานโดยการเชื่อมต่อกับขา Rst
- ขา A0 ใช้สำหรับทำงาน ADC ขนาด 10 บิต ซึ่งรองรับแรงดัน 0-1VDC
- การสื่อสาร SPI (SPI0) ทำงานได้ด้วยความเร็วในการสื่อสารสูงสุด 80MHz โดยใช้ขาดังนี้
- GPIO12 สำหรับทำหน้าที่ MISO หรือนำเข้าข้อมูล
- GPIO13 สำหรับทำหน้าที่ MOSI หรือนำออกข้อมูล
- GPIO14 สำหรับทำหน้าที่ SCK หรือสร้างสัญญาณนาฬิกา
- การสื่อสารบัส I2C สามารถใช้ได้กับทุกขาเนื่องจากทำงานแบบ Software I2C
การสื่อสารอนุกรมของ esp8266 มีขาใช้งานดังตารางต่อไปนี้
หน้าที่ | UART0 | UART1 |
---|---|---|
Tx | 1 | 2 |
Rx | 3 | 8 |
esp32
- ไมโครคอนโทรลเลอร์ esp32 มีขาให้ใช้งานได้แก่ โดยแต่ละขาขับโหลดได้สูงสุด 40mA
- ขา 0-19
- ขา 21-23
- ขา 25-27
- ขา 32-39 เป็นขาที่รองรับการทำ ADC มีช่วงค่า 0 – 4095 แต่แรงดันต้องอยู่ในช่วง 0-1VDC ปกติบอร์ดจะมีวงจรลดทอนแรงดัน 0-3v3 ให้เหลือ 0-1VDC แต่ควรตรวจสอบให้ดีก่อน
- ขา 1 และ 3 ทำหน้าที่ REPL UART Tx และ Rx ดังนั้น ถ้ามีการเชื่อมต่อสื่อสารอนุกรมไม่ควรใช้ 2 ขานี้เชื่อมต่อกับวงจรภายนอก
- ขา 6, 7, 8, 11, 16 และ 17 ใช้เชื่อมต่อกับวงจรหน่วยความจำแฟลชของไมโครคอนโทรลเลอร์ดังนั้นไม่ควรใช้ขาเหล่านี้กับวงจรภายนอกถ้าชิพที่เลือกใช้มีแฟลชรอมถายนอก โดยเฉพาะชิพ WROOM32 ใช้ขาเชื่อมต่อกับแฟลชดังนี้
- GPIO6 –> SCK/CLK
- GPIO7 –> SDO/SD0
- GPIO8 –> SDI/SD1
- GPIO9 –> SHD/SD2
- GPIO10 –> SWP/SD3
- GPIO11 –> CSC/CMD
- ขาสำหรับ Capacitive Touch Sensors สำหรับใช้เป็นขา Wake Up ได้แก่
- T0 –> GPIO4
- T1 –> GPIO0
- T2 –> GPIO2
- T3 –> GPIO15
- T4 –> GPIO13
- T5 –> GPIO12
- T6 –> GPIO14
- T7 –> GPIO17
- T8 –> GPIO33
- T9 –> GPIO32
- ขา 34-39 เป็นขาสำหรับทำหน้าที่เป็นขานำเข้าเท่านั้น ไม่สามารถทำงานแบบ machine.Pin.OUT ได้
- ขาสำหรับทำหน้าที่ DAC0 และ DAC1 คือ GPIO25 และ GPIO26
- สำหรับบางขาที่ machine.Pin.PULLUP และต้องการใช้งานในช่วงโหมดประหยัดพลังงานหรือ deepsleepให้กำหนดเป็น machine.PULLUP_HOLD
- ขาเหล่านี้ถูกใช้เป็นพิเศษในการบูต ได้แก่ GPIO 0, GPIO 2 และ GPIO 4 โดยเฉพาะ 3 ขาต่อไปนี้จะต้องมีสถานะบังคับเพื่อใช้ในการบูต
- GPIO 1 ต้องเป็น HIGH
- GPIO 3 ต้องเป็น HIGH
- GPIO 5 ต้องเป็น HIGH ระหว่างบูต
- GPIO 6 ถึง GPIO11 เชื่อมต่อกับหน่วยความจำแฟลช ไม่ควรนำไปใช้
- GPIO 12 จะต้องเป็น LOW ระหว่างบูต
- GPIO 14 ต้องเป็น HIGH
- GPIO 15 ต้องมีสถานะของขาเป็น HIGH ระหว่างบูต
- ขาที่ทำหน้าที่ ADC ได้ คือ โดยวงจร ADC ทำงานละเอียด 12 บิต
- ADC1_CH0 –> GPIO 36
- ADC1_CH1 –> GPIO 37
- ADC1_CH2 –> GPIO 38
- ADC1_CH3 –> GPIO 39
- ADC1_CH4 –> GPIO 32
- ADC1_CH5 –> GPIO 33
- ADC1_CH6 –> GPIO 34
- ADC1_CH7 –> GPIO 35
- ADC2_CH0 –> GPIO 4
- ADC2_CH1 –> GPIO 0
- ADC2_CH2 –> GPIO 2
- ADC2_CH3 –> GPIO 15
- ADC2_CH4 –> GPIO 13
- ADC2_CH5 –> GPIO 12
- ADC2_CH6 –> GPIO 14
- ADC2_CH7 –> GPIO 27
- ADC2_CH8 –> GPIO 25
- ADC2_CH9 –> GPIO 26
สำหรับขาที่เชื่อมต่อกับ UART0, UART1 และ UART2 เป็นดังตารางต่อไปนี้ โดย
- UART0 ถูกใช้ในขั้นตอนของการโปรแกรมชิพ และในระหว่างการ reset/boot ระบบ
- UART1 ในบางบอร์ดถูกใช้กับ SPI Flash
- UART2 เป็นพอร์ตที่นักพัฒนาสามารถนำไปใช้งานต่อได้
หน้าที่ | UART0 | UART1 | UART2 |
---|---|---|---|
Tx/ส่งข้อมูล | 1 | 10 | 17 |
Rx/รับข้อมูล | 3 | 9 | 16 |
ขาสำหรับเชื่อมต่อกับการสื่อสาร SPI ในโหมดฮาร์ดแวร์ของไมโครคอนโทรลเลอร์ ESP32 เป็นดังนี้
หน้าที่ | HSPI (id=1) | VSPI (id=2) |
---|---|---|
SCK/สร้างสัญญาณนาฬิกา | 14 | 18 |
MOSI/นำออกข้อมูล | 13 | 23 |
MISO/รับข้อมูล | 12 | 19 |
ขาสำหรับการเชื่อมต่อกับการสื่อสาร I2C ในโหมดฮาร์ดแวร์ได้แก่ ซึ่ง GPIO25 และ GPIO26 สามารถทำ DAC ได้ ดังนั้น ถ้าเลือกใช้การทำงาน DAC จะต้องระวังการใช้งาน I2C ชุดที่ 2 (id=1)
หน้าที่ | I2C (id=0) | I2C (id=1) |
---|---|---|
SCL/สร้างสัญญาณนาฬิกา | 18 | 25 |
SDA/รับหรือส่งข้อมูล | 19 | 26 |
จากบทความนี้จะพบว่า ขาของ esp8266 และ esp32 มีมากพอสำหรับใช้งาน แต่เมื่อพิจารณาให้ละเอียดจะพบว่ามีหลายขาที่ถูกจำกัดหน้าที่เอาไว้ ทำให้เหลือขาสำหรับการเชื่อมต่อกับวงจรที่ออกแบบนั้นเหลือน้อยลงจนบางครั้งทางทีมงานเราจึงเลือกใช้การเชื่อมต่อแบบบัส I2C สำหรับการเชื่อมต่อกับบอร์ด Arduino Uno/Mega2560 หรือ STM32 เพื่อขยายพอร์ต สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- Micropython, “Quick reference for ESP8266”
- Micropython, “Quick reference for ESP32”
- Micropython, “class Pin – control I/O pins”
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-16, 2021-07-17, 2021-07-28, 2021-10-30