Keypad เป็นหนึ่งในอุปกรณ์อินพุตที่นิยมใช้ในงานด้านระบบสมองกลฝังตัวมากที่สุด เราสามารถพบเห็นการใช้งาน Keypad ได้จากตู้อัตโนมัติต่าง ๆ เช่น ตู้เติมเงินมือถือ ตู้ซื้อขนมปัง ตู้ ATM ซึ่งแต่ละตู้นำมาใช้เพื่อให้ผู้ใช้บริการกรอกข้อมูลที่เป็นตัวเลขเข้าไป เช่น หมายเลขโทรศัพท์ จำนวนเงิน หมายเลขสินค้า หมายเลขบัญชี รหัสผ่านบัตร ATM แม้เราจะพบเห็นการใช้งาน Keypad ได้ทั่วไป แต่การนำ Keypad มาต่อใช้งานกลับยากอย่างน่าประหลาดใจ
Keypad มักจะบอกขนาดเป็นจำนวนแถว x จำนวนคอลั่มน์ เช่น มี 1 แถว 4 คอลั่มน์ มักจะเขียน 1x4 หรือมี 4 แถว 3 คอลั่มน์ มักจะเขียน 4x3 และ 4 แถว 4 คอลั่มน์ จะเขียนเป็น 4x4
ขอบคุณรูปภาพจาก randomnerdtutorials.com
โครงสร้างภายในของ Keypad เป็นปุ่มกดที่นำแต่ละปุ่มมาต่อกันเป็นวงจรแบบเมตริกซ์ จะแบ่งชุดสายไฟได้ 2 กลุ่ม คือกลุ่มด้านคอลั่มน์ และกลุ่มด้านแถว โดยสายด้านกลุ่มคอลั่มน์ หรือแถว จะต้องมีการต่อตัวต้านทาน Pull-up หรือ Pull-down อยู่ตลอดเวลา การตรวจหาว่าปุ่มใดถูกกดอยู่จะใช้วิธีที่เรียกว่า การสแกน
ขอบคุณรูปภาพจาก www.circuitbasics.com
การสแกน สามารถทำได้หลายวิธี ดังนี้
วิธีสแกนด้านเดียว คือการกำหนดเลือกแถว หรือคอลั่มน์ เป็นอินพุต ส่วนอีกด้านเป็นเอาต์พุต สมมุตให้ด้านแถวเป็นอินพุต มีตัวต้านทานต่อ Pull-down อยู่ และด้านคอลั่มน์เป็นเอาต์พุต
การสแกนแบบนี้ จะต้องทำทั้งหมด จำนวนแถว * จำนวนคอลั่มน์ (สมมุต Keypad ขนาด 4x4 จะต้องสแกนทั้งหมด 16 ครั้ง) เพราะต้องสแกนหาทุก ๆ ปุ่มของ Keypad ซึ่งวิธีนี้อาจจะง่าย แต่จะค่อนข้างจะเปลืองรอบการทำงานของไมโครคอนโทรลเลอร์มาก
วิธีการสแกน 2 ด้าน ในการเขียนโปรแกรมมักใช้วิธีการกำหนดค่าลงไปในรีจิสเตอร์โดยตรง โดยจะประหยัดขั้นตอนการทำงานลงได้มาก แต่จะมีตัวต้านทานต่อ Pull-up หรือ Pull-down อยู่ที่สายทุกเส้น ขั้นตอนการสแกนวิธีนี้ มีดังนี้
จะเห็นว่าการสแกนสองด้านจะมีขั้นตอนที่มากกว่า และเปลืองตัวต้านทานมากกว่า แต่วิธีนี้จะสแกนเพียงสองครั้ง แล้วได้ตำแหน่งของปุ่มที่ถูกกดทันที
Keypad ที่นิยมใช้งานกันในปัจจุบันมักจะมีขนาด 4x4 และ 4x3 ซึ่งต้องใช้สายจำนวน 7 - 8 เส้น ในการต่อเข้ากับไมโครคอนโทรลเลอร์ ซึ่งอาจไม่มีปัญหากับไมโครคอนโทรลเลอร์ 8 บิต มากนัก (เช่น Arduino Uno R3 , Arduino Mega 2560 R3) แต่มักจะเป็นปัญหากับไมโครคอนโทรลเลอร์ 32 บิต เนื่องจากจำนวนขา GPIO มีน้อย ไมโครคอนโทรลเลอร์ 32 บิตหลาย ๆ เบอร์ แต่ละขามีหลายฟังก์ชันให้ใช้งาน ดังนั้นจึงต้องระวังที่จะไปใช้ขาพิเศษเหล่านั้น เช่น ESP8266 ที่ไม่สามารถนำ GPIO0 / GPIO15 / GPIO2 มาใช้งานได้เต็มรูปแบบ จากเดิมที่ขา GPIO มีเพียง 9 ขา (ไม่นับ TX0 RX0) เมื่อตัดขาทั้ง 3 ขาออกไป ทำให้เหลือขาใช้งานเพียง 6 ขาเท่านั้น ซึ่งไม่พอสำหรับใช้งาน Keypad และถึงต่อ Keypad ได้ ก็จะไม่มีสายเพียงพอไปต่อเซ็นเซอร์อื่น ๆ หรือจอแสดงผลได้
วิธีแก้ไข จึงเป็นการลดขาที่ไปต่อเข้ากับไมโครคอนโทรลเลอร์ลง มีทั้งวิธีนำตัวต้านทานมาต่อเพิ่ม เพื่อให้เวลากดปุ่มแต่ละปุ่มค่าแรงดันเอาต์พุตที่อ่านได้จะแตกต่างกัน หรือใช้ไอซีขยายพอร์ตขนาดใหญ่ หรือใช้ Shift Register วิธีเหล่านี้ผู้เขียนมองว่าทำงานไม่เสถียร หรือ สิ้นเปลืองค่าใช้จ่ายมากเกินไป
วิธีที่ผู้เขียนนำเสนอ คือการใช้ไอซีขยายพอร์ตขนาด 8 บิตเบอร์ PCF8547 ใช้การเชื่อมต่อกับไมโครคอนโทรลเลอร์แบบบัส I2C เป็นไอซีขยายพอร์ตที่มีราคาถูก และนิยมใช้งานทั่วไป และมักพบเห็นได้บ่อยครั้งเมื่อใช้จอ LCD แล้วใช้สายเพียง 2 เส้น แบบ I2C
PCF8574 หากต้องการใช้งานเป็น OUTPUT สามารถสั่งให้เป็นลอจิก 0 ได้เท่านั้น หากสั่งให้เป็น HIGH เมื่อใด สถานะจะเป็น INPUT Pull-up ทันที ด้วยคุณสมบัติ INPUT Pull-up อัตโนมัตินี้เอง จึงทำให้เมื่อนำไปต่อเป็นวงจร INPUT จึงไม่ต้องต่อตัวต้านทานใด ๆ เพิ่มเติมเลย
สำหรับบทความนี้จะสาธิตการต่อใช้งาน Keypad ขนาด 4x4 เนื่องจากเป็นขนาดที่นิยมใช้ หากท่านใช้ Keypad ขนาด 4x3 สามารถต่อเรียงได้แบบเดียวกัน เพียงแต่ขาสุดท้ายให้เว้นว่างไว้เท่านั้น
เพื่ออ้างอิงกับไลบรารี่ที่จะใช้ในขั้นตอนต่อไป การต่อวงจรจะเริ่มตั้งแต่แถวที่ 0 ไปจนถึงแถวที่ 4 จากนั้นเริ่มที่คอลั่มน์ที่ 1 ไปจนถึงคอลั่มน์สุดท้าย ต่อเรียงกันไปจากขา P0 ถึง P7 รวมจะใช้ครบ 8 บิตพอดี
กรณีใช้ Keypad ขนาด 4x3 สามารถต่อวงจรได้ดังรูปนี้
หากต้องการความสะดวกมากยิ่งขึ้น หรือต้องการนำไปใช้กับสินค้าของท่านเอง ท่านสามารถเลือกใช้งานโมดูลสำเร็จรูปที่ผลิตโดย ThaiEasyElec ได้ ร้านไอโอเอ็กซ์ฮ๊อบนำมาจำหน่ายในชื่อ TEE I2C Keypad - 4x4 Keypad I2C Two-wire bus ราคาเพียง 310 บาทเท่านั้น วงจรภายในโมดูลเหมือนกับวงจรที่สอนต่อในบทความนี้ทุกประการ
บอร์ด Arduino Uno R3 มี I2C เพียงช่องเดียว ที่ A4 A5 และ 2 ช่องสุดท้ายด้านขวาบน การต่อใช้งานจึงจำเป็นต้องต่อขา SDA และ SCL ให้ถูกต้อง
NodeMCU 1.0 ใช้ ESP8266 รองรับการเลือกขาใช้งานได้อิสระ แต่มีค่าเริ่มต้นขา SDA อยู่ที่ขา D2 และ SCL อยู่ที่ขา D1 หากต้องการเปลี่ยนขาให้เข้าไปแก้ไขในโค้ดโปรแกรมด้วย
NodeMCU-32S ใช้ ESP32 เป็นแกนหลัก รองรับการเลือกขาใช้งานได้อิสระ แต่มีค่าเริ่มต้นขา SDA อยู่ที่ขา GPIO21 และ SCL อยู่ที่ขา GPIO22 หากต้องการเปลี่ยนขาให้เข้าไปแก้ไขในโค้ดโปรแกรมด้วย
ใช้งานไลบรารี่ ioxhop/I2C_KEYPAD โดยเข้าไปที่ส่วนของ Releases · ioxhop/I2C_KEYPAD แล้วเลือกดาวน์โหลดเวอร์ชั่นล่าสุดของไลบรารี่ (แนะนำให้เลือกเป็นไฟล์ .zip)
เปิดไฟล์ที่ได้ดาวน์โหลดไว้ขึ้นมา จากนั้นลากโฟลเดอร์จากในโปรแกรมคลายไฟล์ (WinRAR, 7-zip) ไปใส่ไว้ในโฟลเดอร์ Documents\Arduino\libraries
แก้ไขชื่อโฟลเดอร์ ลบขีดกลาง (-) และข้อความหลังขีดกลางออก
เปิดโปรแกรม Arduino ขึ้นมา จากนั้นกดไปที่ File > Examples > I2C_KEYPAD เลือก Ex_keypad
หากต่อขา I2C ตามขามาตรฐานของบอร์ด สามารถอัพโหลดโปรแกรมลงบอร์ดได้เลย (อย่าลืมเลือกบอร์ด และพอร์ตก่อน) แต่หากใช้ ESP32 / ESP8266 และเปลี่ยนขาใช้งาน I2C ให้แก้บรรทัดที่ 5 - 6 ดังนี้
หลังจากแก้ไขครบแล้ว สามารถอัพโหลดโปรแกรมลงบอร์ดได้เลย
เมื่ออัพโหลดเสร็จแล้ว ให้ปรับไปที่ 9600 จากนั้นลองกดปุ่มบน Keypad จะปรากฏหมายเลขปุ่มที่กด (ดังรูป)
ไลบรารี่ ioxhop/I2C_KEYPAD ประกอบไปด้วยฟังก์ชันต่าง ๆ ดังนี้
Constructor
รูปแบบ: I2CKEYPAD(int sda = -1, int scl = -1)
ใช้สำหรับ: กำหนดขา SDA และ SCL สำหรับ ESP32 / ESP8266 และใช้เริ่มต้นการทำงานของไลบรารี่
ค่าที่ต้องส่งเข้า มีดังนี้
I2CKEYPAD::begin
รูปแบบ: void I2CKEYPAD::begin(char addr = 0x20, long interval = 200)
ใช้สำหรับ: เริ่มต้นใช้งานติดต่อกับ PCF8574 ผ่าน I2C กำหนดหมายเลข Address ของ PCF8574 และกำหนดเวลาสแกน
ค่าที่ต้องส่งเข้า มีดังนี้
ไม่มีค่าที่ส่งกลับ
I2CKEYPAD::scand
รูปแบบ: void I2CKEYPAD::scand()
ใช้สำหรับ: ไล่สแกนทุกปุ่มของ Keypad ว่าขณะนั้นมีการกดปุ่มใดหรือไม่
ไม่มีค่าที่ต้องส่งเข้า
ไม่มีค่าที่ส่งกลับ
I2CKEYPAD::on
รูปแบบ: void I2CKEYPAD::on(KEYPAD_EVENT event, KeypadEventCallback callback)
ใช้สำหรับ: กำหนดฟังก์ชันที่จะถูกเรียกเมื่อเกิดเหตุการณ์ตามที่กำหนด
ค่าที่ต้องส่งเข้า มีดังนี้
ไม่มีค่าที่ส่งกลับ
ส่วนนี้จะเป็นตัวอย่างโค้ด แลละการต่อวงจรเพื่อใช้งาน Keypad เพื่อกดรหัสผ่านร่วมกับอุปกรณ์แสดงผลแบบอื่น ๆ ซึ่งจะทำให้ผู้อ่านเข้าใจวิธีการใช้งานไลบรารี่ ioxhop/I2C_KEYPAD มากยิ่งขึ้น
เริ่มต้น หลอดไฟทั้งหมด 8 ดวงจะเป็นสีแดง เมื่อเริ่มกดรหัสผ่าน หลอดไฟจะเปลี่ยนเป็นสีเขียวครั้งละ 2 ดวง เมื่อกดครบ 4 ครั้ง จะเปลี่ยนเป็นเขียว หากกดรหัสผ่านถูก (1234) และเป็นสีแดงหากกดรหัสผ่านผิด กระพริบ 4 ครั้ง จากนั้นจึงเริ่มให้กรอกรหัสใหม่อีกครั้ง
อุปกรณ์ที่ใช้มี 3 ชิ้นดังนี้
ต่อวงจรดังนี้
ไลบรารี่ที่จำเป็นต้องติดตั้ง มีดังนี้
โค้ดโปรแกรม
เริ่มต้นหน้าจอจะแสดง Enter Password เมื่อกดรหัสผ่านครบ 4 ตัว หน้าจอจะแสดง Correct เมื่อพิมพ์รหัสผ่านถูก (1234) และแสดง Wrong เมื่อพิมพ์รหัสผ่านผิด จากนั้นจะกลับมาให้กรอกรหัสผ่านใหม่อีกครั้ง
อุปกรณ์ที่ใช้มี 3 ชิ้นดังนี้
ต่อวงจรดังนี้
ไลบรารี่ที่จำเป็นต้องติดตั้ง มีดังนี้
โค้ดโปรแกรม
เริ่มต้นหน้าจอจะแสดง Enter Password to unlock เมื่อกดรหัสผ่านครบ 4 ตัว หน้าจอจะแสดง Correct เมื่อพิมพ์รหัสผ่านถูก (1234) และแสดง Wrong เมื่อพิมพ์รหัสผ่านผิด จากนั้นจะกลับมาให้กรอกรหัสผ่านใหม่อีกครั้ง
อุปกรณ์ที่ใช้มี 3 ชิ้นดังนี้
ต่อวงจรดังนี้
ไลบรารี่ที่จำเป็นต้องติดตั้ง มีดังนี้
โค้ดโปรแกรม
เป็นมินิโปรเจคที่ทำขึ้นมาเพื่อสาธิตการนำ I2C Keypad ไปใช้งานจริง หลักการทำงานคือเมื่อกดเลขหวยที่ต้องการแล้ว จะไปส่งเลขไปยังเซิร์ฟเวอร์ แล้วนำผลการตรวจมาแสดงผลในรูปแบบภาษาไทย
อุปกรณ์ที่ใช้มี 3 ชิ้นดังนี้
ต่อวงจรดังนี้
ไลบรารี่ที่จำเป็นต้องติดตั้ง มีดังนี้
โค้ดโปรแกรมมีหลายไฟล์ สามารถเข้าไปดาวน์โหลดได้ที่ ioxhop/ESP32-CheckLotto
I2C Keypad คือการใช้ Keypad ผ่าน I2C โดยใช้ไอซี PCF8574 ซึ่งจะช่วยลดสายที่เชื่อมต่อเข้ากับไมโครคอนโทรลเลอร์ได้มาก จากเดิมใช้สายมากถึง 8 เส้น เหลือเพียง 2 เส้น บัส I2C สามารถใช้งานได้กับไมโครคอนโทรลเลอร์ทุกเบอร์ ทุกตะกูล สำหรับ Arduino ทางร้านไอโอเอ็กซ์ฮ๊อบได้จัดทำไลบรารี่ ioxhop/I2C_KEYPAD ไว้ให้แล้ว ทำให้สามารถใช้งานได้ง่ายขึ้นมาก
สำหรับบทความนี้ก็ขอจบเพียงเท่านี้ ในบทความหน้าจะเป็นเรื่องเกี่ยวกับอะไร ฝากติดตามด้วยนะครับ สำหรับวันนี้
~ สวัสดีครับ ~