4x4 Matrix Keypad Module
ماژول صفحه کلید ماتریسی 4x4
هر روز که در مسیر اداره، دانشگاه، مدرسه یا … نیاز به پول پیدا میکنید سریع با مراجعه به یک دستگاه ATM یا خود پرداز پول دریافت میکنید. تا حالا چقدر به کیپد های این دستگاهها دقت کرده بودید؟ همین کیپد های کوچک روزانه کار انسانهای زیادی را راه میاندازد.
اگر شما بخواهید اطلاعات را به میکروکنترلر وارد کنید راههای زیادی دارید. مثلا از طریق پورت سریال (مطالعه آموزش پورت سریال)، استفاده از SPI و … . یکی از راههای ساده این است که با استفاده از کلید اطلاعات را میکروکنترلر بدهید. اما هر کلید یک پین از میکروکنترلر را مصرف میکند.
در بعضی از پروژه ها لازم است تا میکرو کنترلر اطلاعاتی را توسط کاربر جهت تنظیم کردن ، دریافت کند. به طور نمونه یک میکرو کنترلر 40 پایه (مثل ATmega32) دارای 32 خط ورودی و خروجی می باشد. بنابراین برای اتصال 16 کلید فشاری به شکل ساده ، به نصفی از ورودی و خروجی ها نیاز دارد. ولی می توان به چندین روش متفاوت کلید های زیادی را حتی با یک ورودی تشخیص داد.
تصور کنید که بخواهید با استفاده از ۱۶ کلید اطلاعات را به میکرو وارد کنید. در این صورت دو پورت ۸ بیتی کاملا مصرف میشود و اگر پروژهی شما به ادوات جانبی زیادی نیاز داشته باشد احتمالا با مشکل کمبود پورت مواجه خواهید شد. گذشته از این ۱۶ کلید جدا از هم فضای زیادی روی بورد مصرف میکند. پس باید به فکر راه کاری بهتر بود. چنین مشکلاتی باعث ابداع صفحه کلیدهای ماتریسی شد.
صفحه کلیدها در پایین ترین سطح خود به صورت ماتریسی از سطرها و ستونها تشکیل شده اند که keypad نام دارند. میکروکنترلر از طریق پورتها می تواند به این سطرها و ستونها دسترسی داشته باشد. یعنی ما می توانیم با استفاده از یک پورت هشت بیتی یک ماتریس ۴*۴ از کلید ها را به میکرو متصل کنیم. وقتی یک کلید فشار داده می شود یک سطر و ستون به هم متصل میشوند.
در غیر این صورت هیچ گونه اتصالی بین سطرها و ستونها وجود ندارد. همان طور که در شکل بالا مشاهده میکنید. ۴ سطر و ۴ ستون وجود دارد که هیچ گونه اتصالی به هم دیگر ندارند. برای مثال اگر کلید s1 فشرده شود. سطر ۱ و ستون ۱ به هم دیگر وصل میشوند. برای اتصال این صفحه کلید کوچک به میکروکنترلر در بدترین حالت ۸ پین مصرف میشود. یعنی تا این جا توانستیم نصف پینها را آزاد کنیم.
آموزش کامل راه اندازی کیپد 4×4 با آردوینو
کیپدهای ماتریسی از نمونه صفحه کلیدهایی هستند که شما در موبایل، ماشین حساب، مایکرویو، اجاق، قفل در و … میبینید. شاید بتوان گفت که این صفحه کلید در همه جا وجود دارد! در پروژههای الکترونیک، این صفحه کلید یکی از بهترین روشهایی است که با استفاده از آن میتوانید به کاربران این فرصت را دهید تا با پروژه شما ارتباط برقرار کنند. به علاوه، این صفحه کلید اغلب برای دسترسی به منو، وارد کردن رمز و کنترل کردن ربات لازم است.
کیپدهای مختلفی وجود دارد، اما ما در این پروژه به بررسی کیپدهای ممبرین 4×4 میپردازیم. بیایید کیپد 4×4 را به عنوان نمونه باهم بررسی کنیم. همانطور که در تصویر بالا میبینید، این کیپد 16 کلید دارد و پشت هر کلید سوئیچ ممبرین خاصی قرار گرفته است. همه سوئیچهای این کیپدها با مسیرهای هادی بهم متصل شدهاند و زیر این پدها یک ماتریس 4×4 را تشکیل میدهند.
اگر از 16 کلید این کیپد استفاده کنید، به 17 پایه ورودی نیاز خواهید داشت ( برای هر کلید یک پایه و یک پایه برای زمین). با این حال، با این آرایش ماتریس، شما تنها به 8 پایه میکروکنترلر (4 سطر و 4 ستون) برای اسکن کردن همه کلیدها نیاز خواهید داشت.
نحوه کار و نحوه اسکن کردن کیپد 4×4
نحوه عمکلرد کیپدها بسیار ساده است. با فشردن یک کلید، یکی از خطهای سطر به یکی از خطهای ستون وصل میشود. برای مثال همانطور که در انیمیشن زیر مشاهده میکنید، با فشردن کلید 4، ستون 1 و سطر 2 به یکدیگر متصل میشوند.
همانطور که در تصویر بالا میبینید، با فشردن هر کلید، ستون و سطر مربوطه به هم متصل میشوند.
- میکروکنترلر، سطرها را خروجی و ستونها را ورودی در نظر میگیرد.
- سپس به یکی از سطرها مقدار HIGH میدهد.
- بعد از آن، خطوط ستون را یکی یکی بررسی میکند.
- اگر اتصال یک ستون LOW بماند، کلید آن سطر فشرده نشده است.
- اگر همین ستون HIGH شود، میکروکنترلر تشخیص میدهد کدام سطر و ستون HIGH شده است.
- در آخر، متناسب با سطر و ستون شناسایی شده، کلید فشرده شده را تشخیص میدهد.
اتصال کیپد به آردوینو ساده است. در ابتدا، پایه 1 صفحه کلید را به پایه دیجیتال 9 آردوینو متصل کنید و به همین ترتیب اتصالات را انجام دهید یعنی پایه 2 کیپد را به پایه 8 آردوینو وصل کنید و این روند را ادامه دهید.
نصب کتابخانه کیپد
برای اینکه بفهمید کدام کلید فشرده شده است، باید سطرها و ستونها را دائما اسکن کنید. خوشبختانه کتابخانه Keypad.h پیچیدگیهای غیر ضروری را برای شما کم کرده است تا با دستورات ساده بتوانید تشخیص دهید که کدام یک از کلیدها فشرده شده است. با کلیک بر روی لینک زیر میتوانید این کتابخانه دانلود کنید:
برای نصب کتابخانه مسیر زیر را دنبال کنید:
Sketch > Include Library > Manage Libraries…
پس از آن، کمی صبر کنید تا Library manager، فهرست کتابخانهها را دانلود کند و لیست کتابخانههای نصب شده را بروز نماید.
کلمه keypad را در Library manager جستجو کنید. با این کار، کتابخانههای متعددی ظاهر میشود. شما باید کتابخانه نوشته شده توسط Mark Stanley, Alexander Brevig را پیدا و نصب کنید.
کد آردوینو
دستورات زیر به شما نشان میدهد که چگونه کلید فشرده شده کیپد 4×4 را تشخیص دهید. حتی میتوانید از این دستورات به عنوان مبنایی برای سایر پروژههای خود استفاده کنید.
// WWW.NIKISITE.COM
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
Serial.begin(9600);
}
void loop(){
char key = keypad.getKey();// Read the key
// Print if key pressed
if (key){
Serial.print(“Key Pressed : “);
Serial.println(key);
}
}
خروجی این کد بر روی سریال به شکل زیر خواهد بود:
توضیحات کد:
دستوراتی که در بالا دیدید، ابتدا کتابخانه Keypad.h را فراخوانی میکند. سپس، تعداد سطرها و ستونهای کیپدی را که میخواهید از آن استفاده کنید، تعریف میکند.
پس از آن، شما باید آرایه 2 بعدی keys[ROWS][COLS] را که نقشه کیپد را مشخص میکند، تعریف کنید. زمانیکه یک کلید خاص از صفحه کلید فشرده شود، کاراکتر متناظر با آن کلید بر روی سریال مانیتور نمایش داده میشود. در کدهای بالا، کاراکترهایی که داخل آرایه آورده شدهاند، به همان شکلی هستند که بر روی کیپد قرار دارند. با این حال، شما میتوانید کاراکترهای مختلفی تعریف کنید. به عنوان مثال اگر میخواهید یک ماشین حساب بسازید، تنها کافی است آرایه را به شکل زیر تعریف کنید:
char keys[ROWS][COLS] = {
{‘1′,’2′,’3′,’4’},
{‘5′,’6′,’7′,’8’},
{‘9′,’0′,’+’,’-‘},
{‘.’,’*’,’/’,’=’}
};
پس از تعریف آرایه، باید یک شئ از کتابخانه Keypad ایجاد کنید. ساختار Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS ) پنج پارامتر دارد:
makeKeymap(keys): این پارامتر، نقشه داخلی کیپد را مقداردهی میکند تا با نقشهای که توسط کاربر تعریف شده است، یکسان باشد.
rowPins و colPins: این دو پارامتر، پایههای آردوینو هستند که به سطرها و ستونهای صفحه کلید متصل شدهاند.
ROWS و COLS: این دو پارامتر، تعداد سطرها و ستونهای صفحه کلید هستند.
زمانیکه شی کیپد ایجاد شد، میتوانید با استفاده از دستور ساده ()getKey بفهمید که کدام یک از کلیدها فشرده است.
توابع مفید در کتابخانه Keypad
در کتابخانه Keypad، توابع مفیدی وجود دارد که شما میتوانید از آنها برای ساخت شئ Keypad استفاده کنید. برخی از آنها را میتوانید در ادامه مشاهده کنید:
()char waitForKey: این تابع همیشه منتظر است تا یک کلید فشرده شود. هشدار! این تابع همه کدها را تا زمانی که یک کلید فشرده شود، متوقف میکند. این موضوع به این معنا است که اگر شما از LED و LCD استفاده کنید، به استثنای وقفهها، خبری از LED چشمک زن و به روزرسانی شدن نمایشگر LCD نخواهد بود.
()KeyState getState: این تابع، حالت فعلی هر کلید را برمیگرداند. 4 حالت کلید عبارت اند از: IDLE, PRESSED, RELEASED و HOLD.
()boolean keyStateChanged: این تابع شما را از تغییر وضعیت هر کلید با خبر میکند. یعنی هر زمان که کلیدی، حتی به صورت اتفاقی، روی کیپد فشرده شود ، این تابع شما را از این تغییر وضعیت مطلع میکند.
setHoldTime(unsigned int time): بهوسیله این تابع میتوان مدت زمانی (برحسب میلی ثانیه) را که یک کاربر باید یک کلید را نگه دارد تا حالت HOLD برای کلید تشخیص داده شود، تنظیم کرد.
setDebounceTime(unsigned int time): با این تابع، شما میتوانید مدت زمان Debounce را برحسب میلی ثانیه تنظیم کنید. یعنی هر زمان که کلیدی فشرده شود، با استفاده از این تابع میتوانید از خطایی که به دلیل نوسانات کلید به وجود میآید، جلوگیری کنید.
addEventListener(keypadEvent): با استفاده از این تابع میتوانید هر نوع تغییری در صفحه کلید از جمله فشرده شدن، نگه داشتن و رها شدن کلیدها را تشخیص دهید.
لیست المان های NSE-KP44
Quantity | Code | Symbol |
---|---|---|
16 | Push Buttons | SW |
8 | 1x8 SIL Straight Male as Key | Pin Header |
4cm x 4cm | Single Side with Solder Mask and Helper | PCB |
/**
Arduino Calculator
By Farhad Nikkhah
https://www.NikiSite.com
https://www.nikisite.com/product/nse-kp44/
*/
#include
#include
/* Display */
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = { 5, 4, 3, 2 };
byte colPins[KEYPAD_COLS] = { A3, A2, A1, A0 };
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{ '1', '2', '3', '+' },
{ '4', '5', '6', '-' },
{ '7', '8', '9', '*' },
{ '.', '0', '=', '/' }
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
uint64_t value = 0;
void showSpalshScreen() {
lcd.print("www.NikiSite.com");
lcd.setCursor(3, 1);
String message = "Calculator";
for (byte i = 0; i < message.length(); i++) {
lcd.print(message[i]);
delay(50);
}
delay(2000);
}
void updateCursor() {
if (millis() / 250 % 2 == 0) {
lcd.cursor();
} else {
lcd.noCursor();
}
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
showSpalshScreen();
lcd.clear();
lcd.cursor();
lcd.setCursor(1, 0);
}
char operation = 0;
String memory = "";
String current = "";
uint64_t currentDecimal;
bool decimalPoint = false;
double calculate(char operation, double left, double right) {
switch (operation) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
}
}
void processInput(char key) {
if ('-' == key && current == "") {
current = "-";
lcd.print("-");
return;
}
switch (key) {
case '+':
case '-':
case '*':
case '/':
if (!operation) {
memory = current;
current = "";
}
operation = key;
lcd.setCursor(0, 1);
lcd.print(key);
lcd.setCursor(current.length() + 1, 1);
return;
case '=':
float leftNum = memory.toDouble();
float rightNum = current.toDouble();
memory = String(calculate(operation, leftNum, rightNum));
current = "";
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(memory);
lcd.setCursor(0, 1);
lcd.print(operation);
return;
}
if ('.' == key && current.indexOf('.') >= 0) {
return;
}
if ('.' != key && current == "0") {
current = String(key);
} else if (key) {
current += String(key);
}
lcd.print(key);
}
void loop() {
updateCursor();
char key = keypad.getKey();
if (key) {
processInput(key);
}
}
دیدگاهها
پاکسازی فیلترهیچ دیدگاهی برای این محصول نوشته نشده است.