Arduino – Salvare date in EEPROM extern

Ce sunt memoriile EEPROM externe ?

Termenul EEPROM inseamna Electrically Erasable Programmable Read-Only Memory, adica  acest termen se refera la memoriile nevolatile care pot fi citite/scrise si rescrise de nenumarate ori.

Memoriile nevolatile sunt cele care isi pastreaza continutul, chiar si dupa ce ai intrerupt  alimentarea. Spre exemplu, un alt dispozitiv care isi pastreaza datele este hard disk-ul. Chiar daca ai  oprit calculatorul, hard disk-ul pastreaza toate informatiile intacte. Ele nu se sterg si pot fi accesate din  nou la urmatoarea pornire a calculatorului.

In aceeasi maniera functioneaza si o memorie EEPROM. Poti sa salvezi date in ea si sa le citesti ori de cate ori vrei tu, chiar si dupa ce ai intrerupt alimentarea.

In ce conditii poti sa folosesti o memorie EEPROM ?

In primul rand, memoriile EEPROM nu sunt destinate pentru a salva blocuri uriase de  informatii (asa cum face un hard disk), dar poti folosi o memorie EEPROM pentru a salva o cantitate  minima de informatii, adica cel mult cativa MB.

In al doilea rand, memoriile sunt simplu de utilizat si sunt produse in capsule de circuite  integrate, adica poti sa le adaugi foarte usor si foarte rapid in proiectul tau.

Alt avantaj al memoriilor EEPROM este ca multumita interfetei de comunicare cu placa  Arduino, poti sa folosesti nu doar una, ci mai multe memorii inlantuite pe o magistrala I2C sau SPI.

Dar totusi in ce situatii poti sa folosesti aceste memorii?

Iata un data logger ce se foloseste de memoria EEPROM pentru a salva un numar mare de  esantioane cu valori de temperatura:

http://forum.arduino.cc/index.php/topic,111366.0.html

Un alt proiect asemanator celui de mai sus este un data logger care inregistreaza viteza de  deplasare a unei biciclete:

http://www.eightlines.com/blog/2008/09/data-logging-to-the-arduino-eeprom/

Daca nu stiai afla ca si placa Arduino, mai exact microcontroller-ul placii, are propria memorie  EEPROM pe care poti salva pana la 4096 de octeti (4KB). Poti afla mai multe detalii despre memoria  interna accesand urmatoarele link-uri:

http://arduino.cc/en/Reference/EEPROM#.UySH7Pl_uSo

http://arduino.cc/en/Tutorial/EEPROMWrite#.UySIYPl_uSo

http://arduino.cc/en/Tutorial/EEPROMRead#.UySIefl_uSo

Cum conectez o memorie EEPROM la o placa Arduino ?

In acest tutorial s-a folosit o memorie EEPROM AT24C02, a carei fisa de catalog se poate  descarca de la urmatoarea adresa:

http://www.atmel.com/Images/doc3256.pdf

Spre exemplu, din fisa de catalog se pot afla urmatoarele specificatii ale memoriei:
• Tensiunea de alimentare: 5 V sau 2.7 V.

• Organizarea interna a memoriei care iti va fi de folos atunci cand o adresezi.

• Tipul interfetei seriale (memoria de fata necesita o interfata seriala pe 2 fire)

• Viteza de scriere a datelor in functie de tensiunea de alimentare.

• Numarul de scrieri posibile (memoria de fata suporta 1 milion de cicluri de scrieri).

• Configuratia pinilor (pinii de adresare, pinii interfetei seriale, pinii de alimentare si pinul de  citire/scriere).

Dar totusi cum conectez memoria la placa Arduino ? Pentru a realiza acest lucru vei avea  nevoie de o placa breadboard, fire de conexiune tata-tata si memoria in sine.

Conexiunea placii Arduino cu memoria EEPROM se va realiza dupa urmatoarea schema:

Mai exact vei conecta pinii placii Arduino cu memoria EEPROM dupa urmatorul tabel:

Pinii memoriei se pot afla direct din fisa de catalog (link-ul de mai sus) sau din urmatoarea  diagrama:

Ce reprezinta pinii marcati cu A0, A1, A2 si WP ?

Am spus mai devreme ca o placa Arduino poate adresa mai multe memorii, iar pinii A0, A1 si  A2 te pot ajuta sa inlantuiesti pe magistrala seriala pana la 8 memorii EEPROM. In cazul in care doresti sa folosesti o singura memorie, tot ce trebuie sa faci este sa conectezi pinii la GND, adica toti pinii sa  capete valoarea logica „0“. Daca vrei sa adaugi o noua memorie, tot ce trebuie sa faci este sa alegi o  configuratie diferita pentru noua memorie, adica sa conectezi pinii A0 si A1 la GND iar pinul ramas,  A2, la VCC. Pentru o a treia memorie trebuie sa alegi o noua configuratie, diferita fata de celelalte  doua. In final poti adauga pana la 8 memorii.

In cazul de fata, placa Arduino va adresa o singura memorie EEPROM, dar tie iti ramane sa  descoperi cum se poate adresa o a doua memorie si chiar mai multe.

Ramane pinul WP care inseamna „Write Protect“. Acest pin iti permite sa protejezi datele de pe memoria EEPROM dupa anumite reguli pe care le poti descoperi in fisa de catalog.

In cazul de fata, pinul WP este conectat la GND si asta inseamna ca esti liber sa scrii si sa citesti memoria ori de cate ori vrei tu, adica functia de protectie la scriere este dezactivata.

Cum citesc/scriu memoria EEPROM din Arduino ?

Iata 2 functii simple care iti permit sa scrii si sa citesti in/din memoria EEPROM:

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte 
data ) 
{
 Wire.beginTransmission(deviceaddress);
 Wire.write((int)eeaddress); 
 Wire.write(data);
 Wire.endTransmission();
 delay(5);
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) 
{
 byte rdata = 0xFF;
 Wire.beginTransmission(deviceaddress);
 Wire.write((int)eeaddress); 
 Wire.endTransmission();
 Wire.requestFrom(deviceaddress,1);
 if (Wire.available()) rdata = Wire.read();
 return rdata;
}

Cum functioneaza functia de scriere ? La prima vedere, functia pare extrem de simpla deoarece este formata din 5 instructiuni. La apelare functia accepta 3 parametrii, dintre care primul reprezinta adresa fizica a memoriei EEPROM, al doilea parametru reprezinta adresa locatiei din memorie la care vrei sa faci scrierea, iar al treilea parametru reprezinta informatia pe care doresti sa o salvezi. Simplu ?

Cum stabilesc adresa fizica a memoriei ? In primul rand, mai devreme am vorbit despre pinii A0, A1 si A2 pe care i-ai conectat la GND, adica le-ai dat tuturor valoarea logica „0“.

Daca te uiti in fisa de catalog a memoriei vei intalni urmatoarea imagine:

Pentru memoria de fata este valabila doar prima linie marcata cu 1K/2K in care apar bitii A2, A1 si A0. Daca acesti biti sunt conectati la GND, inseamna ca toti bitii capata valoarea „0“.

Daca realizezi conversia din binar in hexazecimal a urmatorului sir de biti „1010000“, vei descoperi adresa hardware pe care o poti folosi in functia de mai sus, respectiv 0x50.

Scrierea propriu-zisa a informatiei in memoria EEPROM se realizeaza dupa urmatoarea diagrama (pe care o poti descoperi tot din fisa de catalog). Iti ramane ca tu sa descoperi cum lucreaza instructiunile din interiorul functiei de scriere, asa cum indica si diagrama de mai jos.

Cum functioneaza functia de citire ? Diferenta intre functia de scriere si cea de citire este ca cea din urma returneaza ceva dintr-o locatie de memorie. Asta inseamna ca la apelare, functia accepta 2 parametrii, respectiv adresa hardware a memoriei (descoperita mai sus) si locatia din memorie. Instructiunile de citire sunt asemanatoare functiei de scriere, dar exista ceva in plus.

Tot ce trebuie sa faci este sa cauti diagrama de citire din fisa de catalog si sa corelezi instructiunile.

Am functiile de scriere si citire, dar cum le apelez ?

Iata un exemplu:

#include <Wire.h> 
#define disk1 0x50 //adresa hardware a memoriei
void setup(void)
{
 Serial.begin(9600);
 Wire.begin(); 
 unsigned int address = 0;
 writeEEPROM(disk1, address, 123);
 Serial.println(readEEPROM(disk1, address), DEC);
}
void loop(){
}

Prima linie de cod, directiva preprocesor, apeleaza libraria Wire. Libraria este responsabila cu protocolul de comunicatie intre placa Arduino si memoria EEPROM.

Am mentionat mai sus ca fiecare memorie poate capata o adresa hardware (prin configurarea pinilor A0, A1 si A2). In codul de mai sus, adresa poarta numele disk1 si are valoarea hexazecimala 0x50.

In rutina setup() se initializeaza Monitorul Serial, conexiunea seriala cu memoria EEPROM, adresa locatiei la care vrei sa faci o scriere si apoi o citire.

Dupa care se apeleaza functia de scriere si dupa cum observi se scrie valoarea 123 in locatia 0, din memoria EEPROM cu adresa hardware 0x50.

Apoi se citeste si se afiseaza din memoria EEPROM, valoarea scrisa anterior prin functia: Serial.println(readEEPROM(disk1, address), DEC);

Ce altceva poti sa faci cu o memorie EEPROM ?

Pe langa a salva si a scrie date, poti spre exemplu sa salvezi un fisier wav pentru a il folosi mai tarziu la redare. Iata un exemplu:

http://www.enide.net/webcms/index.php?page=pcm2pwm-multiplayer

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s