راه اندازی lcd کاراکتری با رابط i2c | اگر تا به حال سعی کردهاید نمایشگر LCD را به آردوینو متصل کنید، احتمالاً متوجه شدهاید که به چند پایه آردوینو نیاز دارد. حتی وقتی از حالت ۴ بیت استفاده میکنید، باز هم به هفت اتصال نیاز دارید. که تقریباً نصف پایههای I/O دیجیتال موجود آردوینو را اشغال میکند.
راهحل بهتر این است که از یک نمایشگر LCD با رابط I2C استفاده کنید. تنها به دو پایه نیاز دارد که حتی بخشی از مجموعه پایههای دیجیتال I/O معمولی نیستند. جالبتر اینکه این پایهها میتوانند با سایر دستگاههای I2C به اشتراک گذاشته شوند. این کار سیمبندی شما را بسیار سادهتر میکند و آن پایههای ارزشمند را برای اتصال سنسورها یا اجزای دیگر در پروژههای شما حفظ میکند. در ادامهی این آموزش با خانه رباتیک ایران همراه باشید.
مروری بر سختافزار
یک نمایشگر LCD با رابط I2C معمولاً از دو بخش اصلی تشکیل شده است: نمایشگر LCD کاراکتری مبتنی بر HD44780 و مبدل LCD I2C. بیایید هر دو این مؤلفهها را با جزئیات بیشتری بررسی کنیم.
نمایشگر LCD کاراکتری
LCDهای کاراکتری بهطور خاص برای نمایش حروف، اعداد و نمادها طراحی شدهاند. بهعنوان مثال، یک LCD کاراکتری ۱۶×۲ میتواند ۱۶ کاراکتر در هر خط نشان دهد، با دو خط بهطور کل.
اگر خیلی دقیق به صفحه نمایش نگاه کنید، متوجه جعبههای مستطیلی کوچک برای هر موقعیت کاراکتری میشوید. داخل هر کدام از این مستطیلها شبکهای از ۵×۸ نقطه یا پیکسلهای کوچک وجود دارد. این پیکسلها با الگوهای مختلف روشن میشوند تا حروف، اعداد یا نمادهای مختلف را بسازند.
مبدل LCD I2C
کلید اصلی این مبدل، یک چیپ گسترشکننده خروجی-ورودی ۸ بیتی به نام PCF8574 است. این چیپ هوشمند دادههای I2C را از آردوینو به دادههای موازی تبدیل میکند که نمایشگر LCD برای عملکرد به آنها نیاز دارد.
برد مدار مبدل همچنین یک ترایم-pot کوچک دارد که به شما اجازه میدهد کنتراست نمایشگر را بهطور دقیق تنظیم کنید.
متوجه میشوید که در board یک جامپر وجود دارد که به پشتنور LCD قدرت میدهد. اگر میخواهید شدت نور خلفی را کنترل کنید، به سادگی میتوانید این جامپر را جدا کنید و یک منبع تغذیه خارجی را به پین هدر با برچسب «LED» وصل کنید.
آدرس I2C LCD
اگر چندین دستگاه روی همان باس I2C دارید، ممکن است لازم باشد برای مبدل LCD آدرس I2C متفاوتی تنظیم کنید تا با سایر دستگاههای I2C تداخل نداشته باشد.
برای این منظور، مبدل سه جامپر/پد لحیمشده دارد (با برچسبهای A0، A1، و A2). برای یک LCD واحد، میتوانید اینها را دستنخورده بگذارید؛ با این حال، اگر چندین دستگاه I2C یا LCD اتصال دارید، باید اطمینان حاصل کنید هر کدام آدرس منحصربهفردی دارد با تغییر این جامپرها. شما میتوانید با هم کوتاه کردن یک جامپر با یک توده کوچکی از لحیم، آدرس را تغییر دهید.
یک نکته مهم این است که شرکتهای مختلفی مانند Texas Instruments و NXP Semiconductors همان چیپ PCF8574 را تولید میکنند. آدرس I2C LCD شما به شرکتی که چیپ را ساخته بستگی دارد.
اگر LCD شما از چیپ PCF8574 شرکت Texas Instruments استفاده میکند:
طبق دیتاشیت شرکت Texas Instruments، سه بیت انتخاب آدرس (A0، A1، و A2) در پایان رجیستر آدرس I2C به طول ۷ بیت قرار دارند.
یک نکته مهم دیگر این است که شرکتهای مختلفی مانند Texas Instruments و NXP Semiconductors همان چیپ PCF8574 را تولید میکنند. آدرس I2C LCD شما بستگی به این دارد که چیپ توسط کدام شرکت ساخته شده است.
از آنجا که سه ورودی آدرس وجود دارد که میتوانند یا HIGH یا LOW باشند، هشت ترکیب ممکن (۲^۳ = ۸) برای آدرسها وجود دارد.
هر سه ورودی آدرس به طور پیشفرض با استفاده از مقاومتهای پولآپ داخلی به حالت HIGH کشیده میشوند. این امر به PCF8574 آدرس I2C پیشفرض 0x27 را میدهد.
وقتی یک جامپر لحیمشده را کوتاه کنید، ورودی آدرس مربوطه به LOW میرسد. اگر هر سه جامپر را کوتاه کنید، آدرس به 0x20 تغییر میکند. بنابراین دامنه آدرسهای ممکن از 0x20 تا 0x27 است.
میتوانید آدرسهای I2C مختلف را مطابق این جدول تنظیم کنید:
اگر LCD شما از چیپ PCF8574 شرکت NXP استفاده میکند:
طبق دیتاشیت شرکت NXP Semiconductors، سه بیت انتخاب آدرس (A0، A1، و A2) نیز در پایان رجیستر آدرس I2C به طول ۷ بیت قرار دارند. با این حال، بیتهای باقیمانده در رجیستر آدرس با چیپ شرکت Texas Instruments فرق دارند.
دقیقا مثل چیپ Texas Instruments، هشت ترکیب آدرس ممکن وجود دارد چرا که سه ورودی میتواند یا HIGH یا LOW باشد.
هر سه ورودی آدرس به طور پیشفرض با استفاده از مقاومتهای پولآپ داخلی به حالت HIGH کشیده میشوند. این امر آدرس I2C پیشفرض PCF8574 را برابر با 0x3F میکند.
وقتی یک جامپر لحیمشده را کوتاه کنید، ورودی آدرس مربوطه را به LOW میرسانید. اگر هر سه جامپر را کوتاه کنید، آدرس به 0x38 تغییر میکند. بنابراین دامنه آدرسهای ممکن از 0x38 تا 0x3F است.
میتوانید آدرسهای I2C مختلف را مطابق این جدول تنظیم کنید:
بنابراین آدرس I2C LCD شما احتمالا 0x27 یا 0x3F است. اگر مطمئن نیستید آدرس I2C LCD شما چیست، نگران نباشید! روش سادهای وجود دارد که میتوانید آن را کشف کنید، که در ادامه این آموزش یاد خواهید گرفت.
پیناوت نمایشگر LCD I2C
نمایشگر LCD I2C فقط چهار پین دارد. در زیر پیناوت آمده است:
GND یک پین زمین است.
VCC پین منبع تغذیه است. آن را به خروجی ۵V آردوینو یا یک منبع تغذیه خارجی ۵V وصل کنید.
SDA پین داده I2C است.
SCL پین کلاک I2C است.
سیمکشی یک نمایشگر LCD I2C به آردوینو
اتصال LCD I2C نسبت به اتصال LCD استاندارد بسیار سادهتر است. شما فقط باید چهار پین را وصل کنید، نه تعداد بیشتری.
ابتدا پین VCC را به خروجی ۵V آردوینو و پین GND را به زمین آردوینو وصل کنید.
سپس باید پینهای استفادهشده برای ارتباط I2C را اتصال دهید. مهم است بدانید که بردهای مختلف آردوینو پینهای I2C متفاوتی دارند و باید به درستی وصل شوند. روی بردهای آردوینو با طرحبندی R3، پینهای SDA (خط داده) و SCL (خط کلاک) همچنین در هدرهای پین نزدیک پین AREF یافت میشوند. با این حال، بهطور داخلی، آنها همان پینهای A4 (SDA) و A5 (SCL) هستند.
جدول زیر تمامی اتصالات پینهایی که باید انجام دهید را نشان میدهد:
این نمودار دقیقاً نحوه اتصال همه چیز را نشان میدهد:
تنظیم کنتراست LCD
بعد از اینکه سیمکشی LCD را به آردوینو کامل کردید، باید کنتراست نمایشگر LCD را تنظیم کنید. جستجو کنید برای یک تریموپ آبی کوچک روی برد مبدل I2C این قسمت کنتراست LCD را کنترل میکند.
حال آردوینو را روشن کنید. باید نور پسزمینه بلافاصله روشن شود. با یک پیچگوشتی کوچک، پتانسیومتر را به آرامی بچرخانید. در حین تنظیم، اولین ردیف مستطیلها را روی صفحه خواهید دید. این مستطیلها همان جایی هستند که کاراکترها نمایش داده خواهند شد. اگر بتوانید آن مستطیلها را به وضوح ببینید، تبریک میگویم LCD شما به خوبی کار میکند و آماده نمایش متن است!
تعیین آدرس I2C
قبل از اینکه به کد نمونه بپردازیم،
باید آدرس I2C LCD خود را بدانید تا بتوانید با آن به درستی ارتباط برقرار کنید. همانطور که قبلاً گفتیم، آدرس I2C LCD احتمالاً یا 0x27 یا 0x3F است. ممکن است این آدرس روی چسبی که با LCD شما آمده است چاپ شده باشد یا در اطلاعات محصول ذکر شده باشد. اما نگران نباشید اگر نتوانید این اطلاعات را جایی پیدا کنید! یک راه حل ساده وجود دارد. میتوانید یک اسکنر I2C ساده را اجرا کنید که به صورت خودکار آدرس صحیح را پیدا کند. به این صورت:
میتوانید این اسکنر را از طریق File > Examples > Wire > i2c_scanner در منوی IDE آردوینو بیابید.
اسکچ i2c_scanner را در محیط IDE آردوینو بارگذاری کنید.
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ |
#include void setup() { Wire.begin(); Serial.begin(۹۶۰۰); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { int nDevices = ۰; Serial.println("Scanning..."); for (byte address = ۱; address < ۱۲۷; ++address) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); byte error = Wire.endTransmission(); if (error == ۰) { Serial.print("I2C device found at address 0x"); if (address < ۱۶) { Serial.print("۰"); } Serial.print(address, HEX); Serial.println(" !"); ++nDevices; } else if (error == ۴) { Serial.print("Unknown error at address 0x"); if (address < ۱۶) { Serial.print("۰"); } Serial.println(address, HEX); } } if (nDevices == ۰) { Serial.println("No I2C devices found\n"); } else { Serial.println("done\n"); } delay(۵۰۰۰); // Wait 5 seconds for next scan } |
بعد از آپلود اسکچ به آردوینو، مانیتور سریال را باز کنید و آن را روی ۹۶۰۰ باود تنظیم کنید. پس از چند لحظه، باید آدرس I2C نمایشگر LCD شما روی صفحه ظاهر شود.
حتماً این آدرس را در جایی امن یادداشت کنید. در مثالهای بعدی که با LCD کار میکنیم، به آن نیاز خواهید داشت.
نصب کتابخانه برای کنترل LCD I2C، از کتابخانه Arduino LiquidCrystal_I2C استفاده خواهیم کرد. این کتابخانه کار با LCD را بسیار سادهتر میکند زیرا تمام ارتباط I2C پیچیده را در پسزمینه مدیریت میکند. چندین نسخه از این کتابخانه موجود است، اما یکی از معتبرترینها نسخهای است که توسط Frank de Brabander ساخته شده است.
برای نصب کتابخانه:
- ابتدا برنامه IDE آردوینو را باز کنید. سپس روی آیکون مدیریت کتابخانه در نوار کناری سمت چپ کلیک کنید.
- در کادر جستجو عبارت «liquidcrystal» را تایپ کنید تا نتایج فیلتر شوند.
- کتابخانه «LiquidCrystal I2C library» را که توسط Frank de Brabander ساخته شده است پیدا کنید.
- روی دکمه Install کلیک کنید تا به IDE آردوینو اضافه شود.
با اتصال سختافزار و نصب کتابخانه، میتوانیم یک اسکچ ساده آردوینو بنویسیم تا متن را روی LCD نمایش دهد. در این مثال، «Hello World!» را در خط اول LCD و «LCD Tutorial» را در خط دوم نمایش خواهیم داد.
قبل از آپلود اسکچ، باید دو تغییر مهم انجام دهید تا با LCD مخصوص شما کار کند. شما باید آدرس I2C صحیح LCD خود را وارد کنید (که قبلاً پیدا کردیم) و ابعاد نمایشگر را در سازنده LiquidCrystal_I2C() مشخص کنید. اگر از LCD کاراکتری ۱۶×۲ استفاده میکنید، مقدارهای ۱۶ و ۲ را وارد کنید؛ اگر از LCD کاراکتری ۲۰×۴ استفاده میکنید، مقدارهای ۲۰ و ۴ را وارد کنید.
|
۱ ۲ |
// enter the I2C address and the dimensions of your LCD here LiquidCrystal_I2C lcd(0x3F, ۱۶, ۲); |
وقتی این تغییرات را انجام دادید، آمادهاید تا اسکچ کامل را امتحان کنید:
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ |
#include LiquidCrystal_I2C lcd(0x3F,۱۶,۲); // set the LCD address to 0x3F for a 16 chars and 2 line display void setup() { lcd.init(); lcd.clear(); lcd.backlight(); // Make sure backlight is on // Print a message on both lines of the LCD. lcd.setCursor(۲,۰); //Set cursor to character 2 on line 0 lcd.print("Hello world!"); lcd.setCursor(۲,۱); //Move cursor to character 2 on line 1 lcd.print("LCD Tutorial"); } void loop() { } |
بعد از بارگذاری این کد روی آردوینو، این چیزی است که باید روی صفحه نمایش ببینید:
تصویر
شرح کد راه اندازی lcd کاراکتری با رابط i2c:
اسکچ با اضافه کردن کتابخانه LiquidCrystal_I2C آغاز میشود، که به ما همه توابع لازم برای کنترل LCD را میدهد.
|
۱ |
#include |
سپس یک شی از کلاس LiquidCrystal_I2C ایجاد میکنیم. سازنده LiquidCrystal_I2C به سه مورد اطلاعات نیاز دارد: آدرس I2C، تعداد ستونها و تعداد ردیفهای نمایشگر شما.
|
۱ |
LiquidCrystal_I2C lcd(0x3F,۱۶,۲); |
در تابع setup، ما سه تابع مهم را فرا میخوانیم. اول، تابع init() رابط کاربری با LCD را مقداردهی اولیه میکند. دوم، تابع clear() هر چیزی را روی صفحه LCD پاک میکند و نشانگر را به گوشه بالا-چپ میبرد. سوم، تابع backlight() روشنایی پسزمینه LCD را روشن میکند تا بتوانیم متن را ببینیم.
|
۱ ۲ ۳ |
lcd.init(); lcd.clear(); lcd.backlight(); |
تابع setCursor(۲, ۰) نشانگر را به ستون سوم در سطر اول منتقل میکند. (یادتان باشد که شمارش از صفر شروع میشود، بنابراین ستون ۲ در واقع ستون سوم است.) موقعیت نشانگر به LCD میگوید که متن جدید را کجا روی صفحه قرار دهد. گوشه بالا-چپ، موقعیت (۰,۰) در نظر گرفته میشود.
|
۱ |
lcd.setCursor(۲,۰); |
سپس از تابع print() برای نمایش متن «Hello world!» روی LCD استفاده میکنیم.
|
۱ |
lcd.print("Hello world!"); |
به همین ترتیب، دو خط کد بعدی نشانگر را به ستون سوم در ردیف دوم منتقل میکند و عبارت «LCD Tutorial» را روی LCD چاپ میکند.
|
۱ ۲ |
lcd.setCursor(۲,۱); lcd.print("LCD Tutorial"); |












