SD modul

 

 

Mikro SD modul

 

V některých aplikacích je vhodné zaznamenávat data pro jejich pozdější zpracování. K tomuto účelu lze využít SD modul. Uvedený modul zapisuje data na paměťovou mikro SD kartu. Dá se pořídit jak v Asii, tak v ČR. Komunikace modulu s Arduinem probíhá pomoci SPI (Serial Peripheral Interface) rozhraní. Napájecí napětí modulu je 4,5 - 5,5 V. K danému účelu byly ověřeny desky UNO a NANO se stejnými kladnými výsledky. 

Arduino připojíme k SD modulu:  

Arduino UNO         mikro SD modul

UNO 5V ----> Vcc

 UNO GND ----> GND

 UNO pin D11 ----> MOSI

 UNO pin D12 ----> MISO

UNO pin D13 ----> SCK

 UNO pin D2 ----> CS

 

 

 

K ověření záznamu textu lze použit skeč "SD_text.ino". Skeč proběhne jednou, na kartě vytvoří soubor "Test.txt" (název max. 8 znaků, přípona 3 znaky) a do souboru zapíše text "text". V zapisovaném textu nelze používat diakritiku a mezery nahrazujeme podtrhávací čarou.  SD modul vyžaduje knihovny "SPI.h" a "SD.h". Jsou součásti IDE, není třeba shánět.

 

Skeč "SD_text.ino":

#include <SPI.h>                 	//knihovny           
#include <SD.h>

File S;                          	//deklarace            

void setup()
{ SD.begin(2);                    	//iniciace pinu D2 Arduina         
S=SD.open("Test.txt", FILE_WRITE);	//založí textový souboru "Test.txt" na SD kartě       
S.println("text");                	//zapíše text do souboru       
S.close();}                      	//uzavře soubor                                        

void loop()                     	//prázdná smyčka           
{}

 

Paměťovou kartu předem naformátujeme na formát FAT32. Kartu vloží do SD modulu a do desky Arduino nahrajeme skeč "SD_text.ino". Po ukončení nahrávání bude na paměťové kartě vytvořen soubor "Test.txt" a do tohoto souboru bude zapsán text "text". Kartu vyjmeme z modulu a pomoci SD čtečky se v PC přesvědčíme o stavu paměťové karty. Do zapsaného souboru máme možnost nahlédnou např. klávesnicí F4.

 

Pro účely zaznamenávání číselných dat lze použít soubor s příponou "csv", který lze zpracovat v Excelu. Zapisované hodnoty musí být v souboru odděleny středníkem. K ověření záznamu číselných dat lze použít skeč "SD_data.ino". Skeč každou sekundu navyšuje číselnou hodnotu A+5 a zapisuje do souboru "Test.csv":

 

Skeč "SD_data.ino":

#include <SPI.h>                      	//knihovny      
#include <SD.h>

File S;                                 //deklarace   
int A=0;

void setup()
{SD.begin(2);}                          //iniciace pinu D2 Arduina  
  
void loop()                             //smyčka se opakuje a vždy zapíše na SD kartu hodnotu A   
{A=A+5;                                 //zvýší hodnotu A+5   
S = SD.open("Test.csv", FILE_WRITE);    //založí soubor "csv" na SD kartě   
S.print(A);                             //zapíše hodnotu A do souboru   
S.println(";");                         //zapíše oddělovač za hodnotu A   
S.close();            			//uzavře zápis                     
delay(1000);}				//prodleva 1 sekunda

 

 

Prázdnou naformátovanou paměťovou kartu vložíme do SD modu a do Arduina nahrajeme skeč "SD_data.ino". Po ukončení nahrávání ponecháme desku Arduino běžet, např. 30 sekund. Po této době desku odpojíme.  Na paměťové kartě bude vytvořen soubor "Test.csv". V souboru budou zapsány číselné hodnoty za dobu běhu desky. Soubor lze zpracovat v Excelu. Soubor "Test.csv" otevřeme v Excelu, v  levém sloupci (A) se zobrazí načtené hodnoty. Klikneme na záhlaví sloupce, tj, na písmeno A (dojde k označení sloupce), v záhlaví Excelu zvolíme nabídku grafu, vybereme typ grafu, např. čarový, a graf zobrazíme:

 

 

V prvním sloupci zleva jsou pořadová čísla záznamu, v tomto případě se jedná o čas v sekundách (smyčka zapisovala každou sekundu jednu hodnotu, viz "delay" na posledním řádku skeče). Tyto hodnoty tvoří osu "x" grafu.  Osa"y" obsahuje hodnoty sloupce "A", tj. zaznamenané hodnoty na paměťové kartě. Graf lze podle možnosti Excelu upravit (!Excel používá desetinnou čárku, Arduino desetinnou tečku!).  

Tímto způsobem lze na paměťovou kartu zapisovat data s časovým intervalem menším než 0,1 sekundy (viz grafy koncentrací CO v kapitole "Analyzátor CO"). Pokud volíme uvedený krátký interval, je vhodné experimentálně ověřit skutečný čas běhu smyčky delším časem záznamu (zjistíme čas běhu smyčky se záznamem na SD kartu). Nejkratší ověřený interval  záznamu na SD kartu (po odstranění "delay" na posledním řádku skeče "SD_avomet.ino") činil 23,1 milisekundy při použití mikro SD karty HAOSHIDENG V10 (SD karta třídy V10 - 10MB/s). Rychlost zápisu SD karty popisuje článek zde. K aktivaci a ukončení záznamu lze použít reset desky Arduino. Procesor začíná zapisovat na SD kartu cca po 1 sekundě od odpojení RES od GND.

 

 

SD modul

Byl odzkoušen SD modul základní velikosti paměťové karty (32x24 mm) s deskou NANO. SD modul se dá pořídit jak v Asii, tak v ČR. Arduino NANO připojíme k SD modulu stejným způsobem jako mikro SD modul:  

Arduino NANO         SD modul

NANO 5V ----> Vcc

 NANO GND ----> GND

 NANO pin D11 ----> MOSI

 NANO pin D12 ----> MISO

NANO pin D13 ----> SCK

 NANO pin D2 ----> CS

 

Modul SD byl napájen z pinu 5V desky NANO. V uvedeném zapojení byl použit vypínač pro přerušení záznamu, viz níže popsaný skeč.

 

 

Skeč byl sestaven pro zápis třech sloupců dat do souboru "Test.csv"  a možnost přerušení záznamu pomoci vypínače. K tomuto účelu byla na pin D3 naprogramovaná logická "1" příkazem "PULLUP" a byla použitá podmínka "if" k zapnutí/vypnutí záznamu. SD modul vyžaduje knihovny "SPI.h" a "SD.h". Jsou součásti IDE, není třeba shánět.Tři sloupce dat tvoří:

- první sloupec:  proměnná "A", čas běhu skeče v milisekundách podle příkazu "millis"

- druhý sloupec: proměnná "B", názorná hodnota konstantně narůstající B=B+1.01

- třetí sloupec: proměnná "C", názorná hodnota konstantně narůstající C=C+2.01

Do desky NANO nahrajeme skeč " SD_3_sloupce.ino":

 

Skeč "SD_3_sloupce.ino":

#include <SPI.h>                                          //knihovny SD karty 
#include <SD.h> 
  
File S;                                                             //deklarace 
unsigned long A=0; 
float B=0; 
float C=0; 
  
void setup() 
{SD.begin(2);                                                  //iniciace pinu D2, připojení SD karty 
pinMode(3,INPUT_PULLUP);}                      //iniciace pinu D3, přiřazení logické 1 
  
void loop() 
{A=(millis());                                                    //zápis času od zahájení skeče do proměnné A v milisekundách 
B=B+1.01;C=C+2.01;                                    //konstantní navyšování hodnoty proměnných  B a C 
if(digitalRead(3)==HIGH)                               //podmínka - jestliže je na pinu D3 log. "1", pak se provede zápis na SD kartu 
{S=SD.open("Test.csv",FILE_WRITE);           //založí soubor "Test.csv" na SD kartě 
S.print(A);S.print(" ");                                     //zápis času v milisekundách od zahájení skeče a mezera 
S.print(B);S.print(" ");                                     //zapíše hodnotu B a mezeru 
S.print(C);S.println(" ");                                  //zapíše hodnotu C, mezeru a zalomí řádek 
S.close();}                                                       //uzavře zápis 
delay(1000);}                                                  //čeká 1 sekundu 


 

 

Skeč byl spuštěn připojením desky NANO na USB a po cca 10ti sekundách bylo vypínačem odpojeno spojení D3 s GND. Tímto byla na D3 logická "1" a byl proveden zápis na SD kartu v trvání cca 10ti sekund (opět vypnuto vypínačem). Na SD kartu byly zapsány tři sloupce dat do souboru "Test.csv", viz projekce dat stiskem klávesy F4 na soubor "Test.csv" v PC:

V prvém sloupci vidíme čas v milisekundách od zapnutí záznamu. Čas tvoří běh smyčky "void loop()" včetně "delay (1000)". Lze vypočítat, že mezi jednotlivými řádky je po odečtení "delay(1000)" rozdíl nejčastěji 23 milisekund, což tvoří čas jednoho běhu smyčky obsahující zápis na SD kartu (může záviset na kvalitě SD karty, u jiné karty to byl čas cca 18 milisekund). Ostatní dva sloupce tvoří názorné, pravidelně narůstající konstanty. Sloupce jsou odděleny mezerou. Tento soubor "csv" je možné zobrazit v EXCELU. Pro tento účel byl pořízen soubor o 21 řádcích (od začátku připojení desky NANO k USB) bez přerušení vypínačem.

Soubor zobrazíme v EXCELU.

Odlišnost zápisu Arduina vyžaduje v Excelu konkrétní postup otevření dat (Arduino používá desetinnou tečku, Excel čárku). Postup je popsán zde. Po zobrazení dat v Excelu vytvoříme graf s daty prvního sloupce v ose "x", tj. v tomto názorném příkladu čas trvání záznamu bude tvořit osu "x" (sloupec dat proměnné "A" - čas v milisekundách běhu programu). Ostatní dva sloupce budou zobrazeny v ose "y" (názorné hodnoty konstant "B" a "C"). Postup vytvoření grafu je popsán zde.

 

 

Další úprava grafu závisí na naši dovednosti práce s Excelem, případně se interaktivně pokusíme o dopracování.

 

Poznámka:

Pro zjištění času záznamu, případně času jednoho běhu smyčky "loop", ve které budeme mít naprogramovaný záznam na SD kartu, je možné využít příkaz "millis()". Pokud umístíme tento příkaz na začátek a konec smyčky "loop", rozdíl vyčíslí čas jednoho běhu smyčky. Například, na začátek umístíme T1=millis(); na konec T2=millis(); T=T2-T1;. Čas T bude čas jednoho běhu smyčky "loop" v milisekundách. 

 

Upozornění:

Excel (2002) zobrazuje do jednoho grafu max. 32000 řádků. Je proto vhodné v pořizovaném souboru "csv" nepřekročit tento limit. V několika případech byl problém s příkazem "millis", docházelo v čase záznamu k nadměrnému zpomalování. Je lépe se příkazu "millis" v delších záznamech vyhnout.

 

Prosinec 2020/upraveno 2024

 

Home

 

Arby

arduinohobby@email.cz