Самодельный 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 должен был перезаписать файл)
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 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
                    Навесной монтаж — это, конечно, хорошо. Но хотелось бы плату, чтобы девайс стал полноценным Shield'ом, пусть даже не поверхностного монтажа.
                    • 0
                      Скажите, а где можно купить такой разъем/держатель для SD-карты?
                      • 0
                        я выпаял из полудохлого кардридера
                        • 0
                          Митинский радиорынок, подвал, средний ряд, примерно в середине справа, если смотреть от входа… На витрине в павильоне справа вверху почти под потолком, спрашивать «Держатель SD карт». Вариантов КУЧА!

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

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