آموزش آردوینو

افزایش پین های آردوینو (بیشتر کردن پایه های 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 هشت کانالی استفاده خواهیم کرد. برای ساخت پروژه، شماتیک سیم کشی زیر را دنبال کنید:

اتصالات آردوینو با گسترش دهنده پین MCP23017 

مقادیر مقاومت های محدود کننده جریان متصل به ال ای دی ها 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 لذت برده باشید! اگر سوالی دارید حتما در نظرات زیر با ما در میان بگذارید.

5/5 - (1 امتیاز)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.
تصویر از محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

2 نظر

  1. عیسی اصغری گفت:

    با سلام از صبر و حوصله ای که به خرج میدید
    بنده یک دوره آموزش آدرینو از شما تهیه کردم مشغول آموزش هستم یک سوال داشتم درمورد پروژه ای که دارم و در اصل باعث تهیه این آموزش شده اینکه در پروژه من به ۱۳ عدد ورودی و ۱۰ عدد خروجی نیاز دارم که فعال یا غیر فعال بودن ورودی و غروبی ها را لازم دارم آیا این امکان در آدرینو وجود دارد

    1. محمد رحیمی گفت:

      سلام عزیز
      راحت ترین کار این هست که شما بردی از آردوینو رو انتخاب کنید که تعداد پین های بالایی داشته باشه مثل برد آردوینو Mega

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

نشانی ایمیل شما منتشر نخواهد شد.