Мы не выдаем Китай за Италию. Платы от российского производителя по сниженным ценам.

Новинки: Power DC Shield, Светодиодная лента, Freeduino Mini, модули USB Host, Relay.

Назначение

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

Модуль совместим со стандартной Arduino библиотекой SD, отличается от других, представленнх на рынке плат следующими особенностями:

  • Поддерживает как SD так и microSD карты (в т.ч. и совместную работу с двумя картами)
  • Возможность работы с платами в формате Nano
  • Возможность выбора вывода SS (slave select)

Комплектация

Существует два варианта комплектации SD Shield, различающихся монтажом разъемов. Немонтируемые в той или иной версии разъемы высылаются вместе с платой для возможного последующего монтажа.

SD/microSD карты в комплект поставки не входят.

SD Shield Arduino      Временно недоступно для заказа

Плата ориентирована на использование совместно с полноразмерными Arduino-совместимыми устройствами.

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

SD Shield 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 карты:

#include <SD.h>

//используется вывод 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.

Было:

    if ( ! file.open(SD.root, filepath, mode)) {

Стало:

    if ( ! file.open(root, filepath, mode)) {

Во-вторых, библиотека не всегда вовремя освобождает шину SPI, поэтому, перед работой с картой нужно выставить соответствующий ей вывод SS в ноль, а для других устройств, присутствующих на шине (второй карты) - в единицу.

Пример чтения файлов с двух карт:

#include <SD.h>

//для одновременной работы со второй картой нужен дополнительный объект 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), то не следует размещать во втором неиспользуемом разъеме другую карту, поскольку она может мешать работе первой.