I2C FRAM 모듈

아두이노는 램(SRAM, 2KB)과 EEPROM(1KB)이 매우 제한적이기 때문에 상대적으로 용량이 큰 이미지나 문자열, 데이터, 멀티미디어 처리가 힘든 단점이 있습니다. 이런 경우 마치 아두이노에 HDD를 달듯 외부에 모듈을 추가해서 데이터를 저장해 쓸 수 있습니다. 이번에 소개할 I2C FRAM 모듈이 그런 역할을 해줍니다. FRAM 모듈을 사용하면 EEPROM의 용량을 확장한 것과 같은 효과를 낼 수 있습니다.

FRAM은 ‘ferroelectric’ RAM 의 약자로 전원이 차단되어도 데이터가 삭제되지 않는 비휘발성 메모리입니다. 이런 점에서는 아두이노의 32KB Flash 메모리와 유사합니다. 하지만 Flash 메모리가 아두이노 실행중에 write 할 수 없는데 반해 FRAM 모듈은 아두이노 실행중에도 read/write가 자유롭습니다. 그리고 FRAM이 속도도 더 빠릅니다. FRAM 모듈은 32KB~256KB 용량을 선택할 수 있으며 I2C 통신을(또는 SPI) 지원합니다. 그리고 read/write 작업이 동시에 가능하고 상온에서 약 95년 동안 유지되며, 10조 번의 read/write를 할 수 있습니다. 한마디로 일반적인 용도에서 수명 걱정없이 사용할 수 있습니다.

여기서는 많은 자료를 참고한 Adafruit I2C FRAM 모듈(FRAM – MB85RC256V )을 기준으로 기술합니다. 이 모듈은 MB85RC256V 칩을 사용합니다. 상세한 내용은 데이터 시트를 참고하세요.

연결 방법

adafruit_products_pinout

Adafruit에서 판매되는 I2C FRAM 모듈은 아래와 같은 핀들을 가지고 있습니다. (SPI FRAM 모듈은 연결 방법이 틀리니 >>> 링크를 참고하세요.)

  • VCC – 3~5V 전원입력 가능
  • GND – common ground
  • SCL – I2C clock 핀. 아두이노의 SCL 핀에 연결
  • SDA – I2C data 핀. 아두이노의 SDA 핀에 연결
  • WP – Write Protect pin, 내부적으로 pull-down 된 핀입니다. 여기에 high voltage(VCC)를 걸어주면 쓰기금지 상태가 됩니다.
  • A0, A1, A2 – FRAM 모듈은 기본 I2C 어드레스가 0x50으로 설정되어 있는데 이 값을 동적으로 변경할 수 있습니다. A0~A2 핀에 high voltage(VCC)를 걸어주면 I2C 어드레스의 하위 3bit의 값이 변경됩니다. 예를 들어 A0 를 high 상태로 만들어주면 어드레스는 0x51이 되고, A1-A2 를 high 상태로 만들면 어드레스는 0x56이 됩니다.

단순하게 사용하기 위해서는 VCC, GND, SCL, SDA만 아두이노에 연결해주면 됩니다. 기본 I2C 어드레스 0x50 만 기억해뒀다 소스코드에 명시해주면 됩니다.

소스 코드

I2C FRAM 모듈 연결이 끝나면 이제 아두이노에 테스트 소스를 올려 확인해볼 차례입니다. 테스트에 앞서 FRAM driver 라이브러리를 설치해줘야 합니다. Adafruit I2C FRAM 모듈용 드라이버를 아래에서 다운로드 받을 수 있습니다.

https://github.com/adafruit/Adafruit_FRAM_I2C

라이브러리 설치가 끝나면 [File->Examples->Adafruit_FRAM_I2C->MB85RC256V] 예제를 불러옵니다. 그리고 예제를 아두이노에 업로드 합니다.

업로드가 완료되면 시리얼 모니터를 열어서 데이터가 표시되는걸 확인해보세요. 예제는 간단한 리붓 카운터입니다. 즉, 메모리의 첫 바이트에 적힌 값을 읽어와서 여기에 1을 더해 다시 기록합니다. 따라서 아두이노가 재실행 될 때마다 이 카운트가 1씩 증가합니다. 원하는대로 동작하는지 확인하세요.

adafruit_products_i2cframtest

소스코드에서 FRAM 억세스를 위해 필요한 부분은 아래 코드가 전부입니다. 이 부분만 유심히 봐두세요.

Adafruit_FRAM_I2C fram = Adafruit_FRAM_I2C(); // FRAM 억세스를 위한 객체 생성

fram.begin(0x53); // FRAM 모듈의 I2C 어드레스, 0x53을 생략하면 기본 어드레스인 0x50 사용
fram.write8(address, byte-value); // FRAM에 데이터 저장 (여기서 어드레스는 메모리의 특정 위치)
fram.read8(address); // FRAM 에서 읽기 (여기서 어드레스는 메모리의 특정 위치)

활용법

FRAM 모듈은 아두이노의 SRAM을 확장시켜 준다기보다는 EEPROM을 확장시켜주는 개념입니다. 그래서 큰 용량의 데이터를 아두이노가 처리할 수 있을만큼 쪼개서 처리 가능하게 만들어줍니다.

FRAM 모듈의 I2C 어드레스는 8개까지 지정할 수 있습니다. 따라서 여러개의 FRAM 모듈을 연결해서 데이터 저장 공간을 늘릴 수 있습니다.

또한 하나의 FRAM 모듈을 여러 아두이노가 공유할 수도 있을 것 같습니다. 아두이노끼리 통신을 해서 큰 데이터를 주고받는 경우보다 하나의 저장소를 공유하는 편이 훨씬 편리하겠죠. 대신 아두이노가 읽기, 쓰기 작업을 동시에 하지 않도록 적절한 처리 방법이 필요할 듯 합니다.

참고자료