Arduino with Keypad and 4 Channel Relay
Arduino with 4x4 Keypad membrane and 4 Channel Relay
วันนี้จะว่ากันด้วยเรื่องของ 4x4 Keypad membrane นะครับ โดยรุ่นที่นิยมใช้กับ Arduino ก็จะเป็นแบบ 4 x 4 ซึ่งมีตัวเลข 0 - 9 และ ตัวอักษรอีกนิดหน่อย
มาดูหลักการทำงานของ Keypad membrane กันนิดหน่อยนะครับ 4x4 Keypad membrane แบบ 4 x 4 ชนิดนี้ก็ประกอบไปด้วยปุ่ม 16 ปุ่ม ที่เรียงต่อกันเป็นเมตริกซ์แบบ 4 Row และ 4 Column ถ้าใครเคยได้สัมผัสแล้วก็คงพอจะเดาออกว่าปุ่มแต่ละปุ่ม เป็นการกดเพื่อให้หน้าสัมผัสที่เป็นชั้นสีแดงในรูปด้านล่าง ไปแตะกันทำให้เป็นการเชื่อมต่อกันทางไฟฟ้าไปอีกด้านหนึ่งของสวิตช์
ทีนี้หลักการในการตรวจสอบว่าผู้ใช้กำลังกดปุ่มอะไรอยู่นั้นก็ใช้วิธีการ scan ไปทีละ Column ครับจบครบทุก Column แล้วนำมาตีความว่ามีการตอบสนองออกมาเป็นแบบใดบ้าง เช่น ถ้ามีการกดเลข 1 อยู่ ในขณะที่เราจ่ายแรงดัน 5 โวลต์ไปที่ Column ที่ 1 จะมีเพียง Row แรกเท่านั้นที่จะอ่านค่า แรงดันได้ High นอกนั้นจะเป็น Low หรือ ถ้ามีการกดปุ่ม # อยู่ ขณะที่ Scan ไปแต่ละ Column นั้นจะไม่เจอแรงดัน High ที Row ใดเลย จนกว่าจะ Scan ไปถึง Column ที่ 3 ซึ่งจะพบว่ามีการตอบสนองกลับมาจาก Row ที่ 4 นั้นเอง ดังนั้นเมือพบว่าเป็นการ Scan Column ที่ 3 และมี Row 4 ตอบสนอง ก็คือปุ่ม '#' นั่นเอง
อ่านแล้วก็รู้สึกว่าไม่ซับซ้อนมานักใช่มั้ยครับ แต่มันมีมากกว่านั้นอีกตรงที่ว่าจังหวะการกดของคนแต่ละคน กดด้วยช่วงเวลาสั้นยาวไม่เท่ากัน ทำให้ต้องมีการตรวจสอบโดยมีระยะเวลาเข้ามาเกี่ยวข้อง ไม่อย่างนั้นจะสับสนระหว่างการกดแช่ หรือ การกดแบบซ้ำปุ่ม นอกจากนั้นยังต้องมี debouncing ด้วยครับ เพื่อป้องกันการรับค่าผิดจากการ bounce ของสวิตช์ (ถ้าใครเคยเรียน Digital Design อาจจะเข้าใจได้ทันที ถ้าไม่รู้จักก็ไม่เป็นไรนะครับ) แถมยังต้องมีการจดจำปุ่มที่กดไปแล้วอีกว่ากดอะไรไปบ้าง กี่ครั้งแล้ว ก่อนที่จะมาประมวลผล ตรวจสอบค่าที่ใส่ เปรียบเทียบกับค่าที่ตั้งไว้เป็นรหัส
แต่ไม่ต้องกังวลครับ ว่าเริ่มที่จะยุ่งยาก เพราะในโลกนี้มีคนแก่งและใจดีเขียนโปรแกรมขึ้นมาให้ใช้กันฟรีๆ อีกแล้วครับ Library ที่ว่าก็ไป ที่นี่เลยครับ ไม่ต้องเขียนเอง และต่อด้วยการตรวจสอบรหัสอีกอันที่นี่ครับ ฟรีเช่นกัน
โหลดมาแล้วก็เอาไปใส่ใน Folder Library ของเราเช่นเคยนะครับ ใครที่นึกไม่ออกก็กลับไปหาอ่านบทความเก่าของผมก็ได้ครับ แล้วอย่าลืมปิดและเปิดโปรแกรมใหม่หลังจากใส่ไว้ใน Folder library นะครับ
ลองตัวอย่างง่ายๆที่เขาให้มากับ Library กันก่อนครับ
เริ่มต้นจากการต่อ Keypad membrane นี้เข้ากับ Digital Pin ตั้งแต่ D6-D13 โดยเริ่มจาก Pin บนสายแพด้านซ้ายไปขวาของ Keypad นะครับ จากนั้นก็ลอง Sketch ใน Example ชื่อ "Password Keypad" หรือดูตามด้านล่างนี้ครับ
/*|| Simple Password Entry Using Matrix Keypad|| 4/5/2012 Updates Nathan Sobieck: Nathan@Sobisource.com||*///* is to validate password//# is to reset password attempt/////////////////////////////////////////////////////////////////#include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zipPassword password = Password( "1234" );const byte ROWS = 4; // Four rowsconst byte COLS = 4; // columns// Define the Keymapchar keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};byte rowPins[ROWS] = {13, 12, 11, 10};byte colPins[COLS] = {9, 8, 7, 6};// Create the KeypadKeypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );void setup(){Serial.begin(9600);keypad.addEventListener(keypadEvent); //add an event listener for this keypad}void loop(){keypad.getKey();}//take care of some special eventsvoid keypadEvent(KeypadEvent eKey){switch (keypad.getState()){case PRESSED:Serial.print("Pressed: ");Serial.println(eKey);switch (eKey){case '*': checkPassword(); break;case '#': password.reset(); break;default: password.append(eKey);}}}void checkPassword(){if (password.evaluate()){Serial.println("Success");//Add code to run if it works}else{Serial.println("Wrong");//add code to run if it did not work}} |
ในตัวอย่างนี้ก็ใช้ Password เป็น '1234' นะครับ แก้ไขกันได้ตามสะดวก แต่ผมสาธิตโดยใช้ตัวเดิมนะครับ จะเห็นว่าตัว Sketch กำหนดให้เมื่อใส่ Password ครบให้กด * ด้วย ถ้ากดรหัสถูกก็จะแจ้งว่า Success ถ้ากดไปแล้วผิด จะเริ่มต้นใหม่ (Reset) ให้ก็ '#' นะครับ
อีกซักตัวอย่างนึง คราวนี้เราจะเอามันมาเป็น Pass Code เพื่อใช้เข้ารหัสก่อนที่จะสามารถควบคุมการทำงานของ Relay แบบ 4 ช่องได้นะครับ
ผมเอามาจาก http://lathama.net/Arduino_and_Relays_and_a_Keypad ถ้าใครอยากอ่านตัวอย่างนี้ของต้นฉบับ
เริ่มต้นก็ต่อวงจรตามนี้เลยครับ
LEDsRed LED positive connected to Arduino Uno Analog A0Green LED positive connected to Arduino Uno Analog A1Ground legs connected to Arduino GroundRelaysVCC connected to Arduino 5vIN1 connected to Arduino D2IN2 connected to Arduino D3IN3 connected to Arduino D4IN4 connected to Arduino D5Ground connected to Arduino GroundKeypadConnected to Arduino D6-D13Power9V battery connected to Arduino Ground and VIN when not connected to computer USB
ตัวอย่างนี้ใช้ รหัสเริ่่มต้นเป็น '0000' นะครับ เวลาใส่ไม่ต้องใส่ * ตามท้าย ถ้าใส่รหัสถูกต้อง LED สีเขียวจะติด ถ้าใส่ไม่ถูกจะเป็นสีแดง ถ้าอยู่ระหว่างการใส่รหัส LED สีแดงจะกระพริบ หลังจากใส่รหัสถูกแล้ว จะสามารถควบคุม Relay ได้ทั้ง 4 ตัวนะครับ โดยการกดปุ่ม A B C D กดแล้ว Relay ทำงานก็จะได้ยินเสียงป๊อกแป็กชัดเจนครับ :-)
/* Locked Relays** An Arduino Uno, Keypad, Relays and some LEDs for fun** Using a password to enable the relays, then selective* toggle the relays by key.** Needed libraries* http://arduino.cc/playground/uploads/Code/Keypad.zip* http://arduino.cc/playground/uploads/Code/Password.zip*/#include <Keypad.h>#include <Password.h>int relay1 = 2;int relay2 = 3;int relay3 = 4;int relay4 = 5;int locked = 1;int passinput = 0;int lockedled = 14;int unlockedled = 15;long ledflashvar = 0;long ledflashtime = 300;const byte ROWS = 4;const byte COLS = 4;char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};byte rowPins[ROWS] = {13, 12, 11, 10};byte colPins[COLS] = {9, 8, 7, 6};Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );Password password = Password("0000"); // รหัสของการปลดล็อคvoid setup(){// กำหนดค่าเริ่มต้น และ PIN ต่างๆSerial.begin(9600);pinMode(relay1, OUTPUT);digitalWrite(relay1, 255);pinMode(relay2, OUTPUT);digitalWrite(relay2, 255);pinMode(relay3, OUTPUT);digitalWrite(relay3, 255);pinMode(relay4, OUTPUT);digitalWrite(relay4, 255);pinMode(lockedled, OUTPUT);digitalWrite(lockedled, 255);pinMode(unlockedled, OUTPUT);digitalWrite(unlockedled, 0);}void loop(){char key = keypad.getKey(); // รับค่าจาก keypad// กรณีที่ Lock อยู่ LED สีแดงจะติด และหากอยู่ระหว่างการใส่รหัส LED สีแดงจะกระพริบif(locked){if(passinput){unsigned long ledcurrentvar = millis();if(ledcurrentvar - ledflashvar > ledflashtime) {ledflashvar = ledcurrentvar;digitalWrite(lockedled, !digitalRead(lockedled));}}// ถ้าไม่ได้อยู่ระหว่างการใส่รหัสelse{digitalWrite(lockedled, 255); // LED สีแดงจะติด}digitalWrite(unlockedled, 0); // LED สีเขียวดับ}if (key != NO_KEY){Serial.println(key); // แสดงค่าที่กดบน Serial monitorpassword.append(key); // บันทึกค่ารหัสที่กดและเปรียบเทียบกับรหัสที่ถูกต้องpassinput = 1; // อยู่ระหว่างการใส่รหัส// ถ้ากด '*' ให้เริ่มใส่รหัสใหม่if(key == '*'){password.reset(); // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรกpassinput = 0; // ไม่อยู่ระหว่างการกดรหัสlocked = 1;digitalWrite(relay1, HIGH); // ตั้งค่า Relay ให้อยู่ในสถานะ HightdigitalWrite(relay2, HIGH);digitalWrite(relay3, HIGH);digitalWrite(relay4, HIGH);}if(password.evaluate()) { // ถ้าใส่ Password ถูกต้องให้ปลดล็อคlocked = !locked;password.reset(); // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรกpassinput = 0;}// ถ้าปลดล๊อคแล้วให้ไฟสีเขียวติด สีแดงดับ และสามารถควบคุมการเปิดปิดของ Relay ได้if(!locked) {passinput = 0;digitalWrite(lockedled, 0);digitalWrite(unlockedled, 255);switch (key) { // และเลือก Relay ที่ต้องการควบคุมcase 'A':digitalWrite(relay1, !digitalRead(relay1));break;case 'B':digitalWrite(relay2, !digitalRead(relay2));break;case 'C':digitalWrite(relay3, !digitalRead(relay3));break;case 'D':digitalWrite(relay4, !digitalRead(relay4));break;}password.reset(); // เริ่มต้นใส่รหัสใหม่ตั้งแต่ตัวแรก}}} |
เรียบร้อยครับ กับการตั้งรหัสเพื่อควบคุมอุปกรณ์ไฟฟ้า ด้วยต้นทุนไม่ถึง 1500 บาท วันนี้ขอจบบทความเพียงเท่านี้นะครับ หากต้องการถาม หรือ แนะนำติชม หรือ ซื้อสินค้า ก็ติดต่อเข้ามาได้ที่ Website หรือ Facebook ของเรานะครับ
หาข้อมูลเพิ่มเติมได้ที่
โดย Mountain "A"