[TH] machine.Pin

บทความนี้เป็นการเรียนรู้การใช้งานคลาส Pin ซึ่งเป็นคลาสย่อยในคลาส machine ของ Micropython เพื่อใช้งานกับไมโครคอนโทรลเลอร์ ESP8266 หรือ ESP32 พร้อมทั้งกล่าวถึงหน้าที่ของขาของชิพทั้ง 2 ที่ควรทราบก่อนใช้งาน

machine.Pin

ขาหรือ GPIO ของไมโครคอนโทรลเลอร์มีหน้าที่นำเข้าข้อมูลหรือนำออกข้อมูลเพื่อเชื่อมต่อกับอุปกรณ์หรือวงจรภายนอกตัวชิพซึ่งการเข้าถึงขาเหล่านี้ด้วย Micropython ต้องกระทำผ่านทางคลาส machine.Pin โดยขั้นตอนของการใช้งาน

  1. นำเข้าคลาส machine
  2. กำหนดบทบาทหน้าที่ของขา
  3. ใช้งาน (นำออก/นำเข้า)

การเรียกใช้คลาส 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

  1. ขาที่ esp8266 เตรียมไว้ให้ผู้ออกแบบหรือนักพัฒนาใช้งาน คือ 0,1,2,3,4,5, 12, 13, 14, 15 และ 16
  2. ขา 1 และ 3 ทำหน้าที่ Tx และ Rx เมื่อใช้ในการสื่อสารอนุกรม (UART) บนระบบ REPL
  3. ขา 16 ใช้สำหรับการ wake up ในการทำงานของโหมดประหยัดพลังงานโดยการเชื่อมต่อกับขา Rst
  4. ขา A0 ใช้สำหรับทำงาน ADC ขนาด 10 บิต ซึ่งรองรับแรงดัน 0-1VDC
  5. การสื่อสาร SPI (SPI0) ทำงานได้ด้วยความเร็วในการสื่อสารสูงสุด 80MHz โดยใช้ขาดังนี้
    1. GPIO12 สำหรับทำหน้าที่ MISO หรือนำเข้าข้อมูล
    2. GPIO13 สำหรับทำหน้าที่ MOSI หรือนำออกข้อมูล
    3. GPIO14 สำหรับทำหน้าที่ SCK หรือสร้างสัญญาณนาฬิกา
  6. การสื่อสารบัส I2C สามารถใช้ได้กับทุกขาเนื่องจากทำงานแบบ Software I2C

การสื่อสารอนุกรมของ esp8266 มีขาใช้งานดังตารางต่อไปนี้

หน้าที่UART0UART1
Tx12
Rx38

esp32

  1. ไมโครคอนโทรลเลอร์ esp32 มีขาให้ใช้งานได้แก่ โดยแต่ละขาขับโหลดได้สูงสุด 40mA
    1. ขา 0-19
    2. ขา 21-23
    3. ขา 25-27
    4. ขา 32-39 เป็นขาที่รองรับการทำ ADC มีช่วงค่า 0 – 4095 แต่แรงดันต้องอยู่ในช่วง 0-1VDC ปกติบอร์ดจะมีวงจรลดทอนแรงดัน 0-3v3 ให้เหลือ 0-1VDC แต่ควรตรวจสอบให้ดีก่อน
  2. ขา 1 และ 3 ทำหน้าที่ REPL UART Tx และ Rx ดังนั้น ถ้ามีการเชื่อมต่อสื่อสารอนุกรมไม่ควรใช้ 2 ขานี้เชื่อมต่อกับวงจรภายนอก
  3. ขา 6, 7, 8, 11, 16 และ 17 ใช้เชื่อมต่อกับวงจรหน่วยความจำแฟลชของไมโครคอนโทรลเลอร์ดังนั้นไม่ควรใช้ขาเหล่านี้กับวงจรภายนอกถ้าชิพที่เลือกใช้มีแฟลชรอมถายนอก โดยเฉพาะชิพ WROOM32 ใช้ขาเชื่อมต่อกับแฟลชดังนี้
    1. GPIO6 –> SCK/CLK
    2. GPIO7 –> SDO/SD0
    3. GPIO8 –> SDI/SD1
    4. GPIO9 –> SHD/SD2
    5. GPIO10 –> SWP/SD3
    6. GPIO11 –> CSC/CMD
  4. ขาสำหรับ Capacitive Touch Sensors สำหรับใช้เป็นขา Wake Up ได้แก่
    1. T0 –> GPIO4
    2. T1 –> GPIO0
    3. T2 –> GPIO2
    4. T3 –> GPIO15
    5. T4 –> GPIO13
    6. T5 –> GPIO12
    7. T6 –> GPIO14
    8. T7 –> GPIO17
    9. T8 –> GPIO33
    10. T9 –> GPIO32
  5. ขา 34-39 เป็นขาสำหรับทำหน้าที่เป็นขานำเข้าเท่านั้น ไม่สามารถทำงานแบบ machine.Pin.OUT ได้
  6. ขาสำหรับทำหน้าที่ DAC0 และ DAC1 คือ GPIO25 และ GPIO26
  7. สำหรับบางขาที่ machine.Pin.PULLUP และต้องการใช้งานในช่วงโหมดประหยัดพลังงานหรือ deepsleepให้กำหนดเป็น machine.PULLUP_HOLD
  8. ขาเหล่านี้ถูกใช้เป็นพิเศษในการบูต ได้แก่ GPIO 0, GPIO 2 และ GPIO 4 โดยเฉพาะ 3 ขาต่อไปนี้จะต้องมีสถานะบังคับเพื่อใช้ในการบูต
    1. GPIO 1 ต้องเป็น HIGH
    2. GPIO 3 ต้องเป็น HIGH
    3. GPIO 5 ต้องเป็น HIGH ระหว่างบูต
    4. GPIO 6 ถึง GPIO11 เชื่อมต่อกับหน่วยความจำแฟลช ไม่ควรนำไปใช้
    5. GPIO 12 จะต้องเป็น LOW ระหว่างบูต
    6. GPIO 14 ต้องเป็น HIGH
    7. GPIO 15 ต้องมีสถานะของขาเป็น HIGH ระหว่างบูต
  9. ขาที่ทำหน้าที่ ADC ได้ คือ โดยวงจร ADC ทำงานละเอียด 12 บิต
    1. ADC1_CH0 –> GPIO 36
    2. ADC1_CH1 –> GPIO 37
    3. ADC1_CH2 –> GPIO 38
    4. ADC1_CH3 –> GPIO 39
    5. ADC1_CH4 –> GPIO 32
    6. ADC1_CH5 –> GPIO 33
    7. ADC1_CH6 –> GPIO 34
    8. ADC1_CH7 –> GPIO 35
    9. ADC2_CH0 –> GPIO 4
    10. ADC2_CH1 –> GPIO 0
    11. ADC2_CH2 –> GPIO 2
    12. ADC2_CH3 –> GPIO 15
    13. ADC2_CH4 –> GPIO 13
    14. ADC2_CH5 –> GPIO 12
    15. ADC2_CH6 –> GPIO 14
    16. ADC2_CH7 –> GPIO 27
    17. ADC2_CH8 –> GPIO 25
    18. ADC2_CH9 –> GPIO 26

สำหรับขาที่เชื่อมต่อกับ UART0, UART1 และ UART2 เป็นดังตารางต่อไปนี้ โดย

  1. UART0 ถูกใช้ในขั้นตอนของการโปรแกรมชิพ และในระหว่างการ reset/boot ระบบ
  2. UART1 ในบางบอร์ดถูกใช้กับ SPI Flash
  3. UART2 เป็นพอร์ตที่นักพัฒนาสามารถนำไปใช้งานต่อได้
หน้าที่UART0UART1UART2
Tx/ส่งข้อมูล11017
Rx/รับข้อมูล3916

ขาสำหรับเชื่อมต่อกับการสื่อสาร SPI ในโหมดฮาร์ดแวร์ของไมโครคอนโทรลเลอร์ ESP32 เป็นดังนี้

หน้าที่HSPI (id=1)VSPI (id=2)
SCK/สร้างสัญญาณนาฬิกา1418
MOSI/นำออกข้อมูล1323
MISO/รับข้อมูล1219

ขาสำหรับการเชื่อมต่อกับการสื่อสาร I2C ในโหมดฮาร์ดแวร์ได้แก่ ซึ่ง GPIO25 และ GPIO26 สามารถทำ DAC ได้ ดังนั้น ถ้าเลือกใช้การทำงาน DAC จะต้องระวังการใช้งาน I2C ชุดที่ 2 (id=1)

หน้าที่I2C (id=0)I2C (id=1)
SCL/สร้างสัญญาณนาฬิกา1825
SDA/รับหรือส่งข้อมูล1926

สรุป

จากบทความนี้จะพบว่า ขาของ esp8266 และ esp32 มีมากพอสำหรับใช้งาน แต่เมื่อพิจารณาให้ละเอียดจะพบว่ามีหลายขาที่ถูกจำกัดหน้าที่เอาไว้ ทำให้เหลือขาสำหรับการเชื่อมต่อกับวงจรที่ออกแบบนั้นเหลือน้อยลงจนบางครั้งทางทีมงานเราจึงเลือกใช้การเชื่อมต่อแบบบัส I2C สำหรับการเชื่อมต่อกับบอร์ด Arduino Uno/Mega2560 หรือ STM32 เพื่อขยายพอร์ต สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ

แหล่งอ้างอิง

  1. Micropython, “Quick reference for ESP8266”
  2. Micropython, “Quick reference for ESP32”
  3. Micropython, “class Pin – control I/O pins”

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-16, 2021-07-17, 2021-07-28, 2021-10-30