راهاندازی صفحه کلید ۳×۴ و ۴×۴ با آردوینو
سلامی دوباره. فاطمه هستم و با سری آموزشهای کاربردی تیم مِهصا در خدمتتان هستم. امروز از آموزش سخت و پر چالش خبری نیست. امروز قصد داریم یک قطعهی الکترونیکی بسیار ساده را آموزش دهیم. برخلاف ساده بودن آن، بسیار قطعهی پرکاربردی در حرفهی ما است. پس آموزش را سرسری نگیرید. با من همراه باشید.
صفحه کلیدها (keypads) مجموعهای از دکمهها هستند که در یک صفحه یا پد مرتب شدهاند. در این پد کلیدهای مربوط به ارقام، نمادها یا حروف الفبا قرار دارد. صفحه کلیدهایی که بیشتر حاوی عدد هستند و در رایانهها استفاده میشوند، صفحه کلیدهای عددی نام دارند. درواقع صفحه کلیدها در دستگاههایی یافت میشوند که بیشتر به ورودی عددی نیاز دارند. مانند ماشینحساب، کنترل تلویزیون، تلفنهای دکمهای، خودپردازها، قفلهای ترکیبی و قفلهای دیجیتالی درب و....
در اینجا ما نوع رایج صفحه کلیدها را بررسی میکنیم. صفحه کلید ماتریکس، نوعی از صفحه کلید است که در تلفنهای همراه، ماشین حسابها، اجاقهای ماکروویو، قفل درها و ... مشاهده میشود. عملاً همهجا هستند. با این حال، در الکترونیک استفاده از این صفحه کلیدها یک روش عالی برای جابهجایی در منوها، وارد کردن رمزهای عبور و کنترل رباتها است.
بررسی سختافزار صفحه کلید
صفحه کلیدها از یک مادهی غشایی نازک و انعطافپذیر ساخته شدهاند. در اندازههای ۴×۳، ۴×۴، ۴×۱ و ... موجود هستند. صرفنظر از اندازه، همهی آنها به یک روش کار میکنند. یکی از نکات جالب درمورد آنها این است که دارای پشتی برچسبی هستند بنابراین میتوانید آن را به هر چیزی متصل کنید.
صفحهکلید ۴×۴ را بهعنوان مثال درنظر بگیرید. درکل ۱۶ کلید دارد. در زیر هر کلید، یک سوئیچ غشایی خاص قرار دارد. تمام این کلیدهای غشایی با سیمهای رسانا در زیر پد به یکدیگر متصل میشوند و یک ماتریس شبکهی ۴×۴ را تشکیل میدهند.
اگر از ۱۶ کلید تکی استفاده کرده بودید، برای عملکرد آنها به ۱۷ پایهی ورودی (برای هر کلید یک پایهی اتصال و یک اتصال به زمین) نیاز داشتید اما با آرایش ماتریس، فقط به ۸ پایهی میکروکنترلر (۴ ستون و ۴ ردیف) برای اسکن از طریق پد نیاز دارید.
پینهای صفحه کلید ۴×۳ و ۴×۴
پینهای صفحه کلید ۴×۳ و ۴×۴ به شرح زیر است:
از این که پایهها را توضیح ندادم نگران نشوید. آنها توضیحات خاصی ندارند. پایههای با علامت R مربوط به ردیفها (ROW) و پایههای با علامت C مربوط به ستونها (COLUMN) هستند که در ادامه مشاهده میکنید که همگی به پایههای دیجیتال برد آردوینو متصل میگردند.
صفحهکلید چگونه کار میکند و چگونه میتوان آن را اسکن کرد؟
اصل کار بسیار ساده است. فشار دادن یک دکمه، یکی از خطوط ردیف را به یکی از خطوط ستون متصل میکند و اجازه میدهد جریان بین آنها به وجود آید. بهعنوان مثال، هنگامی که کلید 1 فشرده میشود، ستون ۱ و ردیف 1 بهم متصل میشوند.
یک میکروکنترلر میتواند این خطوط را برای حالت button-pressed (فشاردادن دکمه) اسکن کند. برای انجام این کار، مراحل زیر اجرا میشود.
1. میکروکنترلر تمام خطوط ستون و ردیف را بهعنوان ورودی تنظیم میکند.
2. سپس یک ردیف را انتخاب کرده و آن را برروی HIGH تنظیم میکند.
3. پس از آن، خطوط ستون را یکبهیک بررسی میکند.
4. اگر اتصال ستون LOW باشد، دکمهی روی ردیف، فشار داده نشدهاست.
5. اگر High شود، میکرو آن سطر را تشخیص داده و متوجه میشود که کدام ستون نیز High شده است.
6. در نهایت متوجه میشود که کدام دکمه فشرده شدهاست.
سیمکشی صفحه کلید ۴×۳ و ۴×۴ با آردوینو
اکنون که همهچیز را درمورد صفحه کلید دانستیم، میتوانیم اتصال آن را به آردوینو شروع کنیم. اتصالات بسیار ساده هستند. با اتصال پایهی ۱ صفحه کلید به پایهی ۹ دیجیتال در آردوینو شروع کنید. اکنون به اتصال پینها به چپ، مانند ۲ به ۸، ۳ به ۷ و... ادامه دهید.
نصب کتابخانهی مربوط به صفحه کلید
برای تعیین اینکه کدام کلید فشرده شدهاست، باید ردیفها و ستونها را بهطور مداوم اسکن کنیم. خوشبختانه Keypad.h برای پنهان کردن این پیچیدگی نوشته شدهاست تا بتوانیم دستورات ساده صادر کنیم و تشخیص دهیم که کدام کلید فشرده شدهاست. برای نصب کتابخانه، به ترتیب به sketch > include library > manage library بروید. منتظر بمانید تا manage library فهرست کتابخانهها را بارگیری کند و لیست کتابخانههای نصب شده را بهروز کند.
با تایپ کردن “keypad” جستوجوی خود را فیلتر کنید. باید چند مورد به شما نمایش داده شود. به دنبال keypad by mark Stanley, alexander brevig باشید. با کمی scroll آن را پیدا کرده و بر روی آن کلیک کنید و سپس install را بزنید.
کد آردوینو
نمونههای زیر به شما درکی کامل درمورد نحوهی تشخیص فشار کلیدها با صفحه کلید ۴×۳ و ۴×۴ را میدهد و میتواند بهعنوان پایهی پروژههای پیشرفتهتر باشد.
کد برای صفحهکلید ۴×۳
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3}; //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);
}
}
کد برای صفحهکلید ۴×۴
#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 و تعیین تعداد ردیفها و ستونهای روی صفحه کلید که میخواهید استفاده کنید، شروع میشود. پس از آن یک آرایهی دو بُعدی برای صفحه کلید تعریف میکنیم که حروف را برای فشار دادن یک دکمهی خاص روی صفحه کلید، چاپ کند.
در کد ما، characterها دقیقاً همانطور که روی صفحه کلید نشان داده میشوند، ترسیم میگردند. با این حال شما میتوانید هرگونه که خود دوست دارید آرایه را تعریف کنید. برای مثال اگر قصد ایجاد یک پروژهی ماشین حساب را دارید، میتوانید تعریف آرایه را بهصورت زیر تغییر دهید.
char keys[ROWS][COLS] = {
{'1','2','3','4'},
{'5','6','7','8'},
{'9','0','+','-'},
{'.','*','/','='}
};
سپس ما یک شیء از کتابخانهی صفحه کلید ایجاد میکنیم. Constructor keypad پنج متغیر میگیرد: makekeypad(keys)، rowpins، colpins، rows و cols .
· Makekeypad(keys) نقشهی کلید داخلی را برابر میکند تا برابر با نقشهی کلید تعریف شده توسط کاربر باشد.
· Rowpins و colpins پینهای آردوینو هستند که ردیفها و ستونهای صفحه کلید به آنها متصل میشوند.
· Rows و cols تعداد ردیفها و ستونهای صفحه کلید است.
هنگامی که یک object صفحه کلید ایجاد شد، میتوانیم از دستور سادهی getKey() برای بررسی اینکه کدام کلید فشرده شدهاست، استفاده کنیم.
سایر توابع مفید در کتابخانهی صفحهکلید
چند تابع مفید وجود دارد که میتوانید برای صفحه کلید استفاده کنید. تعدادی از آنها در زیر آمده است.
· Char waitForKey() منتظر میماند تا اینکه کسی یک کلید را فشار دهد. تا زمانی که کلید فشرده نشود، همهی کدهای دیگر را مسدود میکند به استثنای برنامههای مربوط به وقفه.
· KeyState getState() حالت فعلی هر کلید را برمیگرداند.
· Boolean KeyStateChanged() به شما اطلاع میدهد که چه زمانی کلید از یک حالت به حالت دیگر تغییر کردهاست.
· SetHoldTime() (زمان بینالمللی) تا زمانیکه دکمه فشار داده شده است تابع HOLD را نگهمیدارد.
· SetDebounceTime(unsigned int time) مقدار میلیثانیه را تنظیم میکند که صفحه کلید منتظر بماند تا زمانی که کلید فشار جدید را بپذیرد.
· AddEventListener (keypadEvent) درصورت استفاده از صفحه کلید، رویدادی را راهاندازی میکند.
حال که با کارکرد ابتدایی keypad آشنا شدیم بهتر است کمی پیشرفتهتر وارد جزئیات آن شویم و به صورت دیگر آن را راهاندازی کنیم.
راهاندازی keypad با استفاده از 1 پین آردوینو
برای راهاندازی keypad باید یک آرایه مقاومتی همانند شکل زیر بسازیم.
این مقادیر مقاومتها بیشترین اختلاف پتانسیل پیدرپی ممکن را برای آنالوگ ورودی ما تأمین میکنند که این مقادیر عبارتاند از:
کلید |
هیچ |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
مقدار |
1023 |
679 |
505 |
477 |
446 |
639 |
407 |
367 |
322 |
587 |
263 |
202 |
130 |
558 |
170 |
93 |
0 |
کمترین فاصله بین این مقادیر 28 است. برای بستن مدار کافی است که طبق مدار بالا عمل کنید و تنها پین خروجی کیپد را به A0 متصل کنید.
کد
#include <SPI.h>
#define HARDWARE_SPI 1
// SPI setup
const int LATCH_PIN = 13; //storage register clock (slave select)
const int DATA_PIN = 1; //data in
const int CLOCK_PIN = 2; //shift register clock
// Matrix setup
const int SmallestGap = 28;
const int nButtons = 16;
int AnalogVals[] = {1023, 679, 639, 587, 558, 505, 477, 446,
407, 367, 322, 263, 202, 170, 130, 93, 0};
int Buttons[] = {0, '1', '4', '7', 'E', '2', '3', 'A',
'5', '6', 'B', '8', '9', '0', 'C', 'F', 'D'};
void setup(void) {
SPI.begin();
SPI.setDataMode(0);
pinMode(LATCH_PIN, OUTPUT);
digitalWrite(LATCH_PIN, HIGH);
}
// Returns the button character or 0 if no button pressed
char ReadButton() {
int val = analogRead(A2) + SmallestGap/2;
for (int i=0; i<=nButtons; i++) {
if (val >= AnalogVals[i]) return Buttons[i];
}
}
void loop(void) {
digitalWrite(LATCH_PIN, LOW);
SPI.transfer(0x76); // Clear display
int b = ReadButton();
if (b != 0) SPI.transfer(b);
digitalWrite(LATCH_PIN, HIGH);
delay(100);
}
دقت کنید که در اینجا من به جای * و # از E و F استفاده کردهام. اگر یک keypad 3*4 داشتیم نحوه بستن آرایه مقاومتی آن به صورت زیر است:
راهاندازی keypad با استفاده از i2c و آیسی PCF8574P
تا اینجا یادگرفتیم که keypad را با استفاده از یک سیم و چندین سیم راهاندازی کنیم. در این مرحله میخواهیم بررسی کنیم که با استفاده از پروتکل i2c و با استفاده از آیسی PCF8574P ( پروتکل دو سیمه) keypad چگونه به کار گرفته میشود.
نحوه اتصال سیم ها به آیسی PCF8574P به صورت زیر است
برای راهاندازی keypad با استفاده از پروتکل i2c باید ابتدا کتابخانه مربوط به آن را در محیط آردوینو نصب کنیم برای این کار به بخش manage library رفته و در قسمت جستوجو عبارت keypad را نوشته و I2C keypad را پیدا کرده و سپس آن را نصب کنید.
کد آردوینو keypad i2c
// I2C Keypad for Arduino
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#define I2CADDR 0x38
const byte ROWS = 4; //four rows
const byte COLS = 4 ; //three columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad
Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );
void setup() {
Wire.begin( );
kpd.begin( makeKeymap(keys) );
Serial.begin(9600);
Serial.println( "start" );
}
void loop() {
char key = kpd.getKey();
if (key) {
Serial.println(key);
}
میبینید که با استفاده از پروتکل i2c و آدرس کیپد که 0x38 است میتوان آن را راهاندازی کرد.