การติดตามระดับพลังงานในอุปกรณ์พกพาถือเป็นหัวใจสำคัญของการออกแบบระบบฝังตัว (Embedded Systems) โดยเฉพาะในบอร์ดตระกูล Arduino MKR Zero ซึ่งถูกออกแบบมาเพื่อรองรับการใช้งานร่วมกับแบตเตอรี่ LiPo บทความนี้จะเจาะลึกวิธีการวัดแรงดันแบตเตอรี่อย่างแม่นยำผ่านขา ADC ภายใน เพื่อให้คุณสามารถจัดการพลังงานของโปรเจกต์ได้อย่างมืออาชีพ
แนวคิดเชิงวิศวกรรม: การวัดแรงดันแบตเตอรี่บน MKR Zero
โดยปกติแล้ว ไมโครคอนโทรลเลอร์ไม่สามารถรับแรงดันไฟฟ้าที่สูงเกินกว่าแรงดันใช้งาน (Operating Voltage) เข้าไปยังขา Analog-to-Digital Converter (ADC) ได้โดยตรง สำหรับ MKR Zero ซึ่งทำงานที่ 3.3V แต่แบตเตอรี่ LiPo มีแรงดันสูงสุดถึง 4.2V เมื่อชาร์จเต็ม ทีมออกแบบของ Arduino จึงได้ติดตั้ง Voltage Divider Circuit หรือวงจรแบ่งแรงดันไว้บนบอร์ดเรียบร้อยแล้ว
วงจรนี้จะลดทอนแรงดันจากแบตเตอรี่ลงมาในสัดส่วนที่ปลอดภัยต่อชิป SAMD21 และเชื่อมต่อเข้ากับขาอะนาล็อกพิเศษที่ชื่อว่า ADC_BATTERY (ซึ่งภายในคือขา PB09) ทำให้เราสามารถเขียนโปรแกรมอ่านค่าได้ทันทีโดยไม่ต้องต่อวงจรภายนอกเพิ่มเติม
การวิเคราะห์โค้ดโปรแกรม (Source Code Analysis)
เพื่อให้เห็นภาพการทำงานจริง นี่คือสคริปต์สำหรับการอ่านค่าแรงดันแบตเตอรี่และคำนวณกลับเป็นหน่วยโวลต์ (Voltage)
/*
MKR Zero Battery Monitor
อ่านค่าแรงดันจากแบตเตอรี่ LiPo และแสดงผลผ่าน Serial Monitor
*/
void setup() {
// เริ่มต้นการสื่อสาร Serial ที่ความเร็ว 9600 bps
Serial.begin(9600);
// รอจนกว่าพอร์ต Serial จะพร้อมใช้งาน (เฉพาะบอร์ดที่มี Native USB)
while (!Serial);
Serial.println("MKR Zero Battery Voltage Monitor Ready!");
}
void loop() {
// 1. อ่านค่าดิบจากขา ADC_BATTERY (0 - 1023 สำหรับความละเอียด 10-bit)
int sensorValue = analogRead(ADC_BATTERY);
// 2. แปลงค่า Digital เป็นแรงดันไฟฟ้าจริง
// สูตรการคำนวณ: (ค่าที่อ่านได้ * แรงดันอ้างอิงสูงสุด) / ความละเอียด ADC
// หมายเหตุ: สำหรับ MKR Zero ตัวคูณ 4.3 มาจากวงจร Voltage Divider ภายในที่คำนวณไว้ให้แล้ว
float voltage = sensorValue * (4.3 / 1023.0);
// 3. แสดงผลลัพธ์ออกทาง Serial Monitor
Serial.print("Battery Voltage: ");
Serial.print(voltage);
Serial.println(" V");
// หน่วงเวลา 1 วินาทีก่อนการอ่านค่าครั้งถัดไป
delay(1000);
}
เจาะลึกกระบวนการทำงานของลอจิก (Logic Breakdown)
- Hardware Abstraction: การใช้ตัวแปร
ADC_BATTERYแทนหมายเลขพิน ช่วยให้โค้ดมีความยืดหยุ่นและลดความผิดพลาด เนื่องจากคอมไพเลอร์ของ Arduino จะแมปค่านี้เข้ากับขาที่เชื่อมต่อกับวงจรวัดแรงดันภายในโดยเฉพาะ - Analog-to-Digital Conversion (ADC): ฟังก์ชัน
analogRead()จะเปลี่ยนแรงดันไฟฟ้าที่เป็นสัญญาณต่อเนื่อง (Analog) ให้เป็นตัวเลขดิจิทัล ในกรณีของ MKR Zero ค่าเริ่มต้นคือ 10-bit ซึ่งให้ค่าตั้งแต่ 0 ถึง 1023 - The Scaling Factor (4.3V): นักพัฒนาหลายคนอาจสงสัยว่าทำไมต้องคูณด้วย 4.3?
- เนื่องจากแรงดันสูงสุดของแบตเตอรี่ LiPo อยู่ที่ 4.2V บวกกับ Margin เพื่อความปลอดภัย และประสิทธิภาพของวงจรแบ่งแรงดัน (Resistor Divider) บนบอร์ด MKR Zero ค่าคงที่ 4.3 จึงถูกกำหนดเป็นมาตรฐานในการคำนวณกลับเพื่อให้ได้ค่าแรงดันที่ตรงกับความเป็นจริงมากที่สุด
- Floating Point Precision: การประกาศตัวแปร
voltageเป็นชนิดfloatมีความสำคัญมาก เพื่อรักษาทศนิยมของแรงดันไฟฟ้า ทำให้เราสามารถเห็นความเปลี่ยนแปลงแม้เพียงเล็กน้อย (เช่น จาก 3.75V เป็น 3.74V)
ข้อแนะนำเพิ่มเติมสำหรับวิศวกร
- ความแม่นยำ: หากต้องการความแม่นยำที่สูงขึ้น คุณสามารถปรับแต่งค่าความละเอียด ADC เป็น 12-bit ได้โดยใช้คำสั่ง
analogReadResolution(12)(และอย่าลืมเปลี่ยนตัวหารในสูตรจาก 1023 เป็น 4095) - Battery Health: โดยทั่วไป แบตเตอรี่ LiPo ไม่ควรมีแรงดันต่ำกว่า 3.2V หากระบบตรวจพบว่าแรงดันต่ำกว่าเกณฑ์ คุณควรเขียน Logic ให้เข้าสู่โหมด Deep Sleep เพื่อถนอมอายุการใช้งานของเซลล์แบตเตอรี่
- Self-Correction: ในสภาพแวดล้อมที่อุณหภูมิเปลี่ยนแปลงสูง ค่าความต้านทานภายในอาจคลาดเคลื่อน การใช้ Multimeter วัดเทียบเพื่อหาค่า Offset เฉพาะบอร์ดจะช่วยให้ระบบของคุณมีความแม่นยำในระดับ Industrial Grade
ด้วยการทำงานประสานกันระหว่างฮาร์ดแวร์ที่ออกแบบมาอย่างดีและซอฟต์แวร์ที่เรียบง่าย Arduino MKR Zero จึงเป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับการสร้างอุปกรณ์ IoT ที่ใช้พลังงานจากแบตเตอรี่อย่างยั่งยืน