Pojďme programovat elektroniku | Arduino | SD

Pojďme programovat elektroniku: Co se skrývá uvnitř běžné SD karty a jak ji oživit

  • Máme ji v mobilech a fotoaparátech
  • SD karta je dnes už standard
  • A proto ji zkusíme připojit i k Arduinu

Máte ji ve svých fotoaparátech, digitálních kamerách a mobilních telefonech, kde se tento typ úložiště díky svým rozměrům a oblibě mezi výrobci stal v podstatě standardem výměnných paměťových karet. Řeč je samozřejmě o SD.

Dnes se na ni podíváme optikou našeho seriálu o programování elektroniky, ovládnutí SD karty z Arduina, destičky s čipem ESP8266 a tak dále totiž patří k základním dovednostem a často také k jedinému způsobu, jak bez internetu rychle a za běhu načítat data do mikročipu, anebo je naopak ukládat pro snadné čtení na velkém počítači – třeba informace z libovolného řídla.

7c3c80d7-4476-4179-b65f-a2a5e3763f01
SD karta v klasickém rozměru a jako microSD. Mimochodem, věděli jste, že páčka Lock pro zákaz zápisu ve skutečnosti sama o sobě nic nedělá? Její polohu musí detekovat samotná čtečka a zápis zakázat na úrovní počítače, ke kterému je SD karta připojená. 

Secure Digital jako globální standard

Formát SD, tedy Secure Digital, vychází ze starší technologie MMC a za jeho vývojem stály na sklonku 90. let minulého století společnosti SanDisk, Panasonic a Toshiba.

Zkraje nového tisíciletí zastřešila další vývoj organizace SD Association, jejíchž několik set členů od Applu po Microsoft se už postaralo o to, aby se ze Secure Digital stal skutečný standard, který z trhu téměř dokonale vytlačil veškerou konkurenci.

50de0874-f20e-4b3d-86aa-1ed644770e6c
I když vypadá SD karta stále stejně, dnes nabízí hromadu technologií. Vedle samotného úložiště také chytré funkce iSDIO (SD karta se zabudovaným Wi-Fi atp.)

SD kartu známe v jejích dvou základních rozměrech. V malém provedení microSD a v klasické velikosti. Byť se samotná podoba obou karet za ty roky prakticky nezměnila, v nitru došlo k hotové technologické revoluci.

Díky tomu lze dnes použít technologii SD v její nejrychlejší kategorii i k ukládání a načítání rozměrných dat rychlostí v řádu mnoha desítek MB/s, čehož mezi prvními využil třeba projekt mikropočítačů Raspberry Pi, které microSD používají jako výchozí úložiště operačního systému.

Jistě, stále je to o řád méně než v případě vašeho SSD, my se tu ale bavíme o drobné kartičce velikosti SIM a poštovní známky a v porovnání s velkými úložišti také s nicotnou elektrickou spotřebou!

V nitru maličké kartičky

Fajn, ale co je tedy vlastně uvnitř toho maličkého plastu? Ve své podstatě to není žádná věda, s nožíkem v ruce byste totiž v nitru našli docela prostý čip flashové paměti v provedení NAND pro mnohem rychlejší, snazší a častější přepisování dat než v případě flashových pamětí typu NOR.

de3a8540-5ba1-4138-8a97-997315d60f77
Toto většinu čtenářů asi překvapí, aneb vlevo SD karta v celku a vpravo skutečné rozměry tištěného obvodu samotného čipu. Vnitřní rozměry karty tedy dávají výrobci poměrně velkou svobodu, jak s nimi naloží.

Ačkoliv jsou flashové paměti NAND mnohem rychlejší než NOR, které se používají spíše pro uložení firmwaru na řídící čip (není důležitá rychlost a četnost zápisů, ale jen rychlost čtení), i ony pochopitelně trpí problémy s omezeným počtem přepisovacích cyklů. Mazání/přepisování dat na flashové paměti je totiž z fyzikálního a mikroskopického hlediska poměrně agresivní proces.

List papíru, tužka a guma

Samotné paměťové buňky flashové paměti bychom mohli připodobnit k listu papíru. Když na něj budeme chtít zapsat nějaká data, vezmeme do ruky tužku a začneme psát na jednotlivé řádky (paměťové sektory) nuly a jedničky. Když je ale budeme potřebovat přepsat, vyměníme tužku za gumu a celý řádek listu smažeme.


S omezeným počtem write/erase cyklů flashových pamětí  je to podobné jako s listem papíru a gumou (Zdroj: Wikipedie

Problém spočívá v tom, že když budeme některý z těchto řádků mazat příliš často, list papíru brzy prodřeme a tato část paměti bude nenávratně poškozená. Vzhledem k dnešním kapacitám SD karet, které dosahují kapacity až 1 TB, nicméně není nutné jedno místo přepisovat stále dokola, takže trvanlivost může poskočit až o několik řádů.

Myslí na to i některé speciální souborové systémy pro přenosná média, které při zápisu pečlivě střídají paměťové sektory, čímž se může dramaticky zvýšit jejich životnost.

SD kartu lze připojit skrze sériovou sběrnici SPI

Současná SD karta umí komunikovat skrze několik vlastních protokolů SD I/O (SDIO), při připojování k běžnému Arduinu a dalším populárním prototypovacím destičkám se ale zpravidla používá mnohem populárnější sériová sběrnice SPI (Serial Peripheral Interface), se kterou jsme v našem seriálu pracovali už mnohokrát.

908d241f-78f4-40f0-b781-34704715d7bc
Pinout, tedy popis jednotlivých elektrických signálů SD karty při zapojení skrze sběrnici SPI

SPI má čtyři signální linky, které jsou zpravidla pojmenované takto:

  • SS/CS (Slave Select/Chip Select, signál koncového zařízení)
  • MOSI (Master Out, Slave In: komunikace z mikropočítače do karty)
  • MISO (Master In, Slave Out: komunikace z karty do mikropočítače)
  • CLK (Clock, takt komunikace)

Samozřejmě bychom mohli na vodivé plošky SD karty připájet drátky a kartu přímo připojit na piny sběrnice SPI vhodného mikrokontroleru, mnohem vhodnější je ale koupě modulu pouzdra pro SD, který obsahuje převodník napětí.

a9e56fa8-6ca7-4c36-8dbc-17bfb1b12102
Základní Arduino Uno a spojení se čtečkou SD karet pomocí sběrnice SPI, pro které jsou na této desce vyhrazené digitální piny 10, 11, 12 a 13, případně samostatný konektor ICSPI

Ten je opravdu důležitý, protože paměťové čipy povětšinou pracují na mnohem nižším napětí než klasické 5V Arduino. Kdybychom tedy SD kartu připojili přímo k 5V desce Arduino Uno, nejspíše ji poškodíme. Bude vyžadovat nižší 3,3V logiku, na které pracují třeba populární prototypovací desky s Wi-Fi čipem ESP8266, nebo armové mikrokontrolery.

Předinstalovaná knihovna SD se postará o práci se soubory

Fajn, kartu jsme tedy skrze pouzdro s převodníkem 5V logiky a napájení na 3,3 V připojili k desce Arduino Uno, ale jak to vlastně celé oživit? Nebojte se, nebudete muset studovat žádnou dokumentaci složitého komunikačního protokolu, vše za nás totiž už udělali autoři Arduina.

bbfdfab6-3330-4021-8096-0fa7c8a056760cdb23f8-920f-4c37-80d5-179d6e985053
Modul čtečky microSD a připojení k desce Arduino Uno pomocí sběrnice SPI

Součástí vývojového prostředí je předinstalovaná knihovna s prostým názvem SD. Pro základní seznámení bohatě stačí, přičemž z GitHubu si můžete stáhnout její pokročilejší verzi SdFat. Z názvu je patrné, že Arduino zvládne práci s SD kartou, která je naformátovaná na souborový systém FAT16 nebo FAT32. S jinými pochopitelně fungovat nebude.

Při napájení skrze baterii mějte na paměti, že po připojení ke zdroji elektřiny SD karta dle specifikace spaluje i v klidu okolo 15 mA elektrického proudu. S využitím modulu čtečky je třeba připočítat i jeho vlastní odběr.

Uložíme na SD pozdrav a zase jej přečteme

Základní práce s paměťovou kartou je v obou případech velmi jednoduchá. My se budeme dále držet předinstalované a jednodušší verze knihovny SD. V příkladu níže nejprve připíšeme na konec souboru test.txt v kořenovém adresáři karty nový řádek „Ahoj, tady je casopis Computer!“ Poté celý soubor vypíšeme pro kontrolu do sériové linky.

#include <SD.h>

void setup() {
  Serial.begin(115200);
  SD.begin(SS);
  delay(1000);
  Serial.println("*** TEST SD KARTY ***");

  Serial.println("Zapisuji soubor...");
  File soubor = SD.open("/test.txt",FILE_WRITE);
  soubor.println("Ahoj, tady je casopis Computer!");
  soubor.close();


  Serial.println("Ctu soubor...");
  soubor = SD.open("/test.txt", FILE_READ);
  while (soubor.available()) {
    Serial.print((char)soubor.read());
  }
  soubor.close();
}

void loop() {;}

Pojďme si kód projít podrobněji. Nejprve vložíme odkaz na hlavičkový soubor knihovny SD.h. Jak jsem už napsal výše, je součástí instalace prostředí Arduino. Ve funkci setup, která je povinná a spustí se po startu čipu, nejprve nastartujeme sériovou linku rychlostí 115 200 b/s.

V dalším kroku otevřeme spojení se samotnou SD kartou. Parametr SS knihovně říká, že jsme SD kartu (respektive modul čtečky) připojili na výchozí identifikační CS/SS pin sběrnice SPI, kterým je v případě desky Arduino Uno pin číslo 10.

K čemu slouží na sběrnici SPI pin SS?

K čemu vlastně pin CS/SS slouží? K identifikaci zařízení, pokud jich máme na sběrnici připojeno více (CS/SS znamená Chip Select, nebo Slave Select). Zatímco v případě sběrnice I²C jsou jednotlivá zařízení identifikovaná pomocí interní číselné adresy, v případě sběrnice SPI slouží k rozlišení právě tento dedikovaný vodič.

67fe8ce5-4ffd-4418-92b9-872910a5fe9f
Schéma zapojení periferií na sběrnici SPI s rozlišením pomocí digitálního stavu na pinu CS/SS každé z nich. Nevýhodou SPI je tedy velká spotřeba digitálních pinů na řídícím mikropočítači. Grafika: Cburnett, CC-BY-SA-3.0

Kdybychom tedy na sběrnici SPI vedle čtečky SD karet připojili ještě nějaké další zařízení, třeba displej, jako jeho CS/SS pin použijeme některý ze zbývajících volných pinů GPIO. Řídící čip Arduina pak nastavováním stavů na těchto identifikačních pinech vlastně určuje, se kterým SPI klientem zrovna komunikuje a ostatní budou datový přenos ignorovat.

Spojení je nastartované, zbytek je už brnkačka

Tak, po malé odbočce zpět do našeho programu. Máme nastartovanou sériovou linku i spojení s SD kartou na sběrnici SPI, a tak ještě sekundu počkáme, ať se stačí vše stabilizovat, a otevřeme soubor test.txt v kořenovém adresáři a v režimu pro zápis. Pokud se žádný takový soubor na SD kartě nevyskytuje, knihovna jej za nás automaticky vytvoří.

59ad79d5-ff99-4184-87b5-6c54a2ac102c
Vestavěná knihovna SD se postará o primitivní vytváření a čtení textových i binárních souborů. Na pokročilejší a rychlejší práci s SD kartami třeba pro načítání JPEG obrázků pro připojené LCD displeje slouží pokročilejší knihovny.

Poté do souboru uložíme řádek „Ahoj, tady je casopis Computer!,“ který se v tomto režimu zapíše až na jeho konec a nepřepíše jeho stávající obsah. To se hodí pro případy, kdybychom chtěli do souboru periodicky zapisovat údaje z čidel po řádcích třeba ve formátu CSV. Každé měření tedy vytvoří nový řádek v souboru, aniž bychom jej celý přepsali.

Soubor uzavřeme a v poslední části programu jej znovu otevřeme tentokrát v režimu čtení. V tomto případě procházíme soubor ve smyčce znak po znaku až do konce a každý znak (bajt převedený na znak) posíláme do sériové linky.

Jako kdybychom zapisovali a četli ze sériové linky

Pokud vám způsob zapisování a čtení ze souboru připomíná práci se sériovou linku, není to náhoda, třídy Serial i File jsou totiž obě odvozené ze základní třídy Stream pro práci s proudy dat. Takovým proudem může být jak sériová linka, tak soubor na SD kartě, čili v obou případech používáme i stejné metody pro čtení a zápis textových (ASCII) i surových binárních dat.

a511277e-3dc0-4f01-a351-049305d119e4
Kompletní výstup našeho primitivního programu, který vytvořil  textový soubor a vypsal jej do sériové linky. Stejným způsobem bychom mohli na SD ukládat třeba údaje z čidel ve formát CSV, XML, JSON apod. 

Knihovna SD je samozřejmě dostatečně univerzální, aby nám poskytla kompletní servis. Libovolný soubor tak můžeme dále otevřít i v režimu, kdy jej celý přepíšeme, pomocí metody seek se v souboru můžeme přesunout na konkrétní pozici a nechybí ani práce s adresáři, které snadno vytvoříme, smažeme a vypíšeme obsah.

1. ledna 2000, 00:00:00

Když nyní Arduino odpojíme od napájení, vytáhneme z pouzdra SD kartu a zacvakneme ji třeba do notebooku, správce souborů zobrazí její obsah včetně vytvořeného textového souboru.

64c85d86-97da-4e23-bdeb-d2013e3becd9
Soubor má podivné datum, protože použitý mikropočítač Arduino Uno nemá obvod reálného času RTC

Má to jen jeden háček. U souboru bude svítit nesmyslné datum a čas jeho vytvoření o půlnoci 1. ledna roku 2000. Je to logické, Arduino Uno totiž není vybavené obvodem reálného času RTC, takže netuší, kolik je hodin. Kdybychom tyto údaje znali, můžeme časovou značku uložit k metadatům souboru.

Ze stejného důvodu jsou pokročilejší pouzdra pro SD karty vybavené vlastními RTC hodinami, které s Arduinem komunikují zpravidla skrze sběrnici I²C a na GitHubu pro ně najdeme zástup knihoven pro snadné ovládnutí, a zároveň pouzdrem pro malou baterii, která bude udržovat čas i ve chvíli, kdy bude čtečka karet odpojená od napájení.

07d3fb09-8f41-4a86-ba12-e307289a6c6a7f0d6550-49b9-4ff3-9ba8-f1e1aa3ec2b8b1ab5d1c-f343-4d24-8eab-5929ec867330
Jeden z populárních modulů RTC hodin s rozhraním I²C a kombinovaný shield s obvodem RTC i SD karty pro Arduino Uno

Funkci pokročilé čtečky SD karty s RTC obvodem nabízejí třeba některé rozšiřující desky pro Arduino Uno a Mega. V hantýrce se jim říká shieldy a jejich cena se pohybuje v řádu desetikorun až stokorun podle toho, zdali si je objednáte z Aliexpressu, anebo do druhého dne třeba z českého Arduino-shop.cz.

Skvělý pomocník, když nemá mikropočítač Wi-Fi

A to je pro dnešek už vážně všechno. Tentokrát jsme si tedy ukázali, jak lze na SD kartu velmi jednoduše ukládat data z drobných mikrokontrolerů, nebo je naopak číst. Představte si například nějaké čidlo kdesi v lese nebo na druhém konci zahrady, kam nedosáhne signál Wi-Fi.

Čidlo může průběžně ukládat data třeba do textového souboru na SD kartě, kterou můžete kdykoliv vytáhnout a přečíst na velkém počítači. Stejně tak byste ale mohli SD použít k nahrání jiné konfigurace programu, čip si totiž na začátku svého programu zkontroluje, jestli je na připojeném úložišti třeba soubor nastaveni.txt, který si následně projde a nastaví nové hodnoty.

Meze představivosti se nekladou a SD karta může být skvělým pomocníkem nejen ve vašem fotoaparátu, mobilu nebo třeba Raspberry Pi.

Článek původně vyšel v časopisu Computer, kde každý měsíc najdete náš seriál o programování elektroniky. Aktuálně se v něm věnujeme knihovně pro počítačové vidění OpenCV na Raspberry Pi s připojenou drobnou kamerou.

Diskuze (20) Další článek: Kometa C/2019 Y4 (ATLAS) nečekaně zvýšila jas. Podle odhadů rozzáří noční oblohu už za pár dnů

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,