پیش از این بخشهای مختلفی از آموزش میکروکنترلرهای 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
پس بر این اساس هر سطر و ستون به صورت مجزا بیانگر یک کلید است که یاد گرفتیم. در نهایت ماکزیمم ولتاژ ورودی از هر کلید ۲۴ ولت و جریان عبوری ۳۰ میلی آمپر است. دمای کاری کیپد ۰ تا ۵۰ درجه سانتی گراد است.
پیکربندی و اتصالات پروژه
در آموزش کیپد با 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 را مطالعه نمایید.
جمع بندی
همانطور که در ابتدای آموزش گفته شده استفاده از کلید های زیاد در پروژه منطقی نیست. و باعث افزایش هزینه و گیج شدن کاربر میشود. یکی از راه های رفع این مشکل استفاده از کیپد است. کیپد دارای نوع های مختلفی است که از محبوب ترین کیپد ها میتوانن به کیپد های ۴*۳ و ۴*۴ اشاره نمود که به ترتیب دارای ۱۲ و ۱۶ کلید بر روی خود هستند. به دلیل روش اتصال کلید ها به یک دیگر (ماتریس) تعداد پایه کمتری از میکروکنترلر اشغال میشود. در این پست نحوه راه اندازی کیپد و نمایش خروجی هر کلید بر روی LCD آموزش داده شد. با استفاده از این آموزش میتواید پروژه هایی همچون قفل رمزی، ماشین حساب و … را اجرا کنید.
لوازم مورد نیاز
- پروگرامر STC Auto Programmer
- برد STM32 مدل F103C8T6 دارای تراشه ARM
- نمایشگر LCD کاراکتری ۱۶*۲
- کیپد فلت ۴*۴ دارای ۱۶ کلید
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی از وبسایت دیجی اسپارک حمایت کنید.
با سلام
از چه زبان برنامه نویسی برای stm micro استفاده کردید؟
باسلام
برای برنامه نویسی میکروکنترلر stm32 از زبان C استفاده شده است.
با سلام
لطفا روش راه انداز ی ونصب نرم افزار کیل را یاد دهید.
باسلام
حتما در آموزش های بعدی این مورد را در نظر خواهیم داشت.
ای بابا ، یکی باید اول بره نحوه دانلود فایل از github رو یاد بگیره
ولی ممنون از زحماتتون
با سلام از توجه شما سپاسگزارم
برای دانلود کتابخانه از Github بایستی بر روی گزینه Code کلیک کرده و گزینه Download zip را انتخاب کنید.
ممنون ، خیلی اعصابمو این سایته به هم ریخته بود ، بعد فهمیدم با گوشی اون گزینه دانلود نمیاد ، باید تیک دسکتاپ رو بزنی تا گزینه دانلود رو نشونت بده ، مچکر بابت راهنمایی
با سلام
از توجه شما سپاسگزارم
کاش می گفتین هذقسمت کد کجا باید کپی بشه
با سلام
کدی که در آموزش قرار داده شده است به سه قسمت تقسیم می شود.
قسمت اول کد های قبل از تابع main است که بایستی این قسمت کد را در یکی از بخش های موجود در پروژه خود قبل از تابع main کپی کنید.
قسمت دوم کد هایی است که داخل تابع main قبل از حلقه while(1) قرار دارد. این قسمت نیز بایستی داخل پروژه شما دقیقا قبل از حلقه قرار گیرد.
و قسمت اخر کد هایی است که در حلقه قرار دارد. کد های موجو داخل حلقه را کپی کرده و در پروژه خود داخل حلقه قرار دهید.
ببخشید برد من نوکلئو هستش کد شما جواب میده؟
با سلام
بله این کتابخانه بر روی تمام میکروکنترلر های STM32 کار میکند.
سلام . تشکر بابت اموزش هاتون ، من دارم رو یه دستگاهی کار میکنم که داخلش از 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 وجود دارد. لطفا اتصالات را مجددا چک کنید.
مهندس سلام،تابع کی پد ریدread چرا جایی تعریف نکردین ،توضیح لطفا
با سلام
این تابع در فایل های کتابخانه قرار گرفته است.
سلام مهندس
من میتونم فایل زیپ این پروژه رو داشته باشم ؟ چون میخوام تست کنم ببینم مشکل کارنکردن از دستگاه منه یا که جایی از کد اشتباه کردم صرفا چون بسیار تازه کار هستم در این زمینه این رو میخوام
خیلی ممنون
باسلام
داخل لینکی که برای کتابخانه قرار داده شده است، یک نمونه کد کامل با نام Example Source Code قرار گرفته است. میتوانید از آن استفاده کنید.
سلام خسته نباشید جسارتا شما پروژه ساده برای مدرسه هم درست میکنید با پرداخت هزینه
با سلام
خیر
درود.باید هفت خوان را رفت .avr کجا stm32 کجا
درود بر شما
ایا این کتابخانه کی پد فقط با کتابخانه ال سی دی معرفی شده خود سایت شما کار میکنه یا با هر کتاخانه ال سی دی دیکر هم کار میکنه؟