티스토리 뷰

Arduino SD-Card CardInfoArduino SD-Card CardInfo

Arduino Uno : SD-CARD CardInfo 예제 실행

이번 포스트에서는 아두이노에서

SD-CARD 를 사용하기 위해 사전에 알아 두면 좋은 내용과 기본 제공되는 CardInfo 예제를 실행하는 방법

을 소개합니다.

SD-Card 사전 준비 및 안내 사항

SD 카드 포맷

[각주:1]SD.h 라이브러리는 FAT16, FAT32 파일 시스템을 지원합니다. 아두이노로 SD Card를 사용하기 전에 되도록 FAT16로 포맷을 하시길 권장합니다.

Arduino SD 카드 지원 포맷Arduino SD 카드 지원 포맷

파일 명명 규칙

파일 이름은 8.3 Format(Short Filename or SFN) 규칙을 준수해야 합니다. 8.3 Format은 오래된 윈도우 및 DOS 버전에서 사용하는 파일 이름 규칙으로, 파일명과 확장자의 길이가 각각 최대 8자 3자로 제한됩니다.

파일명 사용 예시
  • 사용 가능 : HELLO.TXT
  • 사용 불가 : HELLOWORLD.TXT


SD카드 라이브러리

Arduino에서 SD-Card와 데이터를 주고받는 방식은 SPI를 사용하고, SD-Card 파일 시스템을 사용하기 위해 SD 라이브러리를 사용합니다.

참조 헤더

  • #include <SPI.h>
  • #include <SD.h>

※ 파일시스템

파일 시스템은 데이터를 파일 단위로 생성, 저장, 수정, 삭제, 검색 할 수 있는 시스템입니다. 파일 단위란 말은 HELLO.TXT 와 같이 파일명과 확장자를 가지는 단위를 말합니다. SD 카드를 사용할 때 파일 시스템을 사용하지 않으면, SD 카드의 메모리 주소에 직접 접근해서 주소에 데이터를 쓰고, 쓰여진 데이터를 찾기 위해 메모리 주소를 기억하거나 메모리 주소 전체를 다 검색해야 합니다.


SRAM 용량

아두이노로 SD라이브러리 사용시 SRAM 메모리를 차지하는 비율이 크다는 점을 고려해야 합니다. 아래와 같이 SD카드 인식하는 기본적인 코드만 사용하는 경우, Arduino Uno 보드 기준 SRAM 전체 용량의 43%를 차지합니다. SD-CARD이 외에 복잡한 프로그래밍을 하는 경우에 더 높은 SRAM을 가진 아두이노 보드 사용을 권장하고, 부득이하게 Arduino Uno 와 같이 SRAM이 작은 보드를 사용하는 경우 메모리 관리에 신경을 써야 합니다. 아두이노에서 전역 변수, Serial.print문에 사용되는 문자열을 FLASH 메모리로 저장하는 방법 등을 사용할 수 있습니다. 방법은 하단의 관련 포스트를 참고해주세요.

코드 예시 및 메모리 용량

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <SPI.h>
#include <SD.h>
 
#define SS 4
 
void setup(){
  Serial.begin(9600);
  while(!Serial){
    //wait for serial port to connect
  }
 
  Serial.println("Initializing SD card...");  
 
  if (!SD.begin(SS)) {
    Serial.println("Card Initializing failed, or not present");
    // don't do anything more:
    while (1);
  }
  Serial.println("Card initializing complete.");
}
 
void loop(){
}
cs

SD Library SRAM 사용량SD Library SRAM 사용량



(SPI)Hardware 연결 

Arduino에서 SD-Card와 SPI 통신 방식을 사용하여 데이터를 주고받습니다. Arduino Uno보드는 SPI 채널은 1개만 존재하기 때문에, 11, 12, 13번 MOSI, MISO, SCK 핀은 고정으로 사용되어야 하고, SS핀(EN, CS, NSS로 불리기도 함)은 SD_Card 모듈에 따라 선택되어야 합니다. Arduino 호환용 쉴드 대부분 SS가 4pin, 8pin, 10pin 으로 사용하고 있습니다.

Arduino Uno SPI 포트Arduino Uno SPI 포트


아래 그림은 Micro SD-Card 의 핀맵입니다. 아두이노로 SD-Card 를 사용하는 경우 대부분 모듈형을 사용하기 때문에 알 필요는 없지만, 참고로 사진을 추가하였습니다. Micro SD카드는 일반적으로 SDIO 통신으로 데이터를 주고받지만, SPI도 사용이 가능합니다. 아두이노는 SPI 통신으로 SD 카드와 통신이 가능합니다.

Micro SD-Card PinoutMicro SD-Card Pinout



SD 라이브러리

아두이노 우노에서 SD-Card 사용을 하기 위해 사용되는 SD 라이브러리는 Arduino IDE 설치기 기본으로 내장되어 있어 별도 설치가 불필요합니다. 

기본 제공 SD 라이브러리 예제

아두이노에서는 아래와 같이 SD-Card 관련 기본적인 예제를 제공하고 있습니다. 이 기본 예제들을 응용하면 파일, 검색, 읽기, 쓰기가 가능합니다. 하지만, 처음 보거나 프로그래밍에 익숙하지 않으면 코드가 길고 복잡하기 때문에 어렵게 느껴질 수 있습니다. 저는 예제 전체를 다루지 않고, 이후 포스트에서 사용 목적에 따라 필요한 코드만 소개할 예정입니다.

기본 제공 예제

  • CardInfo : SD 카드 정보 읽기
  • Datalogger : SD 카드에 데이터 쓰기
  • DumpFile : SD 카드의 파일 읽기
  • Files : SD 카드 파일 생성 및 삭제
  • listfiles : SD 카드의 디렉터리 표시
  • ReadWrite : SD 카드의 데이터 읽기 쓰기

SD Library 기본 예제SD Library 기본 예제


기본 예제 사용 : CardInfo

아두이노와 SD-Card를 연결하여 아두이노에서 제공되는 Cardinfo 예제를 사용하여 카드 정보를 읽어 오는 예제를 실행하는 방법을 소개합니다. 

회로 구성

Arduino 와 함께 사용할 수 있는 SD-Card 모듈은 여러 가지가 있지만, 저는 Ethernet Shiled 에 있는 SD-Card를 사용해서 테스트하였습니다.  Ethernet Shield2 내부 회로에서 SD-Card 의 SPI의 SCK, MISO, MOSI 는 ICSP 단자를 통해 통신하고, SS는 4번 핀으로 구성되어 있습니다.

Arduino Uno 와 Ethernet Shield2 는 아래 그림과 같이 연결하면 됩니다. 


SD 카드 준비

CardInfo 예제는 SD카드 정보, 용량, 파일 디렉터리까지 보여주는 예제입니다. 예제를 실행하기 전에 SD 카드를 FAT기본 값 또는 FAT16 으로 포맷합니다. 이후 SD 카드에 파일 및 폴더를 추가합니다. 파일명은 앞서 소개한대로 8.3 Format 에 맞도록 작성되어야 합니다.

SD 카드 포멧 및 파일,폴더 추가SD 카드 포멧 및 파일,폴더 추가


CardInfo 예제 불러오기

Arduino IDE에서 아래 그림과 같이 CardInfo 예제를 불러 옵니다. Ethernet Shield2의 SD-Card를 사용하는 경우는 해당 예제를 그대로 사용하면 되지만, Ethernet Shield가 아닌 경우 36번 라인의 chipSelect 핀을 사용하는 모듈 또는 회로에 맞게 수정해야 합니다.

CardInfo 예제 실행CardInfo 예제 실행 및 CS핀 설정 코드 위치


결과 보기

CardInfo 예제를 업로드 후 아두이노가 실행되면 연결된 SD-Card의 종류, 용량, 파일 구성을 시리얼 포트로 출력합니다.

CardInfo 예제 실행 결과CardInfo 예제 실행 결과


마무리

아두이노에서 SD-Card를 사용하기 전에 미리 알아 두면 좋은 내용을 요약하면 아래와 같습니다.

  • SD-Card FAT16 또는 FAT32 파일 시스템으로 포맷
  • 파일 명명 규칙 : 8.3 Format을 준수
  • SD 라이브러리는 SRAM 용량을 많이 차지하는 것을 염두
  • SD-Card 모듈을 사용하는 경우 CS 핀을 확인

이후 포스트는 아두이노로 SD-Card를 사용하는 기본적인 방법을 소개할 예정입니다. 끝까지 읽어 주셔서 감사합니다.😄


참조할만한 포스트

2020/08/25 - [Embedded/Arduino] - 아두이노 강좌 #27 동적 메모리 용량 부족 문제 PROGMEM F() 메크로로 해결

2020/08/26 - [Embedded/Arduino] - 아두이노 강좌 #28 2차원 배열 PROGMEM 매크로 사용 방법



  1. SD Library : https://www.arduino.cc/en/reference/SD [본문으로]
댓글
댓글쓰기 폼
최근에 올라온 글
«   2020/10   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
21,965
Today
190
Yesterday
595