รู้จักกับ Analog Input Channels บน Arduino Uno
ถ้าน้องติดตามโปรเจคก่อนหน้านี้มา น้องน่าจะเข้าใจเรื่องการใช้งาน Digital I/O สำหรับควบคุม สื่อสาร และอ่านค่าอินพุตบน Arduino Uno Rev3 (Uno) กันพอสมควรแล้ว ในโปรเจคนี้ พี่จะพาน้องไปรู้จักกับการใช้งาน Analog Input Channels กันบ้าง จำนวนช่องมันขึ้นอยู่กับบอร์ดนะ แต่ของ Uno มันมี 6 ช่อง (A0-A5) น้องจะได้เรียนรู้วิธีการอ่านค่าจากแต่ละช่อง แล้วเอามาแสดงผลเป็นตารางสวยๆ บน Serial Monitor แบบที่เห็นด้านล่างนี่แหละ
ในโลกแห่งความเป็นจริง สัญญาณส่วนใหญ่ไม่ได้มีแค่ "เปิด" กับ "ปิด" (0 กับ 1) นะน้อง มันเป็นสัญญาณต่อเนื่อง (Continuous) ต่างหาก เช่น อุณหภูมิ ความเข้มแสง หรือแรงดันไฟฟ้าที่เปลี่ยนแปลงตลอดเวลา เราจะมาดูกันว่า Analog Input Channels สำคัญยังไงในการเชื่อมต่อ Arduino กับเซนเซอร์อนาล็อก บอร์ด Arduino Uno มันมีช่องอนาล็อกให้ใช้ทั้งหมด 6 ช่อง (A0-A5) เราจะมาเรียนรู้วิธีการอ่านค่าจากทุกช่องพร้อมกัน แล้วจัดระเบียบข้อมูลให้แสดงผลเป็นตารางดูโปรๆ บน Serial Monitor กัน
โพเทนชิโอมิเตอร์ (Potentiometer)
โพเทนชิโอมิเตอร์เป็นอุปกรณ์ที่มี 3 ขา ช่วยให้เราปรับค่าความต้านทานภายในได้อย่างรวดเร็ว พอปรับความต้านทาน แรงดันเอาต์พุตก็จะเปลี่ยนไปด้วย ระหว่าง 0V ไปจนถึงแรงดันสูงสุดที่เราเอามาจ่ายให้มัน ตัวอย่างง่ายๆ ถ้าเราเอาแรงดัน +5Vdc มาต่อที่ขา 1 และต่อขา 3 เข้ากับ 0V (GND) แรงดันที่ออกมาที่ขา 2 ก็จะวิ่งไปมาระหว่าง 0V ถึง +5V นั่นเอง โพเทนชิโอมิเตอร์ทำหน้าที่เหมือนวงจรแบ่งแรงดัน (Voltage Divider) ตามภาพด้านล่างเลย
หรือที่เรียกกันติดปากว่า "ตัวต้านทานปรับค่าได้ (Variable Resistor)" นั่นแหละ มันเป็นอุปกรณ์ 3 ขาที่ทำงานเป็นวงจรแบ่งแรงดัน ภายในมันประกอบด้วยแทรกรีซิสเตอร์และตัวสัมผัส (Wiper) ที่เลื่อนได้ พอเราหมุนแกนมัน ความต้านทานระหว่างขา 2 (ขากลาง) กับขา 1 และ 3 ก็จะเปลี่ยนไป ในทางวิศวกรรม ถ้าเราต่อขา 1 เข้ากับ 0V (GND) และขา 3 เข้ากับ +5Vdc แรงดันที่ออกมาจากขา 2 (Wiper) ก็จะเปลี่ยนไปตามตำแหน่งการหมุนแบบเชิงเส้น ตั้งแต่ 0V ถึง 5V นี่คือวงจรพื้นฐานที่เรียกว่า วงจรแบ่งแรงดัน (Voltage Divider Circuit) นั่นเอง

อินพุตแบบอนาล็อก (Analog Input)
ในแต่ละช่องอินพุตแบบอนาล็อกของ Arduino Uno นั้น มีวงจร ตัวแปลงสัญญาณอนาล็อกเป็นดิจิทัล (Analog-to-Digital Converter หรือ ADC) ขนาด 10-bit ติดตั้งมาอยู่แล้วครับ ไอซีไมโครคอนโทรลเลอร์ ATmega328P จะทำหน้าที่แปลงแรงดันไฟฟ้าอนาล็อกให้เป็นตัวเลขดิจิทัลที่คอมพิวเตอร์เข้าใจได้
ด้วยความละเอียด 10-bit ค่าที่อ่านได้จะมีความละเอียดทั้งหมด $2^{10}$ ระดับ หรือมีค่าตั้งแต่ 0 ถึง 1023 นั่นเอง
- ถ้าแรงดันอินพุตเป็น 0V ค่า ADC ที่อ่านได้ก็จะเป็น 0
- ถ้าแรงดันอินพุตเป็น 5V ค่า ADC ที่อ่านได้ก็จะเป็น 1023
เราสามารถคำนวณความสัมพันธ์ระหว่างแรงดันไฟฟ้ากับค่าดิจิทัลได้ด้วยสมการในรูปด้านล่างนี้เลย

สมมติว่าเราวัดแรงดันได้ 1V เรารู้ค่า n, แรงดันสูงสุด, และ แรงดันตัวอย่าง เราก็สามารถแก้สมการหาค่า ADC ได้ตามตัวอย่างด้านล่าง เนื่องจากคำตอบไม่ใช่จำนวนเต็ม วงจร ADC จะปัดเศษลงให้เป็นจำนวนเต็มที่ใกล้ที่สุด ซึ่งก็คือ 204
ตัวอย่างการคำนวณ: สมมติเราวัดแรงดันได้ 1V โดยใช้แรงดันอ้างอิง (Vref) 5V ค่า ADC ที่คำนวณได้จะเป็น: $(1V / 5V) \times 1023 = 204.6$ เนื่องจาก ADC ทำงานกับค่าจำนวนเต็ม ระบบจะปัดเศษทศนิยมลง ทำให้ค่าที่อ่านได้จริงคือ 204

ต่อวงจรให้พร้อมสู้งาน
เตรียมตัวต้านทานปรับค่าได้ (โพเทนชิโอมิเตอร์) 10kΩ มา 6 ตัว แล้ววางบนเบรดบอร์ด ต่อขา 3 ของแต่ละตัวเข้ากับเรลไฟบวก (+5V) และขา 1 เข้ากับเรลกราวด์ (GND) ของเบรดบอร์ด จากนั้น ใช้สายจัมเปอร์ผู้ชาย (male jumper) ต่อจากจุดที่ขา 2 (ไวเปอร์) ของโพเทนชิโอมิเตอร์แต่ละตัวอยู่ ไปยังพอร์ตอินพุตอนาล็อก A0 ถึง A5 ของ Arduino ตามลำดับ วงจรคร่าวๆ ดูได้จากรูปด้านล่างเลย
ในโปรเจคนี้ เราจะใช้โพเทนชิโอมิเตอร์ 10kΩ จำนวน 6 ตัว เพื่อทดสอบการอ่านค่าพร้อมกันจากทุกช่อง:
- วางโพเทนชิโอมิเตอร์ทั้ง 6 ตัวลงบนเบรดบอร์ด
- ต่อ ขา 3 ของโพเทนชิโอมิเตอร์แต่ละตัว เข้ากับเรลไฟบวก (+5V)
- ต่อ ขา 1 ของโพเทนชิโอมิเตอร์แต่ละตัว เข้ากับเรลกราวด์ (GND)
- ใช้สายจัมเปอร์ต่อจาก ขา 2 (ไวเปอร์) ของโพเทนชิโอมิเตอร์แต่ละตัว ไปยัง พอร์ตอินพุตอนาล็อก A0, A1, A2, A3, A4 และ A5 ตามลำดับ

การเดินสายไฟให้ FuelCan
ถ้ายังไม่ได้ติดตั้งบอร์ด Uno ลงบนพื้นที่โปรโตไทป์ของ FuelCan ก็จัดไปเลยวัยรุ่น ตัวพี่เองวางเบรดบอร์ดไว้ในช่องเก็บของด้านล่างเพื่อให้สายจัมเปอร์ไม่ยาวเกินไป เราต้องจ่ายไฟ +5V และ GND ไปยังรางไฟของเบรดบอร์ด ใช้สาย Banana Jack ต่อกับคลิปทดสอบ (test-lead clip) ที่มีมาให้ได้เลย ส่วนด้านเบรดบอร์ดต้องใช้พินเฮดเดอร์ชาย (male header pin) 2 ตัวเพื่อติดคลิปทดสอบนั้น ต่อสาย USB ด้าน Type A เข้ากับช่อง USB1 และด้าน Type B เข้ากับช่องของ Uno เสร็จแล้วก็เปิดสวิตช์ FuelCan ด้วยอะแดปเตอร์ AC-DC ได้เลย
ถ้าใช้ชุดเรียนรู้ FuelCan ให้ติดตั้งบอร์ด Uno ลงในพื้นที่โปรโตไทป์ แนะนำให้วางเบรดบอร์ดในช่องเก็บของด้านล่าง จะได้ประหยัดพื้นที่และจัดสายไฟง่ายขึ้น
- ใช้สาย Banana Jack ต่อกับคลิปทดสอบ เพื่อจ่ายไฟ +5V และ GND จากแหล่งจ่ายไฟของ FuelCan ไปยังรางไฟของเบรดบอร์ด
- เชื่อมต่อสาย USB Type A กับคอมพิวเตอร์ และสาย Type B กับ Arduino Uno
- เปิดสวิตช์ FuelCan เพื่อเริ่มจ่ายไฟให้วงจร
ส่วนซอฟต์แวร์
เดินสายเสร็จและเปิดไฟ FuelCan แล้ว ต่อไปก็อัปโหลดสเก็ตช์ลง Uno ได้เลย สเก็ตช์อยู่ด้านล่างนี้ มันจะตั้งค่าการสื่อสารแบบอนุกรม (serial) ระหว่าง Uno กับคอมพิวเตอร์ จากนั้นอ่านค่าอะนาล็อกจากแต่ละพินอินพุตและส่งค่าไปยังคอมพิวเตอร์เพื่อแสดงผลบน Serial Monitor ลองหมุนโพเทนชิโอมิเตอร์แต่ละตัวตามเข็มและทวนเข็มนาฬิกา แล้วดูค่ามันเปลี่ยนจาก 0 ไป 1023 สิ
ซอร์สโค้ดนี้ออกแบบมาเพื่อใช้ประโยชน์จากประสิทธิภาพของคำสั่ง analogRead() และจัดการการแสดงผลผ่าน Serial Monitor ตรรกะของโปรแกรมแบ่งออกเป็นส่วนสำคัญดังนี้:
- Setup: เริ่มต้นการสื่อสารแบบอนุกรม (Serial) ด้วยอัตราบอด (Baud rate) ที่กำหนด เพื่อเตรียมส่งข้อมูลกลับไปยังคอมพิวเตอร์
- Loop:
- โปรแกรมใช้ฟังก์ชัน
analogRead(pin)เพื่ออ่านค่าแรงดันจากพิน A0 ถึง A5 - ข้อมูลที่ได้จะถูกเก็บในตัวแปรและส่งออกผ่าน
Serial.print() - ใช้ตัวควบคุมเช่น Tab (
\t) เพื่อจัดตัวเลขให้เป็นคอลัมน์ ทำให้สังเกตการเปลี่ยนแปลงของทั้ง 6 ช่องได้ง่าย
- โปรแกรมใช้ฟังก์ชัน
ขั้นตอนทดสอบ: อัปโหลดโค้ดเสร็จแล้ว ให้เปิด Serial Monitor ขึ้นมา จากนั้นลองหมุนโพเทนชิโอมิเตอร์แต่ละตัวตามเข็มและทวนเข็มนาฬิกา จะเห็นค่าตัวเลขในตารางแกว่งไหวระหว่าง 0 ถึง 1023 แบบเรียลไทม์ การเปลี่ยนแปลงนี้แสดงให้เห็นความแม่นยำของ ADC ในการตรวจจับความแตกต่างของแรงดันแม้เพียงเล็กน้อย (ประมาณ 4.88 มิลลิโวลต์ต่อหนึ่งหน่วยดิจิทัล)
// Basic source code example for reading 6 channels
void setup() {
Serial.begin(9600);
Serial.println("A0\tA1\tA2\tA3\tA4\tA5"); // Table header
}
void loop() {
for (int i = 0; i < 6; i++) {
Serial.print(analogRead(i)); // Read values from pins A0 - A5
Serial.print("\t"); // Separate with Tab
}
Serial.println(); // New line
delay(100); // Delay to stabilize readings
}
จากพื้นฐานนี้ น้องๆ ก็สามารถนำไปประยุกต์อ่านค่าจากเซนเซอร์จริงๆ ได้เลย เช่น LDR (วัดแสง), LM35 (วัดอุณหภูมิ), หรือเซนเซอร์วัดระดับน้ำ ซึ่งทั้งหมดทำงานบนหลักการของแรงดันอะนาล็อกเหมือนกัน สู้งานนะน้อง!