กล่าวโดยย่อคือ
ดิจิตอล คือเปิดหรือปิด ส่วน
อนาล็อก คือระดับสัญญาณคล้ายๆระดับน้ำ นั่นเอง ซึ่งระดับสัญญาณ เปิดหรือปิด หมายถึง 5v (ON) 0v (OFF) และระดับสัญญาณ อนาล็อกคือ ระดับตั้งแต่ 0-5v สำหรับ Arduino uno r3 arduino mega และรุ่นอื่นๆ ตระกูล AVR ซึ่งจะต่างกับตระกูล ESP เช่น ESP32 หรือ ESP8266 (หรือ nodemcu) ที่จะมีระดับแรงดันเปิดปิดคือ 3.3v คือ ON และ 0v คือ OFF และอนาล็อกเป็นระดับแรงดัน 0-3.3v (บางที่เขียน 3v3)
พูดถึงเรื่องแรงดันขา GPIO ก็เป็นเรื่องสำคัญที่ต้องทราบว่าคอนโทรลเลอร์เราใช้ระดับแรงดันเท่าไรสำหรับขา GPIO เพื่อป้องกันการเสียหายจากการต่ออุปกรณ์ที่มีแรงดันมากกว่าที่คอนโทรลเลอร์รับได้ และก่อให้เกิดความเสียหาย ซึ่งวิธีแก้คือต้องแปลงระดับสัญญาณฝั่งส่งให้เหมาะสมกับฝั่งรับเสียก่อน หรือใช้
โมดูลแปลงระดับสัญญาณ 8 ช่อง สองทิศทาง 8-Channel 5V/3.3V IIC UART SPI TTL Logic Level Converter Bi-Directional Module แปลงระดับสัญญาณไปมาระหว่างอุปกรณ์และคอนโทรลเลอร์ครับ

สำหรับ Arduino uno r3 มีขาสำหรับ analog ตั้งแต่ A0-A5 รวม 6 ขา ซึ่งเราสามารถกำหนดให้เป็นขาแบบ digital ได้เช่นกัน โดยหากกำหนดเป็น digital ก็จะทำงานคล้ายขาที่ 0-13 ทุกประการ
แต่กลับกันขาที่ 0-13 หากต้องการใช้เป็นการรับสัญญาณ analog จะทำไม่ได้ เนื่องจากขาเหล่านั้นไม่มี ADC (Analog digital converter) ที่คอยแปลงสัญญาณอนาล็อกให้เป็นดิจิตอล เพราะคอลโทรลเลอร์รู้จักแค่ on กับ off เท่านั้นแหบะ
การกำหนดขาพินให้เป็นสัญญาณ digital ให้เป็นขาเข้า(INPUT)หรือขาออก(OUTPUT) กำหนดโดยฟังก์ชัน pinMode โดยระบุเลขขานั้นๆ และหน้าที่ของมันว่าเป็น INPUT หรือ OUTPUT
แต่หากต้องการกำหนดให้เป็นการรับค่า analog บนขา A0-A5 ก็ไม่จำเป็นต้องสั่ง pinMode เพราะคอนโทรลเลอร์รู้อยู่แล้วว่า analog ทำได้แค่รับเข้ามาอย่างเดียว
ตัวอย่างการกำหนดขา A0 ให้เป็น digital แบบ INPUT
/**
* กำหนดขา A0 เป็นสัญญาณ digital ขาเข้า
*/
pinMode(A0, INPUT);
/**
* อ่านค่าโดยใช้ digitalRead จะได้ค่า 0 หรือ 1
*/
int value = digitalRead(A0);
ตัวอย่างการกำหนดขา 4 ให้เป็น digital แบบ OUTPUT
/**
* กำหนดขา 4 เป็นสัญญาณ digital ขาเข้า
*/
pinMode(4, INPUT);
/**
* เขียนค่าโดยใช้ digitalWrite(ขา, ระดับสัญญาณ)
* HIGH = 5v (เปิด) , LOW= 0v
*/
digitalWrite(4, HIGH);
digitalWrite(4, LOW);
ตัวอย่างการกำหนดขา A4 ให้เป็น analog แบบ INPUT
/**
* กำหนดขา A4 เป็นสัญญาณ analog ขาเข้า
* ไม่ต้องสั่ง pinMode(A4, INPUT) ถ้าสั่งไประบบจะเข้าใจว่า
* เราให้ A4 เป็น digital
*/
/**
* อ่านค่าโดยใช้ analogRead
* จะได้ค่าระหว่าง 0-1023 (10bit)
*/
int value = analogRead(A4);
แต่สำหรับฟังก์ชัน
pinMode ยังกำหนดขาสัญญาณให้ทำอีกหน้าที่นึงคือ
INPUT_PULLUP ซึ่งจะแตกต่างกับ
INPUT ธรรมดาดังนี้
INPUT จะให้สัญญาณเป็นขาเข้าที่หากวัดแรงดันจะมีค่า 0v เมื่อยังไม่ต่ออุปกรณ์
INPUT_PULLUP จะให้สัญญาณเป็นขาเข้าที่หากวัดแรงดันจะมีค่า 5v เมื่อยังไม่ต่ออุปกรณ์
ซึ่งเป็นเพราะหากเราใช้คำสั่ง
INPUT_PULLUP ระบบจะใช้ตัวต้านทานที่ต่อกับแรงดัน 5v ต่อเข้ากับขาไว้ก่อน ทำให้หากเราใช้คำสั่ง
digitalRead จะได้ค่า 1 หรือ ON ตลอดเวลา จนมีสัญญาณที่เป็น 0v เข้ามาจึงจะอ่านค่าเป็น 0
ทำให้
INPUT_PULLUP มีประโยชน์มากในการลดอุปกรณ์บางชนิดลง เพราะไม่จำเป็นต้องส่งระดับแรงดัน 5v ถึงจะสั่ง ON บน Arduino ได้ แค่ใช้ระดับแรงดัน 0v ก็เพียงพอต่อการเปลี่ยนสถานะ
ลองมาเปรียบเทียบการต่อสวิตซ์เมื่อใช้
INPUT ธรรมดา (รูปบน) และ
INPUT_PULLUP (รูปล่าง) เห็นความแตกต่างอะไรไหมครับ


หวังว่าบทความนี้จะเป็นประโยชน์กับผู้ที่สนใจศึกษา อย่าอายที่จะสอบถามกันเข้ามาหากมีข้อสงสัย
ธนบดี บุหลันศรีชาติ
ผู้เขียน
เลี้ยงกาแฟผมสักแก้ว : https://ko-fi.com/modulemore Reference http://iteiei.blogspot.com/2012/03/blog-post_29.html https://www.arduino.cc/en/Reference.PinMode https://www.arduino.cc/en/tutorial/button