Arduino IDE를 사용하여 ESP32와 MicroSD 카드 모듈을 인터페이스하는 방법

Arduino Ideleul Sayonghayeo Esp32wa Microsd Kadeu Modyul Eul Inteopeiseuhaneun Bangbeob



ESP32는 다양한 주변 장치와 인터페이스할 수 있는 고급 마이크로 컨트롤러 보드입니다. 다른 센서와 마찬가지로 MicroSD 카드 모듈을 ESP32와 인터페이스할 수도 있습니다. 데이터 로깅 애플리케이션에 MicroSD 카드 센서를 사용하거나 마이크로컨트롤러 보드의 저장 용량을 늘릴 수 있습니다.

이 문서에서는 Arduino IDE를 사용하여 MicroSD 카드를 ESP32 보드와 인터페이스하는 단계를 설명합니다.

목차:







1. MicroSD 카드 모듈



2. ESP32와 MicroSD 카드 모듈을 인터페이스하는 방법



3. 하드웨어





4. 코드

5. 출력



6. ESP32를 사용하여 MicroSD 카드에서 다양한 기능 수행

결론

1. MicroSD 카드 모듈

MicroSD 카드 모듈은 SD 카드를 마이크로 컨트롤러 보드에 연결할 수 있는 ESP32 센서입니다. SPI 통신 프로토콜을 통해 작동합니다. 이를 통해 ESP32 또는 Arduino와 같은 다른 마이크로 컨트롤러 보드가 SPI 프로토콜을 통해 SD 카드에 저장된 데이터에 액세스할 수 있습니다.

SD 카드 모듈의 작동 전압은 3.3V이므로 ESP32나 다른 마이크로컨트롤러 보드에 직접 연결할 수 없습니다. 이를 위해서는 5V 이상에서 작동하는 SD 카드 모듈이나 센서를 사용해야 합니다.

1.1. 핀아웃

MicroSD 카드에는 총 6개의 핀이 있습니다. 그 중 두 개는 전원 핀입니다: VCC와 GND. 읽는 동안 4개의 핀이 SPI 통신 프로토콜에 사용됩니다. 다음은 이 6개 핀 모두에 대한 세부 정보입니다.

전원 핀:

  • VCC: ESP32 5V 핀에 연결됩니다.
  • 접지: ESP32 접지(GND) 핀에 연결합니다.

SPI 핀:

  • 된장: (마스터 입력 슬레이브 출력) ESP32 MOSI(마스터 출력 슬레이브 입력) 핀에 연결됩니다.
  • 연기: ESP32 MISO(Master In Slave Out) 핀에 연결됩니다.
  • SCK: ESP32 SCK(직렬 시계) 핀에 연결됩니다.
  • 봄 여름 시즌: (Slave Select) Arduino 코드에 지정된 핀을 SS(Slave Select) 핀으로 연결합니다.

2. ESP32와 MicroSD 카드 모듈을 인터페이스하는 방법

ESP32를 MicroSD 카드 모듈과 인터페이스하려면 SD 카드 센서용 전원 핀을 설정해야 합니다. 다음으로 SPI 핀을 설정합니다. 여기서는 두 가지 선택 사항이 있습니다. 기본 SPI 핀을 설정하거나 사용자 정의 SPI 핀을 정의할 수 있습니다.

기본 SPI 핀을 사용하는 경우 SD.h 그리고 SD_MMC.h 도서관. 기본적으로 이러한 라이브러리는 SPI 통신을 위해 VSPI SPI 핀(23, 19, 18, 5)을 사용합니다. 그러나 SPI 통신을 위해 다른 핀을 설정할 수도 있습니다.

ESP32에는 두 개의 SPI 인터페이스 HSPI 및 VSPI가 포함되어 있으며 해당 핀 세부 정보는 다음과 같습니다.

SPI 연기 미소 CLK CS
VSPI D23 D19 D18 D5
HSPI D13 D12 D14 D15

관련된: ESP32 핀아웃 참조 - 전체 가이드

2.2. SD 카드 준비

다음으로, MicroSD 카드에서 데이터 읽기 및 쓰기를 진행하기 전에 먼저 이전 데이터를 포맷하여 설정해야 합니다.

카드 리더기를 사용하여 SD 카드를 열고 체재 그것.

카드 파일 시스템으로 FAT32를 선택하고 다음을 클릭합니다. 시작 .

카드를 포맷한 후 좋아요 .

이제 SD 카드 모듈을 사용하여 SD 카드를 ESP32와 인터페이스할 준비가 되었습니다.

2.3. 개략도

MicroSD 카드 센서를 ESP32와 연결하려면 아래 구성을 따르십시오.

다음은 연결선의 핀 구성 표입니다.

마이크로SD 카드 ESP32
접지 접지
VCC 오다
CS D5
연기 D23
SCK D18
미소 D19

3. 하드웨어

하드웨어의 경우 ESP32 및 SD 카드 모듈과 함께 브레드보드와 점퍼선이 필요합니다.

4. 코드

이제 MicroSD 카드 내부에 텍스트 파일을 생성하는 코드를 작성한 후 여기에 텍스트 문자열을 작성합니다. 완료되면 Arduino IDE 직렬 모니터에서 텍스트 파일의 내용을 읽습니다.

Arduino IDE를 시작하고 주어진 코드를 컴파일하십시오. 그런 다음 ESP32 보드에 굽습니다.

#include

#include

파일 마이파일 ;
const 정수 CS = 5 ;

// 주어진 메시지를 지정된 경로의 파일에 씁니다.
무효의 파일 쓰기 ( const * , const * 메시지 ) {
// 파일을 엽니다. 한 번에 하나의 파일을 열 수 있도록 지원합니다.
// 새 파일을 열기 전에 다른 파일을 닫습니다.
내파일 = SD. 열려 있는 ( , 파일_쓰기 ) ;

만약에 ( 내파일 ) {
연속물. printf ( '%s에 쓰는 중' , ) ;
myFile.myFile. 인쇄 ( 메시지 ) ;
myFile.myFile. 닫다 ( ) ; // 파일을 닫습니다.
연속물. 인쇄 ( '완전한.' ) ;
} 또 다른 {
연속물. 인쇄 ( '파일을 여는 중 오류가 발생했습니다.' ) ;
연속물. 인쇄 ( ) ;
}
}

// 지정된 경로의 파일 내용을 인쇄합니다.
무효의 파일 읽기 ( const * ) {
// 파일 열기
내파일 = SD. 열려 있는 ( ) ;
만약에 ( 내파일 ) {
연속물. printf ( '%s에서 파일을 읽는 중 \N ' , ) ;
// 마지막 파일까지 전체 파일을 읽습니다.
~하는 동안 ( myFile.myFile. 사용 가능 ( ) ) {
연속물. 쓰다 ( myFile.myFile. 읽다 ( ) ) ;
}
myFile.myFile. 닫다 ( ) ; // 파일을 닫습니다.
} 또 다른 {
// 파일을 열지 못한 경우 오류를 인쇄합니다.
연속물. 인쇄 ( 'test.txt를 여는 동안 오류가 발생했습니다.' ) ;
}
}

무효의 설정 ( ) {
연속물. 시작하다 ( 9600 ) ;
지연 ( 500 ) ;
~하는 동안 ( ! 연속물 ) { ; }

연속물. 인쇄 ( 'SD 카드 초기화 중...' ) ;
만약에 ( ! SD. 시작하다 ( CS ) ) {
연속물. 인쇄 ( '초기화 실패!' ) ;
반품 ;
}
연속물. 인쇄 ( '초기화가 완료되었습니다.' ) ;

파일 쓰기 ( '/테스트.txt' , 'Linuxhint.com' ) ;
파일 읽기 ( '/테스트.txt' ) ;
}

무효의 고리 ( ) {

}

4.1. 코드 설명

더 나은 이해를 위해 이 코드를 하위 부분으로 나누겠습니다.

초기화 및 설정: 먼저 SD 카드 모듈과 관련된 몇 가지 중요한 라이브러리를 포함하는 것으로 코드가 시작되었습니다. SD 카드와의 통신을 위해 SPI.h 라이브러리가 추가되었고 SD 카드 작업을 처리하기 위해 SD.h가 추가되었습니다. 다음으로 전역 변수를 정의합니다. 내파일 파일 작업을 관리하는 파일 유형입니다. CS 상수는 SD 카드의 CS(Chip Select) 핀으로 사용되는 핀 5로 설정됩니다.

설정() 기능: 설정 기능 내에서 직렬 통신이 시작됩니다. 그런 다음 SD.begin(CS) 함수를 사용하여 SD 카드 모듈을 초기화했습니다. 또한 텍스트 파일에서 텍스트를 읽고 쓰기 위한 두 가지 다른 함수도 정의했습니다.

SD 카드에 쓰기: WriteFile() 함수는 SD.open(path, FILE_WRITE)을 사용하여 쓰기 위해 test.txt 파일을 엽니다. 그런 다음 myFile.println(message)을 사용하여 Linuxhint.com 문자열을 파일에 씁니다.

SD 카드에서 읽기: 파일 내용을 읽기 위해 ReadFile() 함수를 사용했습니다. 성공적으로 읽으면 데이터가 Arduino 직렬 포트로 전송되어 Arduino IDE 직렬 모니터에 표시됩니다.

5. 출력

출력에서 Arduino IDE 코드 내부에 정의한 것과 동일한 문자열이 Arduino IDE 직렬 모니터에 표시되는 것을 볼 수 있습니다.

6. ESP32를 사용하여 MicroSD 카드에서 다양한 기능 수행

Arduino IDE 코드를 통해 MicroSD 카드에 디렉터리 생성, 제거, 추가와 같은 다양한 작업을 직접 수행할 수 있습니다.

6.1. MicroSD 카드에 디렉토리 생성

아래 코드는 MicroSD 카드 내부에 새 디렉토리를 생성합니다. 이라는 함수를 정의합니다. createDir 이는 파일 시스템 객체(fs::FS)와 경로를 입력으로 사용합니다. 이 함수는 지정된 경로를 사용하여 디렉터리 생성을 시도하고 성공 또는 실패를 나타내는 메시지를 인쇄합니다.

#include 'FS.h'

#include 'SD.h'

#include 'SPI.h'

무효의 createDir ( FS :: FS & FS , const * ) {

연속물. printf ( '디렉터리 생성 중: %s \N ' , ) ;

만약에 ( fs. mkdir ( ) ) {

연속물. 인쇄 ( '디렉토리가 생성되었습니다' ) ;

} 또 다른 {

연속물. 인쇄 ( 'mkdir이 실패했습니다' ) ;

}

}

무효의 설정 ( ) {



연속물. 시작하다 ( 115200 ) ;

// SD 카드 초기화

만약에 ( ! SD. 시작하다 ( ) ) {

연속물. 인쇄 ( '카드 마운트 실패' ) ;

반품 ;

}

// 'mydir'이라는 디렉토리를 생성합니다.

createDir ( SD , '/mydir' ) ;

}

무효의 고리 ( ) {



}

출력에서 다음을 사용하여 새 디렉터리가 생성된 것을 볼 수 있습니다. /mydir 이름.

6.2. MicroSD 카드의 디렉터리 나열

아래 코드에서는 MicroSD 카드 내부에 있는 모든 디렉터리를 나열합니다. 그만큼 목록Dir 함수는 SD 카드에 있는 디렉터리의 내용을 반복적으로 나열합니다. 이름과 크기를 포함하여 디렉터리(접두사 'DIR')와 파일(접두사 'FILE')에 대한 정보를 인쇄합니다.

#include 'FS.h'
#include 'SD.h'
#include 'SPI.h'

무효의 목록Dir ( FS :: FS & FS , const * 이름 , uint8_t 레벨 ) {
연속물. printf ( '디렉토리 목록: %s \N ' , 이름 ) ;
파일 루트 = fs. 열려 있는 ( 이름 ) ;
만약에 ( ! 뿌리 ) {
연속물. 인쇄 ( '디렉터리를 열지 못했습니다.' ) ;
반품 ;
}
만약에 ( ! 뿌리. is디렉토리 ( ) ) {
연속물. 인쇄 ( '디렉토리가 아닙니다.' ) ;
반품 ;
}
파일 파일 = 뿌리. openNext파일 ( ) ;
~하는 동안 ( 파일 ) {
만약에 ( 파일. is디렉토리 ( ) ) {
연속물. 인쇄 ( ' 너 : ' ) ;
연속물. 인쇄 ( 파일. 이름 ( ) ) ;
만약에 ( 레벨 ) {
목록Dir ( FS , 파일. 이름 ( ) , 레벨 - 1 ) ;
}
} 또 다른 {
연속물. 인쇄 ( ' 파일: ' ) ;
연속물. 인쇄 ( 파일. 이름 ( ) ) ;
연속물. 인쇄 ( ' 크기: ' ) ;
연속물. 인쇄 ( 파일. 크기 ( ) ) ;
}
파일 = 뿌리. openNext파일 ( ) ;
}
}

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;
만약에 ( ! SD. 시작하다 ( ) ) {
연속물. 인쇄 ( '카드 마운트 실패' ) ;
반품 ;
}
목록Dir ( SD , '/' , 0 ) ;
}

무효의 고리 ( ) {

}

출력에서 두 개의 서로 다른 파일을 볼 수 있습니다. 하나는 텍스트 파일이고 다른 하나는 이전 코드에서 만든 디렉터리입니다.

6.3. 디렉토리 제거

이제 이전에 생성된 디렉터리와 텍스트 파일을 제거하겠습니다. 이를 위해 우리는 제거Dir 함수는 경로에 지정된 디렉터리를 제거하려고 시도합니다. 성공하면 인쇄됩니다. 디렉터리가 삭제됨 ; 그렇지 않으면 인쇄됩니다. rmdir 실패 .

#include 'FS.h'
#include 'SD.h'
#include 'SPI.h'

무효의 제거Dir ( FS :: FS & FS , const * ) {
연속물. printf ( '디렉터리 제거 중: %s \N ' , ) ;
만약에 ( fs. rm이다 ( ) ) {
연속물. 인쇄 ( '디렉토리가 제거되었습니다' ) ;
} 또 다른 {
연속물. 인쇄 ( 'rmdir이 실패했습니다' ) ;
}
}

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;

만약에 ( ! SD. 시작하다 ( ) ) {
연속물. 인쇄 ( '카드 마운트 실패' ) ;
반품 ;
}


}

무효의 고리 ( ) {

}

6.4. MicroSD 카드 유형 가져오기

MicroSD 카드 또는 에스 에큐어 디지털 카드는 원래 SD 카드 협회에서 설계했으며 스마트폰, 카메라와 같은 휴대용 장치에 사용하도록 설계되었습니다. SD 카드에는 주로 네 가지 유형의 제품군이 포함됩니다.

  • SDSC(표준 용량 SD): 이 카드는 2GB의 적당한 저장 용량을 제공하며 FAT-12 및 FAT-16 파일 시스템을 사용합니다.
  • SDHC(고용량 SD): 이 카드의 범위는 2GB부터 32GB까지이며 FAT-32 파일 시스템을 사용합니다.
  • SDXC(확장 용량 SD): 이 카드는 exFAT 파일 시스템을 사용하며 32GB부터 최대 2TB까지 가능합니다.
  • SDIO: SDIO 카드는 데이터 저장과 INPUT/OUTPUT 기능을 결합하여 두 가지 용도로 사용됩니다.

카드 유형을 확인하려면 아래 코드를 실행하세요.

#include 'FS.h'
#include 'SD.h'
#include 'SPI.h'

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;

만약에 ( ! SD. 시작하다 ( ) ) {
연속물. 인쇄 ( '카드 마운트 실패' ) ;
반품 ;
}

uint8_t 카드 종류 = SD. 카드 종류 ( ) ;
만약에 ( 카드 종류 == CARD_NONE ) {
연속물. 인쇄 ( 'SD 카드가 연결되어 있지 않습니다.' ) ;
반품 ;
}

연속물. 인쇄 ( 'SD 카드 유형: ' ) ;
만약에 ( 카드 종류 == CARD_MMC ) {
연속물. 인쇄 ( 'MMC' ) ;
} 또 다른 만약에 ( 카드 종류 == CARD_SD ) {
연속물. 인쇄 ( 'SDSC' ) ;
} 또 다른 만약에 ( 카드 종류 == CARD_SDHC ) {
연속물. 인쇄 ( 'SDHC' ) ;
} 또 다른 {
연속물. 인쇄 ( '알려지지 않은' ) ;
}

uint64_t 카드 크기 = SD. 카드 크기 ( ) / ( 1024 * 1024 ) ;
연속물. printf ( 'SD 카드 크기: %lluMB \N ' , 카드 크기 ) ;
}

무효의 고리 ( ) {
}

제가 32GB 카드를 가지고 있어서 32GB 정도 되는 것을 알 수 있습니다. SDHC 카드.

6.5. MicroSD 카드 크기 가져오기

아래 코드를 ESP32 보드에 업로드하여 SD 카드의 크기를 확인할 수도 있습니다.

#include 'FS.h'
#include 'SD.h'
#include 'SPI.h'

무효의 설정 ( ) {
연속물. 시작하다 ( 115200 ) ;

만약에 ( ! SD. 시작하다 ( ) ) {
연속물. 인쇄 ( '카드 마운트 실패' ) ;
반품 ;
}

uint8_t 카드 종류 = SD. 카드 종류 ( ) ;
만약에 ( 카드 종류 == CARD_NONE ) {
연속물. 인쇄 ( 'SD 카드가 연결되어 있지 않습니다.' ) ;
반품 ;
}

uint64_t 카드 크기 = SD. 카드 크기 ( ) / ( 1024 * 1024 ) ;
연속물. printf ( 'SD 카드 크기: %lluMB \N ' , 카드 크기 ) ;

// 여기에서 다른 함수(listDir, createDir, RemoveDir 등)를 호출할 수 있습니다.
}

무효의 고리 ( ) {

}

출력에서 약 30GB의 SD 카드가 있음을 알 수 있습니다.

결론

MicroSD 카드 모듈은 ESP32 보드를 사용하여 SD 카드의 데이터를 읽고 쓰는 데 사용됩니다. MicroSD 카드 모듈은 SPI 인터페이스를 사용하여 마이크로컨트롤러와 통신합니다. 따라서 SPI 라이브러리를 사용하거나 코드 내에 자체 SPI 핀을 정의할 수 있습니다. 연결되면 텍스트 파일을 읽고 쓰거나 SD 카드에 새 디렉터리를 만들 수 있습니다.