将 SD 卡与 Arduino 连接并获取卡信息
在本教程中,我们将 Arduino Uno 连接到 SD 卡并提取卡信息。
电路图
电路图如下所示 −
如您所见,您需要进行以下连接 −
SD 卡座 | Arduino Uno |
---|---|
Vcc | 5V |
GND | GND |
MISO | 12 |
MOSI | 11 |
SCK | 13 |
CS | 10 |
仅对于 Vcc,请确保您的 SD 卡座以 5V 作为输入。如果它采用 3.3V,请将其连接到 Arduino Uno 上的 3.3V 引脚。
代码演练
我们将演练内置 SD 库附带的示例代码。您可以从文件 → 示例 → SD → 访问它CardInfo
或者,您可以在 GitHub 上访问它 −https://github.com/arduinolibraries/SD/blob/master/examples/CardInfo/CardInfo.ino
我们从包含 SPI 和 SD 库开始 −
#include <SPI.h> #include <SD.h>
接下来,我们根据 SD 库中定义的对象定义一些变量。
Sd2Card card; SdVolume volume; SdFile root;
接下来,我们定义 chipSelect 引脚。示例代码将 chipSelect 设置为引脚 4。但是,我们已将 CS 引脚连接到 Arduino Uno 的引脚 10。因此,我们将对其进行更改。
const int chipSelect = 10;
在设置中,我们首先初始化串行,然后初始化 SD 卡(使用 chipSelect 引脚和 SPI 协议,SPI 协议的其他引脚 MISO、MOSI、SCK 在 SPI 库中默认定义)。
void setup() { // 打开串行通信并等待端口打开: Serial.begin(9600); while (!Serial) { ; // 等待串行端口连接。仅适用于原生 USB 端口 } Serial.print("
正在初始化 SD 卡..."); // 我们将使用实用程序库中的初始化代码 // 因为我们只是在测试卡是否正常工作! if (!card.init(SPI_HALF_SPEED, chipSelect)) { Serial.println("初始化失败。需要检查的事项:"); Serial.println("* 是否插入了卡?"); Serial.println("* 您的接线正确吗?"); Serial.println("* 您是否更改了 chipSelect 引脚以匹配您的 屏蔽或模块?"); while (1); } else { Serial.println("接线正确,卡存在。"); }
接下来,我们使用 .type() 函数获取并打印卡的类型。
// 打印卡的类型 Serial.println(); Serial.print("Card type: "); switch (card.type()) { case SD_CARD_TYPE_SD1: Serial.println("SD1"); break; case SD_CARD_TYPE_SD2: Serial.println("SD2"); break; case SD_CARD_TYPE_SDHC: Serial.println("SDHC"); break; default: Serial.println("Unknown"); }
接下来,我们初始化卡的卷,获取卡中的簇总数以及每个簇的块数,从而获取卡中的块总数。
// 现在我们将尝试打开"volume"/"partition" - 它应该是 FAT16 或 FAT32 if (!volume.init(card)) { Serial.println("Could not find FAT16/FAT32 partition.
Make sure you've formatted the card"); while (1); } Serial.print("Clusters: "); Serial.println(volume.clusterCount()); Serial.print("Blocks x Cluster: "); Serial.println(volume.blocksPerCluster()); Serial.print("Total Blocks: "); Serial.println(volume.blocksPerCluster() * volume.clusterCount()); Serial.println();
稍后,我们打印卷的类型是 FAT 16 还是 FAT 32。此外,我们计算总卷(以 kB 为单位),因为一个块始终为 512 字节或 0.5 kB。
// 打印第一个 FAT 类型卷的类型和大小 uint32_t volumesize; Serial.print("Volume type is: FAT"); Serial.println(volume.fatType(), DEC); volumesize = volume.blocksPerCluster(); // 簇是块的集合 volumesize *= volume.clusterCount(); // 我们将拥有很多集群 volumesize /= 2; // SD 卡块始终为 512 字节(2 个块为 1KB) Serial.print("卷大小 (Kb): "); Serial.println(volumesize); Serial.print("卷大小 (Mb): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("卷大小 (Gb): "); Serial.println((float)volumesize / 1024.0);
最后,我们使用 openRoot() 函数列出卡上找到的所有文件,并打印日期和大小以及文件名
Serial.println("
在卡上找到的文件(名称、日期和大小(以字节为单位):"); root.openRoot(volume); // 列出卡上的所有文件以及日期和大小 root.ls(LS_R | LS_DATE | LS_SIZE);