บทที่ 8: การเขียนโปรแกรมอ่านค่าแรงดันจากตัวต้านทานปรับค่าได้
สัญญาณอนาล็อก (Analog Signal) เป็นสัญญาณแบบต่อเนื่อง มีลักษณะเป็นคลื่นไซน์ (sinewave)
โดยที่แต่ละคลื่นจะมีความถี่และความเข้มของสัญญาณที่ต่างกัน

โดยทั่วไปแล้วสัญญาณต่าง ๆที่อยู่รอบตัวเรา โดยพื้นฐานแล้วจะเป็นสัญญาณอนาล็อกแทบทั้งสิ้น ไม่ว่าจะเป็นคลื่นน้ำ คลื่นลม คลื่นเสียง ความดันอากาศ แรงดันไฟฟ้า กระแสไฟฟ้า และอีกมากมาย ซึ่งการส่งสัญญาณเหล่านี้ไปให้ไมโครคอนโทรลเลอร์วิเคราะห์หรือประมวลผลอะไรบางอย่าง จึงมีความจำเป็นอย่างยิ่งที่ต้องแปลงสัญญาณอนาล็อกนั้นให้อยู่ในรูปของสัญญาณดิจิทัล

ไมโครคอนโทรลเลอร์ในปัจจุบันโดยส่วนมากจะมีวงจรภาค ADC(Analog to Digital converter) อยู่ภายใน ซึ่งจะสามารถแปลงสัญญาณอนาล็อกเป็นสัญญาณดิจิตอลได้เลย โดยไม่ต้องผ่านวงจรแปลงใดใดภายนอก แต่มีข้อแม้คือแรงดันสูงสุดที่จะรับได้ต้องไปเกินแรงดัน VCC ของไมโครคอนโทรลเลอร์ตัวนั้น ๆ

มาดูในส่วนของบอร์ด Arduino Learning Kit กันครับ บนบอร์ดจะมีตัวต้านทานปรับค่าได้ (potentiometer) ค่า 100k𝛺 อยู่ 3 ตัวคือ VR1, VR2 , VR3 โดยต่อกับขาไมโครคอนโทรลเลอร์ชนิดต่าง ๆตามตารางด้านล่าง

| VR1 | VR2 | VR3 | |
|---|---|---|---|
| Arduino Uno | A0 | A1 | A2 |
| Arduino Nano | A6 | A7 | A2 |
| ESP32(ESP-WROM-32) | 35 | 34 | 39 |
ตารางที่ 8. 1 ตำแหน่งขาที่ต่อกับตัวต้านทานปรับค่าได้
เขียนโปรแกรม Arduino อ่านค่าแรงดันจากตัวต้านทานปรับค่าได้
Arduino Uno และ Arduino Nano จะมีวงจร ADC ความละเอียดขนาด 10บิต (10bits resolution) อยู่ภายใน ดังนั้น ค่าที่อ่านได้เมื่อแปลงเป็นค่าดิจิทัล ออกมาแล้วจะได้ค่าอยู่ในช่วง 0 ถึง 1023
คือที่แรงดัน 0 โวลต์ จะได้ค่าเป็น 0 และที่แรงดัน 5 โวลต์ จะได้ค่าเป็น 1023
แต่สำหรับ ESP32 จะมีวงจร ADC ความละเอียดขนาดถึง12บิต (12bits resolution) อยู่ภายใน โดยค่าที่อ่านได้สูงสุดจะอยู่ในช่วง 0 – 4095 โดยที่แรงดัน 0 โวลต์ จะได้ค่าเป็น 0 และที่แรงดัน 3.3 โวลต์ จะได้ค่าเป็น 4095 (** ADC ของ ESP32 รับแรงดันสูงสุดได้เพียง 3.3V**)
-
เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า AnalogReadSerial โดยคลิกที่ File -> Examples -> 01.Basics -> AnalogReadSerial

-
ทดลอง upload โปรแกรมให้กับ Arduino Uno เมื่อเสร็จแล้วให้เปิด Serial Monitor

-
ทดลองหมุน VR1 ดูค่าการเปลี่ยนแปลงที่หน้าจอ Serial Monitor

จากการทดลองจะเห็นได้ว่า เมื่อหมุน VR1 ทวนเข็มนาฬิกาจนสุด ค่าที่ได้จะเป็น 0 (แรงดันที่ขา A0 เท่ากับ 0โวลต์) และเมื่อหมุนไปทิศทางตรงกันข้ามจนสุด ค่าที่ได้จะเท่ากับ 1023(แรงดันที่ขา A0 เท่ากับ 5โวลต์)
อธิบายโค้ดข้างบนดังนี้
-
ในส่วนคำสั่งหลัก ๆของโค้ดด้านบนอยู่ที่บรรทัดที่ 22 คือการประกาศตัวแปรชนิด integer ชื่อว่า sensorValue แล้วนำมารับค่าที่อ่านได้จากคำสั่ง analogRead โดยอ่านค่าแรงดันที่ขา A0 ของ Arduino Uno จากนั้นนำค่าที่ได้แสดงออกทาง Serial Monitor
-
กลับมาในส่วนของการทดลองต่อนะครับ โดยการทดลองนี้จะทำการแปลงค่าตัวเลขที่อ่านได้กลับไปเป็นค่าแรงดันแล้วแสดงออกทาง Serial Monitor ให้เขียนโปรแกรมเพิ่มตามตัวอย่างด้านล่าง
-

จากโค้ดด้านบนที่บรรทัดที่ 24 เป็นการประกาศตัวแปรชนิดทศนิยม(float) ชื่อ volt มารับค่าที่ได้จากการคำนวณ โดยนำค่าที่ได้จากการอ่าน ADC มาคูณด้วย 5 และหารด้วย 1024 จากนั้นบรรทัดที่ 26-28 จะแสดงค่าที่ได้หลังจากการคำนวน โดยกำหนดให้แสดงทศนิยม 2 ตำแหน่ง
แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
ให้ทำการแสดงค่าที่อ่านได้จาก VR1, VR2 และ VR3 โดยแปลงค่าที่ได้เป็นค่าแรงดันและแสดงจุดทศนิยม 2 ตำแหน่ง
-
จากความรู้เรื่องการเขียนโปรแกรมติดต่อกับจอ LCD16x2 ให้ทำการแสดงค่าที่อ่านได้จาก VR1, VR2 และ VR3 โดยแปลงค่าที่ได้เป็นค่าแรงดันและแสดงจุดทศนิยม 2 ตำแหน่ง แสดงที่หน้าจอแอลซีดี
-
จากแบบฝึกหัดข้อ 2 ด้านบน เปลี่ยนไมโครคอนโทรลเลอร์จาก Arduino Uno ไปเป็น ESP32(ESP-WROM-32) แล้วทำการเขียนโค้ด จากนั้นให้อธิบายว่า ทำไมเมื่อหมุนตัวต้านทานปรับค่าได้ ในทิศทางตามเข็มนาฬิกาประมาณ 2/3 ของการหมุนจนสุด ค่าที่ได้ถึงหยุดการเปลี่ยนแปลง





Leave a Reply