[TH] Using ESP32’s ADC and DAC with Micropython.

บทความนี้เป็นการใช้งาน ADC (Analog-to-Digital Converter) และ DAC (Digital-to-Analog Converter) ของไมโครคอนโทรลเลอร์ ESP32 ด้วยภาษาไพธอนของ MicroPython ซึ่งเป็นคลาสย่อยชื่อ ADC และ DAC ซึ่งอยู่ภายใต้คลาส machine เพื่อเรียนรู้คลาสย่อยทั้งสอง พร้อมทั้งตัวอย่างโปรแกรมการใช้งานคลาสดังภาพที่ 1 เพื่อเป็นพื้นฐานสำหรับการนำไปพัฒนาต่อไป

ภาพที่ 1 ตัวอย่างการใช้ ADC/DAC

ADC

ไมโครคอนโทรลเลอร์ ESP32 รองรับแรงดันสำหรับการทำ ADC ในช่วง 0 ถึง 1.1VDC และมี ADC 2 ช่องเรียกว่า ADC1 และ ADC2 โดย ADC1 ประกอบด้วยขาดังต่อไปนี้

  • GPIO36 หรือ VP
  • GPIO39 หรือ VN
  • GPIO32
  • GPIO33
  • GPIO34
  • GPIO35
  • GPIO37
  • GPIO38

สำหรับ ADC2 ประกอบด้วยขาต่อไปนี้

  • GPIO4
  • GPIO0 ต้องระมัดระวังในการใช้เนื่องจากถูกใช้งานในหน้าที่พิเศษของ ESP32
  • GPIO2 ต้องระมัดระวังในการใช้เนื่องจากถูกใช้งานในหน้าที่พิเศษของ ESP32
  • GPIO15 ต้องระมัดระวังในการใช้เนื่องจากถูกใช้งานในหน้าที่พิเศษของ ESP32
  • GPIO13
  • GPIO12
  • GPIO14
  • GPIO27
  • GPIO25
  • GPIO26

การใช้งาน ADC ของ Micropython ต้องเรียกใช้คลาสย่อย ADC ที่อยู่ภายใต้คลาส machine ซึ่งมีรายละเอียดดังภาพที่ 2

ภาพที่ 2 คลาส ADC

ภาค ADC มีความละเอียด 12 บิต ทำให้สามารถอ่านค่าแรงดัน 0-3.3VDC มาเป็นค่าดิจิทัล 0 ถึง 4095 หรือ 4096 ระดับ โดยต้องสร้างวัตถุที่อ้างอิงไปยังขาของ ADC ด้วยรูปแบบการสั่งงานดังนี้

วัตถุ = machine.ADC( machine.Pin( หมายเลขขา ) )

คำสั่งสำหรับอ่านค่าจาก ADC มีรูปแบบการใช้งานดังนี้

ค่าที่ได้ = วัตถุ.read( )

สำหรับกรณีที่ต้องการปรับเปลี่ยนช่วงค่าความละเอียดในการแปลงให้ใช้คำสั่ง width() ดังรูปแบบคำสั่งต่อไปนี้

วัตถุ.width( ค่าความละเอียด )

โดยค่าสำหรับปรับความละเอียด คือ

  • WIDTH_9BIT หรือ 0
  • WIDTH_10BIT หรือ1
  • WIDTH_11BIT หรือ 2
  • WIDTH_12BIT หรือ 3

ถ้าต้องการเปลี่ยนค่าหรือการลดทอนแรงดันนำเข้าให้ปรับเปลี่ยนค่าด้วยเมธอด atten() ดังรูปแบบต่อไปนี้

วัตถุ.atten( ค่าการลดทอน )

ค่าของการลดทอน ประกอบด้วย

  • ATTN_0DB หรือ 0 เพื่อรองรับการทำงานของแรงดันไม่เกิน 800mV
  • ATTN_2_5DB หรือ 1 เพื่อรองรับการทำงานของแรงดันประมาณ 0 ถึง 1.1VDC (1.33x)
  • ATTN_6DB หรือ 2 เพื่อรองรับการทำงานของแรงดันประมาณ 0 ถึง 2.2VDC (2x)
  • ATTN_11DB หรือ 3 เพื่อรองรับการทำงานของแรงดันประมาณ 0 ถึง 3.3VDC (3.55x)

DAC

ภาค DAC ที่ทำหน้าที่แปลงค่าดิจิทัลที่ส่งไปให้เพื่อเป็นแรงดันหรือค่าแบบแอนาล็อกของ ESP32 นั้น มีความละเอียด 8 บิต จำนวน 2 ช่อง นั่นหมายความว่าสามารถส่งค่า 0 ถึง 255 เพื่อแปลงเป็นแรงดัน 0 ถึง 3.3VDC หรือเรียกว่าสามารถส่งสัญญาณได้ 256 ระดับ ผ่านทาง DAC1 และ DAC2 ซึ่งตรงกับขา GPIO26 และ GPIO25 โดยโครงสร้างของคลาส DAC ซึ่งเป็นคลาสย่อยของ machine เป็นดังภาพที่ 3 และการสร้างวัตถุแบบ DAC สั่งงานดังนี้

วัตถุ = machine.DAC( machine.Pin( หมายเลขขา ))

ภาพที่ 3 คลาส DAC

คำสั่งสำหรับส่งออกค่าดิจิทัลให้เป็นค่าแอนาล็อกมีรูปแบบดังนี้ ซึ่งระดับค่าดิจิทัลเป็นตัวเลขจำนวนเต็มในช่วง 0 ถึง 255

วัตถุ.write( ระดับค่าดิจิทัล )

ตัวอย่างโปรแกรม

ตัวอย่างโปรแกรมเป็นการส่งค่า 200 ไปให้ DAC1 ที่เชื่อมต่อเข้ากับขา VP ของไมโครคอนโทรลเลอร์ เชื่อมต่อขา DAC0 เข้ากับลำโพง และต่อ GPIO16 เข้ากับสวิตช์สัมผัส ดังภาพที่ 4 ตามผังวงจรภาพที่ 5 โดยเมื่อผู้ใช้กดสวิตช์จะอ่านค่าที่ส่งไปให้ DAC1 ผ่านทาง VP และแปลงเป็นค่าส่งไปให้ DAC0 ทำให้มีเสียงออกลำโพง แต่ถ้าผู้ใช้ปล่อยนิ้วจากสวิตช์จะส่ง 0 ไปให้ DAC0 เพื่อปิดการเปล่งเสียง

ภาพที่ 4 การเชื่อมต่อกับอุปกรณ์ของบอร์ด ESP32
ภาพที่ 5 ตัวอย่างวงจรของการทดลอง

โค้ดโปรแกรมเป็นดังนี้

import time
from machine import ADC, DAC, Pin, TouchPad
adcPin1 = Pin(36) # ต่อกับขา 26 (dacPin2)
dacPin1 = Pin(25) # ต่อกับลำโพง
dacPin2 = Pin(26) # ต่อกับ adcPin1
swPin = Pin(16)

adc1 = ADC( adcPin1 )
adc1.width( ADC.WIDTH_12BIT ) # 12bit
adc1.atten( ADC.ATTN_11DB ) # 3.3V
dac1 = DAC( dacPin1 )
dac2 = DAC( dacPin2 )

# โปรแกรมหลัก
while True:
    # รอการกด TouchPad
    touched = swPin.value()
    if (touched):
        # สุ่มค่า DAC
        dac2.write(200)
        # ส่งไป ADC
        dValue1 = adc1.read()
        # แปลงออกลำโพง
        dac1.write( int(dValue1/4096*256 ) )
        # หน่วงเวลา
        #time.sleep_ms(100)
    else:
        # ปิดเสียง
        dac1.write( 0 )

ตัวอย่างคลิปภาพการทำงานของโปรแกรมตัวอย่างเป็นดังนี้

สรุป

จากบทความนี้จะพบว่า คลาส ADC และ DAC รองรับการทำงานของไมโครคอนโทรลเลอร์ ESP32 ได้ดี สามารถใช้งานได้เต็มความสามารถของบอร์ด แต่อย่างไรก็ดี ด้วยความละเอียดของ DAC ที่เป็น 8 บิต อาจจะไม่เพียงพอสำหรับผู้นิยมทำงานด้านการประมวลผลเสียง ซึ่งต้องใช้ความละเอียดในการนำออกที่มากกว่านี้ ดังนั้น ผู้อ่านอาจจะต้องใช้โมดูลภายนอกที่ทำหน้าที่แปลงสัญญาณที่ทำงานผ่านบัส I2C หรือ SPI เพิ่มเข้ามาในระบบ สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ

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

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

  1. Espressif ADC
  2. Espressif DAC
  3. MicroPython ESP32

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