Web разработчик
0,0
рейтинг
9 марта 2011 в 22:46

Самодельный SD Card Shield для Arduino

Приветствую, %username%!
Подумал на днях, что для своего будущего 2х ядерного коптера (да и мало ли других проектов) неплохо бы потом сделать еще и черный ящик (GPS), а для этого надо много памяти и EEPROM не поможет, а поэтому стоит купить или сделать SD шилд для Arduino.
Купить — дороговато для такой мелочи и долго ждать пока пришлют, поэтому гуглим и находим что народ то клепает свои шилды, для этого нам понадобится всего 6 резисторов, переходник/разъем для карты памяти и сама карточка (заработало с картами SD и SDHC, отформатированными в FAT16 и FAT32).

Схемка довольно простая (читаем подробнее тут):

резисторы нужны для понижения напряжения с 5 до примерно 3.4 вольт
спаял, получилось вот такая красота:

код взял из стандартых примеров Arduino, только немного подправил пины под вариант схемы (измененные места отмечены жирным, заодно перевел на русский местами):
/*
SD card read/write

Этот пример показывает как читать и писать данные на и из файла на SD карточке
Схема подключения
* SD карточка подсоеденина к SPI шине:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 10

создано Ноябрь 2010
David A. Mellis
обновлено 2 Декабря 2010
Tom Igoe
и переведено в Марте 2011
Gleb Devyatkin
Этот пример кода - народное достояние.

*/

#include <SD.h>

File myFile;

void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);

  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // открываем файл. заметте, что только один файл может быть открыт за раз,
  // поэтому вы должны закрыть этот, чтобы открыть другой.
  myFile = SD.open("test.txt", FILE_WRITE);

  // если файл нормально открылся, запишем в него:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // закрываем файл:
    myFile.close();
    Serial.println("done.");
  } else {
    // а если он не открылся, то печатаем сообщение об ошибке:
    Serial.println("error opening test.txt");
  }

  // откроем файл снова, для чтения:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // читаем из файла, пока не достигнем конца файла:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // закрываем файл:
    myFile.close();
  } else {
    // а если не открылся, то пишем об ошибке:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
  // больше делать нечего, но тут мог бы быть ваш код
}


Поле отработки этого кода — на вашей карточке будет файлик TEST.TXT с содержимым «testing 1, 2, 3.» (или много раз эта строка, если код запускался не один раз, что немного странно, так как FILE_WRITE должен был перезаписать файл)
SovGVD @SovGVD
карма
45,2
рейтинг 0,0
Web разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (23)

  • +3
    Думается мне, теги code не помешают
    • 0
      код и так в <code> — или вы про другое?
      • +1
        <source lang="cpp"> </source>

        Попробуйте так.
        • 0
          стало тоже самое, но в сереньком квадрате
        • 0
          а нет… убрал html изнутри — стало лучше =)
  • +1
    Хм, прикольно. Теперь буду знать, что в ATmega328 можно даже работу с файловой системой вставить. Думал, что это за гранью хардкора.

    Есть ли какие ограничения в SD библиотеке, помимо того что она способна работать одновременно только с одним файлом? Ограничение на размер файла? Как насчет работы с файлом в поддиректории? Прочитать список файлов в директории? Удалить файл?
    • +1
      особо еще не ковырял (только сегодня сделал), но точно можно:
      создавать/удалять каталоги
      удалять файл
      проверять файл на существование

      подробнее тут arduino.cc/en/Reference/SD
    • +1
      мне иногда кажется что у ардуинке вообще нет предела, из ближайшего, что хочу попробовать:
      вывод PAL сигнала без каких либо шилдов www.elenafrancesco.org/arduino/palgenerator/ и внедрение своего сигнала www.elenafrancesco.org/arduino/baroneosd/ (правда тут не совсем осознал как подключать)
  • +3
    Как два пальца об асфальт:
    SD shield
  • +2
    Простите, а с чего вы взяли, что SDHC якобы работать не будут, да ещё и только в FAT16?
    • 0
      с того что все везде пишут что работать не будет… сейчас специально проверил, на FAT16 и FAT32 без проблем пишет, так же как и на SDHC 8Gb =)
      странно что к подобным шилдам то и дело приписка «SDHC is not supported. „
      • +1
        Изучайте матчасть. Разницы в электрическом интерфейсе между SD, SDHC и SDXC нет вообще, отличия только в управлении и формате (ну и скоростях поддерживаемых), так что поддержка того или иного стандарта — дело драйвера. В документации на Ваш драйвер явно написано, что SD и SDHC он поддерживает, равно как и FAT16 и FAT32.

        Вот так-то™.
  • 0
    Очень уж мне нравится твой коптер. Жду недождусь, когда ты к нему нейроинтерфейс прикрутишь.
    • 0
      и тогда он захватит мир, неся хаос и разруху!!! =)
  • 0
    Навесной монтаж — это, конечно, хорошо. Но хотелось бы плату, чтобы девайс стал полноценным Shield'ом, пусть даже не поверхностного монтажа.
  • 0
    Скажите, а где можно купить такой разъем/держатель для SD-карты?
    • 0
      я выпаял из полудохлого кардридера
    • 0
      Митинский радиорынок, подвал, средний ряд, примерно в середине справа, если смотреть от входа… На витрине в павильоне справа вверху почти под потолком, спрашивать «Держатель SD карт». Вариантов КУЧА!

      P.S. Вчера обыскался, почти смирился уже с «Выпаяю хоть как-нить откуда-нить с мясом!»… И тут ОНО!
  • +1
    Собрал на ProtoShield, работает.
  • 0
    Вообще-то на ардуине уже есть 3.3 вольта, зачем такая конструкция из резисторов?
    • 0
      3.3 есть на питании, а вот на сигнальных проводках 0в-5в
  • +1
    К сожалению картинка со схемой отвалилась из статьи — вот она (вдруг кому еще пригодится? тема до сих пор востребована.)
    image
    • 0
      Спасибо. Только вчера увидел статью про готовый шилд, залез в свою, а тут схемы больше нет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.