Image
20.8.2016 1 Comments

Seriál: ARDUINO – programovanie mikrokontrolérov Atmel

Web server na SD karte –práca s kartou

V minulej časti sme sa naučili pracovať s AD prevodníkom Arduina. Vytvorili sme si jednoduchú aplikáciu, ktorá kontrolovala napätie na akumulátore a podľa hodnoty tohto napätia pripájala alebo odpájala akumulátor k pomyslenému slnečnému kolektoru.

V predchádzajúcich častiach sme vytvárali webové stránky v jazyku HTML  a pri niektorých sme začali narážať na priestorový limit pamäte Arduina. Aj keď má Arduino (Uno) skoro 32 kB flash a 2 kB SRAM pamäte pre program a dáta, pre obsiahlejšie HTML stránky to bude nedostačujúce. Existuje síce určitá možnosť použiť aj pamäť EEPROM, ale jej kapacita 1 kB tak môže trochu napomôcť pri textových stránkach, avšak už nie pri obrázkoch a prípadných animáciách, ktoré by sme chceli na našich stránkach používať.

Aké je riešenie? Môžeme k Arduinu pripojiť väčšiu externú pamäť alebo môžeme použiť dnes už dobre a lacno dostupnú SD kartu. A na tú uložíme našu web stránku vrátane obrázkov.

Čo budeme potrebovať?

Ak používame ethernet shield, tak jeho súčasťou je aj slot na SD kartu. Ak používame iný typ ethernovej karty pre Arduino, musíme si zabezpečiť externú čítačku SD kariet (existujú aj také priamo šité pre Arduino) a tú pripojiť k Arduinu. A samozrejme potrebujeme mikro SD kartu! Pre začiatok nemusí mať extrémnu kapacitu, využijeme aj staršie karty o veľkosti 128 MB až 2 GB, ktoré sa dajú získať za pár drobných či dokonca zadarmo.

V dnešnej časti sa naučíme pracovať s SD kartou, zapisovať na ňu a hlavne z nej čítať webové stránky a obrázky a tie odosielať po sieti klientom. Tak sa stanú naše stránky grafickejšie a hlavne nebudeme obmedzení veľkosťou pamäte Arduina. Toto riešenie má aj určitú nevýhodu – čítanie z SD karty je pomalšie ako z internej pamäte Arduina, ale ako sa hovorí – vždy je niečo za niečo!

Čítačka SD kariet

Či už integrovaná (obr.č.1) alebo samostatná čítačka SD kariet (obr.č.2) komunikuje cez rozhranie SPI. K tomu potrebuje piny MISO, MOSI, CLKCS. Pre každé Arduino sú tieto piny na inom mieste. Pre Arduino Uno sú to piny č. 12, 11,13 a 4, pre Arduino Mega sú to piny č. 50,51, 52 a 53. Rôzne shieldy a čítačky majú signály MISO, MOSI a CLK (označované tiež ako SCK) pevne dané, líšiť sa môžu v signále CS (niekedy označovanom aj SS). Na mojom ethernet shielde je to pin č.4 (niekde býva aj pin č.10), preto si v dokumentácii svojho shieldu alebo čítačky toto skontrolujte!

Knižnica SD.h

Na prácu s SD kartou v Arduine existuje niekoľko typov knižníc. Niektoré majú obmedzenia v kapacite karty – dokážu pracovať len s kartami do veľkosti 2 GB, iné nedokážu pracovať s formátom FAT32 a iné. Asi najuniverzálnejšou knižnicou, ktorá je zároveň aj súčasťou vývojového prostredia Arduina je knižnica SD.h. Tá obsahuje sadu príkazov na prácu s SD kartami:

 

Príkaz (funkcia)

Popis

SD.begin(pin)

Inicializuje SD kartu. Pri úspešnom pokuse vráti hodnotu true, inak false. Parameter pin slúži k nastaveniu signálu CS (ChipSelect). Najčastejšie to býva hodnota 4.

SD.exists(názov)

Ak zadaná zložka, alebo súbor existuje, vráti true, inak false. Parameter názov  môže obsahovať aj cestu k súboru (napr. ZLOZKA1/ZLOZKA2/SUBOR.TXT).

SD.mkdir(názov)

Vytvorí zadanú zložku.

SD.open(názov, mód)

Otvorí vybraný súbor. Parameter mód je nepovinný a je defaultne nastavený na FILE_READ. V tomto stave je súbor otvorený iba pre čítanie a kurzor pozície je umiestnený na začiatku súboru. Ak nastavíme mód na FILE_WRITE, otvorí sa súbor aj pre zápis s kurzorom pozície na jeho konci. Ak súbor neexistuje, funkcia ho vytvorí. Všetky nadriadené zložky však musia existovať.
Tato funkcia je dôležitá, lebo vracia objekt obsahujúci informácie o otvorenom súbore, s ktorým potom pracuje druhá skupina funkcií.

SD.remove(názov)

Odstráni vybraný súbor (nie zložku!).

SD.rmdir(názov)

Odstráni vybranú zložku - zložka však musí byť prázdna.

Funkcia SD.open() vracia objekt súboru, s ktorým ďalej pracujeme. Objekt je typu File. Na prácu s objektom sa používajú tieto príkazy:

Príkaz (funkcia)

Popis

súbor.available()

Funguje rovnako ako u sériovej komunikácii - vráti počet neprečítaných bajtov v súbore.

súbor.close()

Zavrie otvorený súbor.

súbor.read()

Prečíta jeden bajt zo súboru.

súbor.write(data)

Zapíše jeden bajt do súboru.

súbor.print(data)

Zapíše dáta do súboru ako text (ASCII kódovanie). Čísla rozdelí na jednotlivé číslice a tie potom zapíše jednotlivo.

súbor.println(data)

Funguje rovnako ako .print(), len na koniec dát pridá zalomení riadku a návrat posuvníka.

Práca s SD kartou

A teraz si vyskúšame prácu s SD kartou. Ako prvé si ukážeme čítanie z SD karty. Aby sme však mohli niečo čítať, potrebujeme mať na karte nahratý nejaký súbor, ktorý budeme čítať. Zoberieme vhodnú SD kartu a zasunieme ju do čítačky na stolnom počítači alebo do notebooku (možno budeme musieť použiť micro SD adaptér – obr.č.3). Necháme ju naformátovať, doporučujem na typ FAT16. Ak máme kartu ktorá má kapacitu väčšiu ako 2 GB, túto môžeme naformátovať na typFAT32.

Na notebooku vo vhodnom editore (stačí aj obyčajný NotePad) napíšeme tento text:

   
        Arduino - webová stránka na SD karte
   
   
       

Ahoj, toto je Arduino web server!

       

Webová stránka je odosielaná z SD karty.

   

Súbor pomenujeme index.htm a uložíme na SD kartu. Kartu vyberieme z adaptéra. Pripojíme čítačku k Arduinu poprípade ethernet shield a vložíme SD kartu do slotu. Arduino pripojíme k notebooku, spustíme vývojové prostredie Arduina a napíšeme tento program:

#include
// CS pre čítačku kariet - pin 4
// pre Arduino UNO a Ethernet Shield
const int chipSelect = 4;
 
void setup()
{   
  // nastaví sériovú komunikáciu
  Serial.begin(9600);
  Serial.print("Inicializacia SD karty...");
  pinMode(4, OUTPUT);
 
  //skontroluje inicializáciu karty
  if (!SD.begin(chipSelect)) {
    Serial.println("SD karta nenajdena...");   
    return;
  }
 
  Serial.println("SD karta inicializovana...");
  Serial.println("Obsah suboru index.htm je:");
  Serial.println();
 
   // otvorí súbor index.htm
   File dataFile = SD.open("index.htm", FILE_READ);
 
  // ak súbor existuje
  if (dataFile)
  {
     // dokiaľ nebudeme na konci súboru tak:
     while (dataFile.available())
     {
        // prečítaj jeden bajt (znak) a ulož do premennej data
        byte data = dataFile.read();
        // odošli znak na Serial Monitor 
        Serial.write(data);
     }
     // súbor zavrieme
     dataFile.close(); 
  }
}
void loop()
{
}

Prvý riadok značí pripojenie knižnice SD.h. V deklaračnej časti vytvoríme konštantu typu int s názvom chipSelect, ktorej priradíme hodnotu 4.

V sekcii void setup() nastavíme sériovú komunikáciu, čo už dobre poznáme a tomto prípade využijeme. Na obrazovku Serial Monitoru sa vypíšu texty o inicializácii karty, ktorú vykonáme funkciu SD.begin. Všimnite si ten výkričník pred funkciou v príkaze if. Už vieme, že funkcia SD.begin inicializuje SD kartu a ak sa to podarilo, vrátia hodnotu true. Parametrom tejto funkcie je pin, na ktorý je pripojený signál Chip Select. V našom prípade je to pin č.4.  Zápis if (!SD.begin(chipSelect))hovorí – „ak sa nepodarilo inicializovať kartu“. Takže sa vypíše hlásenie o tom, že karta nebola nájdená. Ak karta bola inicializovaná, na Serial Monitore sa objaví o tom hlásenie a program pokračuje ďalej.

Nasleduje definícia premennej dataFile typu File. Príkazom SD.open otvoríme súbor index.htm na čítanie a jeho obsah uložíme do premennej dataFile. Ak súbor existuje a podarilo sa ho otvoriť a načítať (if datafile), tak dokiaľ obsahuje nejaké znaky a nedosiahli sme koniec súboru (while (dataFile.available)), prečíta bajt po bajte (dataFile.read) a uloží do premennej data typu byte. Potom nám už známym  príkazom serial.write tieto dáta zobrazí v Serial Monitore. Nakoniec súbor uzavrieme príkazom dataFile.close.

Všimnime si, že slučka void loop() je prázdna. To preto, že tento výpis potrebuje vykonať iba raz, nie cyklicky. Keď tento program napíšeme a skompilujeme, spustíme Serial Monitor. Ak sme v ňom nastavili správnu prenosovú rýchlosť, uvidíme výpis podobný tomu na obrázku č.4.

Takto sme zobrazili obsah súboru index.htm na Serial Monitore ako čistý text. Ak chceme, aby sa tento súbor zobrazil na obrazovke webového prehliadača ako klasická webová HTML stránka, musíme obsah súboru index.htm odoslať protokolom HTTP. Využijeme naše znalosti z tvorby nášho prvého jednoduchého web servera. Ale to si ukážeme nabudúce.

Vaše prípadné nápady a návrhy môžete písať na adresu arduino@cevaro.sk


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

1 Comments

  1. Velmi zaujimave vyuzitie reakcia na: Seriál: ARDUINO – programovanie mikrokontrolérov Atmel
    30.7.2016 12:07
    Tento clanok ma naozaj zaujal. Uz dlhsiu dobu sa zaoberam Raspberry Pi a samozrejme jednym z prvych vyuziti bol aj Web server. Diskusie o opodstatnenosti takehoto riesenia su na Internete dlhosiahle a asi nekonecne. Jedno maju ale spolocne. Hadky ohladne dostatocneho vykonu RPi na takuto sluzbu a vhodnosti SD karty ako uloziska. Nikdy ma ale nenapadlo na tento ucel pouzit Arduino. O to viac sa mi to paci. Zrejme by sa ale nejednalo o nasadenie v kombinacii s databazov a plnohodnotnou webovou sluzbou, ale skor ako zdroj dat v specifickom prostredi, napriklad priemyselnom. Dakujem za clanok. www.PiCoBot.net
    Reagovať

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá