Arduino y las Memorias EEPROM I2C

lunes, 14 de marzo de 2011
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.

0 Comentarios, Dejar un Comentario:

Publicar un comentario en la entrada