Close

Formát SD Card

Úvodní stránka Fórum Hardware Arduino Formát SD Card

  • Toto téma obsahuje celkem 9 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel Axamith a poslední změna proběhla před 5 roky.
Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Autor
    Příspěvky
  • #11272
    Axamith
    Účastník

    Ahoj, mám problém s komunikaci arduino – SD Card. Klasické připojení karty a její inicializace. Při výpisu info o kartě na serial monitor mi hlásí:
    Inicializace SD karty…
    Pametova karta nebyla detekovana

    Kartu jsem dříve používal v mobilu, MicroSD, 2 GB. Formát ve Win nepomáhá. Něco jsem vygooglil, takže jsem formátoval pomocí SDFormatter v4.0. Nyní kartu detekuje, ale nerozpozná systém souborů FAT:
    Typ karty: SD1
    System souboru FAT16/FAT32 nenalezen.
    Zkuste naformatovat kartu

    Dohledal jsem ještě sketch na formátování přímo přes Arduino, knihovna SDFat. V příkladech je sketch formatting, na ser. monitoru vidím výpis z formátování, po otestování karty opět hláška o nerozpoznání FAT 16/32.
    Zkoušel jsem takto dvě karty, obě se chovají úplně stejně. Máte někdo zkušenosti, co s tím?

    #11279
    RomanB
    Účastník

    Také zdravím, jakou máš desku se čtečkou a použil jsi jenom program pro komunikaci s SD kartou?

    #11285
    Axamith
    Účastník

    Ahoj, mám čtečku Micro SD.

    Použil jsem krom jiných tuto sketch:

    // created 28 Mar 2011
    // by Limor Fried
    // modified 9 Apr 2012
    // by Tom Igoe
    // modifed 23.3.2013
    // by Pavel Putna

    #include <SD.h>

    // nastaví proměné pro info karty
    Sd2Card card;
    SdVolume volume;
    SdFile root;

    // nastavte správně
    // Arduino Ethernet shield: pin 4 – náš případ
    // Adafruit SD shields and modules: pin 10
    // Sparkfun SD shield: pin 8
    const int chipSelect = SS;

    void setup()
    {
    Serial.begin(9600);

    Serial.print(„\nInicializace SD karty…“);
    pinMode(4, OUTPUT);

    // inicializace
    if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println(„\nPametova karta nebyla detekovana“);
    return;
    } else {
    Serial.println(„\nPametova karta nalezena.“);
    }

    // Určí typ karty
    Serial.print(„\nTyp karty: „);
    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(„Neznama“);
    }

    // Now we will try to open the ‚volume’/’partition‘ – it should be FAT16 or FAT32
    if (!volume.init(card)) {
    Serial.println(„System souboru FAT16/FAT32 nenalezen.\nZkuste naformatovat kartu“);
    return;
    }

    // print the type and size of the first FAT-type volume
    uint32_t volumesize;
    Serial.print(„\nVolume type is FAT“);
    Serial.println(volume.fatType(), DEC);
    Serial.println();

    volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
    volumesize *= volume.clusterCount(); // we’ll have a lot of clusters
    volumesize *= 512; // SD card blocks are always 512 bytes
    Serial.print(„Volume size (bytes): „);
    Serial.println(volumesize);
    Serial.print(„Volume size (Kbytes): „);
    volumesize /= 1024;
    Serial.println(volumesize);
    Serial.print(„Volume size (Mbytes): „);
    volumesize /= 1024;
    Serial.println(volumesize);

    Serial.println(„\nNalezene soubory na karte (nazev, datum a velikost v bajtech): „);
    root.openRoot(volume);

    // list all files in the card with date and size
    root.ls(LS_R | LS_DATE | LS_SIZE);
    }

    void loop(void) {
    }

    Čtečku jsem zkoušel jak na Pro mini, tak na UNO a Wemos D1. Vím, že je třeba definovat vstup na Arduinu pinu. Volba 4, 8, 10 (dle Arduina). NIC nejede, ani volba SS. Nebo spíš ji detekuje, nenajde FAT a veškeré pokusy s kartou z příkladů z knihoven nejedou, respektive s kartou nekomunikují. Koupil jsem i novou kartu, pro klid duše, pořád bez výsledků. Buď kartu nedetekuje, nebo ji detekuje a nerozpozná FAT16/32

    #11286
    RomanB
    Účastník

    Já vlastním Ethernet s SD a tam je použit pin 4. U tebe samozřejmě je možnost volby zapíchnutím drátku. Vyzkoušej také skeč z Arduina IDE, je tam v příkladěch pod SD. Je to vlastně to stejné jako ty zde cituješ, ale akorát je to počeštěno. Jediné co je špatně je:

    // nastavte správně
    // Arduino Ethernet shield: pin 4 – náš případ
    // Adafruit SD shields and modules: pin 10
    // Sparkfun SD shield: pin 8
    const int chipSelect = SS;

    Má být const int chipSelect = 4; nebo jiný tebou použitý pin.

    Zároveň zachovej a definuj tento pin v setupu
    Serial.print(“\nInicializace SD karty…”);
    pinMode(4, OUTPUT);

    A jaké používáš napětí? 5V nebo 3,3V

    #11293
    Axamith
    Účastník

    Abych minimalizoval problémy s různým pochopením HW a SW, omezil jsem testování na UNO a originální příklady ke knihovně. UNO, napájené přes USB, SD modul připojen na GND a 5V,
    CS – PIN 10
    MOSI – PIN 11
    MISO – PIN 12
    SCK – PIN 13

    Kartu 4 GB jsem naformátoval pomocí SD Card Formatter, nastavení :
    Format type – Full (OverWrite) // i když by stačilo QUICK
    Format size adjustment – OFF

    Sketch dle příkladu z knihovky SD – CardInfo:

    /*
    SD card test

    This example shows how use the utility libraries on which the‘
    SD library is based in order to get info about your SD card.
    Very useful for testing a card when you’re not sure whether its working or not.

    The circuit:
    * SD card attached to SPI bus as follows:
    ** MOSI – pin 11 on Arduino Uno/Duemilanove/Diecimila
    ** MISO – pin 12 on Arduino Uno/Duemilanove/Diecimila
    ** CLK – pin 13 on Arduino Uno/Duemilanove/Diecimila
    ** CS – depends on your SD card shield or module.
    Pin 4 used here for consistency with other Arduino examples

    created 28 Mar 2011
    by Limor Fried
    modified 9 Apr 2012
    by Tom Igoe
    */
    // include the SD library:
    #include <SPI.h>
    #include <SD.h>

    // set up variables using the SD utility library functions:
    Sd2Card card;
    SdVolume volume;
    SdFile root;

    // change this to match your SD shield or module;
    // Arduino Ethernet shield: pin 4
    // Adafruit SD shields and modules: pin 10
    // Sparkfun SD shield: pin 8
    // MKRZero SD: SDCARD_SS_PIN
    const int chipSelect = 10;

    void setup() {
    // Open serial communications and wait for port to open:
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    }

    Serial.print(„\nInitializing SD card…“);

    // we’ll use the initialization code from the utility libraries
    // since we’re just testing if the card is working!
    if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println(„initialization failed. Things to check:“);
    Serial.println(„* is a card inserted?“);
    Serial.println(„* is your wiring correct?“);
    Serial.println(„* did you change the chipSelect pin to match your shield or module?“);
    return;
    } else {
    Serial.println(„Wiring is correct and a card is present.“);
    }

    // print the type of card
    Serial.print(„\nCard 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“);
    }

    // Now we will try to open the ‚volume’/’partition‘ – it should be FAT16 or FAT32
    if (!volume.init(card)) {
    Serial.println(„Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card“);
    return;
    }

    // print the type and size of the first FAT-type volume
    uint32_t volumesize;
    Serial.print(„\nVolume type is FAT“);
    Serial.println(volume.fatType(), DEC);
    Serial.println();

    volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
    volumesize *= volume.clusterCount(); // we’ll have a lot of clusters
    volumesize *= 512; // SD card blocks are always 512 bytes
    Serial.print(„Volume size (bytes): „);
    Serial.println(volumesize);
    Serial.print(„Volume size (Kbytes): „);
    volumesize /= 1024;
    Serial.println(volumesize);
    Serial.print(„Volume size (Mbytes): „);
    volumesize /= 1024;
    Serial.println(volumesize);

    Serial.println(„\nFiles found on the card (name, date and size in bytes): „);
    root.openRoot(volume);

    // list all files in the card with date and size
    root.ls(LS_R | LS_DATE | LS_SIZE);
    }

    void loop(void) {

    }

    a výsledek:
    Initializing SD card…initialization failed. Things to check:
    * is a card inserted?
    * is your wiring correct?
    * did you change the chipSelect pin to match your shield or module?

    Pro klid duše jsem dal i nové propojovací kabely, vyzkoušel SS piny č. 4, 8, 10 (i když u UNA je jasné, že 4 a 8 je blbost), opět bez výsledku. Taková kravina jako SD karta a co já na tom strávil času … a bez výsledku.

    #11296
    RomanB
    Účastník

    Ještě vyzkoušej test pinů 10-13 jestli jsou OK. Viz https://bastlirna.hwkitchen.cz/i-zaklady-2-bliknuti-led/ s tím, že ti bude stačit ta jedna LEDka a ty ji jenom přepojíš na další piny. A pin 12 bych ještě otestoval jako vstup. Pokud bude vše OK, tak to vypadá na mrtvou čtečku.

    /*
    Blikání
    LED na sekundu zasvítí a pak zase na sekundu zhasne. Opakovaně.
    */

    // Pin 13 je na většině Arduino deskách spojen s LED
    int led1 = 10;
    int led2 = 11;
    int led3 = 12;
    int led4 = 13;

    void setup() {
    // nastavení pinu na Output
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    }

    // opakujici se smyčka
    void loop() {
    digitalWrite(led1, HIGH); //zapnutí led
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);

    delay(1000); // po dobu jedné sekundy

    digitalWrite(led1, LOW); // vypnuti LED
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);

    delay(1000); // po dobu jedné sekundy
    }

    #11301
    Axamith
    Účastník

    Díky, testnu to. Ale myslím, že problém bude s modulem. Zkoušel jsem jak na UNO, tak na Wemos a Pro mini a vždy se stejným výsledkem. Originální příklady k SD modulu. takže objednám nový modul a uvidíme.

    #11351
    Axamith
    Účastník

    Tak a mám jasno, problém byl v čtečce. Ač byla nová a nepoužitá, je mrtvá.
    S jinou čtečkou vše jede jak má. Co já se nad tím natrápil …
    Děkuji za konzultaci a pomoc s řešením problému.

    #11357
    RomanB
    Účastník

    Kdyby vše fungovalo napoprvé, nemělo by bastlení smysl 🙂 A proto přeji mnoho úspěchů v projektu Arduino.

    #11359
    Axamith
    Účastník

    Ač je to k nevíře, čtečka se probudila k životu. Koukl jsem na ni lupou s tím, že se podívám, co by se z ní dalo využít a rozeberu ji na díly. A našel jsem neproletovaný spoj. Kapka cínu a už jede 🙂

Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Pro reakci na toto téma se musíte přihlásit.