اتصال LCD 16×2 به میکروکنترلر STM32F103C8T6

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

در بسیاری از پروژه‌هایی که در آنها از میکروکنترلر استفاده می‌شود، استفاده از یک صفحه‌ی نمایشگر کار با سیستم را برای کاربر هم بسیار راحت‌تر و هم جذاب‌تر می‌کند. پرکاربردترین نمایشگرهایی که به میکروکنترلرها متصل می‌شوند، صفحه نمایشگرهای 16×2 Alpha numeric هستند. مزیت استفاده از این نمایشگرها این است که نه تنها اطلاعات لازم سیستم را در اختیار کاربر قرار می‌دهند، بلکه به عنوان یک ابزار دیباگ در مراحل اولیه‌ی راه‌اندازی پروژه نیز بسیار کاربردی و کمک ‌کننده هستند. به همین علت در این جلسه به سراغ آموزش چگونگی اتصال میکروکنترلر STM32 (بورد Blue pill) به LCD 16×2 و نحوه‌ی پروگرم کردن آن با استفاده از Aduino IDE رفته‌ایم. اگر از قبل با Arduino IDE کار کرده باشید، آموزش این جلسه برایتان مثل آب خوردن راحت و شیرین خواهد بود چرا که پروگرم کردن STM32 و LCD متصل به آن بسیار شبیه به پروگرم کردن بوردهای آردوینو در شرایط مشابه است. در مورد بورد میکروکنترلر STM32 نیز در آموزش‌های قبلی توضیح داده‌ایم که می‌توانید به آن مراجعه کنید.

تجهیزات مورد نیاز پروژه

  • بورد STM32 Blue Pill
  • پروگرمر FTDI
  • LCD 16×2
  • سیم رابط

مقدمه‌ای بر LCD ماتریسی 2×16 خانه‌ای

همان‌طور که قبلا هم گفته‌ایم، Energia IDE یک کتابخانه‌ی جامع و مرتب ارائه می‌دهد که ارتباط با LCDها را بسیار ساده می‌کند. به نحوی که اصلا نیازی به دانستن جزئیات هر ماژول نمایشگر نداریم. اما بهرحال اینکه مختصری از ماژولی که قرار است از آن استفاده کنیم را بدانیم جذابیت‌های خاص خود را دارد. نام 2×16 به این دلیل بر روی این نمایشگرها قرار داده شده است که دارای ۱۶ ستون و دو سطر هستند. یعنی در مجموعه بر روی صفحه‌ی این نمایشگرها ۳۲ خانه وجود دارد که هر خانه شبیه چیزی است که در تصویر زیر می‌بینیم.

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

هر خانه دارای ۴۰ پیکسل است (به صورت یک ماتریس ۵ سطر و ۸ ستونه). این ۴۰ پیکسل در کنار هم یک کاراکتر را نمایش می‌دهند. بنابراین با در نظر گرفتن تمام ۳۲ خانه‌ی موجود بر روی صفحه، LCD می‌تواند حداکثر ۳۲ کاراکتر را به صورت همزمان نمایش دهد.

حالا بیایید نگاهی هم به پایه‌های این نمایشگرها بیندازیم.

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

همان‌طور که در تصویر بالا مشخص است، LCD دارای ۱۶ پایه است که این پایه‌ها را می‌توان در چهار گروه مختلف به شرح زیر جای داد.

Source Pinها: پایه‌های شماره‌ی ۱، ۲ و ۳. این پایه‌ها تغذیه و ورودی تنظیم سطح کنتراست نمایشگر را تامین می‌کنند.

Control Pinها: پایه‌های شماره‌ی ۴، ۵ و۶. این پایه‌ها رجیسترهای موجود درون LCD را که با IC مربوطه در ارتباط هستند تنظیم و کنترل می‌کنند.

Data/Command Pinها: پایه‌های شماره‌ی ۷ تا ۱۴. این پایه‌ها داده‌هایی را که باید بر روی صفحه‌ی نمایشگر نشان داده شوند، برای آن فراهم می‌کنند.

LED pinها: پایه‌های شماره‌ی ۱۵ و ۱۶. استفاده از این پایه‌ها اختیاری است و زمانی استفاده می‌شوند که بخواهیم نور پشت صفحه‌ی LCD را کم و زیاد کنیم.

از بین این ۱۶ پین، تنها ۱۰ پین برای عملکرد صحیح LCD کافی هستند. چنانچه علاقه‌مند بودید بیشتر در مورد این ماژول‌ها بدانید می‌توانید به این لینک سر بزنید.

نمودار مدار و اتصالات

مدار مورد نیاز برای اتصال LCD ماتریسی 2×16 به میکروکنترلر STM32F103C8T6 در تصویر زیر نشان داده شده است. این مدار با استفاده از نرم‌افزار Fritzing رسم شده است.

مطلب پیشنهادی:  مدولاسیون عرض پالس یا PWM در STM32 - کنترل سرعت فن DC

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

همان‌طور که می‌بینید تمام اتصالات این مدار بر روی یک برد بورد ساده انجام شده است. برای پروگرم کردن میکروکنترلر STM32 هم به یک بورد پروگرمر FTDI نیاز داریم. برای اتصال بورد میکرو به بورد پروگرمر، پین‌های Vcc و زمین پروگرمر را به ترتیب به پین‌های 5V و gnd میکرو متصل می‌کنیم. از آنجایی که هم LCD و هم میکرو هر دو از تغذیه ۵ ولتی استفاده می‌کنند به این ترتیب هر دوی آنها روشن خواهند شد. پایه‌های Rx و Tx پروگرمر نیز به ترتیب به پایه‌های A9 و A10 میکرو متصل می‌شوند. به این ترتیب بدون نیاز به بوت لودر میکرو را به صورت مستقیم پروگرم می‌کنیم.

بعد از اتصال این دو، مرحله‌ی بعدی این است که LCD را به میکرو متصل کنیم. در این پروژه ما LCD را در مود ۴ بیتی استفاده می‌کنیم پس باید ۴ بیت از بیت‌های تبادل داده (DB4 تا DB7) و دو بیت کنترلی RS و EN را به میکروکنترلر متصل کنیم. این اتصال را در مدار تصویر فوق می‌توانیم ببینیم. جدول زیر نیز همین اتصالات را به زبان نوشتاری توصیف کرده است.

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

پس از کامل کردن مدار و بستن تمام اتصالات، Arduino IDE را باز کرده و برای پروگرم کردن میکرو آماده می‌شویم.

پروگرم کردن STM32 با کمک Arduino IDE برای استفاده از LCD

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

پس از اینکه STM32 بر روی Arduino IDE نصب شد، پروگرم کردن را شروع می‌کنیم. پروگرم کردن STM32 با این روش بسیار شبیه به پروگرم کردن خود بوردهای آردوینو است. با این تفاوت که به علت نوتیشن‌های مختلف این بوردها، نام پین‌ها در STM32 باید تغییر کند. در قسمت‌های ادامه‌، بخش‌های مهم کد را مرور کرده و توضیح می‌دهیم و در انتها نیز کد پروژه را به صورت کامل در اختیارتان قرار خواهیم داد.

یکی از مزایای استفاده از Arduino برای پروگرم کردن میکروکنترلرها این است که این IDE تقریبا برای ارتباط با تمام سنسورها و اکچواتورها، کتابخانه‌های از پیش آماده شده دارد. در اینجا هم، ما از این مزیت استفاده کرده و کتابخانه‌ی مربوط به LCD را در ابتدای کد اضافه می‌کنیم. به این ترتیب کارمان بسیار ساده‌تر خواهد شد.

#include <LiquidCrystal.h> // include the LCD library

در مرحله‌ی بعد باید مشخص کنیم که کدام پین‌های GPIO از میکروکنترلر به پین‌های داده و کنترل LCD متصل شده‌اند. برای نوشتن این قسمت کافیست که دوباره نگاهی به اتصالات مدارتان بیندازید و یا در اینجا به جداولی که در بخش اتصالات مدار گذاشته بودیم و پین‌های میکرو و LCD را در مقابل هم نوشته بود مراجعه کنیم. پس از نوشتن پایه‌ها، با استفاده از تابع LiquidCrystal نمایشگر LCD راinitialize می‌کنیم.

مطلب پیشنهادی:  نرم افزار ARMwizard

در اینجا ما نام LCD را در کد خود «lcd» گذاشته‌ایم.

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD

سپس وارد بخش تابع setup می‌شویم. در اینجا ابتدا باید مشخص کنیم که از چه نوع LCDای استفاده می‌کنیم. از آنجا که نوع مورد استفاده‌ی ما 2×16 است پس باید به این شکل بنویسیم (lcd.begin(16,2. دقت داریم که کدی که در داخل تابع void setup می‌نویسیم، تنها یک بار اجرا خواهد شد. بنابراین یکی از مواردی که در این قسمت می‌نویسیم، کد مربوط به پیام اولیه‌ی راه‌اندازی LCD است که به مدت ۲ ثانیه بر روی آن نمایش داده شده و سپس پاک می‌شود. برای اینکه محل نمایش داده شدن پیام اولیه را بر روی صفحه‌ی LCD مشخص کنیم، از تابع lcd.setcursor استفاده می‌کنیم و برای چاپ شدن (نمایش داده شدن) آن بر روی صفحه نیز از تابع lcd.print استفاده می‌کنیم. به عنوان مثال دستور (lcd.setCursor(0,0، نقطه‌ی شروع متن مورد نظر را از ستون اول و سطر اول قرار می‌دهد و یا (lcd.setCursor(0,1، آن را در ستون اول و سطر دوم قرار خواهد داد.

void setup() {
  lcd.begin(16, 2);//We are using a 16*2 LCD
  lcd.setCursor(0, 0); //At first row first column
  lcd.print("Interfacing LCD"); //Print this
  lcd.setCursor(0, 1); //At secound row first column
  lcd.print("-CircuitDigest"); //Print this
  delay(2000); //wait for two secounds
  lcd.clear(); //Clear the screen
}

همان‌طور که گفتیم، پیام اولیه را به مدت ۲ ثانیه بر روی صفحه نگه می‌داریم تا کاربر بتواند آن را بخواند. در این مدت روند اجرای برنامه به صورت موقتی متوقف است. این کار را با کمک تابع تاخیر انجام می‌دهیم که به صورت (delay(2000 در کد نوشته شده است و واحد تاخیر آن میلی‌ثانیه است. پس از طی شدن مدت زمان تاخیر، نوشته‌های روی صفحه‌ی LCD را با استفاده از دستور ()lcd.clear پاک می‌کنیم.

در نهایت به بخش مربوط به تابع حلقه می‌رسیم (()void loop). به عنوان تمرین، در این بخش می‌خواهیم عبارت STM32 –Blue Pill را در خط اول نمایشگر و یک شمارنده‌ی ثانیه‌ را در خط دوم آن چاپ کنیم. برای به دست آوردن تابع ثانیه، می‌توانیم از تابع ()millis استفاده کنیم. این تابع در واقع یک تایمر است که درست از لحظه‌ی شروع به کار میکروکنترلر زمان را محاسبه می‌کند. مقدار محاسبه شده‌ی آن در واحد میلی‌ثانیه است و به همین علت ما آن را بر ۱۰۰۰ تقسیم می‌کنیم تا به ثانیه تبدیل شود.

void loop() {
  lcd.setCursor(0, 0); //At first row first column
  lcd.print("STM32 -Blue Pill"); //Print this
  lcd.setCursor(0, 1); //At secound row first column
  lcd.print(millis() / 1000); //Print the value of secounds
}

آپلود کردن برنامه بر روی بورد STM32F103C8T6

اتصالات مدار را مطابق بخش قبلی که توضیح دادیم بین پروگرمر و میکرو برقرار کنید و کد را هم در Arduino IDE وارد کنید. به قسمت tools بروید و مطمئن شوید که بورد را به درستی انتخاب کرده‌اید و حتما قبل از پروگرم کردن، این را هم چک کنید که boot 0 jumper بر روی یک تنظیم شده باشد. (مانند تصویر زیر) سپس کلید reset را بزنید. وقتی که گزینه‌ی upload را بزنید، کد برنامه باید بر روی میکرو بارگذاری شود و در این صورت مانند تصویر زیر بر روی LCD پیغام را ملاحظه خواهید کرد.

مطلب پیشنهادی:  معرفی معماری RISC در پردازنده های ARM

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

تایید صحت خروجی در مود عملکرد

همان‌طور که در قسمت بالایی گفتیم، به محض اینکه کد بر روی میکرو آپلود شود شما باید پیغام مدنظر را بر روی صفحه‌ی LCD ببینید. اما اگر یک بار بورد را خاموش و سپس دوباره روشن کنید، دیگر پیغام مربوطه را بر روی صفحه نخواهید دید و اصطلاحا شبیه این است که برنامه کار نمی‌کند. علت این اتفاق این است که میکرو هنوز در مود پروگرم قرار دارد. برای پرهیز از این حالت، باید به محض اتمام بارگذاری برنامه بر روی میکرو، boot 0 jumper را مجددا به وضعیت صفر برگردانیم. (مانند تصویر زیر) در این حالت دیگر به پروگرمر FTDI نیز برای تغذیه‌رسانی به بورد میکرو نیاز نداریم و همان اتصال usb میکرو به سیستم این کار را برای ما انجام خواهد داد. پس می‌توانیم تمام مدار مربوط به قسمت پروگرمر را از پروژه جدا کنیم.

اتصال LCD 16x2 به میکروکنترلر STM32F103C8T6

بسیار خب؛ تمام شد! این آموزش فقط یک پروژه‌ی ساده برای یادگیری نحوه‌ی اتصال LCD به میکروکنترلر STM32 بود و یادگیری تکنیک آن به شما کمک می‌کند که در پروژه‌های جدی‌تری از آن استفاده کنید. امیدواریم که این آموزش برای شما مفید واقع شود و از آن به اندازه‌ی کافی لذت ببرید. سوال‌های احتمالی خود را درباره‌ی این پروژه در قسمت نظرات سایت با ما در میان بگذارید. مثل همشه؛ در انتها یک ویدئو از نحوه‌ی انجام و عملکرد این پروژه را هم به همراه کد کامل آن برایتان قرار داده‌ایم.

کد

/*
Program to test 16*2 Alaphanumeric LCD with STM32 (Blue Pill) 
For: www.circuitdigest.com
Tr: Melec.ir   The circuit:  * LCD RS pin to digital pin PB11  * LCD Enable pin to digital pin PB10  * LCD D4 pin to digital pin PB0  * LCD D5 pin to digital pin PB1  * LCD D6 pin to digital pin PC13  * LCD D7 pin to digital pin PC14  * LCD R/W pin to ground  * LCD VSS pin to ground  * LCD VCC pin to 5V */ #include <LiquidCrystal.h> // include the LCD library const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to  LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD void setup() {   lcd.begin(16, 2);//We are using a 16*2 LCD   lcd.setCursor(0, 0); //At first row first column    lcd.print("Interfacing LCD"); //Print this   lcd.setCursor(0, 1); //At secound row first column    lcd.print("-CircuitDigest"); //Print this      delay(2000); //wait for two secounds    lcd.clear(); //Clear the screen } void loop() {   lcd.setCursor(0, 0); //At first row first column    lcd.print("STM32 -Blue Pill"); //Print this   lcd.setCursor(0, 1); //At secound row first column    lcd.print(millis() / 1000); //Print the value of secounds }

ویدئو

امیدواریم در ادامه آموزش‌های بیشتر از میکروکنترلرهای STM32 منتشر کنیم. کامنت یادتون نره:)

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *