Назначение
Модуль предназаначен для подключения к Arduino-совместимым платам SD и microSD карт.


Модуль совместим со стандартной Arduino библиотекой SD, отличается от других, представленнх на рынке плат следующими особенностями:
- Поддерживает как SD так и microSD карты (в т.ч. и совместную работу с двумя картами)
- Возможность работы с платами в формате Nano
- Возможность выбора вывода SS (slave select)
Комплектация
Существует два варианта комплектации SD Shield, различающихся монтажом разъемов. Немонтируемые в той или иной версии разъемы высылаются вместе с платой для возможного последующего монтажа.
SD/microSD карты в комплект поставки не входят.
Плата ориентирована на использование совместно с полноразмерными Arduino-совместимыми устройствами.

В комплект поставки входит SD Shield со смонтированными разъемами «классической» Arduino, а также разъемы Arduino Nano.
Плата ориентирована на использование совместно с устройствами в формате Arduino Nano.

В комплект поставки входит SD Shield со смонтированными разъемами Arduino Nano, а также разъемы <классической> Arduino.
Конфигурирование модуля
С помощью группы перемычек JSS выбирается номер вывода Slave Select, который должен быть разным у различных устройств, находящихся на шине SPI. Верхний ряд штырьков - вывод SS карты SD, нижний ряд - вывод SS карты microSD. В центральном ряду - выводы Arduino 10, 9, 8. Таким образом, можно выбрать для каждой карты любой из трех (10, 9, 8) выводов Arduino.
На рисунке ниже выбран вывод 10 для карты SD, и вывод 9 для карты microSD.

Джампер JPWR выбирает источник питания 3.3В. В левом положении 3.3В поступают с основной платы, в правом - от встроенного стабилизатора 3.3В, питающегося от 5В.
Пример работы с картой
Пример чтения файла с SD карты:
//используется вывод 10 в качестве SS (Slave Select)
const int SSpin = 10;
void setup()
{
//открываем COM порт
Serial.begin(9600);
Serial.print("Initializing SD card...");
//инициализируем карту, проверяем ошибки
if (!SD.begin(SSpin)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
Serial.println("reading datalog.txt from card...");
//открываем файл "datalog.txt" в корневом каталоге, и если он открылся
File dataFile = SD.open("datalog.txt");
if (dataFile) {
//и если он открылся в цикле до конца файла
//читаем по одному байту из файла и выводим в COM порт
while (dataFile.available()) {
Serial.write(dataFile.read());
}
//закрываем файл
dataFile.close();
}
else {
Serial.println("error opening datalog.txt from card");
}
}
void loop()
{
}
Одновременная работа с двумя картами
Модуль позволяет одновременно работать с двумя картами, но для этого требуется правильная работа прошивки.
Во-первых, нужно исправить ошибку стандартной библиотеки SD (актуально для версии ПО Arduino 1.0.5) в файле libraries/SD/SD.cpp строка 453.
Было:
Стало:
Во-вторых, библиотека не всегда вовремя освобождает шину SPI, поэтому, перед работой с картой нужно выставить соответствующий ей вывод SS в ноль, а для других устройств, присутствующих на шине (второй карты) - в единицу.
Пример чтения файлов с двух карт:
//для одновременной работы со второй картой нужен дополнительный объект SDClass
SDClass SD2;
//используются выводы 10 и 9 в качестве SS (Slave Select)
const int SS1pin = 10;
const int SS2pin = 9;
void setup()
{
//открываем COM порт
Serial.begin(9600);
//будем работать с двумя картами с разными номерами выводов SS
//конфигурируем эти выводы как выходные
pinMode(SS1pin, OUTPUT); pinMode(SS2pin, OUTPUT);
//перед работой с картой выставляем 0 на ее выводе SS, и 1 на остальных
digitalWrite(SS1pin, 0); digitalWrite(SS2pin, 1);
Serial.print("Initializing SD card 1...");
//инициализируем карту с SS на 10 выводе, проверяем ошибки
if (!SD.begin(SS1pin)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
//перед работой с картой выставляем 0 на ее выводе SS, и 1 на остальных
digitalWrite(SS1pin, 1); digitalWrite(SS2pin, 0);
Serial.print("Initializing SD card 2...");
//инициализируем карту с SS на 9 выводе, проверяем ошибки
if (!SD2.begin(SS2pin)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");
//перед работой с картой выставляем 0 на ее выводе SS, и 1 на остальных
digitalWrite(SS1pin, 0); digitalWrite(SS2pin, 1);
Serial.println("reading datalog.txt from card 1...");
//открываем файл "datalog.txt" в корневом каталоге, и если он открылся
File dataFile = SD.open("datalog.txt");
if (dataFile) {
//и если он открылся в цикле до конца файла
//читаем по одному байту из файла и выводим в COM порт
while (dataFile.available()) {
Serial.write(dataFile.read());
}
//закрываем файл
dataFile.close();
}
else {
Serial.println("error opening datalog.txt from card 1");
}
//перед работой с картой выставляем 0 на ее выводе SS, и 1 на остальных
digitalWrite(SS1pin, 1); digitalWrite(SS2pin, 0);
Serial.println("reading datalog.txt from card 2...");
//открываем файл "datalog.txt" в корневом каталоге, и если он открылся
File dataFile2 = SD2.open("datalog.txt");
if (dataFile2) {
//и если он открылся в цикле до конца файла
//читаем по одному байту из файла и выводим в COM порт
while (dataFile2.available()) {
Serial.write(dataFile2.read());
}
//закрываем файл
dataFile2.close();
}
else {
Serial.println("error opening datalog.txt from card 2");
}
}
void loop()
{
}
Также следует отметить, что если в Вашей прошивке реализована работа только с одной картой (и значит не переключаются в нужные состояния выводы SS), то не следует размещать во втором неиспользуемом разъеме другую карту, поскольку она может мешать работе первой.