Andmesalvestus Robootika Kodulaboris

Autor: Raivo Sell

Käesolev õpiobjekt tutvustab andmesalvestust SD kaardile Robootika Kodulaboriga.

Andmete püsivaks säilitamiseks on Robootika Kodulaboril mitmeid võimalusi. Üheks mugavamaks suurema mahuga andmete säilitamise võimaluseks on need salvestada SD kaardile. SD(Secure Digital) kaart on mälukaardi formaat, mille töötas välja SD Card Association (SDA) kasutamiseks kaasaskantavates seadmetes. Kaardiga suhtlemiseks saab kasutada kaardi enda, SD nimelist liidest või SPI siini. Viimane on hea võimalus kasutada SD kaarti ka mikrokontrollersüsteemides nagu Robootika Kodulabor.

ESF

Õpiobjekti nimi: Andmesalvestus Robootika Kodulaboris

Õpiväljundid:

Pärast mooduli läbimist õpilane:

  • Kirjeldab andmesalvestuse võimalusi
  • Kirjeldab SD kaardi struktuuri
  • Kirjeldab mikrokontrolleri SPI käskusid SD kaardiga suhtlemisel
  • Ühendab SD kaardi mikrokontrolleriga õigesti
  • Ühendab vajalikud Robootika Kodulabori moodulid õigesti

Kasutusjuhend:

  • Teoreetilise taustamaterjaliga tutvumine
  • Graafilise materjaliga tutvumine
  • Enesekontrolli küsimustele vastamine

Õpetatav osa: Lugeda teoreetilist ülevaadet enne riistvara reaalset ühendamist ja pingestamist. Vaadata juhendeid korrektse riistvara käsitlemise tagamiseks. Õpitu kinnistamiseks tuleb praktilised näited reaalselt läbi teha.

Seoste loomine: Läbi õppejuhendite ja sõnalise selgituse järgimise.

Kinnistav osa: Iseseisev praktika reaalse riistvarakomplekti baasil.

TEOREETILINE OSA

Secure Digital (SD) on mälukaardi formaat, mille töötas välja SD Card Association (SDA) kasutamiseks kaasaskantavates seadmetes. SD kaart töötab 3,3 V tööpingega. 

SD kaart on iseenesest suur hulk mälupitte, mida saab küll muuta, aga muud seadmed ei oska salvestatud andmetega seljuhul midagi peale hakata. Probleemi lahendamiseks kasutatakse failisüsteemi, mis annab võimaluse töötada kogu kaardi mälumaatriksi asemel failidega. Failisüsteemi üks tähtsamaid ülesandeid on organiseerida loogilisi faile füüsilisel salvestusseadmel. Salvestusseadmel olev ruum on jaotatud sektoriteks, mille suurus on enamasti 512 baiti. Kuna failisüsteemil on otstarbekas töötada suuremate üksustega, grupeeritakse sektoreid klastriteks. Klaster on mingi täisarvuline hulk järjestikuliselt asuvaid sektoreid. Suurema klastri kasutamisel väheneb suuremate failide puhul fragmentatsioon, kuid väiksemate failide puhul suureneb raisatud ruum, kuna osa klastreid jääb ainult osaliselt täidetuks.

Portatiivsetel mäluseadmetel ja mälukaartidel on laialt levinud FAT (File Allocation Table) failisüsteem, mida toetavad kõik enamlevinud operatsioonisüsteemid. FAT failisüsteemi failipaigutustabel sisaldab iga kettal oleva faili algusklastri kannet, mis omakorda sisaldab viita järgmisele failiga seotud klastrile ja nii edasi, kuni faililõpu klastrini. FAT-i korral on klastrid adresseeritud n-bitiste kannetega aadressiruumi tabelisse, kus n on sõltuvalt FAT-i versioonist 12 (FAT12), 16 (FAT16) või 32 bitti (FAT32). Seega vanemate FAT versioonide korral muutusid suurte kettamahtude korral klastrid mahult suureks ja seega kettamahu kasutamine ebaefektiivseks.

Praktika

Kodulabori Kontrollermooduli plaadil on pesa Micro SD mälukaardi sisestamiseks. Ühendatud on see samale SPI siinile koos etherneti kontrolleriga.

Kodulabori teegis on SD kaardiga suhtlemiseks kaks kihti. Esimene ketta kiht on seotud otseselt kettaga suhtlemise ja initsialiseerimisega. Lisaks paiknevad seal kettale kirjutamise ja lugemisega seotud funktsioonid. Teine failisüsteemi kiht suhtleb esimese kihiga ja võimaldab failidega seotud toiminguid. Toetatud ja testitud on FAT12, FAT16 ja FAT32 failisüsteemid.

Kodulabori teegis oleva FatFs failisüsteemi paketiga on võimalik lähemalt tutvuda siit.

NÄITEKOOD

Järgmine näide demonstreerib tekstifaili lugemist ja kirjutamist. Nupule S1 vajutades initsialiseeritakse ketas ja failissüsteem. Nupu S3 vajutamine loob kettale kausta, kuhu omakorda luuakse fail. Faili kirjutatakse ka sisu. Nupp S2 kuvab tekitatud faili sisu ekraanile.

#include <stdio.h>
#include <homelab/module/ff.h>
#include <homelab/module/diskio.h>
#include <homelab/delay.h>
#include <homelab/pin.h>
#include <homelab/module/lcd_gfx.h>
 
 
// LEDide viigud
pin led_red    = PIN(C, 5);
pin led_yellow = PIN(C, 4);
pin led_green  = PIN(C, 3);
 
// Nuppude viigud
pin button1 = PIN(C, 0);
pin button2 = PIN(C, 1);
pin button3 = PIN(C, 2);
 
 
int main (void)
{
	int f_err_flag = -1; //Ketta vea lipp
	int d_err_flag = -1; //Failisüsteemi vea lipp
	char f_err_buf[16];
	char d_err_buf[16];
 
	int variableName = 0;
 
	static FATFS FATFS_Obj;
        FIL fil_obj;
 
	char read_buf[20];
 
	unsigned char new_value1, old_value1 = 0;
	unsigned char new_value2, old_value2 = 0;
	unsigned char new_value3, old_value3 = 0;
 
 
	// Seab LEDid töökorda
	pin_setup_output(led_red);
	pin_setup_output(led_yellow);
	pin_setup_output(led_green);
 
	// Seab nupud töökorda
	pin_setup_input_with_pullup(button1);
	pin_setup_input_with_pullup(button2);
	pin_setup_input_with_pullup(button3);
 
	// Lülitab LEDid välja
	pin_set(led_green);
	pin_set(led_yellow);
	pin_set(led_red);
 
	// Ekraani seadistamine
	lcd_gfx_init();
 
	// LCD ekraani puhastamine
	lcd_gfx_clear();
 
	lcd_gfx_backlight(true); 
 
// Kursori (nähtamatu) ekraani keskele viimine lcd_gfx_goto_char_xy(3, 2);   // Programmi nime kuvamine lcd_gfx_write_string("SD Card");     while (1)
{ // Loeb nuppude väärtused. new_value1 = pin_get_debounced_value(button1); new_value2 = pin_get_debounced_value(button2); new_value3 = pin_get_debounced_value(button3);   // Nupp S1 alla vajutatud. Registreeritakse ainult üks vajutus. if((!new_value1) && (old_value1)) { // SD kaardi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp. d_err_flag = disk_initialize(0);   // Viide sw_delay_ms(2);   // Failisüsteemi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp. f_err_flag = f_mount(0, &FATFS_Obj);   // Viide sw_delay_ms(2);     }
 
// Nupp S2 vajutatud. Registreeritakse ainult üks vajutus. if((!new_value2) && (old_value2)) { // Faili "fail.txt" avamine lugemisreziimis. f_open(&fil_obj, "/Homelab/fail.txt", FA_READ);   // Failist esimese 14 tähemärgi lugemine. f_gets (read_buf,14, &fil_obj); f_close(&fil_obj);   // Faili esimese 14 tähemärgi ekraanile kirjutamine. lcd_gfx_goto_char_xy(0, 0); lcd_gfx_write_string(read_buf);   }   // Nupp S3 vajutatud. Registreeritakse ainult üks vajutus if((!new_value3) && (old_value3)) { // Suvaline muutuja, mis salvestatakse faili. variableName = 4;
 
// Kettale luuakse kaust "Homelab". f_mkdir("Homelab");
 
// Loodud kausta tekitatakse tekstifail "fail.txt". f_open(&fil_obj, "/Homelab/fail.txt", FA_CREATE_NEW);   // Fail avatakse kirjutusreziimis. f_open(&fil_obj, "/Homelab/fail.txt", FA_WRITE);
 
// Faili kirjutamine. f_printf(&fil_obj, "Variable: %d", variableName);   // Faili sulgemine f_close(&fil_obj); }     // Jätab eelmise nupu väärtuse meelde old_value1 = new_value1; old_value2 = new_value2; old_value3 = new_value3;
 
 
// Kui SD-kaart on initsialisseritud ja töökorras, siis põleb roheline LED // ja vastupidisel juhul punane LED. if((f_err_flag == 0) && (d_err_flag == 0)) { pin_clear(led_green); pin_set(led_red);
} else {
pin_set(led_green); pin_clear(led_red); }   // Ekraanile kuvatakse vealippude olekud. Need on järgnevad: // -1 initsialiseerimata // 0 viga ei ole // 1 (või suurem) viga sprintf(f_err_buf, "Error_f: %02d", f_err_flag ); sprintf(d_err_buf, "Error_d: %02d", d_err_flag );   lcd_gfx_goto_char_xy(0, 4); lcd_gfx_write_string(f_err_buf); lcd_gfx_goto_char_xy(0, 5); lcd_gfx_write_string(d_err_buf);   // Viide sw_delay_ms(2);
}   }

 

ENESEKONTROLL

Vastates alljärgnevatele küsimustele, saad proovida oma teadmisi antud teema kohta

Millist failisüsteemi kasutatakse Robootika Kodulaboris SD kaardile andmete salvestamiseks?
Vali õige vastus

NTFS
ext4
FAT
UTF

Mis SD kaardi formaati toetab Robootika Kodulabori Kontrollermoodul?
Vali õiged vastused

microSD
miniSD
SD

Milliseid failisüsteeme toetab SD kaardi tarkvaramoodul?
Vali õiged vastused

FAT12
FAT16
FAT32
NTFS
ext4

Millist andmevahetusprotokolli kasutatakse Robootika Kodulabori mikrokontrolleris SD kaardiga suhtlemisel?
Vali õige vastus

UART
SPI

Milleks sobib SD kaarti kasutada Robootika Kodulaboris?
Vali õiged vastused

Anduri lugemite salvestamiseks
Programmi koodi (mikrokontrolleri tööprogrammi) salvestamiseks
Konfiguratsiooniandmete salvestamiseks
Suurte failide, kuni 10 GB salvestamiseks

LISAMATERJAL

  1. Robootika Kodulabor - SD kaart
  2. FAT failisüsteemi moodul AVR mikrokontrollerile -dokumentatsioon

Teoreetilise osa algtekstide autor: Raivo Sell ja Heiko Pikner