افزایش پین های آردوینو (بیشتر کردن پایه های Arduino)

محتویات
از توسعه دهنده های پورت می توان برای ایجاد پین های اضافی GPIO در آردوینو استفاده کرد. در این آموزش، نحوه استفاده از توسعه دهنده های پورت را با ساختن پروژه ای با استفاده از MPC23017 برای ایجاد دو پورت 8 بیتی اضافی و خواندن و نوشتن روی آنها با استفاده از I2C در آردوینو یاد خواهیم گرفت. ما چند چراغ را متصل می کنیم و از اقدامات بیتی برای خواندن سوئیچ های ورودی و نمایش آنها در مانیتور سریال استفاده می کنیم.
گسترش دهنده پورت MPC23017
MPC23017 شامل دو پورت دو جهته 8 بیتی است که می تواند با ارتباط I2C به آردوینو متصل شود. کتابخانه Wire برای ارتباط این قطعه با آردوینو مورد استفاده قرارمیگیرد. تراشه دارای سه خط آدرس قابل انتخاب است، بنابراین می توانیم آن را با 23 = 8 آدرس ممکن تنظیم کنیم.
اگر مدتی را صرف برنامهنویسی آردوینو کردهاید، ممکن است با خواندن و نوشتن در پورتها آشنا باشید در این پروژه با دو پورت 8 بیتی مواجه هستیم که فقط به صورت port-wide یا بایت قابل نوشتن/خواندن است. منظورم این است که شما همه 8 بیت را به طور همزمان بخوانید و سپس باید بیت یا پین مورد نظر خود را مشخص کنید.
لنمادهای >> یا << برای نشان دادن شیفت به راست یا چپ استفاده می شود. ابزار مفید دیگر نمایش بایت ها بر روی نمایشگر سریال به صورت باینری است. به عنوان مثال، Serial.println(29، BIN); در حقیقت عدد باینری 11101 را چاپ میکند. می توانیم از یک تابع ساده که در زیر نشان داده شده است استفاده کنیم.
void loop() { printBin(29); } void printBin(byte inByte){ for (int b = 7; b >= 0; b--) Serial.print(bitRead(inByte, b)); //now prints: 00011101 Serial.println(); }
فرض کنید میخواستیم یک پین از پورت A بیاوریم اما فقط به بیت ۲ نیاز داریم (بیت سوم از سمت راست). فرض کنید بایت حاوی 11110100 باشد.
ما از “bit mask” استفاده خواهیم کرد. در حقیقت ما یک بایت صفر (بجز 1 در بیت مورد نظرمان) را با مقدار داده شده & میکنیم. در بیت هایی که با هم AND میشوند فقط در صورتی که هر دو 1 باشند خروجی 1 خواهد بود. یعنی:
B11110100
& B00000100
= B00000100
حالا برای اینکه بفهمیم بیت مورد نظر ما 0 است یا 1، نتیجه را شیفت میدهیم. یعنی از Serial.println((B11110100 & B00000100) >> 2)
استفاده می کنیم. این خط کد در حقیقت تمام بیت های اضافه را حذف میکند و وضعیت بیت مورد نظر ما را بر میگرداند.
یک راه ساده تر هم وجود دارد. به یاد داشته باشید که بیت ها از 0 تا 7 شماره گذاری می شوند. به کد زیر مراجعه کنید:
byte mybyte = B11110100; Serial.println(bitRead(mybyte, 2)); // prints 1 Serial.println(bitWrite(mybyte, 3, HIGH), BIN); // prints 11111100 Serial.println(bitClear(mybyte, 3), BIN); // prints 11110100
اتصالات آردوینو با گسترش دهنده پین MCP23017
در این پروژه، ما از توسعه دهنده پورت MCP23017 برای کنترل هشت LED بسته به ورودی یک سوئیچ DIP هشت کانالی استفاده خواهیم کرد. برای ساخت پروژه، شماتیک سیم کشی زیر را دنبال کنید:
مقادیر مقاومت های محدود کننده جریان متصل به ال ای دی ها 680 اهم است. مقاومت متصل به پایه 18 MCP23017 برابر 2.2K اهم است و مقاومت های pull-up متصل به سوئیچ DIPبرابر 10K اهم است.
اینها قطعاتی هستند که برای ساخت این پروژه نیاز دارید:
- آردوینو اونو
- توسعه دهنده پورت MPC23017
- سوئیچ DIP هشت تایی
- هشت LED
- هشت مقاومت 680 اهم
- هشت مقاومت 10K اهم
- یک مقاومت 2.2K اهم
- سیم های جامپر
- برد بورد
کد آردوینو برای افزایش پایه ها
پس از اتصال همه چیز، این کد را در آردوینو آپلود کنید. این برنامه مقدار بیت ایجاد شده توسط سوئیچ DIP را به صورت خام و اعشاری خروجی می دهد:
#include byte byteVal=0; byte chipAddr = 0x27; byte GPIOA = 0x12; // PortA reg addr byte GPIOB = 0x13; // PortB reg addr byte IODIRA = 0x00; // PortA direction reg addr byte IODIRB = 0x01; // PortB direction reg addr void setup(){ Serial.begin(9600); Wire.begin(); Wire.beginTransmission(chipAddr); Wire.write(IODIRA); // IODIRA dir register Wire.write(0x00); // set entire PORT A as output Wire.endTransmission(); Wire.beginTransmission(chipAddr); Wire.write(IODIRB); // IODIRB dir register Wire.write(0xff); // set entire PORT B as input Wire.endTransmission(); } void loop(){ Wire.beginTransmission(chipAddr); Wire.write(GPIOB); // read the inputs off PORT B Wire.requestFrom(chipAddr, 1); // ask for 1 byte byteVal = Wire.read(); // read it Wire.endTransmission(); // write that input to PORT A Wire.beginTransmission(chipAddr); Wire.write(GPIOA); // address PORT A Wire.write(byteVal); // PORT A Serial.print(byteVal,BIN); Serial.print(" "); Serial.println(byteVal, DEC); Wire.endTransmission(); delay (200); }
در بخش اول، کتابخانه Wire را وارد میکنیم، سپس آدرس تراشه را اعلام میکنیم و سپس رجیسر های پورت داده A و B را تنظیم میکنیم.
در setup()، پورت A را پورت خروجی و پورت B را پورت ورودی می کنیم. شایان ذکر است که لازم نیست کل پورت خروجی یا ورودی را ایجاد کنید. به عنوان مثال، بایت IODIRA = B0101010101 برخی پین ها را ورودی و برخی را خروجی می کند. در بخش loop() فقط پورت B را خوانده و آن را در پورت A کپی می کنیم.
پنجره سریال بسته به موقعیت سوئیچ های ورودی شما چیزی شبیه به این را نشان می دهد:
کد روشن شدن چراغ های LED
کد زیر را آپلود کنید تا LED ها یکی پس از دیگری روشن شوند. در اینجا ما از shift به چپ استفاده می کنیم تا ال ای دی ها را به سمت چپ روشن کنیم.
#include // Wire.h byte inByte=1; byte chipAddr = 0x27; byte GPIOA = 0x12; // PortA reg addr byte GPIOB = 0x13; // PortB reg addr byte IODIRA = 0x00; // PortA direction reg addr byte IODIRB = 0x01; // PortB direction reg addr byte i = 1; void setup(){ Serial.begin(9600); Wire.begin(); Wire.beginTransmission(chipAddr); Wire.write(IODIRA); // IODIRA dir register Wire.write(0x00); // set entire PORT A as output Wire.endTransmission(); Wire.beginTransmission(chipAddr); Wire.write(IODIRB); // IODIRB dir register Wire.write(0xff); // set entire PORT B as input Wire.endTransmission(); } void loop(){ i=i<<1; if(i==0) i=1; Wire.beginTransmission(chipAddr); Wire.write(GPIOA); // address PORT A Wire.write(i); // PORT A delay (500); Wire.endTransmission(); Serial.println(i); }
امیدواریم از این آموزش در مورد نحوه گسترش پین های GPIO آردوینو با توسعه دهنده پورت MCP23017 لذت برده باشید! اگر سوالی دارید حتما در نظرات زیر با ما در میان بگذارید.
با سلام از صبر و حوصله ای که به خرج میدید
بنده یک دوره آموزش آدرینو از شما تهیه کردم مشغول آموزش هستم یک سوال داشتم درمورد پروژه ای که دارم و در اصل باعث تهیه این آموزش شده اینکه در پروژه من به ۱۳ عدد ورودی و ۱۰ عدد خروجی نیاز دارم که فعال یا غیر فعال بودن ورودی و غروبی ها را لازم دارم آیا این امکان در آدرینو وجود دارد
سلام عزیز
راحت ترین کار این هست که شما بردی از آردوینو رو انتخاب کنید که تعداد پین های بالایی داشته باشه مثل برد آردوینو Mega