محدودیت GPIO در بسیار از میکروکنترلرها، چالشی اساسی حساب می شود. به عنوان مثال فرض کنید با قرار دادن شیلدهای مختلف بر روی آردوینو UNO، تعداد کمی پایه GPIO باقی بماند. به عنوان یک مثال کلی تر، ماژول های ESP8266 پایه های GPIO بسیار کمی دارند. این موضوع سبب می شود که در پروژه های مختلف، محدودیت ورودی/خروجی، به عنوان یک چالش روند توسعه پروژه را مختل نماید. اما با وجود ماژول افزاینده GPIO با نام PCF8574، تمامی مشکلات فوق بر طرف می شوند. ماژول افزاینده تعداد پایه GPIO، یک ماژول فوق العاده کاربردی است. این ماژول که با پروتکل I2C پشتیبانی می کند، با اشغال تنها دو پایه از برد شما، ۸ پایه GPIO ورودی و خروجی ایجاد می نماید. جهت راه اندازی و کار با ماژول افزاینده GPIO، کتابخانه تحت پلتفرم آردوینو توسعه یافته است. از این رو روند توسعه پروژه ها به کمک این ماژول، تسریع یافته و تمرکز برنامه نویس بر روی قسمت های اصلی برنامه، قرار خواهد گرفت. در این آموزش به معرفی و بررسی این کتابخانه کاربردی می پردازیم. در ابتدا روش نصب آن را بررسی می کنیم. در ادامه به معرفی بردهای مورد پشتیبانی و الزامات فنی آن می پردازیم. پس از این مورد، به معرفی توابع کلیدی و کاربردی کتابخانه می پردازیم. در نهایت با ارائه مثالی از کاربرد، به بحث خاتمه می دهیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی ، دیجی اسپارک همراه باشید.
PCF8574 چیست و چه کاربردی دارد؟
PCF8574 یک مدار متصلکننده ورودی/خروجی سریال (Serial I/O Expander) است که توسط شرکت Texas Instruments تولید میشود. این مدار مبتنی بر تکنولوژی CMOS بوده و قادر است ورودیهای دیجیتال و سیگنالهای کنترلی را توسط رابط سریال I2C دریافت کرده و خروجیهای دیجیتال را تولید کند.PCF8574 از ۸ پایه ورودی/خروجی دیجیتال (IO) برخوردار است. این پایهها میتوانند به عنوان ورودی یا خروجی تنظیم شوند و از طریق رابط I2C قابل کنترل هستند. هر پایه میتواند به یک دستگاه خروجی (مثل LED یا رله) متصل شود یا از یک دستگاه ورودی (مثل دکمه) خوانده شود.
کاربردهای مختلفی برای PCF8574 وجود دارد. برخی از کاربردهای رایج آن عبارتند از:
- کنترل واسطهای خروجی دیجیتال: PCF8574 میتواند به عنوان یک متصلکننده واسط مورد استفاده قرار گیرد تا تعداد پایههای ورودی/خروجی دیجیتال در میکروکنترلرها و سیستمهای تعبیهشده را افزایش دهد.
- کنترل LEDها: با استفاده از PCF8574 میتوان یک بانک LED را کنترل کرده و آنها را روشن یا خاموش کرد.
- کنترل رلهها: PCF8574 قادر به کنترل رلهها با ورودی دیجیتال است و میتواند در سیستمهای کنترل خانه هوشمند و سیستمهای اتوماسیون خانگی استفاده شود.
- کنترل دکمهها: با استفاده از PCF8574 میتوان دکمههای ورودی را کنترل کرده و وضعیت فشار آنها را به سیستم ارسال کرد.
به طور کلی، PCF8574 از تعدادی پایه دیجیتال استفاده میکند و با استفاده از رابط I2C به میکروکنترلرها و سایر اجزای الکترونیکی وصل میشود تا امکان کنترل واسطهای دیجیتال بیشتری را فراهم کند.
در چه مدارهایی از PCF8574 استفاده میشود؟
PCF8574 در انواع مدارها و پروژههای الکترونیکی استفاده میشود. چندین مثال از کاربردهای آن عبارتند از:
- سیستمهای کنترل خانه هوشمند: PCF8574 میتواند در سیستمهای کنترل خانه هوشمند استفاده شود تا کنترل دستگاههایی مانند روشنایی، تهویه، دربها و پنجرهها را از طریق یک رابط I2C انجام دهد.
- سیستمهای اتوماسیون خانگی: در سیستمهای اتوماسیون خانگی، PCF8574 میتواند به عنوان یک متصلکننده ورودی/خروجی مورد استفاده قرار گیرد تا کنترل دستگاههایی مانند رلهها، موتورها، وسایل نوری و سایر وسایل الکترونیکی را انجام دهد.
- توسعه واسطهای ورودی/خروجی میکروکنترلرها: در پروژههایی که تعداد پایههای ورودی/خروجی میکروکنترلر محدود است، PCF8574 میتواند استفاده شود تا تعداد پایهها را افزایش داده و بیشترین استفاده را از منابع ورودی/خروجی میکروکنترلر کند.
نصب کتابخانه PCF8574.h
به منظور استفاده از کتابخانه PCF8574.h، ابتدا می بایست آن را نصب کنیم. در این قسمت به نصب کتابخانه سنسور شتاب سنج با جستجو در مخازن آردوینو می پردازیم. به همین منظور، ابتدا در نرم افزار آردوینو بر روی گزینه Tools و سپس Manage Libraries را کلیک کنید. پس از کلیک بر روی این گزینه، با تصویر زیر رو به می شوید. این منو کتابخانه های در دسترس را به شما نشان می دهد. شما نیز می توانید با جستجوی نام کتابخانه مورد نظر خود، آن را در مخازن آردوینو یافته و سپس نصب کنید.
مطابق فلش مشخص شده در تصویر فوق، در کادر جستجو عبارت PCF8574 را تایپ کنید. پس از چند لحظه، تعداد زیادی کتابخانه مرتبط در صفحه ظاهر خواهند شد. در این مرحله، لطفا کتابخانه را مطابق کادر قرمز رنگ در تصویر زیر، یافته و سپس بر روی گزینه install کلیک کنید.
توجه: ممکن است این کتابخانه از پیش به صورت پیشفرض بر روی آردوینو شما نصب شده باشد، در این حالت مطابق تصویر فوق با گزینه update رو به رو می شوید. در این آموزش ورژن مورد استفاده ۰٫۹٫۰ است.
پس از نصب کتابخانه، نوبت به تحلیل و بررسی آن می رسد. بنابراین در قسمت بعدی به الزمات فنی ماژول PC8574 و بردهای مورد پشتیبانی آن، می پردازیم.
بردهای مورد پشتیبانی و نکات فنی
اولین نکته در راه اندازی این ماژول، بحث آدرسی دهی آن است. این ماژول بر روی خود دارای جامپرهایی است که با تغییر وضعیت آن ها می توانید آدرس ماژول را تنظیم کنید. برای این ماژول می توانید ۸ آدرس متفاوت تعیین کنید. بنابراین با اتصال ۸ ماژول PCF8574 تنها به یک پورت I2C، می توانید تا ۶۴ پایه GPIO داشته باشید. جهت تنظیم آدرس های ماژول، می توانید مطابق تصویر زیر عمل کنید.
در رابطه با بردها و میکروکنترلرهای مورد پشتیبانی این کتابخانه، می توان به موارد زیر نیز اشاره نمود.
- بردهای ESP32
- بردهای ESP8266
- بردهای آردوینو نظیر UNO، MEGA ،NANO ،MICRO و….
پس از بررسی الزامات و نکات فنی، نوبت به معرفی و تحلیل توابع کلیدی جهت دریافت ورودی و ایجاد خروجی می رسد. در قسمت بعدی این موضوع را مورد بررسی قرار می دهیم.
توابع کلیدی کتابخانه
در این قسمت به بررسی توابع کلیدی کتابخانه ماژول افزاینده GPIO با نام PCF8574 می پردازیم. در رابطه با توابع، در نظر بگیرید که ورودی ها از سمت چپ به راست، به ترتیب شماره های یک، دو، سه و… را به خود اختصاص می دهند. به عبارت دیگر، منظور از ورودی اول سمت چپ ترین ورودی بوده و سایر ورودی ها از ۲ به بعد، به خود شماره اختصاص می دهند.
نام تابع | ورودی ها | شرح |
PCF8574(uint8_t address) | ورودی از نوع بدون علامت ۸ بیتی | این تابع، تابع سازنده کلاس کتابخانه ماژول است. ورودی این تابع آدرس i2c ماژول قرار می گیرد. |
PCF8574(uint8_t address, uint8_t interruptPin, void (*interruptFunction)() ) | ورودی اول از نوع ۸ بیتی بدون علامت برای آدرس ماژول
ورودی دوم از نوع ۸ بیتی بدون علامت برای تعیین پایه وقفه ورودی سوم معرفی تابع روتین وقفه |
این تابع نیز، تابع سازنده اما با ورودی های بیشتر است. به کمک این تابع می توانید ماژول را با تعیین آدرس I2C در ورودی اول، تعیین شماره پین وقفه بردی که ماژول به آن متصل می شود و تابع اجرای وقفه، پیکربندی کنید. |
PCF8574(uint8_t address, uint8_t sda, uint8_t scl, uint8_t interruptPin, void (*interruptFunction)() ) | ورودی اول از نوع ۸ بیتی بدون علامت برای آدرس ماژول
ورودی دوم از نوع ۸ بیتی بدون علامت برای تعیین پایه SDA ورودی سوم از نوع ۸ بیتی بدون علامت برای تعیین پایه SCL ورودی چهارم از نوع بدون علامت ۸ بیتی برای تعیین پایه وقفه ورودی پنجم معرفی تابع روتین وقفه |
این تابع نیز تابع سازنده دیگری از این کتابخانه بوده که در مواقع لزوم از آن می توانید استفاده کنید. این تابع با دریافت آدرس در ورودی نخست، تعیین پایه های ارتباط I2C در ورودی های دوم وسوم، تعیین شماره پین وقفه بردی که ماژول به آن متصل می شود و تابع اجرای وقفه، ماژول را پیکربندی می نماید. |
void begin() | بدون ورودی | با فراخوانی این تابع، کتابخانه راه اندازی شده و ماژول آماده به کار می شود. |
void pinMode(uint8_t pin, uint8_t mode, uint8_t output_start = HIGH) | ورودی اول از نوع بدون علامت ۸ بیتی برای تعیین پایه
وروردی دوم از نوع ۸ بیت بدون علامت برای تعیین مد پایه ورودی سوم از نوع بدون علامت ۸ بیتی برای تعیین وضعیت پیشفرض |
به کمک این تابع می توانید وضعیت پایه های ۰ الی ۷ ماژول را تعیین تکلیف نمایید. برای این مورد، به کمک ورودی اول شماره پایه تعیین می شود. ورودی دوم وضعیت پایه به صورت زیر است:
OUTPUT:خروجی ورودی:INPUT ورودی سوم هم وضعیت پایه خروجی را به صورت پیشفرض تعیین می کند. چنانچه پایه خروجی بوده و این ورودی HIGH باشد، مقدار خروجی در لحظه راه اندازی یک منطقی است. به طور مشابه با LOW قرار دادن این ورودی، پایه خروجی ۰ خواهد شد.
|
void attachInterrupt() | بدون ورودی | به کمک این تابع، روتین وقفه برای پایه ای که پیشتر به عنوان وقفه تعیین شده، فعال می شود. |
void detachInterrupt(); | بدون ورودی | این تابع وقفه پایه ها رو غیر فعال می کند. |
uint8_t digitalRead(uint8_t pin) | ورودی از نوع بدون علامت ۸ بیتی برای تعیین شماره پایه | به کمک این تابع می توانیدوضعیت پایه ورودی را بخوانید. شماره این پایه در ورودی تابع قرار گرفته و به ازای یک،HIGH و به ازای صفر، LOW در خروجی ظاهر می شود. |
bool digitalWrite(uint8_t pin, uint8_t value) | ووردی اول از نوع بدون علامت ۸ بیتی شماره پایه
ورودی دوم از نوع بدون علامت ۸ بیتی برای مقدار |
به کمک این تابع می توانید برای پایه های خروجی، مقدار صفر یا یک تعیین کنید. برای این منظور در ورودی اول شماره پایه(از ۰ الی ۷) و در ورودی دوم، مقدار HIGH برای یک منطقی و مقدار LOW برای صفر منطقی تعیین می شود. |
توجه: این کتابخانه دارای چندین تابع سازنده بوده که شما متناسب با برنامه خود، می توانید یکی از آن هارا جهت پیکربندی ماژول، انتخاب کنید.
اجرای نمونه برنامه
در این قسمت به بررسی نمونه برنامه کاربردی کتابخانه PCF8574.h جهت راه اندازی ماژول PCF8574 می پردازیم. به همین منظور، در ابتدا یک برنامه بلینک جهت روشن و خاموش شدن یک LED را مشاهده می نمایید.
#include "Arduino.h" #include "PCF8574.h" //فراخوانی کتابخانه //ایجاد یک شی از کلاس ماژول و تعیین آدرس PCF8574 pcf8574(0x39); void setup() { Serial.begin(115200); //نحوه تعینی پایه ها به صورت ورودی و یا خروجی pcf8574.pinMode(P0, OUTPUT); pcf8574.pinMode(P1, INPUT); pcf8574.begin(); } void loop() { pcf8574.digitalWrite(P0, HIGH); //تعیین پایه به صورت یک منطقی delay(1000); pcf8574.digitalWrite(P0, LOW); //تعیین پایه به صورت صفر منطقی delay(1000); }
در ادامه، برنامه بعدی نحوه خواندن وضعیت پایه ورودی را نشان می دهد. در این برنامه از وقفه استفاده نشده است.
#include "Arduino.h" #include "PCF8574.h" //فراخوانی کتابخانه //ایجاد یک شی و تعیین آدرس PCF8574 pcf8574(0x39); void setup() { Serial.begin(115200); //تعیین وضعبت پایه ها به صورت ورودی و خروجی pcf8574.pinMode(P0, OUTPUT); pcf8574.pinMode(P1, INPUT); pcf8574.begin(); } void loop() { //خواندن ورودی از پایه P1، به شکل تعیین شماره پایه دقت کنید. uint8_t val = pcf8574.digitalRead(P1); if (val==HIGH) Serial.println("KEY PRESSED"); delay(50); }
در نهایت، در برنامه آخر، وضعیت یک پایه ورودی را به صورت وقفه می خوانیم. در این برنامه، از آنجاییکه از برد آردوینو uno استفاده شده و پین های شماره ۱ یا ۲ مخصوص وقفه هستند، لذا از پایه ۲ به عنوان پایه وقفه استفاده کرده ایم. در این برنامه هرگاه وقفه رخ دهد، به معنای این موضوع بوده که یکی از پایه های ورودی ماژول PCF8574، تغییر وضعیت داده است.
#include "Arduino.h" #include "PCF8574.h" //کتابخانه PCF8574 //انتخاب پایه شماره ۲ اردوینو به عنوان پایه وقفه #define ARDUINO_UNO_INTERRUPTED_PIN 2 //معرفی تابع روتین وقفه void keyPressedOnPCF8574(); //تنظیمات آدرس، پایه وقفه و روتین وقفه با ایجاد یک شی از کلاس ماژول PCF8574 PCF8574 pcf8574(0x39, ARDUINO_UNO_INTERRUPTED_PIN, keyPressedOnPCF8574); void setup() { Serial.begin(115200); pcf8574.pinMode(P0, OUTPUT); // تعریف پایه به عنوان خروجی pcf8574.pinMode(P1, INPUT); //تعریف پایه به عنوان ورودی pcf8574.begin(); //راه اندازی } bool keyPressed = false; //تعریف فلگ جهت تشخیص وضعیت تغییر پایه ها void loop() { if (keyPressed){ //تشخیص تغییر وضعیت پایه ها uint8_t val = pcf8574.digitalRead(P1); Serial.print("READ VALUE FROM PCF "); Serial.println(val); keyPressed= false; } } void keyPressedOnPCF8574(){ // توجه داشته باشید که روتین وقفه باید بسیار سریع اجرا شود، لذا از قرار دادن فرایند های زمانبر نظیر سریال مانتیور و... در این قسمت خودداری کنید. keyPressed = true; }
جمع بندی
در این آموزش به تحلیل و بررسی کتابخانه ماژول PCF8574 پرداختیم. ماژول افزایش GPIO با نام PCF8574، یک ماژول فوق العاده کاربردی جهت افزایش تعداد پایه های GPIO است. به کمک این ماژول می توان ورودی و خروجی های بردها و ماژول های مختلف نظیر ماژول های ESP را افزایش داد. جهت راه اندازی و کار با این ماژول، کتابخانه تحت آردوینو توسعه یافته است. در این آموزش ضمن معرفی این کتابخانه، به الزمات فنی و بردهای مورد پشتیبانی آن پرداختیم. در ادامه به معرفی توابع کلیدی و کاربردی آن اشاره کردیم. در نهایت با ارائه سه مثال متنوع از نحوه کار با توابع کتابخانه ای، به بحث خاتمه دادیم.
خرید PCF8574
جهت خرید ماژول PCF8574 از سایت دانشجوکیت اقدام کنید. در این خصوص یک ماژول افزاینده GPIO با PCF8574 در سایت موجود است و در پروژه ها نقش ویژه ای دارد. بررسی کنید که PCF8574 با تعداد پایهها و ویژگیهای مورد نیاز شما مطابقت دارد. PCF8574 دارای ۸ پایه ورودی/خروجی است، اما برخی نمونهها نسخههای با ویژگیهای خاصی مانند PCF8574A با ورودی/خروجی سازگار با سطح بالا (Schmitt Trigger) نیز وجود دارند.قبل از خرید اطمینان حاصل کنید که PCF8574 با سیستمی که میخواهید از آن استفاده کنید (مانند میکروکنترلر یا برد توسعه) سازگاری دارد. بررسی کنید که PCF8574 از رابط I2C پشتیبانی میکند و تغذیه و ولتاژ کاری آن با سیستم شما سازگار است.
ماژول افزایش GPIO با نام PCF8574
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام ببخشید کد زیر در ARDUINO IDE پیام خطا میده علت چیه ؟ تمام LIBRARY ها رو هم نصب کردم
#include “Arduino.h”
#include “PCF8574.h” //فراخوانی کتابخانه
//ایجاد یک شی از کلاس ماژول و تعیین آدرس
PCF8574 pcf8574(0x39);
void setup()
{
Serial.begin(115200);
//نحوه تعینی پایه ها به صورت ورودی و یا خروجی
pcf8574.pinMode(P0, OUTPUT);
pcf8574.pinMode(P1, INPUT);
pcf8574.begin();
}
void loop()
{
pcf8574.digitalWrite(P0, HIGH); //تعیین پایه به صورت یک منطقی
delay(1000);
pcf8574.digitalWrite(P0, LOW); //تعیین پایه به صورت صفر منطقی
delay(1000);
}
سلام
لطفا متن خطا را در کامنت بعد قرار دهید.