SlideShare a Scribd company logo
1 of 10
Download to read offline
Textul si imaginile din acest document sunt licentiate
Attribution-NonCommercial-NoDerivs
CC BY-NC-ND
Codul sursa din acest document este licentiat
Public-Domain
Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website / blog, printare,
sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document
poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici un fel de limitari.
Arduino – cum accesez o memorie EEPROM externa ?
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.
http://www.robofun.ro/forum
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
http://www.robofun.ro/forum
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:
http://www.robofun.ro/forum
Mai exact vei conecta pinii placii Arduino cu memoria EEPROM dupa urmatorul tabel:
Arduino 5V Memorie EEPROM VCC
Arduino GND Memorie EEPROM GND, A0, A1, A2, WP
Arduino SCL Memorie EEPROM SCL
Arduino SDA Memorie EEPROM SDA
Pinii memoriei se pot afla direct din fisa de catalog (link-ul de mai sus) sau din urmatoarea
diagrama:
http://www.robofun.ro/forum
http://www.robofun.ro/forum
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:
http://www.robofun.ro/forum
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:
http://www.robofun.ro/forum
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(){
}
http://www.robofun.ro/forum
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
http://www.robofun.ro/forum

More Related Content

Similar to Arduino eeprom

Arduino protocolul 1 wire
Arduino   protocolul 1 wireArduino   protocolul 1 wire
Arduino protocolul 1 wireIulius Bors
 
Arduino multiplexarea le-durilor
Arduino multiplexarea le-durilorArduino multiplexarea le-durilor
Arduino multiplexarea le-durilorIulius Bors
 
Prezentarea Calculatorului
Prezentarea CalculatoruluiPrezentarea Calculatorului
Prezentarea CalculatoruluiNicky Nic
 
Prezentarea calculatorului
Prezentarea calculatoruluiPrezentarea calculatorului
Prezentarea calculatoruluiSima Sorin
 
Arduino comunicatie i2c
Arduino comunicatie i2cArduino comunicatie i2c
Arduino comunicatie i2cIulius Bors
 
Modulul 1 ecdl
Modulul 1 ecdlModulul 1 ecdl
Modulul 1 ecdlELENA NITA
 
Modulul 1 ecdl
Modulul 1 ecdlModulul 1 ecdl
Modulul 1 ecdlELENA NITA
 
Arduino indicatoare cp-usiram
Arduino indicatoare cp-usiramArduino indicatoare cp-usiram
Arduino indicatoare cp-usiramIulius Bors
 
Componentele unui-calculator-partea-i
Componentele unui-calculator-partea-iComponentele unui-calculator-partea-i
Componentele unui-calculator-partea-iBalanTatiana1
 
Arduino comparatorul intern
Arduino comparatorul internArduino comparatorul intern
Arduino comparatorul internIulius Bors
 
Identificare nevoi invatare_elevi
Identificare  nevoi invatare_eleviIdentificare  nevoi invatare_elevi
Identificare nevoi invatare_eleviGeorge Brebenel
 
Prezentarea calculatorului
Prezentarea calculatorului Prezentarea calculatorului
Prezentarea calculatorului Nicky Nic
 
Proiect la Info/ COMPONENTELE CALCULATORULUI
Proiect la Info/ COMPONENTELE CALCULATORULUIProiect la Info/ COMPONENTELE CALCULATORULUI
Proiect la Info/ COMPONENTELE CALCULATORULUIDaria561699
 
Generarea de erori persistente in BIOS
Generarea de erori persistente in BIOSGenerarea de erori persistente in BIOS
Generarea de erori persistente in BIOSDefCamp
 
09 server mgmt_ii_ro
09 server mgmt_ii_ro09 server mgmt_ii_ro
09 server mgmt_ii_romcroitor
 
Referat placa de baza andrei
Referat placa de baza andreiReferat placa de baza andrei
Referat placa de baza andreiFlorin Iordache
 
Arduino toraspberrypi firmata
Arduino toraspberrypi firmataArduino toraspberrypi firmata
Arduino toraspberrypi firmataIulius Bors
 

Similar to Arduino eeprom (20)

Arduino protocolul 1 wire
Arduino   protocolul 1 wireArduino   protocolul 1 wire
Arduino protocolul 1 wire
 
Curs calcul
Curs calculCurs calcul
Curs calcul
 
Arduino multiplexarea le-durilor
Arduino multiplexarea le-durilorArduino multiplexarea le-durilor
Arduino multiplexarea le-durilor
 
Cpu
CpuCpu
Cpu
 
Prezentarea Calculatorului
Prezentarea CalculatoruluiPrezentarea Calculatorului
Prezentarea Calculatorului
 
Prezentarea calculatorului
Prezentarea calculatoruluiPrezentarea calculatorului
Prezentarea calculatorului
 
Arduino comunicatie i2c
Arduino comunicatie i2cArduino comunicatie i2c
Arduino comunicatie i2c
 
Modulul 1 ecdl
Modulul 1 ecdlModulul 1 ecdl
Modulul 1 ecdl
 
Modulul 1 ecdl
Modulul 1 ecdlModulul 1 ecdl
Modulul 1 ecdl
 
Arduino indicatoare cp-usiram
Arduino indicatoare cp-usiramArduino indicatoare cp-usiram
Arduino indicatoare cp-usiram
 
Componentele unui-calculator-partea-i
Componentele unui-calculator-partea-iComponentele unui-calculator-partea-i
Componentele unui-calculator-partea-i
 
Arduino comparatorul intern
Arduino comparatorul internArduino comparatorul intern
Arduino comparatorul intern
 
Identificare nevoi invatare_elevi
Identificare  nevoi invatare_eleviIdentificare  nevoi invatare_elevi
Identificare nevoi invatare_elevi
 
Prezentarea calculatorului
Prezentarea calculatorului Prezentarea calculatorului
Prezentarea calculatorului
 
Proiect la Info/ COMPONENTELE CALCULATORULUI
Proiect la Info/ COMPONENTELE CALCULATORULUIProiect la Info/ COMPONENTELE CALCULATORULUI
Proiect la Info/ COMPONENTELE CALCULATORULUI
 
Generarea de erori persistente in BIOS
Generarea de erori persistente in BIOSGenerarea de erori persistente in BIOS
Generarea de erori persistente in BIOS
 
09 server mgmt_ii_ro
09 server mgmt_ii_ro09 server mgmt_ii_ro
09 server mgmt_ii_ro
 
Referat placa de baza andrei
Referat placa de baza andreiReferat placa de baza andrei
Referat placa de baza andrei
 
Curs c#
Curs c#Curs c#
Curs c#
 
Arduino toraspberrypi firmata
Arduino toraspberrypi firmataArduino toraspberrypi firmata
Arduino toraspberrypi firmata
 

More from Iulius Bors

Set prizecomandatedinarduino
Set prizecomandatedinarduinoSet prizecomandatedinarduino
Set prizecomandatedinarduinoIulius Bors
 
Raspberry pi wirelesshotspot
Raspberry pi wirelesshotspotRaspberry pi wirelesshotspot
Raspberry pi wirelesshotspotIulius Bors
 
Raspberry piuln2803
Raspberry piuln2803Raspberry piuln2803
Raspberry piuln2803Iulius Bors
 
Raspberry pi timelapse
Raspberry pi timelapseRaspberry pi timelapse
Raspberry pi timelapseIulius Bors
 
Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Iulius Bors
 
Raspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionRaspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionIulius Bors
 
Raspberry pi firmata - arduino
Raspberry pi   firmata - arduinoRaspberry pi   firmata - arduino
Raspberry pi firmata - arduinoIulius Bors
 
Programare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaProgramare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaIulius Bors
 
Motoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverMotoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverIulius Bors
 
Curs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelCurs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelIulius Bors
 
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Iulius Bors
 
Curs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaCurs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaIulius Bors
 
Curs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsCurs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsIulius Bors
 
Curs gratuitarduino lectia9-senzoriatmosferici
Curs gratuitarduino lectia9-senzoriatmosfericiCurs gratuitarduino lectia9-senzoriatmosferici
Curs gratuitarduino lectia9-senzoriatmosfericiIulius Bors
 
Curs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaCurs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaIulius Bors
 
Curs gratuitarduino lectia6-senzoriforta
Curs gratuitarduino lectia6-senzorifortaCurs gratuitarduino lectia6-senzoriforta
Curs gratuitarduino lectia6-senzorifortaIulius Bors
 
Curs gratuitarduino lectia5-accelerometre
Curs gratuitarduino lectia5-accelerometreCurs gratuitarduino lectia5-accelerometre
Curs gratuitarduino lectia5-accelerometreIulius Bors
 
Curs gratuitarduino lectia3-proiectesimple-1
Curs gratuitarduino lectia3-proiectesimple-1Curs gratuitarduino lectia3-proiectesimple-1
Curs gratuitarduino lectia3-proiectesimple-1Iulius Bors
 
Cum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiCum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiIulius Bors
 
Conector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcConector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcIulius Bors
 

More from Iulius Bors (20)

Set prizecomandatedinarduino
Set prizecomandatedinarduinoSet prizecomandatedinarduino
Set prizecomandatedinarduino
 
Raspberry pi wirelesshotspot
Raspberry pi wirelesshotspotRaspberry pi wirelesshotspot
Raspberry pi wirelesshotspot
 
Raspberry piuln2803
Raspberry piuln2803Raspberry piuln2803
Raspberry piuln2803
 
Raspberry pi timelapse
Raspberry pi timelapseRaspberry pi timelapse
Raspberry pi timelapse
 
Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4Raspberry pi lcd-shield20x4
Raspberry pi lcd-shield20x4
 
Raspberry pi bmp085blueedition
Raspberry pi bmp085blueeditionRaspberry pi bmp085blueedition
Raspberry pi bmp085blueedition
 
Raspberry pi firmata - arduino
Raspberry pi   firmata - arduinoRaspberry pi   firmata - arduino
Raspberry pi firmata - arduino
 
Programare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificialaProgramare in prolog_pentru_inteligenta_artificiala
Programare in prolog_pentru_inteligenta_artificiala
 
Motoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriverMotoare pascupasarduinoeasydriver
Motoare pascupasarduinoeasydriver
 
Curs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcelCurs gratuitarduino lectia15-seismografcuexcel
Curs gratuitarduino lectia15-seismografcuexcel
 
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
Curs gratuitarduino lectia14-analogieelectricitatecurgereafluidelor-proiect-f...
 
Curs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastaturaCurs gratuitarduino lectia13-mousesitastatura
Curs gratuitarduino lectia13-mousesitastatura
 
Curs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocsCurs gratuitarduino lectia12-conexiunewifi-googledocs
Curs gratuitarduino lectia12-conexiunewifi-googledocs
 
Curs gratuitarduino lectia9-senzoriatmosferici
Curs gratuitarduino lectia9-senzoriatmosfericiCurs gratuitarduino lectia9-senzoriatmosferici
Curs gratuitarduino lectia9-senzoriatmosferici
 
Curs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistantaCurs gratuitarduino lectia7-senzoridistanta
Curs gratuitarduino lectia7-senzoridistanta
 
Curs gratuitarduino lectia6-senzoriforta
Curs gratuitarduino lectia6-senzorifortaCurs gratuitarduino lectia6-senzoriforta
Curs gratuitarduino lectia6-senzoriforta
 
Curs gratuitarduino lectia5-accelerometre
Curs gratuitarduino lectia5-accelerometreCurs gratuitarduino lectia5-accelerometre
Curs gratuitarduino lectia5-accelerometre
 
Curs gratuitarduino lectia3-proiectesimple-1
Curs gratuitarduino lectia3-proiectesimple-1Curs gratuitarduino lectia3-proiectesimple-1
Curs gratuitarduino lectia3-proiectesimple-1
 
Cum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypiCum instaleziapachesimysql peraspberrypi
Cum instaleziapachesimysql peraspberrypi
 
Conector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pcConector bluetoothmatesilver arduino-pc
Conector bluetoothmatesilver arduino-pc
 

Arduino eeprom

  • 1. Textul si imaginile din acest document sunt licentiate Attribution-NonCommercial-NoDerivs CC BY-NC-ND Codul sursa din acest document este licentiat Public-Domain Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website / blog, printare, sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul sursa din acest document poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici un fel de limitari.
  • 2. Arduino – cum accesez o memorie EEPROM externa ? 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. http://www.robofun.ro/forum
  • 3. 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 http://www.robofun.ro/forum
  • 4. 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: http://www.robofun.ro/forum
  • 5. Mai exact vei conecta pinii placii Arduino cu memoria EEPROM dupa urmatorul tabel: Arduino 5V Memorie EEPROM VCC Arduino GND Memorie EEPROM GND, A0, A1, A2, WP Arduino SCL Memorie EEPROM SCL Arduino SDA Memorie EEPROM SDA Pinii memoriei se pot afla direct din fisa de catalog (link-ul de mai sus) sau din urmatoarea diagrama: http://www.robofun.ro/forum
  • 7. 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: http://www.robofun.ro/forum
  • 8. 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: http://www.robofun.ro/forum
  • 9. 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(){ } http://www.robofun.ro/forum
  • 10. 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 http://www.robofun.ro/forum