Arduino y las Memorias EEPROM I2C

El control de una memoria EEPROM con una placa Arduino es bastante sencillo ya que tenemos a nuestro alcance la Biblioteca Wire, que no es otra cosa si que la comunicación I2C que necesitamos para accesar a este tipo de memoria sin importar si el fabricante.

Una aplicación que me pareció muy adecuada para este tipo de memoria es el control en las posiciones de un robot, con ayuda de la Biblioteca del Post pasado podremos grabar una serie de movimientos del Servomotor Ax-12+ de tal manera que programar un robot sea tan sencillo como apretar un botón Grabar. para almacenar las posiciones de nuestro robot y otro botón Reproducir para que el robot se mueva con las posiciones que ya le hemos grabado.

A continuación un esquema de como conectar la EEPROM.



Código:
//***********************************************************************
#include "Wire.h"
#include "DynamixelSerial.h"  
#include "NewSoftSerial.h"
NewSoftSerial XSerial(5,6);

char deviceADD = 0x50;
char Page = 0, PageR = 0;
unsigned char Position_Low_Byte;
unsigned char Position_High_Byte;
unsigned char Position_H, Position_L;
long Position_Long_Byte, Position;
             void setup (){
XSerial.begin(9600); // Serial PC
Wire.begin(); // I2C EEPROM
Dynamixel.begin(1000000,2); // Half Duplex USART Dynamixel Ax-12+
pinMode(13,OUTPUT);
XSerial.println("+ Comunicacion USART e I2C +");
delay(1000);
        }
void loop (){
if (digitalRead(3) == 1){
   digitalWrite(13,HIGH);
   delay(300)
   Position = Dynamixel.readPosition(1);
   Position_H = Position >> 8;
   Position_L = Position;
   XSerial.print("Ax-12+: ");XSerial.println(Position);
   Wire.beginTransmission(deviceADD);
   Wire.send(0x00);
   Wire.send(Page);
   Wire.send(Position_L);
   Wire.endTransmission();
   delay(3);
   Page++;
   Wire.beginTransmission(deviceADD);
   Wire.send(0x00);
   Wire.send(Page);
   Wire.send(Position_H);
   Wire.endTransmission();
   delay(3);
   digitalWrite(13,LOW);
   Page++;
        }
if (digitalRead(4) == 1){
  digitalWrite(13,HIGH);
  delay(100);
  Wire.beginTransmission(deviceADD);
  Wire.send(0x00);
  Wire.send(0x00);
  Wire.endTransmission();
  Wire.requestFrom(deviceADD,Page);
  while (Wire.available() < Page)
    delay(1);
  for(int i = 0; i <(Page/2);i++){
    Position_Low_Byte = Wire.receive();
    Position_High_Byte = Wire.receive();
    Wire.endTransmission();
    Position_Long_Byte = Position_High_Byte << 8;
    Position_Long_Byte =Position_Long_Byte + Position_Low_Byte;
    XSerial.print("EEPROM: ");XSerial.println(Position_Long_Byte);
    Dynamixel.move(1,Position_Long_Byte);
    delay(1000);
          }
   digitalWrite(13,LOW);
   Page = 0;
   Dynamixel.torqueStatus(1,OFF); 
}
} 
//************************************************************************
Posibles Problemas:
Estos problemas son muy comunes en este tipo de proyectos.

- Conectar el pin WP de la EEPROM a GND.
-Verificar el Voltaje que soporta la EEPROM ya que puedes quemarla.
- Algunos Capacitores son recomendados para evitar ruidos.

Comments

Popular posts from this blog

Low-Side MOSFET Drive Circuits and Techniques - 7 Practical Circuits

Using the SG3525 PWM Controller - Explanation and Example: Circuit Diagram / Schematic of Push-Pull Converter

Simple MW Transmitter Circuit Diagram