Arduino의 EEPROM 소개

문제를 제거하기 위해 도구를 사용해보십시오





이 게시물에서는 EEPROM이 무엇인지, 데이터가 내장 된 EEPROM에 저장되는 방식을 이해할 것입니다. Arduino 보드 마이크로 컨트롤러를 사용하고 몇 가지 예를 통해 EEPROM에서 데이터를 쓰고 읽는 방법을 실제로 테스트합니다.

Arduino의 EEPROM 소개

왜 EEPROM인가?

EEPROM이 무엇인지 묻기 전에? 처음에 EEPROM이 스토리지에 사용되는 이유를 아는 것은 매우 중요합니다. 그래서 우리는 EEPROM에 대한 명확한 아이디어를 얻습니다.



오늘날 컴퓨터 하드 디스크, 구식 카세트 테이프 레코더와 같은 자기 저장 장치, CD, DVD, Blu-ray 디스크와 같은 광학 저장 매체, SSD (Solid State Drive)와 같은 솔리드 스테이트 메모리 등 다양한 저장 장치를 사용할 수 있습니다. 컴퓨터 및 메모리 카드 등

음악, 비디오, 문서 등과 같은 데이터를 몇 킬로바이트에서 수 테라 바이트까지 저장할 수있는 대용량 저장 장치입니다. 이는 비 휘발성 메모리이므로 저장 매체의 전원이 차단 된 후에도 데이터를 유지할 수 있습니다.



컴퓨터 또는 스마트 폰과 같이 귀를 진정시키는 음악이나 눈이 튀는 비디오를 제공하는 장치는 구성 데이터, 부팅 데이터, 암호, 생체 측정 데이터, 로그인 데이터 등과 같은 일부 중요한 데이터를 저장합니다.

이러한 데이터는 보안상의 이유로 대용량 저장 장치에 저장할 수 없으며 사용자가 실수로 데이터를 수정하여 장치의 오작동을 일으킬 수 있습니다.

이러한 데이터는 몇 바이트에서 몇 메가 바이트에 불과하므로 자기 또는 광학 매체와 같은 기존 저장 장치를 프로세서 칩에 연결하는 것은 경제적이고 물리적으로 불가능합니다.

따라서 이러한 중요한 데이터는 처리 칩 자체에 저장됩니다.

Arduino는 컴퓨터 나 스마트 폰과 다르지 않습니다. 전원이 차단 된 후에도 지워서는 안되는 중요한 데이터 (예 : 센서 데이터)를 저장해야하는 몇 가지 상황이 있습니다.

지금 쯤이면 마이크로 프로세서와 마이크로 컨트롤러 칩에 EEPROM이 필요한 이유를 알고 계실 것입니다.

EEPROM이란 무엇입니까?

EEPROM은 Electrically Erasable Programmable Read Only Memory를 나타냅니다. 또한 읽고 쓸 수있는 비 휘발성 메모리입니다. 바이트 단위.

바이트 레벨 읽기 및 쓰기는 다른 반도체 메모리와 다릅니다. 예를 들어 플래시 메모리 : 블록 단위 방식으로 데이터 읽기, 쓰기 및 지우기.

블록은 수백에서 수천 비트가 될 수 있는데, 이는 대용량 저장에는 가능하지만 바이트 단위 데이터에 액세스해야하는 마이크로 프로세서 및 마이크로 컨트롤러의 '읽기 전용 메모리'작업에는 적합하지 않습니다.

Arduino Uno 보드 (ATmega328P)에는 1KB 또는 1024 바이트의 EEPROM이 있습니다. 각 바이트는 개별적으로 액세스 할 수 있습니다. 각 바이트에는 0에서 1023 (총 1024 개) 범위의 주소가 있습니다.

주소 (0-1023)는 데이터가 저장 될 메모리 위치입니다.

각 주소에 8 비트 데이터, 0에서 255까지의 숫자를 저장할 수 있습니다. 데이터는 이진 형식으로 저장되므로 EEPROM에 숫자 255를 쓰면 숫자가 주소에 11111111로 저장되고 0을 저장하면, 00000000으로 저장됩니다.

적절한 프로그램을 작성하여 텍스트, 특수 문자, 영숫자 문자 등을 저장할 수도 있습니다.

건설 세부 사항과 작업은 여기에서 다루지 않으므로이 기사가 길어지고 졸리 게 만들 수 있습니다. YouTube 또는 Google로 이동하면 EEPORM의 구성 및 작업에 관한 흥미로운 기사 / 비디오가 있습니다.

EEPROM과 EPROM을 혼동하지 마십시오.

간단히 말해서 EPROM은 전기적으로 프로그래밍 가능한 읽기 전용 메모리입니다. 즉, 전기적으로 프로그래밍 (메모리 저장) 할 수 있지만 전기적으로 지울 수는 없습니다.

저장된 데이터를 지우는 스토리지 칩 위에 자외선의 밝은 빛을 활용합니다. EEPROM은 EPROM의 대체품으로 제공되었으며 현재는 전자 장치에서 거의 사용되지 않습니다.

EEPROM 용 플래시 메모리를 혼동하지 마십시오.

플래시 메모리는 반도체 및 비 휘발성 메모리로 전기적으로 소거 가능하고 전기적으로 프로그래밍이 가능하며 실제로 플래시 메모리는 EEPROM에서 파생됩니다. 그러나 블록 단위 메모리 액세스, 즉 메모리 방식이 액세스되고 그 구조가 EEPROM과 다릅니다.

Arduino Uno (ATmega328P 마이크로 컨트롤러)는 프로그램 저장을 위해 32KB의 플래시 메모리도 제공합니다.

1상 대 2상

EEPROM의 수명 :

다른 전자 저장 매체와 마찬가지로 EEPROM에는 유한 읽기, 쓰기, 지우기주기가 있습니다. 그러나 문제는 다른 종류의 반도체 메모리에 비해 수명이 가장 짧다는 것입니다.

Arduino의 EEPROM에서 Atmel은 셀당 약 100000 (1 lakh) 쓰기주기를 주장했습니다. 실내 온도가 낮을수록 EEPROM의 수명이 길어집니다.

EEPROM에서 데이터를 읽는 것은 수명에 큰 영향을 미치지 않습니다.

8KB, 128KB, 256KB 등의 메모리 용량으로 손쉽게 Arduino와 인터페이스 할 수있는 외부 EEPROM IC가 있으며 수명은 셀당 약 1 백만 쓰기주기입니다.

이것으로 EEPROM을 마쳤습니다. 이제 EEPROM에 대한 충분한 이론적 지식을 얻었을 것입니다.

다음 섹션에서는 arduino에서 EEPROM을 실제로 테스트하는 방법을 배웁니다.

Arduino에서 EEPROM을 테스트하는 방법

이를 구현하기 위해 필요한 것은 USB 케이블과 Arduino Uno 보드뿐입니다.

위의 설명에서 우리는 EEPROM에 데이터를 저장하는 주소가 있음을 이해했습니다. Arduino Uno에 0 ~ 1023 개의 위치를 ​​저장할 수 있습니다. 각 위치는 8 비트 또는 1 바이트를 수용 할 수 있습니다.

이 예에서는 주소에 데이터를 저장합니다. 프로그램의 복잡성을 줄이고 프로그램을 가능한 짧게 유지하기 위해 0에서 9까지의 주소에 한 자리 정수 (0에서 9)를 저장할 것입니다.

프로그램 코드 # 1

이제 코드를 Arduino에 업로드합니다.
//------------------Program Developed by R.GIRISH-------------------//
#include
int inputAddress = 0
int inputValue = 0
int ReadData = 0
boolean Readadd = true
boolean Readval = true
void setup()
{
Serial.begin(9600)
Serial.println('Enter the address (0 to 9)')
Serial.println('')
while(Readadd)
{
inputAddress = Serial.read()
if(inputAddress > 0)
{
inputAddress = inputAddress - 48
Readadd = false
}
}
Serial.print('You have selected Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Enter the value to be stored (0 to 9)')
Serial.println('')
while(Readval)
{
inputValue = Serial.read()
if(inputValue > 0)
{
inputValue = inputValue - 48
Readval = false
}
}
Serial.print('The value you entered is: ')
Serial.println(inputValue)
Serial.println('')
delay(2000)
Serial.print('It will be stored in Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Writing on EEPROM.....')
Serial.println('')
EEPROM.write(inputAddress, inputValue)
delay(2000)
Serial.println('Value stored successfully!!!')
Serial.println('')
delay(2000)
Serial.println('Reading from EEPROM....')
delay(2000)
ReadData = EEPROM.read(inputAddress)
Serial.println('')
Serial.print('The value read from Address ')
Serial.print(inputAddress)
Serial.print(' is: ')
Serial.println(ReadData)
Serial.println('')
delay(1000)
Serial.println('Done!!!')
}
void loop()
{
// DO nothing here.
}
//------------------Program Developed by R.GIRISH-------------------//

산출:

코드가 업로드되면 직렬 모니터를 엽니 다.

0에서 9까지의 주소를 입력하라는 메시지가 표시됩니다. 위 출력에서 ​​주소 3을 입력했습니다. 따라서 위치 (주소) 3에 정수 값을 저장하겠습니다.

이제 0에서 9까지의 한 자리 정수 값을 입력하라는 메시지가 표시됩니다. 위 출력에서 ​​값 5를 입력했습니다.

따라서 이제 값 5가 주소 위치 3에 저장됩니다.

값을 입력하면 EEPROM에 값이 기록됩니다.

값이 저장되었음을 의미하는 성공 메시지가 표시됩니다.

몇 초 후 주석 처리 된 주소에 저장된 값을 읽고 직렬 모니터에 값을 표시합니다.

결론적으로 아두 이노 마이크로 컨트롤러의 EEPROM에서 값을 쓰고 읽었습니다.

이제 암호를 저장하기 위해 EEPROM을 사용할 것입니다.

6 자리 숫자 (적거나 더 이상 없음)의 비밀번호를 입력 할 것이며, 6 개의 다른 주소 (각 숫자에 대한 각 주소)와 '1'또는 '0'을 저장하기위한 하나의 추가 주소에 저장됩니다.

암호를 입력하면 추가 주소에 암호가 설정되었음을 나타내는 '1'값이 저장되고 프로그램은 LED를 켤 때 암호를 입력하라는 메시지를 표시합니다.

추가 주소 저장 값이 '0'이거나 다른 값이있는 경우 새 6 자리 비밀번호를 생성하라는 메시지가 표시됩니다.

위의 방법으로 프로그램은 이미 암호를 설정했는지 또는 새 암호를 만들어야하는지 여부를 식별 할 수 있습니다.

입력 한 암호가 정확하면 13 번 핀의 빌드 인 LED가 켜지고, 입력 한 암호가 올바르지 않으면 LED가 켜지지 않으며 직렬 모니터에서 암호가 잘못되었다는 메시지를 표시합니다.

프로그램 코드 # 2

이제 코드를 업로드하십시오.
//------------------Program Developed by R.GIRISH---------------//
#include
int passExistAdd = 200
const int LED = 13
int inputAddress = 0
int word1 = 0
int word2 = 0
int word3 = 0
int word4 = 0
int word5 = 0
int word6 = 0
int wordAddress1 = 0
int wordAddress2 = 1
int wordAddress3 = 2
int wordAddress4 = 3
int wordAddress5 = 4
int wordAddress6 = 5
int passwordExist = 0
boolean ReadVal1 = true
boolean ReadVal2 = true
boolean ReadVal3 = true
boolean ReadVal4 = true
boolean ReadVal5 = true
boolean ReadVal6 = true
int checkWord1 = 0
int checkWord2 = 0
int checkWord3 = 0
int checkWord4 = 0
int checkWord5 = 0
int checkWord6 = 0
void setup()
{
Serial.begin(9600)
pinMode(LED, OUTPUT)
digitalWrite(LED, LOW)
passwordExist = EEPROM.read(passExistAdd)
if(passwordExist != 1)
{
Serial.println('Enter a new 6 number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
Serial.println('')
Serial.print(word1)
Serial.print(word2)
Serial.print(word3)
Serial.print(word4)
Serial.print(word5)
Serial.print(word6)
EEPROM.write(wordAddress1, word1)
EEPROM.write(wordAddress2, word2)
EEPROM.write(wordAddress3, word3)
EEPROM.write(wordAddress4, word4)
EEPROM.write(wordAddress5, word5)
EEPROM.write(wordAddress6, word6)
EEPROM.write(passExistAdd,1)
Serial.println(' Password saved Sucessfully!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
if(passwordExist == 1)
{
Serial.println('')
Serial.println('Please enter the 6 digit number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
checkWord1 = EEPROM.read(wordAddress1)
if(checkWord1 != word1)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord2 = EEPROM.read(wordAddress2)
if(checkWord2 != word2)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord3 = EEPROM.read(wordAddress3)
if(checkWord3 != word3)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord4 = EEPROM.read(wordAddress4)
if(checkWord4 != word4)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord5 = EEPROM.read(wordAddress5)
if(checkWord5 != word5)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord6 = EEPROM.read(wordAddress6)
if(checkWord6 != word6)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
digitalWrite(LED, HIGH)
Serial.println('')
Serial.println('LED is ON')
Serial.println('')
Serial.println('Press Reset Button.')
}
}
void loop()
{
}
//------------------Program Developed by R.GIRISH---------------//

산출:

직렬 모니터를 열면 6 자리 숫자 암호를 생성하라는 메시지가 표시됩니다.

6 자리 비밀번호를 입력하고 메모 한 다음 Enter 키를 누릅니다. 이제 암호가 저장되었습니다.

리셋 버튼을 누르거나 PC에서 USB 케이블을 분리하면 Arduino 보드에 대한 공급이 중단됩니다.

이제 USB 케이블을 다시 연결하고 직렬 모니터를 열면 저장된 6 자리 암호를 입력하라는 메시지가 표시됩니다.

LED가 켜질 올바른 암호를 입력하십시오.

비밀번호를 변경하려면 코드에서 숫자를 변경하십시오.

int passExistAdd = 200

위의 줄은 이전에 논의한 추가 주소입니다. 6에서 1023까지 변경할 수 있습니다. 0에서 5 개의 주소는 6 자리 비밀번호를 저장하기 위해 예약되어 있습니다.

이 추가 주소를 변경하면 암호가 아직 생성되지 않은 프로그램을 속이고 새 6 자리 암호를 생성하라는 메시지가 표시됩니다.

아두 이노 튜토리얼에서이 EEPROM에 대한 질문이 있으시면 댓글로 표현 해주시면 빠른 답변을 받으실 수 있습니다.




이전 : Arduino를 사용한 과전류 차단 전원 공급 장치 다음 : DTMF 모듈을 사용하는 휴대 전화 제어 로봇 자동차