บทความนี้เป็นการใช้งาน ADC (Analog-to-Digital Converter) และ DAC (Digital-to-Analog Converter) ของไมโครคอนโทรลเลอร์ ESP32 ด้วยภาษาไพธอนของ MicroPython ซึ่งเป็นคลาสย่อยชื่อ ADC และ DAC ซึ่งอยู่ภายใต้คลาส machine เพื่อเรียนรู้คลาสย่อยทั้งสอง พร้อมทั้งตัวอย่างโปรแกรมการใช้งานคลาสดังภาพที่ 1 เพื่อเป็นพื้นฐานสำหรับการนำไปพัฒนาต่อไป
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
ภาค 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( หมายเลขขา ))
คำสั่งสำหรับส่งออกค่าดิจิทัลให้เป็นค่าแอนาล็อกมีรูปแบบดังนี้ ซึ่งระดับค่าดิจิทัลเป็นตัวเลขจำนวนเต็มในช่วง 0 ถึง 255
วัตถุ.write( ระดับค่าดิจิทัล )
ตัวอย่างโปรแกรม
ตัวอย่างโปรแกรมเป็นการส่งค่า 200 ไปให้ DAC1 ที่เชื่อมต่อเข้ากับขา VP ของไมโครคอนโทรลเลอร์ เชื่อมต่อขา DAC0 เข้ากับลำโพง และต่อ GPIO16 เข้ากับสวิตช์สัมผัส ดังภาพที่ 4 ตามผังวงจรภาพที่ 5 โดยเมื่อผู้ใช้กดสวิตช์จะอ่านค่าที่ส่งไปให้ DAC1 ผ่านทาง VP และแปลงเป็นค่าส่งไปให้ DAC0 ทำให้มีเสียงออกลำโพง แต่ถ้าผู้ใช้ปล่อยนิ้วจากสวิตช์จะส่ง 0 ไปให้ DAC0 เพื่อปิดการเปล่งเสียง
โค้ดโปรแกรมเป็นดังนี้
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 เพิ่มเข้ามาในระบบ สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-07, 2021-07-28, 2021-11-02