เซ็นเซอร์ต่าง ๆ ที่ต่อเข้ากับไมโครคอนโทรลเลอร์ มีการรับ - ส่งข้อมูลแบ่งเป็น 2 แบบใหญ่ ๆ คือ แบบดิจิตอล และแบบอนาล็อก แม้ในปัจจุบันเซ็นเซอร์ต่าง ๆ จะเปลี่ยนการสื่อสารไปใช้แบบดิจิตอลแทบจะทั้งหมดแล้ว แต่ก็ยังมีเซ็นเซอร์บางชนิดที่ยังต้องสื่อสารแบบอนาล็อกอยู่ เช่น เซ็นเซอร์วัดความชื้นในดิน เซ็นเซอร์วัดอุณหภูมิ TMP35 เซ็นเซอร์แสงใช้ LDR เซ็นเซอร์วัดกระแสไฟฟ้า เป็นต้น
ADC ย่อมาจาก Analog to Digital Converter เป็นวงจร / อุปกรณ์ ที่ใช้แปลงสัญญาณอนาล็อกให้เป็นสัญญาณดิจิตอล โดยสัญญาณที่อ่านได้ออกมานั้นไม่ใช่ค่าแรงดัน แต่เป็นค่าระดับขั้นของแรงดันไฟฟ้าที่วัดได้ ซึ่ง ADC ยิ่งมีค่าระดับขั้นที่วัดได้สูงมากเท่าไร ตัวเลขค่าสูงสุดที่วัดได้ยิ่งสูงเท่านั้น และตัวชิปไอซีที่ใช้แปลงก็จะมีราคาสูงขึ้นไปด้วย
ผู้เขียนไม่สามารถหาศัพท์ หรือคำภาษาไทยที่เป็นทางการมาใช้อธิบายได้ (จริง ๆ) จึงเรียกว่า ระดับขั้น ไปก่อน โดยภาษาอังกฤษเรียกสิ่งนี้ว่า ratiometric value ซึ่งไปสัมพันธ์กับค่าความละเอียด ภาษาอังกฤษใช้คำว่า resolution
หลักการทำงานของ ADC คือภายในชิปจะมีวงจรเปรียบเทียบแรงดันอยู่ภายใน โดยวงจร 1 ชุด จะถือเป็น 1 ขั้น และในชิป ADC นั้น ๆ มีจำนวนขั้นรวมทั้งหมดกี่ขั้น จะเรียกว่า ค่าความละเอียด การเลือกซื้อ ADC มักเลือกจากค่าความละเอียดนี้เอง โดยค่าความละเอียดสูง จะยิ่งวัดแรงดันได้ละเอียดมากยิ่งขึ้น (ส่งผลให้รับค่าจากเซ็นเซอร์มาได้ถูกต้องมากขึ้นนั่นเอง)
วงจรเสมือนภายใน ADC (ขอบคุณรูปภาพจาก globalspec.com)
ความละเอียด (Resolution) มักมีให้เลือกตั้งแต่ 8 บิต 10 บิต 12 บิต 16 บิต และอาจมีมากกว่านี้
ค่าความละเอียด (Resolution) ที่ระบุเป็นบิต สามารถแปลงออกมาเป็นเลขฐาน 10 ให้มนุษย์เข้าใจได้โดยใช้สูตร 2 ^ จำนวนบิต สมมุติความละเอียด 12 บิต จะได้ 2 ^ 12 = 4096 หมายถึงมี ระดับขั้น ทั้งหมด 4096 ขั้นนั้นเอง แต่เมื่อนำไปเขียนโค้ดจริง ๆ เขาจะเริ่มนับขั้นที่ 1 ที่เลข 0 ดังนั้นมี 4096 ขั้น แต่ค่าที่ได้จาก ADC จะเป็น 0 ถึง 4095
แรงดันอ้างอิง (Voltage Reference : Vref) คือ ขาหนึ่งของ ADC ที่ใช้
สมมุติ (1) ขา Vref ต่อกับแรงดัน 3.3V -> แรงดันสูงสุดของทุกช่อง ADC จะต้องไม่เกิน 3.3V และค่าสูงสุดหากใช้ ADC 12 บิต คือ 4095 จะเทียบได้กับแรงดัน 3.3V
สมมุติ (2) ขา Vref ต่อกับแรงดัน 5V -> แรงดันสูงสุดของทุกช่อง ADC จะต้องไม่เกิน 5V และค่าสูงสุดหากใช้ ADC 12 บิต คือ 4095 จะเทียบได้กับแรงดัน 5V ด้วยเช่นกัน
ทั้งนี้ค่าแรงดันอ้างอิง (แรงดันขา Vref) จะต้องไม่เกินไปกว่าแรงดันที่จ่ายให้กับ ADC เช่น หากต่อขา VDD (ขาไฟบวก) ไว้ที่ 5V จะสามารถเลือกต่อให้ขา Vref ไว้ที่ 5V หรือ 3.3V หรือช่วง 0 ถึง 5V ได้ แต่จะไม่สามารถต่อขา Vref ให้เกินไปกว่า 5V ได้
ข้อดีที่ชัดเจนที่สุดของการตั้งแรงดันอ้างอิงที่เหมาะสม คือสามารถวัดแรงดันอินพุตที่มีค่าต่ำ ๆ ได้ดี เช่น เซ็นเซอร์จะปล่อยแรงดันไฟฟ้าออกมาในช่วง 0 - 1V หากตั้งแรงดันอ้างอิงไว้ที่ 1V ก็จะวัดค่าที่ได้จากเซ็นเซอร์ได้ดีที่สุด แต่หากกำหนดแรงดันอ้างอิงไม่ดี เช่น เซ็นเซอร์ปล่อยแรงดันออกมาในช่วง 0 - 2V แต่กำหนดแรงดันอ้างอิงไว้ที่ 3.3V ก็จะทำให้ช่องว่าง 2V - 3.3V สูญเสียไปอย่างเปล่าประโยชน์
ค่าที่ต้องทราบก่อนจะแปลง มีดังนี้
เมื่อทราบค่าทั้ง 3 แล้ว สามารถนำมาเข้าสูตรได้ดังนี้
แรงดันไฟฟ้า = แรงดันอ้างอิง / (ค่าความละเอียด - 1) * ค่าที่ได้จาก ADC
สมมุติ ใช้ ADC ค่าความละเอียด 12 บิต = 2 ^ 12 = 4096 ใช้แรงดันอ้างอิง 3.3V และค่าที่ได้จาก ADC คือ 2047 สามารถแปลงเป็นแรงดันได้ดังนี้
3.3 / (4096 - 1) * 2047 = 1.649597....V หรือ 3.3 / 4095 * 2047 = 1.649597....V
ค่าแรงดันที่วัดได้คือประมาณ 1.65V
หมายเหตุ: ที่มาของสูตร คือการเทียบบัญญัติไตรยางค์ (ค่าความละเอียด - 1):แรงดันอ้างอิง
MCP3208 เป็นไอซี ADC ความละเอียด 12 บิต 8 ช่อง ตัวถังแบบ DIP-16 สามารถเสียบลงโพรโทรบอร์ดได้ มีสเปคคร่าว ๆ ดังนี้
ขาต่อใช้งานมีทั้งหมด 16 ขา เสียบลงโพรโทรบอร์ด หรือแผ่นปริ้นอเนกประสงค์ได้พอดี ขาของไอซีจะแยกเป็น 2 ฝั่งชัดเจน คือฝั่งด้านอินพุต เริ่มตั้งแต่ขา 1 ช่องที่ 0 ไปจนถึงขา 8 ช่องที่ 7 และฝั่งด้านเอาต์พุต + จ่ายไฟเลี้ยง
การเชื่อมต่อเป็นแบบ SPI เมื่อ
การใช้เซ็นเซอร์โดยทั่วไปจะใช้แหล่งจ่ายไฟร่วมกับแหล่งจ่ายของไมโครคอนโทรลเลอร์ และใช้ร่วมกับไอซี ADC ด้วย ดังนั้นช่อง AGND และ DGND สามารถต่อร่วมกัน แล้วต่อเข้าขา GND ปกติได้เลย
ขา VDD และ Vref (ขาแรงดันอ้างอิง) มักต่อใช้ร่วมกัน ดังนั้นจึงจ่ายไฟเข้าขาที่ต่อร่วมนี้ได้เลย
สำหรับ WeMos D1 mini ให้ต่อวงจรดังนี้ (ผู้เขียนเทียบ PINOUT ก่อนทดลองต่อจริง แล้ววาดออกมาเป็นวงจรจริง)
สำหรับ NodeMCU 1.0 ให้ต่อวงจรดังนี้
ให้ติดตั้งไลบรารี่ MajenkoLibraries/MCP3208 เพิ่ม โดยกดที่ปุ่ม Clone or download แล้วกดปุ่ม Download ZIP
เปิดไฟล์ที่ได้ดาวน์โหลดมาด้วยโปรแกรมคลายไฟล์ (WinRAR, 7-zip) แล้วลากโฟลเดอร์ในโปรแกรมคลายไฟล์มาใส่ไว้ที่ C:\Users\Max\Documents\Arduino\libraries
เปลี่ยนชื่อโฟลเดอร์ โดยลบเครื่องหมายขีดกลางออก (-) และข้อความหลังเครื่องหมายขีดกลาง
ตัวอย่างถัดไป จะทดสอบใช้ตัวต้านทานปรับค่าได้เป็นตัวปรับค่าแรงดัน เพื่อทดสอบอ่านค่าจาก MCP3208 ออกมา
ในวงจร ให้เพิ่มตัวต้านทานปรับค่าได้ (วอลุ่ม) โดยต่อเพิ่มดังนี้ (ใช้งาน ADC ช่องที่ 0)
เปิดโปรแกรม Arduino ขึ้นมา คัดลอกโค้ดโปรแกรมต่อไปนี้ลงไป หากไม่ได้ต่อขา CS ตามวงจรด้านบน ให้แก้ไขโค้ดในบรรทัดที่ 3 ให้เป็นขา CS ที่ต่อด้วย
เลือกบอร์ด เลือกพอร์ต แล้วกดอัพโหลดได้เลย จากนั้นเปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 จากนั้นค่าที่วัดได้จะแสดงออกมาทันที เมื่อปรับวอลุ่ม ค่าที่ได้จะเปลี่ยนไปทันที
ฟังก์ชันหลักมีเพียง adc.analogRead(); เท่านั้น มีพารามิเตอร์ตัวเดียวเป็นชนิด int และเป็นหมายเลขของช่อง ADC ที่ต้องการอ่านค่า ค่าที่ได้ออกมาจะเป็น 0 ถึง 4095 สามารถแปลงเป็นแรงดันได้โดยนำไป * 3.3 / 4095
ให้ถอดตัวต้านทานปรับค่าได้ออก แล้วใส่ LDR เข้าไปแทน ตามวงจรดังนี้
ที่หน้าต่าง Serial Monitor ค่าที่แสดงจะเปลี่ยนไปตามแสงที่ส่องถึง ยิ่งแสงสว่างมาก ค่าที่ได้ยิ่งมาก ยิ่งแสงสว่างน้อย ค่าที่ได้ยิ่งน้อย
ไอซี TMP36 เป็นไอซีวัดอุณหภูมิขนาดเล็ก ตัวถัง TO-92 รองรับแรงดันได้ 2.7V ถึง 5.5V เอาต์พุตเป็นแบบอนาล็อก ค่าอุณหภูมิหาได้จาก (แรงดันเอาต์พุต - 500) / 10 ได้ค่าออกมาเป็นองศาเซลเซียส
ให้ต่อวงจรดังนี้
อัพโหลดโค้ดต่อไปนี้
เปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 จะแสดงค่าอุณภูมิที่วัดได้ออกมาแล้ว
จริง ๆ แล้ว MCP3208 ยังมีโหมดใช้งานแบบ Differential อีก (คล้าย ๆ กับการสร้างมิเตอร์ดิจิตอล) แต่เนื่องจากเหตุผลบางประกาศทำให้ผมไม่ได้เขียนวิธีใช้ลงไปด้วย บทความนี้จึงเป็นตัวอย่างการใช้งานไอซี MCP3208 ธรรมดา แต่เชื่อว่าเป็นประโยชน์สำหรับผู้ที่มีปัญหา ESP8266 มีขาใช้งานอนาล็อกไม่พออย่างแน่นอน
หากสนใจ MCP3208 สามารถเข้าไปสั่งซื้อได้ที่ MCP3208 - ADC 8 Channel 12 Bit 2.7 - 5.5V สำหรับบทความนี้ก็มีเพียงเท่านี้ บทความหน้าจะเป็นเรื่องเกี่ยวกับอะไร ฝากติดตามด้วยนะครับ
~ สวัสดีครับ ~