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

آردوینو (قسمت یازدهم) – SD Cards and Datalogging

            طریقه اتصال SD Card به آردوینو از مواردیست که در این قسمت با آن آشنا می شوید. همچنین یاد خواهیم گرفت که چگونه اطلاعات را در SD Card با پسوند های TXT و CSV ذخیره کرده. و از آنها در Excel استفاده کنیم. با نوشتن پروژه ای استفاده از داده های آردوینو را در اکسل یاد خواهیم گرفت.

           SD Card کارت ها حافظه هایی قابل حمل می باشند که بیشتر در دوربین ها و وسایل قابل حمل استفاده می شوند. پروتکل ارتباطی SD Card ها از نوع SPI می باشد. پایه های 11 ,12 ,13 در اغلب بردهای آردوینو و  50, 51, 52 در بردهای آردوینو مگا برای ارتباط SPI می باشند. یک پین هم برای انتخاب کردن SD Card استفاده می شود که پین SS بر روی برد های آردوینو می باشد. یا می توان از پین دیگری استفاده کرد که آن را در()SD.begin مشخص می کنیم.

            برای اسفاده از SD Card در اردوینو باید آن را حتما به صورت FAT فرمت کنیم. بهتر است که اگه امکانش بود FAT16 فرمت شود.

            فایل های FAT محدودیتی در نام گذاری دارند. شما باید از فرمت 8.3 برای نام گذاری فایلها استفاده کنید. مثلا نام فایل را PROJECT1.TXT بگذارید. یعنی 8 کارکتر برای نام و 3 کارکتر برای نوع فایل. نام می تواند از 8 کارکتر کمتر باشد ولی نباید بیشتر باشد.

          شما وقتی از دستور()file.write استفاده می کنید چیزی بر روی SD Card ذخیره نمی شود تا از دستور()flush یا ()close استفاده کنیم. وقتی فایلی را باز می کنید مطمئن شوید که آن را می بندید تا ذخیره شود.

            برای اتصال SD Card باید از شیلد های مخصوص این کار استفاده کنیم. شیلد های بسیاری برای این کار ساخته شده است و در دسترس می باشد.

کتابخانه ی SD Card (SD.h)

           برای استفاده از SD Card باید کتابخانه آن را فرا خوانی کنیم. این کتابخانه به شما اجازه می دهد تا بر روی SD Card نوشته و یا فایلی را از روی آن بخوانید. اگر بخواهیم فایلی را در مسیری خاصی در SD Card ذخیره کنیم می توان آن مسیر را با اسلش نشان داد(root/name.txt).

()SD.begin

            برای آغاز به کار کتابخانه ی SD از این دستور استفاده می کنیم. این دستور پروتکل SPI را هم فعال می کند. پین های 11،12،13 در بیشتر بردهای آردوینو و 50،51،52  هم در برد آردوینو مگا و پین انتخاب تراشه (Chip select)، پین 10 در بیشتر برد ها و 53 در اردوینو مگا. دقت داشته باشید که اگر از پین دیگری بجای SS استفاده می کنید این پین باید به صورتی خروجی تعریف شده باشد. حتی اگر استفاده هم نکنیم ازش. وگرنه کتابخانه به درستی کار نخواهد کرد. اگر از پین دیگری استفاده می کنیم باید آن پین را داخل پرانتز ()SD.begin بنویسیم. ولی اگر از پین SS روی خود برد استفاده می کنیم لازم نیست داخل پرانتز چیزی نوشته شود.

            این دستور در صورتی که SD Card درست کار کند، TRUE  را بر می گرداند و در صورت بر قرار نشدن ارتباط FALSE را بر می گرداند.

            برای شروع کار یک متغیر از نوع فایل مشخص می کنیم. فایل یک کلاس است در این کتابخانه.

()SD.Open

            با این دستور یک فایل را در SD Card می توانیم باز کنیم. اگر فایلی به آن نام وجود نداشته باشد آن را ایجاد می کند.

SD.open(filepath, mode)

پارامتر ها:

Filepath: نام فایل و یا نام فایل همراه با مسیر آن که با اسلش جدا شده است.

Mode: در این قسمت دو مد را می توانیم تعیین کنیم که به صورت پیش فرض FILE_READ می باشد.

            FILE_READ: فایل را برای خواندن باز می کند و از اول فایل شروع می کند.

            FILE_WRITE: فایل را برای خواندن و نوشتن باز می کند و از آخر فایل شروع می کند.

            این دستور اگر نتواند فایل را باز کند FALSE را به صورت Boolean بر می گرداند.

()file.Println

            این دستور داده را پرینت می کند و به خط پایین می رود. به جای file می توانیم از نام متغیری که از نوع file  تعریف کرده ایم استفاده کنیم. در ضمن این دستور تعداد کارکتر هایی که پرینت می کند را بر می گرداند. که از نوع byte می باشد.

()file.close

            این دستور فایل مورد نظر را می بندد و اطلاعاتی که نوشته ایم به صورت فیزیکی در SD Card ذخیره می شود. به جای file می توان از متغیری که از نوع file تعریف کرده ایم استفاده کنیم.

()file.available

            چک می کنه اگه بایتی برای خواندن باشه. به جای file  میشه نام متغیری که از جنس file تعریف کردیم را بنویسیم. تعداد بایت هایی که وجود دارد را بر می گرداند. هر بایتی که توسط read خوانده شود از تعداد بایت کم می شود.

Pow(num1, num2)

            این تابع عدد  اول را به توان عدد دوم می رساند.

()File.read

            فایل مورد نظر را می خواند. اگه چیزی در فایل نباشد 1- را بر می گرداند. توجه داشته باشید که کد اسکی کارکتر را برمی گرداند.

            برای این از پسوند csv استفاده می کنیم چون در این فرمت از فایل، کاما (،) به عنوان خط در Excel در نظر گرفته می شود.

تصویر مدار

SD Card

SD Card

خواندن داده های آردوینو در Excel

            در ادامه می توانید نمنونه کد را که برای نوشتن اطلاعات روی SD Card است را مشاهده کنید. این اطلاعات با پسوند CSV ذخیره می شوند تا در Excel استفاده شوند.

 

//www.eleknow.com
//program by sobhan movassagh

#include <Wire.h>
#include <SD.h>
//SPI SD Card Pins
  //MOSI = Pin 11
  //MISO = Pin 12
  //SCLK = Pin 13
int CS_pin = 10;
int pow_pin = 8;

//I2C Temperature Pins
  //SDA = Analog Pin 4
  //SCL = Analog Pin 5

//IR Distance Sensor Pins
int IR1_pin = 2;
int IR2_pin = 3;

//Light Sensor Pins
int light_pin = 1;

int temp_address = 72;                //address of the I2C Temp sensor
long id=1;                            //Use this to store the id # of our reading


void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Intializing Card");
  //CS Pin in an Output
  pinMode(CS_pin, OUTPUT);
  //SD Card will Draw Power from Pin 8, so set it high
  pinMode(pow_pin, OUTPUT);
  digitalWrite(pow_pin, HIGH);

  //intialize Card 
  if (!SD.begin(CS_pin))
  {
      Serial.println("Card Failure");
      return;                         //End program
  }
  Serial.println("Card Ready");

  //Write Log File Header
  File logFile = SD.open("LOG.csv", FILE_WRITE);
  if (logFile)
  {
      logFile.println(", , , , "); //Just a leading blank line, incase there was rpevious data
      String header = ("ID, Light, Temp, IR1, IR2");
      logFile.println(header);
      logFile.close();
      Serial.println(header);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }

}
void lopp()
{
  //Check Light Level
  int light_level = analogRead(light_pin);

  //Read Temperture
  Wire.beginTransmission(temp_address);      //Start talking
  Wire.write(0);                             //ask for register zero
  Wire.endTransmission();                    //Complate Transmission
  Wire.requestFrom(temp_address, 1);         //Request 1 Byte
  while(Wire.available() == 0);              //wait for respons
  int temp_c = Wire.read();                  //Get the temp
  int temp_f = round(temp_c*9.0/5.0 + 32.0); //convert to stupid American units

  //Read Dictances
  int IR1_val = analogRead(IR1_pin);
  int IR2_val = analogRead(IR2_pin);

   //Create Data string for storing to SD card
   //We will use CSV format
   String dataString = String(id) + "," + String(light_level) + "," + String(temp_f) + "," + String(IR1_val) + "," + String(IR2_val);
   //open a file to write
   File logFile = SD.open("LOG.csv", FILE_WRITE);
   if (logFile)
   {
    logFile.println(dataString);
    logFile.close();
    Serial.println(dataString);
   }
   else
   {
    Serial.println("Couldn't open log file");
   }

   //Increment ID number
   id++;
   delay(1000);
}
  

 

در ادامه می توانید فیلم آموزشی را مشاهده کنید:

 

 

 

 

 

دیدگاه ها :

من بات نیستم

  1. متین گفت:

    با سلام و خیلی ممنون از مطلب مفیدتون.
    یک سوال و اون ایکه آیا sd متصل به آردوینو فقط فایل تکست میخونه؟ یعنی jpg یا pdf یا mp3 نمیخونه ؟ فقط میخواد اسم فایل ها و فرمتشونو برام نمایش بده

  2. بهزوز امینی گفت:

    سلام خیلی ممنون از مطالبی مفیدتون می خواستم ببینم آیا می تونیم فایل متنی را از micro sd بخونیم؟ با چه دستوری تشکر

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

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