برد STM سخت افزار قطعات الکترونیک

پروژه راه اندازی کیپد ۴*۴ با میکروکنترلر STM32 و نرم افزار Keil

نوشته شده توسط علی زاهدی

پیش از این بخشهای مختلفی از آموزش میکروکنترلرهای STM32 منتشر شده است. که میتوانید از این لینک کلیه مطالب را مطالعه نمایید. پیشنهاد میکنم در صورتی که آشنایی کافی با این میکروکنترلرها را ندارید ابتدا آموزش های قبلی را مطالعه کنید. سپس به مطالعه این آموزش بپردازید. در این آموزش کیپد با STM32 راه اندازی می‌کنیم. به عبارتی برخی از پروژه ها نیاز به وارد کردن اعداد چند رقمی و یا ایجاد منو برای نمایشگر است (همانند دزدگیر اماکن، انواع دستگاه های صنعتی و …). در چنین پروژه هایی استفاده از کلید های پوش باتم و … منطقی نیست. زیرا استفاده از تعداد بسیار زیاد کلید برای پروژه هم باعث افزایش هزینه پروژه می‌شود. و هم کاربر را بسیار گیج می‌کند. در این آموزش قصد داریم تا نحوه راه اندازی کیپد (Keypad) را مورد بررسی قرار دهیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


کیپد ۴*۴ ماتریسی


ماتریس ۴*۴ یا به عبارتی همان کیپد در الکترونیک نقش ورودی دارد! ورودی یا همان فرمان دهنده که با فشردن هر کلید یک تغییر در خروجی ایجاد می‌شود. کیپد از چند دکمه (کلید) ساخته شده است که به صورت سطر و ستونی (ماتریس) در کنار یکدیگر قرار گرفته شده اند. کیپدها دارای تنوع زیادی هستند که در این بین کیپد ۴*۳ و کیپد ۴*۴ طرفداران بی شماری دارد. پایه های صفحه کلید به دو ردیف سطر و ستون تقسیم بندی می‎شود.

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

به عنوان مثال ، هنگامی که کلید “۴” فشار داده می شود ، ستون ۱ و ردیف ۲ اتصال کوتاه می‌شوند. میکروکنترلر تمامی پایه های سطر و ستون را به عنوان ورودی تنظیم می‌کند. در مرحله بعدی یک سطر را انتخاب و سپس وضعیت کلید ها را بر روی HIGH تنظیم می‌کند و پس از آن خط های ستون را یک به یک بررسی می‌کند. اگر وضیعت ستون LOW باشد به این معنی است که کلید فشار داده نشده است. اگر وضعیت ستون HIGH باشد، میکروکنترلر تشخیص میدهد که کدام سطر HIGH شده و کدام ستون در زمان تشخیص فعال بودن (HIGH) مشخص شده است و درنهایت با مشخص شدن سطر و ستون کلید فشرده داده شده مشخص می‌شود.

شماتیک کیپد

به همین ترتیب میتوانید وضعیت هر کلید را مشخص کنید. در ادامه اتصال سطر و ستون ها برای هر کلید مشخص شده است.

  • برای کلید ۱ سطر ۱ و ستون ۱ اتصال داده می‌شود : R1+C1
  • برای کلید ۲ سطر ۱ و ستون ۲ اتصال داده می‌شود : R1+C2
  • برای کلید ۳ سطر ۱ و ستون ۳ اتصال داده می‌شود : R1+C3
  • برای کلید ۴ سطر ۲ و ستون ۱ اتصال داده می‌شود : R2+C1
  • برای کلید ۵ سطر ۲ و ستون ۲ اتصال داده می‌شود : R2+C2
  • برای کلید ۶ سطر ۲ و ستون ۳ اتصال داده می‌شود : R2+C3
  • برای کلید ۷ سطر ۳ و ستون ۱ اتصال داده می‌شود : R3+C1
  • برای کلید ۸ سطر ۳ و ستون ۲ اتصال داده می‌شود : R3+C2
  • برای کلید ۹ سطر ۳ و ستون ۳ اتصال داده می‌شود : R3+C3
  • برای کلید * سطر ۴ و ستون ۱ اتصال داده می‌شود: R4+C1
  • برای کلید ۰ سطر ۴ و ستون ۲ اتصال داده می‌شود: R4+C2
  • برای کلید # سطر ۴ و ستون ۳ اتصال داده می‌شود: R4+C3
  • برای کلید A سطر ۱ و ستون ۴ اتصال داده می‌شود: R1+C4
  • برای کلید B سطر ۲ و ستون ۴ اتصال داده می‌شود: R2+C4
  • برای کلید C سطر ۳ و ستون ۴ اتصال داده می‌شود: R3+C4
  • برای کلید D سطر ۴ و ستون ۴ اتصال داده می‌شود: R4+C4

پس بر این اساس هر سطر و ستون به صورت مجزا بیانگر یک کلید است که یاد گرفتیم. در نهایت ماکزیمم ولتاژ ورودی از هر کلید ۲۴ ولت و جریان عبوری ۳۰ میلی آمپر است. دمای کاری کیپد ۰ تا ۵۰ درجه سانتی گراد است.

کیپد فلت ماتریسی 4x4 - دیجی اسپارک

 


پیکربندی و اتصالات پروژه


در آموزش کیپد با STM32 برای تست کیپد از LCD کاراکتری استفاده کرده‌ایم. پیش از این در آموزش راه اندازی LCD کاراکتری نحوه راه اندازی و اتصال LCD به میکروکنترلر STM32 بصورت کامل توضیح داده شده است. برای LCD بر روی میکروکنترلر ۷ پین در نظر گرفته شده است که عبارتند از RS، RW، E، D4، D5، D6، D7 . برای کیپد همانطور که بالا تر گفته شد. برای راه اندازی کیپد با STM32 بایستی ۴ پین ورودی و ۴ پین خروجی تعریف شود. داخل نرم افزار STM32CubeMX پایه های مربوط به ردیف ها (R1، R2، R3، R4) را خروجی و پایه های مربوط به ستون ها (C1، C2، C3، C4) بصورت ورودی و PULL-UP تعریف شده است. پیشنهاد میکنم پایه هایی که برای کیپد بر روی میکروکنترلر در نظر میگیرد، پشت سر هم باشد. سپس بایستی در نرم‌ افزار STM32CubeMX پایه های مشخص شده در تصویر زیر را تعریف کنید. سپس مطابق آموزش های قبلی بخش های دیگر را تنظیم کنید. و پس از آن گزینه GENERATE CODE را بزنید و وارد نرم افزار KEIL شوید.

تعریف پایه های میکروکنترلر برای راه اندازی کیپد

اتصالات کیپد و LCD به برد Bluepill همانند تصویر انجام می‌شود. توجه داشته باشید بر روی پایه شماره ۳ LCD یا همان V0 یک مقاومت ۲٫۲K متصل به زمین قرار دارد. شما میتوانید همانند تصویر زیر از مقاومت ۲٫۲K استفاده کنید. و یا از یک پتانسیومتر برای تظیم کنتراست استفاده کنید.

شماتیک مدار کیپد

 


کدنویسی در نرم افزار KEIL


در پروژه کیپد با STM32 مشابه دیگری پروژه‌ها به کتابخانه نیاز داریم. ابتدا از این لینک کتابخانه مربوط به کیپد را دانلود کنید. سپس مطابق آموزش قبلی کتابخانه را به پروژه اضافه کنید. در این کتابخانه پوشه ای با نام STM32_GPIO موجود است. که بایستی همانند پوشه اصلی کتابخانه به پروژه معرفی شود. در ادامه بایستی وارد فایل KEYPAD_CONFIG.h شده و پایه های تعریف شده برای کیپد را مطابق کد زیر به کتابخانه معرفی کنید.

#define _KEYPAD_PORT		GPIOA
#define _KEYPAD_PIN 		GPIOA
#define _KEYPAD_FIRST_ROW		۰
#define _KEYPAD_SCAN_SPEED		۱

پس از انجام مراحل گفته شده، وارد فایل main شده و کد زیر را به برنامه خود اضافه نمایید. همانطور که در آموزش های قبلی گفته شده است داخل فایل main قسمت هایی مشخص شده است و کد بایستی داخل این قسمت های مشخص شده قرار گیرد. توجه داشته باشید که نباید کد زیر را بصورت کامل داخل فایل main کپی کنید. و باید هر بخش را در قسمت مربوط مشخص شده در فایل main اضافه کنید.

#include "KEYPAD/KEYPAD.h" /* Import keypad lib */
#include "CHARACTER_LCD/CHARACTER_LCD.h" /* Import lcd lib */

uint8_t key_character[16] = {'1' , '2' , '3' , 'A' , '4' , '5' , '6', 'B' , '7' , '8' , '9' , 'C' , '*' , '0' , '#' , 'D'}; /* Keypad Character */
uint8_t x;

void Keypad_Function(int8_t ch) /* Function for get key and show on lcd */
{
	if(ch == 12)
	{
		Lcd_Clear();
		x = 0;
	}
	else 
	{
		if(x > 15)x = 0;
		else 
		{
			Lcd_GotoXY(x,0);
			Lcd_PutChar(key_character[ch]); /* Show character */
			x++;
		}
	}
}

int main(void)
{
	Lcd_Config.Font = _FONT_5X10; /* Set lcd font */
  Lcd_Config.Mode = _4BIT_INTERFACE; /* Set lcd interface */
  Lcd_Config.NumberOfLine = _2LINE_DISPLAY; /* Set lcd lines */
  Lcd_Init(); /* Initialize lcd */
  while (1)
  {
		Lcd_GotoXY(0,1);
		Lcd_PutString("WWW.DIGISPARK.IR");
		Keypad_Read(Keypad_Function); /* Scan keypad */
    HAL_Delay(50); /* Wait for next scan */
  }
}

 


تحلیل کد پروژه کیپد با STM32


در پروژه کیپد با STM32 ابتدا کتابخانه های مربوط به کیپد و LCD به فایل main.c اضافه شده است. سپس در یک آرایه خروجی هر یک از کلید های کیپد تعریف شده است. در ادامه تابعی تعریف شده است که داخل حلقه بی نهایت به عنوان ورودی به تابع Keypad_Read تعریف شده است. پس از فشردن هر یک از کلید های کیپد، برنامه وارد این تابع میشود و دستورات داخل آنرا اجرا مکیند. داخل این تابع شرطی قرار داده شده است که اگر کلید C بر روی کیپد فشرده شد. نوشته های LCD پاک شود. در غیر این صورت خروجی کلید فشرده شده کیپد بر روی LCD نمایش داده شود. در ابتدای تابع main تنظیمات مربوط به LCD انجام شده است. در آخر  بایستی برنامه را کامپایل کرده و بر روی برد Bluepill پروگرام کنید. در صورتی که با نحوه پروگرام کردن میکروکنترلر های Stm32 آشنا نیستید. لطفا بخش اول آموزش های میکروکنترلر Stm32 را مطالعه نمایید.

پروژه کیپد با STM32 و برد BluePill و ال سی دی کاراکتری - دیجی اسپارک

 


جمع بندی


همانطور که در ابتدای آموزش گفته شده استفاده از کلید های زیاد در پروژه منطقی نیست. و باعث افزایش هزینه و گیج شدن کاربر میشود. یکی از راه های رفع این مشکل استفاده از کیپد است. کیپد دارای نوع های مختلفی است که از محبوب ترین کیپد ها میتوانن به کیپد های ۴*۳ و ۴*۴ اشاره نمود که به ترتیب دارای ۱۲ و ۱۶ کلید بر روی خود هستند. به دلیل روش اتصال کلید ها به یک دیگر (ماتریس) تعداد پایه کمتری از میکروکنترلر اشغال می‌شود. در این پست نحوه راه اندازی کیپد و نمایش خروجی هر کلید بر روی LCD آموزش داده شد. با استفاده از این آموزش میتواید پروژه هایی همچون قفل رمزی، ماشین حساب و … را اجرا کنید.

 


لوازم مورد نیاز


 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۸ دیدگاه

  • ای بابا ، یکی باید اول بره نحوه دانلود فایل از github رو یاد بگیره
    ولی ممنون از زحماتتون

    • با سلام از توجه شما سپاسگزارم
      برای دانلود کتابخانه از Github بایستی بر روی گزینه Code کلیک کرده و گزینه Download zip را انتخاب کنید.

      • ممنون ، خیلی اعصابمو این سایته به هم ریخته بود ، بعد فهمیدم با گوشی اون گزینه دانلود نمیاد ، باید تیک دسکتاپ رو بزنی تا گزینه دانلود رو نشونت بده ، مچکر بابت راهنمایی

    • با سلام
      کدی که در آموزش قرار داده شده است به سه قسمت تقسیم می شود.
      قسمت اول کد های قبل از تابع main است که بایستی این قسمت کد را در یکی از بخش های موجود در پروژه خود قبل از تابع main کپی کنید.
      قسمت دوم کد هایی است که داخل تابع main قبل از حلقه while(1) قرار دارد. این قسمت نیز بایستی داخل پروژه شما دقیقا قبل از حلقه قرار گیرد.
      و قسمت اخر کد هایی است که در حلقه قرار دارد. کد های موجو داخل حلقه را کپی کرده و در پروژه خود داخل حلقه قرار دهید.

  • سلام . تشکر بابت اموزش هاتون ، من دارم رو یه دستگاهی کار میکنم که داخلش از sim800 استفاده کردم و نیاز دارم از کیپد استفاده کنم. کیپد رو باهاش هیچ مشکلی ندارم و اوکی جواب میده منتهی مشکلی که دارم اینه که نمیتونم عدد چند رقمی ازش بگیرم . و دلیل نتونستنم هم اینه که تعداد رقم ها ثابت و مشخص نیست. ممنون میشم اگه راه حلی برای حل مشکلم داشتین بگین. من میخام با وارد شدن به یه تابع یه عدد چند رقمی که ممکنه تا حداکثر ۱۱ رقم باشه مثل شماره گیر موبایل رو ازش دریافت کنم.

    • با سلام از توجه شما سپاسگزارم
      برای اینکار شما بایستی عدد های دریافتی را در یک رشته ذخیره کنید. طول رشته میتواند به تعداد حداکثری که فرمودین یعنی ۱۱ خانه باشد. در صورتی که تمام ۱۱ خانه رشته پر نشد. میتوانید باقی خانه ها را با NULL پر کنید.

  • سلام جناب من یه سوال دارم من نفهمیدم که چطور باید پایه ها رو داخل کیل به برنامه معرفی کنم توضیح میدید

    • با سلام
      پس از اضافه کردن کتابخانه به پروژه بایستی وارد فایل KEYPAD_CONFIG.h شده و پایه های تعریف شده برای کیپد را مطابق کد زیر به کتابخانه معرفی کنید.

      #define _KEYPAD_PORT GPIOA
      #define _KEYPAD_PIN GPIOA
      #define _KEYPAD_FIRST_ROW ۰
      #define _KEYPAD_SCAN_SPEED ۱

  • سلام یه سئوال داشتم
    من یه کد ساده نوشتم و دو عدد را در هم ضرب می کنم، ولی نتیجه درستی نمی دهد چرا؟
    مشکل برد است؟ یا آردوینو؟
    کدش اینه:
    long a=99999999;
    long b=100;
    double c=a*b;
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    Serial.println(c);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    Serial.println(c);
    }

    • با سلام
      لطفا سوال خود را در بخش نظرات پست های مربوط به برد آردوینو بپرسید تا دیگر کاربران هم بتوانند استفاده کنند.

    • با سلام
      لازم است که ابتدا تابعی برای نمایش اعداد بر روی سگمنت تعریف کنید. سپس بعد از خواندن مقادیر از کیپد ان را در بخش ورودی تابع نمایش اعداد بر روی سگمنت قرار دهید.

  • سلام
    مهندس مشکل پرش اعداد وقتی دستمون رو صفحه کلیده میتونه از چی باشه؟
    برا اولین بار که دست میگذارم عدد صحیح نمایش داده میشه ولی وقتی دستم رو نگه میدارم پرش میکنه تو جدول ماتریس.همینطور وقتی دستم رو کلید نیست هم گاهی اوقات پرش داره مقداری که تو متغیر ریختم.
    با سپاس

    • با سلام
      در صورتی که اتصالات به درستی انجام نشده باشد امکان پرش کاراکتر ها بر روی LCD وجود دارد. لطفا اتصالات را مجددا چک کنید.

  • سلام مهندس

    من میتونم فایل زیپ این پروژه رو داشته باشم ؟ چون میخوام تست کنم ببینم مشکل کارنکردن از دستگاه منه یا که جایی از کد اشتباه کردم صرفا چون بسیار تازه کار هستم در این زمینه این رو میخوام

    خیلی ممنون

    • باسلام
      داخل لینکی که برای کتابخانه قرار داده شده است، یک نمونه کد کامل با نام Example Source Code قرار گرفته است. میتوانید از آن استفاده کنید.