Cách kết nối mô-đun thẻ MicroSD với ESP32 bằng Arduino IDE

Cach Ket Noi Mo Dun The Microsd Voi Esp32 Bang Arduino Ide



ESP32 là một bo mạch vi điều khiển tiên tiến có thể giao tiếp với nhiều thiết bị ngoại vi khác nhau. Giống như các cảm biến khác, bạn cũng có thể kết nối mô-đun thẻ MicroSD với ESP32. Bạn có thể sử dụng cảm biến thẻ MicroSD cho các ứng dụng ghi dữ liệu hoặc tăng dung lượng lưu trữ cho bo mạch vi điều khiển của mình.

Bài viết này sẽ giải thích các bước để kết nối thẻ MicroSD với bo mạch ESP32 bằng Arduino IDE.

Mục lục:







1. Mô-đun thẻ MicroSD



2. Cách kết nối ESP32 với mô-đun thẻ MicroSD



3. Phần cứng





4. Mã

5. Đầu ra



6. Thực hiện các chức năng khác nhau trên thẻ MicroSD bằng ESP32

Phần kết luận

1. Mô-đun thẻ MicroSD

Mô-đun thẻ MicroSD là một cảm biến ESP32 có thể kết nối thẻ SD với bo mạch vi điều khiển của bạn. Nó hoạt động trên giao thức truyền thông SPI. Nó cho phép ESP32 hoặc bất kỳ bo mạch vi điều khiển nào khác như Arduino truy cập dữ liệu được lưu trữ trên thẻ SD qua giao thức SPI.

Điện áp hoạt động của mô-đun thẻ SD là 3,3V, do đó không thể kết nối trực tiếp nó với ESP32 hoặc bất kỳ bo mạch vi điều khiển nào khác. Để làm được điều đó, chúng ta cần sử dụng mô-đun thẻ SD hoặc cảm biến hoạt động trên 5V.

1.1. Sơ đồ chân

Thẻ MicroSD có tổng cộng sáu chân. Hai trong số đó là chân nguồn: VCC và GND. Trong khi bốn chân đọc được sử dụng cho giao thức truyền thông SPI. Sau đây là thông tin chi tiết về tất cả sáu chân này:

Chân nguồn:

  • VCC: Kết nối với chân ESP32 5V.
  • GND: Kết nối với chân nối đất (GND) của ESP32.

Chân SPI:

  • MISO: (Master In Slave Out) Kết nối với chân ESP32 MOSI (Master Out Slave In).
  • KHÓI: Kết nối với chân ESP32 MISO (Master In Slave Out).
  • SCK: Kết nối với chân ESP32 SCK (Đồng hồ nối tiếp).
  • SS: (Chọn nô lệ) Kết nối với chân được chỉ định trong mã Arduino dưới dạng chân SS (Chọn nô lệ).

2. Cách kết nối ESP32 với mô-đun thẻ MicroSD

Để kết nối ESP32 với mô-đun thẻ MicroSD, bạn sẽ cần thiết lập các chân nguồn cho cảm biến thẻ SD của mình. Tiếp theo thiết lập các chân SPI. Ở đây bạn có hai lựa chọn, bạn có thể đặt các chân SPI mặc định hoặc xác định các chân SPI tùy chỉnh của riêng mình.

Khi sử dụng các chân SPI mặc định, chúng ta sẽ thêm SD. SD_MMC.h thư viện. Theo mặc định, các thư viện này lấy các chân VSPI SPI (23, 19, 18, 5) để liên lạc SPI. Tuy nhiên, bạn cũng có thể đặt các chân khác cho giao tiếp SPI.

ESP32 chứa hai giao diện SPI HSPI và VSPI với các chân chi tiết như sau:

SPI KHÓI MISO CLK CS
VSPI D23 D19 D18 D5
HSPI D13 D12 D14 D15

Có liên quan: Tham khảo sơ đồ chân của ESP32 – Hướng dẫn đầy đủ

2.2. Chuẩn bị sẵn thẻ SD

Tiếp theo, trước khi có thể tiến hành đọc và ghi dữ liệu vào thẻ MicroSD, trước tiên, bạn phải thiết lập thẻ bằng cách định dạng bất kỳ dữ liệu nào trước đó trong thẻ.

Mở thẻ SD của bạn bằng bất kỳ đầu đọc thẻ nào và định dạng Nó.

Chọn FAT32 cho hệ thống tệp thẻ của bạn và nhấp vào Bắt đầu .

Sau khi định dạng thẻ, chọn ĐƯỢC RỒI .

Bây giờ thẻ SD của bạn đã sẵn sàng để giao tiếp với ESP32 bằng mô-đun thẻ SD.

2.3. Sơ đồ

Để kết nối cảm biến thẻ MicroSD với ESP32, hãy làm theo cấu hình dưới đây:

Sau đây là bảng cấu hình chân của dây kết nối:

Thẻ micro SD ESP32
GND GND
VCC ĐẾN
CS D5
KHÓI D23
SCK D18
MISO D19

3. Phần cứng

Đối với phần cứng, bạn chỉ cần một số dây nhảy trên bảng mạch cùng với mô-đun thẻ ESP32 và SD.

4. Mã

Bây giờ chúng ta sẽ viết một mã để tạo một tệp văn bản bên trong thẻ MicroSD và sau đó, nó sẽ ghi một số chuỗi văn bản vào đó. Sau khi hoàn tất, chúng ta sẽ đọc nội dung của tệp văn bản trên màn hình nối tiếp Arduino IDE.

Khởi động Arduino IDE và biên dịch mã đã cho. Sau đó ghi nó vào bảng ESP32 của bạn:

#include

#include

Tập tin myFile ;
hằng số int CS = 5 ;

// Viết tin nhắn đã cho vào một tệp tại đường dẫn đã chỉ định
trống rỗng Viết tập tin ( hằng số ký tự * con đường , hằng số ký tự * tin nhắn ) {
// Mở tập tin. Nó hỗ trợ một tập tin để mở cùng một lúc
// đóng file khác trước khi mở file mới
tập tin của tôi = SD. mở ( con đường , FILE_WRITE ) ;

nếu như ( tập tin của tôi ) {
Nối tiếp. printf ( 'Đang ghi vào %s' , con đường ) ;
tập tin của tôi. in ( tin nhắn ) ;
tập tin của tôi. đóng ( ) ; // Đóng tập tin
Nối tiếp. in ( 'hoàn thành.' ) ;
} khác {
Nối tiếp. in ( 'lỗi mở file' ) ;
Nối tiếp. in ( con đường ) ;
}
}

// In nội dung file tại đường dẫn đã chỉ định
trống rỗng Đọc tài liệu ( hằng số ký tự * con đường ) {
// Mở tập tin
tập tin của tôi = SD. mở ( con đường ) ;
nếu như ( tập tin của tôi ) {
Nối tiếp. printf ( 'Đọc tập tin từ %s \N ' , con đường ) ;
// Đọc file hoàn chỉnh cho tới file cuối cùng
trong khi ( tập tin của tôi. có sẵn ( ) ) {
Nối tiếp. viết ( tập tin của tôi. đọc ( ) ) ;
}
tập tin của tôi. đóng ( ) ; // Đóng tập tin
} khác {
// Nếu không mở được file, in ra lỗi:
Nối tiếp. in ( 'lỗi mở test.txt' ) ;
}
}

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 9600 ) ;
trì hoãn ( 500 ) ;
trong khi ( ! nối tiếp ) { ; }

Nối tiếp. in ( 'Đang khởi tạo thẻ SD...' ) ;
nếu như ( ! SD. bắt đầu ( CS ) ) {
Nối tiếp. in ( 'Khởi tạo thất bại!' ) ;
trở lại ;
}
Nối tiếp. in ( 'Khởi tạo xong.' ) ;

Viết tập tin ( '/test.txt' , 'Linuxhint.com' ) ;
Đọc tài liệu ( '/test.txt' ) ;
}

trống rỗng vòng ( ) {

}

4.1. Giải thích mã

Để hiểu rõ hơn, chúng tôi sẽ chia mã này thành các phần nhỏ.

Khởi tạo và thiết lập: Đầu tiên, mã bắt đầu bằng cách đưa vào một số thư viện quan trọng liên quan đến mô-đun thẻ SD. Thư viện SPI.h được thêm vào để liên lạc với thẻ SD và SD.h để xử lý các hoạt động của thẻ SD. Tiếp theo, nó định nghĩa một biến toàn cục tập tin của tôi loại tệp để quản lý các hoạt động của tệp. Hằng số CS được đặt ở chân 5, chân này sẽ được sử dụng làm chân Chip Select (CS) cho thẻ SD.

Chức năng cài đặt (): Bên trong chức năng thiết lập, giao tiếp nối tiếp được bắt đầu. Sau đó, chúng tôi khởi tạo mô-đun thẻ SD bằng hàm SD.begin(CS). Hơn nữa, chúng tôi cũng đã xác định hai hàm khác nhau để đọc và ghi văn bản vào tệp văn bản.

Ghi vào thẻ SD: Hàm WriteFile() mở tệp test.txt để ghi bằng SD.open(path, FILE_WRITE). Sau đó, nó ghi chuỗi Linuxhint.com vào tệp bằng myFile.println(message).

Đọc từ thẻ SD: Để đọc nội dung file, chúng ta đã sử dụng hàm ReadFile(). Nếu đọc thành công, dữ liệu sẽ được gửi đến cổng nối tiếp Arduino và hiển thị trên màn hình nối tiếp Arduino IDE.

5. Đầu ra

Ở đầu ra, bạn có thể thấy chuỗi tương tự mà chúng tôi đã xác định bên trong mã Arduino IDE được hiển thị trên màn hình nối tiếp Arduino IDE của bạn.

6. Thực hiện các chức năng khác nhau trên thẻ MicroSD bằng ESP32

Chúng ta có thể thực hiện nhiều thao tác khác nhau như tạo, xóa hoặc thêm thư mục trong thẻ MicroSD trực tiếp thông qua mã Arduino IDE.

6.1. Tạo thư mục trong thẻ MicroSD

Đoạn mã dưới đây sẽ tạo một thư mục mới bên trong thẻ MicroSD. Nó định nghĩa một hàm gọi là tạoDir lấy một đối tượng hệ thống tệp (fs::FS) và một đường dẫn làm đầu vào. Hàm này cố gắng tạo một thư mục có đường dẫn được chỉ định và in các thông báo cho biết thành công hay thất bại.

#include 'FS.h'

#include 'SD.h'

#include 'SPI.h'

trống rỗng tạoDir ( fs :: FS & fs , hằng số ký tự * con đường ) {

Nối tiếp. printf ( 'Đang tạo thư mục: %s \N ' , con đường ) ;

nếu như ( fs. mkdir ( con đường ) ) {

Nối tiếp. in ( 'Dir đã tạo' ) ;

} khác {

Nối tiếp. in ( 'mkdir không thành công' ) ;

}

}

trống rỗng cài đặt ( ) {



Nối tiếp. bắt đầu ( 115200 ) ;

// Khởi tạo thẻ SD

nếu như ( ! SD. bắt đầu ( ) ) {

Nối tiếp. in ( 'Gắn thẻ không thành công' ) ;

trở lại ;

}

// Tạo thư mục có tên 'mydir'

tạoDir ( SD , '/mydir' ) ;

}

trống rỗng vòng ( ) {



}

Ở đầu ra, bạn có thể thấy một thư mục mới được tạo bằng /mydir tên.

6.2. Liệt kê thư mục trong thẻ MicroSD

Trong đoạn mã dưới đây, chúng tôi sẽ liệt kê tất cả các thư mục có trong thẻ MicroSD. Các danh sáchDir Hàm liệt kê đệ quy nội dung của một thư mục trên thẻ SD. Nó in thông tin về cả thư mục (có tiền tố là “DIR”) và các tệp (có tiền tố là “FILE”), bao gồm tên và kích thước của chúng.

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

trống rỗng danh sáchDir ( fs :: FS & fs , hằng số ký tự * tên thư mục , uint8_t cấp độ ) {
Nối tiếp. printf ( 'Thư mục danh sách: %s \N ' , tên thư mục ) ;
Tệp gốc = fs. mở ( tên thư mục ) ;
nếu như ( ! nguồn gốc ) {
Nối tiếp. in ( 'Không thể mở thư mục' ) ;
trở lại ;
}
nếu như ( ! nguồn gốc. isDirectory ( ) ) {
Nối tiếp. in ( 'Không phải là một thư mục' ) ;
trở lại ;
}
Tập tin tập tin = nguồn gốc. mởNextFile ( ) ;
trong khi ( tài liệu ) {
nếu như ( tài liệu. isDirectory ( ) ) {
Nối tiếp. in ( ' BẠN : ' ) ;
Nối tiếp. in ( tài liệu. tên ( ) ) ;
nếu như ( cấp độ ) {
danh sáchDir ( fs , tài liệu. tên ( ) , cấp độ - 1 ) ;
}
} khác {
Nối tiếp. in ( ' TÀI LIỆU: ' ) ;
Nối tiếp. in ( tài liệu. tên ( ) ) ;
Nối tiếp. in ( ' KÍCH CỠ: ' ) ;
Nối tiếp. in ( tài liệu. kích cỡ ( ) ) ;
}
tài liệu = nguồn gốc. mởNextFile ( ) ;
}
}

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;
nếu như ( ! SD. bắt đầu ( ) ) {
Nối tiếp. in ( 'Gắn thẻ không thành công' ) ;
trở lại ;
}
danh sáchDir ( SD , '/' , 0 ) ;
}

trống rỗng vòng ( ) {

}

Ở đầu ra, bạn có thể thấy hai tệp khác nhau. Một là tệp văn bản và tệp còn lại là thư mục mà chúng tôi đã tạo bên trong mã trước đó.

6.3. Xóa thư mục

Bây giờ chúng ta sẽ xóa các thư mục và tệp văn bản đã tạo trước đó. Để làm được điều đó chúng ta sẽ sử dụng xóaDir chức năng, Nó sẽ cố gắng loại bỏ một thư mục được chỉ định bởi đường dẫn. Nếu thành công, nó sẽ in Đã xóa thư mục ; nếu không, nó sẽ in rmdir không thành công .

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

trống rỗng xóaDir ( fs :: FS & fs , hằng số ký tự * con đường ) {
Nối tiếp. printf ( 'Đang xóa thư mục: %s \N ' , con đường ) ;
nếu như ( fs. là rm ( con đường ) ) {
Nối tiếp. in ( 'Đã xóa thư mục' ) ;
} khác {
Nối tiếp. in ( 'rmdir không thành công' ) ;
}
}

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;

nếu như ( ! SD. bắt đầu ( ) ) {
Nối tiếp. in ( 'Gắn thẻ không thành công' ) ;
trở lại ;
}


}

trống rỗng vòng ( ) {

}

6.4. Nhận loại thẻ MicroSD

Thẻ MicroSD hoặc S an toàn D Thẻ igital ban đầu được thiết kế bởi hiệp hội thẻ SD và được thiết kế để sử dụng trong các thiết bị di động như điện thoại thông minh và máy ảnh. Thẻ SD chủ yếu chứa bốn loại họ:

  • SDSC (SD dung lượng tiêu chuẩn): Các thẻ này cung cấp phạm vi dung lượng lưu trữ khiêm tốn là 2GB và sử dụng hệ thống tệp FAT-12 và FAT-16.
  • SDHC (SD dung lượng cao): Các thẻ này có dung lượng từ 2GB đến 32GB và sử dụng hệ thống tệp FAT-32.
  • SDXC (SD dung lượng mở rộng): Các thẻ này sử dụng hệ thống tệp exFAT và bắt đầu từ 32 GB đến cao nhất là 2TB.
  • SDIO: Thẻ SDIO phục vụ mục đích kép bằng cách kết hợp việc lưu trữ dữ liệu với các chức năng INPUT/OUTPUT.

Để kiểm tra loại thẻ của bạn, hãy chạy mã bên dưới:

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

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;

nếu như ( ! SD. bắt đầu ( ) ) {
Nối tiếp. in ( 'Gắn thẻ không thành công' ) ;
trở lại ;
}

uint8_t Loại thẻ = SD. Loại thẻ ( ) ;
nếu như ( Loại thẻ == THẺ_NONE ) {
Nối tiếp. in ( 'Không có thẻ SD kèm theo' ) ;
trở lại ;
}

Nối tiếp. in ( 'Loại thẻ SD:' ) ;
nếu như ( Loại thẻ == CARD_MMC ) {
Nối tiếp. in ( 'MMC' ) ;
} khác nếu như ( Loại thẻ == CARD_SD ) {
Nối tiếp. in ( 'SDSC' ) ;
} khác nếu như ( Loại thẻ == CARD_SDHC ) {
Nối tiếp. in ( 'SDHC' ) ;
} khác {
Nối tiếp. in ( 'KHÔNG XÁC ĐỊNH' ) ;
}

uint64_t kích thước thẻ = SD. kích thước thẻ ( ) / ( 1024 * 1024 ) ;
Nối tiếp. printf ( 'Kích thước thẻ SD: %lluMB \N ' , kích thước thẻ ) ;
}

trống rỗng vòng ( ) {
}

Vì tôi có thẻ 32GB nên bạn có thể thấy nó nằm trong khoảng SDHC thẻ.

6.5. Nhận kích thước thẻ MicroSD

Bạn cũng có thể biết kích thước của thẻ SD bằng cách tải mã bên dưới lên bảng ESP32 của mình.

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

trống rỗng cài đặt ( ) {
Nối tiếp. bắt đầu ( 115200 ) ;

nếu như ( ! SD. bắt đầu ( ) ) {
Nối tiếp. in ( 'Gắn thẻ không thành công' ) ;
trở lại ;
}

uint8_t Loại thẻ = SD. Loại thẻ ( ) ;
nếu như ( Loại thẻ == THẺ_NONE ) {
Nối tiếp. in ( 'Không có thẻ SD kèm theo' ) ;
trở lại ;
}

uint64_t kích thước thẻ = SD. kích thước thẻ ( ) / ( 1024 * 1024 ) ;
Nối tiếp. printf ( 'Kích thước thẻ SD: %lluMB \N ' , kích thước thẻ ) ;

// Các hàm khác (listDir, createDir, RemoveDir, v.v.) có thể được gọi tại đây
}

trống rỗng vòng ( ) {

}

Từ đầu ra, bạn có thể thấy tôi có thẻ SD khoảng 30 GB.

Phần kết luận

Mô-đun thẻ MicroSD được sử dụng để đọc và ghi dữ liệu từ thẻ SD bằng bảng ESP32. Mô-đun thẻ MicroSD giao tiếp với bộ vi điều khiển bằng giao diện SPI. Vì vậy, bạn có thể sử dụng thư viện SPI hoặc xác định các chân SPI của riêng mình bên trong mã. Sau khi kết nối, bạn có thể đọc, ghi tệp văn bản hoặc tạo thư mục mới trong thẻ SD của mình.