همه چیز در مورد keypad و راه‌اندازی آن با آردوینو

راه‌اندازی صفحه‌ کلید ۳×۴ و ۴×۴ با آردوینو

keypad arduino 

سلامی دوباره. فاطمه هستم و با سری آموزش‌های کاربردی تیم مِهصا در خدمت‌تان هستم. امروز از آموزش سخت و پر چالش خبری نیست. امروز قصد داریم یک قطعه‌ی الکترونیکی بسیار ساده را آموزش دهیم. برخلاف ساده بودن آن، ‌بسیار قطعه‌ی پرکاربردی در حرفه‌ی ما است. پس آموزش را سرسری نگیرید. با من همراه باشید.

صفحه‌ کلیدها (keypads) مجموعه‌ای از دکمه‌ها هستند که در یک صفحه یا پد مرتب شده‌اند. در این پد کلیدهای مربوط به ارقام، نمادها یا حروف الفبا قرار دارد. صفحه ‌کلیدهایی که بیشتر حاوی عدد هستند و در رایانه‌ها استفاده می‌شوند، صفحه‌ کلیدهای عددی نام دارند. درواقع صفحه‌ کلیدها در دستگاه‌هایی یافت می‌شوند که بیشتر به ورودی عددی نیاز دارند. مانند ماشین‌حساب، کنترل تلویزیون، تلفن‌های دکمه‌ای، خودپردازها،‌ قفل‌های ترکیبی و قفل‌های دیجیتالی درب و....

در اینجا ما نوع رایج صفحه ‌کلیدها را بررسی می‌کنیم. صفحه‌ کلید ماتریکس، نوعی  از صفحه ‌کلید است که در تلفن‌های ‌همراه، ماشین‌ حساب‌ها، اجاق‌های ماکروویو، قفل درها و ... مشاهده می‌شود. عملاً همه‌جا هستند. با این ‌حال، در الکترونیک استفاده از این صفحه‌ کلیدها یک روش عالی برای جابه‌جایی در منوها، وارد کردن رمزهای عبور و کنترل ربات‌ها است.

 

بررسی سخت‌افزار صفحه‌ کلید

صفحه‌ کلیدها از یک ماده‌ی غشایی نازک و انعطاف‌پذیر ساخته شده‌اند. در اندازه‌های ۴×۳، ۴×۴، ۴×۱ و ... موجود هستند. صرف‌نظر از اندازه، همه‌ی آن‌ها به یک روش کار می‌کنند. یکی از نکات جالب درمورد آن‌ها این است که دارای پشتی برچسبی هستند بنابراین می‌توانید آن را به هر چیزی متصل کنید.

 keypad arduino

 

صفحه‌کلید ۴×۴ را به‌عنوان مثال درنظر بگیرید. درکل ۱۶ کلید دارد. در زیر هر کلید، یک سوئیچ غشایی خاص قرار دارد. تمام این کلیدهای غشایی با سیم‌های رسانا در زیر پد به یک‌دیگر متصل می‌شوند و یک ماتریس شبکه‌ی ۴×۴ را تشکیل می‌دهند.

 keypad

اگر از ‍۱۶ کلید تکی استفاده کرده بودید، برای عملکرد آن‌ها به ۱۷ پایه‌ی ورودی (برای هر کلید یک پایه‌ی اتصال و یک اتصال به زمین) نیاز داشتید اما با آرایش ماتریس، فقط به ۸ پایه‌ی میکروکنترلر (۴ ستون و ۴ ردیف) برای اسکن از طریق پد نیاز دارید.

 

پین‌های صفحه ‌کلید ۴×۳ و ۴×۴

پین‌های صفحه‌ کلید ۴×۳ و ۴×۴ به شرح زیر است:

 keypads matrix

از این که پایه‌ها را توضیح ندادم نگران نشوید. آن‌ها توضیحات خاصی ندارند. پایه‌های با علامت R مربوط به ردیف‌ها (ROW) و پایه‌های با علامت C مربوط به ستون‌ها (COLUMN) هستند که در ادامه مشاهده می‌کنید که همگی به پایه‌های دیجیتال برد آردوینو متصل می‌گردند.

 

صفحه‌کلید چگونه کار می‌کند و چگونه می‌توان آن‌ را اسکن کرد؟

اصل کار بسیار ساده است. فشار دادن یک دکمه، یکی از خطوط ردیف را به یکی از خطوط ستون متصل  می‌کند و اجازه می‌دهد جریان بین آن‌ها به وجود آید. به‌عنوان مثال، هنگامی که کلید 1 فشرده می‌شود، ستون ۱ و ردیف 1 بهم متصل می‌شوند.

keypad scans 

یک میکروکنترلر می‌تواند این خطوط را برای حالت button-pressed (فشاردادن دکمه) اسکن کند. برای انجام این کار، مراحل زیر اجرا می‌شود.

1.     میکروکنترلر تمام خطوط ستون و ردیف را به‌عنوان ورودی تنظیم می‌کند.

2.     سپس یک ردیف را انتخاب کرده و آن را برروی HIGH تنظیم می‌کند.

3.     پس از آن، خطوط ستون را یک‌به‌یک بررسی می‌کند.

4.     اگر اتصال ستون LOW باشد، دکمه‌ی روی ردیف، فشار داده نشده‌است.

5.     اگر High شود، میکرو آن سطر را تشخیص داده و متوجه می‌شود که کدام ستون نیز High شده است.

6.      در نهایت متوجه می‌شود که کدام دکمه فشرده شده‌است.

 

سیم‌کشی صفحه ‌کلید ۴×۳ و ۴×۴ با آردوینو

اکنون که همه‌چیز را درمورد صفحه‌ کلید دانستیم، می‌توانیم اتصال آن را به آردوینو شروع کنیم. اتصالات بسیار ساده هستند. با اتصال پایه‌ی ۱ صفحه ‌کلید به پایه‌ی ۹ دیجیتال در آردوینو شروع کنید. اکنون به اتصال پین‌ها به چپ، مانند ۲ به ۸، ۳ به ۷ و... ادامه دهید.

 keypad schematic

 keypad schematic

 

نصب کتابخانه‌ی مربوط به صفحه‌ کلید

برای تعیین اینکه کدام کلید فشرده شده‌است، باید ردیف‌ها و ستون‌ها را به‌طور مداوم اسکن کنیم. خوشبختانه Keypad.h برای پنهان کردن این پیچیدگی نوشته شده‌است تا بتوانیم دستورات ساده صادر کنیم و تشخیص دهیم که کدام کلید فشرده شده‌است. برای نصب کتابخانه، به ترتیب به sketch > include library > manage library بروید. منتظر بمانید تا manage library فهرست کتابخانه‌ها را بارگیری کند و لیست کتابخانه‌های نصب شده را به‌روز کند.

 manage library arduino

با تایپ کردن “keypad” جست‌وجوی خود را فیلتر کنید. باید چند مورد به شما نمایش داده شود. به دنبال keypad by mark Stanley, alexander brevig باشید. با کمی scroll آن را پیدا کرده و بر روی آن کلیک کنید و سپس install را بزنید.

keypad library manager 

 

کد آردوینو

نمونه‌های زیر به شما درکی کامل درمورد نحوه‌ی تشخیص فشار کلیدها با صفحه‌ کلید ۴×۳ و ۴×۴ را می‌دهد و می‌تواند به‌عنوان پایه‌ی پروژه‌های پیشرفته‌تر باشد.

کد برای صفحه‌کلید ۴×۳

#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);

 }

}

در نهایت نحوه‌ی نمایش خروجی در سریال مانیتور آورده شده‌است.

serial monitor keypad 

توضیح کد

کد با فراخوانی کتابخانه‌ی 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  باید یک آرایه مقاومتی همانند شکل زیر بسازیم.

keypad resistor arduino 

این مقادیر مقاومت‌ها بیشترین اختلاف پتانسیل پی‌درپی ممکن را برای آنالوگ ورودی ما تأمین می‌کنند که این مقادیر عبارت‌اند از:

کلید

هیچ

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 resistor array 

 راه‌اندازی keypad با استفاده از i2c و آی‌سی PCF8574P

تا اینجا یادگرفتیم که keypad را با استفاده از یک سیم و چندین سیم راه‌اندازی کنیم. در این مرحله می‌خواهیم بررسی کنیم که با استفاده از پروتکل i2c و با استفاده از آی‌سی PCF8574P ( پروتکل دو سیمه) keypad چگونه به کار گرفته می‌شود.

نحوه اتصال سیم ها به آی‌سی PCF8574P به صورت زیر است

keypad i2c 

برای راه‌اندازی 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 است می‌توان آن را راه‌اندازی کرد.

کپی شد!

ارتباط با ما

اصفهان ، میدان استقلال ، خیابان آزادگان ، دانشگاه صنعتی اصفهان
info@mehsa.ir