問題を排除するために楽器を試してください





この投稿では、EEPROMとは何か、データが内蔵EEPROMにどのように保存されるかを理解します。 Arduinoボードの マイクロコントローラーと、EEPROMでのデータの書き込みと読み取りの方法をいくつかの例で実際にテストします。

ArduinoのEEPROMの紹介

なぜEEPROM?

EEPROMとは何かを尋ねる前に?そもそもなぜEEPROMがストレージに使用されるのかを知ることは非常に重要です。そのため、EEPROMについて明確なアイデアを得ることができます。



最近では、コンピューターのハードディスクなどの磁気ストレージデバイス、古い学校のカセットテープレコーダー、CD、DVD、Blu-rayディスクなどの光ストレージメディア、SSD(ソリッドステートドライブ)などのソリッドステートメモリなど、さまざまなストレージデバイスが利用できます。コンピュータやメモリカードなど。

これらは、音楽、ビデオ、ドキュメントなどのデータを数キロバイトから数テラバイトまで保存できる大容量記憶装置です。これらは不揮発性メモリです。つまり、記憶媒体への電源が遮断された後でもデータを保持できます。



コンピュータやスマートフォンなどの耳を落ち着かせる音楽や目を見張るようなビデオを配信するデバイスは、構成データ、起動データ、パスワード、バイオメトリックデータ、ログインデータなどのいくつかの重要なデータを保存します。

これらのデータは、セキュリティ上の理由から大容量記憶装置に保存できません。また、これらのデータはユーザーによって意図せずに変更され、デバイスの誤動作につながる可能性があります。

これらのデータは数バイトから数メガバイトしかかからず、磁気または光媒体などの従来のストレージデバイスをプロセッサチップに接続することは、経済的および物理的に実現可能ではありません。

したがって、これらの重要なデータは処理チップ自体に保存されます。

Arduinoはコンピューターやスマートフォンと何ら変わりはありません。センサーデータなど、電源を切った後も消去してはならない重要なデータを保存する必要がある状況がいくつかあります。

ここまでで、マイクロプロセッサとマイクロコントローラチップにEEPROMが必要な理由がわかったはずです。

EEPROMとは何ですか?

EEPROMは、Electrically Erasable Programmable Read OnlyMemoryの略です。また、読み取りと書き込みが可能な不揮発性メモリです。 バイト単位。

バイトレベルの読み取りと書き込みにより、他の半導体メモリとは異なります。たとえば、フラッシュメモリ:ブロック単位の方法でデータの読み取り、書き込み、および消去を行います。

ブロックは数百から数千ビットになる可能性があり、大容量記憶装置には適していますが、バイトごとのデータにアクセスする必要があるマイクロプロセッサやマイクロコントローラの「読み取り専用メモリ」操作には適していません。

Arduino Unoボード(ATmega328P)には、1KBまたは1024バイトのEEPROMが搭載されています。各バイトには個別にアクセスできます。各バイトのアドレスは0〜1023(合計1024)の範囲です。

アドレス(0-1023)は、データが保存されるメモリの場所です。

各アドレスには、0〜255の数字の8ビットデータを格納できます。データはバイナリ形式で格納されるため、EEPROMに数値255を書き込むと、アドレスに11111111として桁が格納され、ゼロを格納すると、 00000000として保存されます。

適切なプログラムを作成することにより、テキスト、特殊文字、英数字などを保存することもできます。

構造の詳細と作業についてはここでは説明していません。この記事が長くなり、眠くなる可能性があります。 YouTubeまたはGoogleに向かうと、EEPORMの構築と動作に関する興味深い記事/ビデオがあります。

EEPROMとEPROMを混同しないでください。

一言で言えば、EPROMは電気的にプログラム可能な読み取り専用メモリです。つまり、電気的にプログラム(メモリを保存)することはできますが、電気的に消去することはできません。

それは、保存されたデータを消去するストレージチップ上の紫外線の明るい輝きを利用しています。 EEPROMはEPROMの代わりとして登場し、現在ではほとんどの電子機器で使用されていません。

フラッシュメモリをEEPROMと混同しないでください。

フラッシュメモリは半導体および不揮発性メモリであり、電気的に消去可能で電気的にプログラム可能です。実際、フラッシュメモリはEEPROMから派生しています。ただし、ブロック単位のメモリアクセス、つまりメモリのアクセス方法とその構造は、EEPROMとは異なります。

Arduino Uno(ATmega328Pマイクロコントローラー)も、プログラムストレージ用に32KBのフラッシュメモリを搭載しています。

EEPROMの寿命:

他の電子記憶媒体と同様に、EEPROMにも有限の読み取り、書き込み、消去サイクルがあります。しかし問題は、他の種類の半導体メモリと比較して寿命が最も短いことです。

ArduinoのEEPROMで、Atmelはセルあたり約100000(1万ルピー)の書き込みサイクルを主張しました。室温が低い場合は、EEPROMの寿命が長くなります。

EEPROMからデータを読み取ることは、寿命に大きな影響を与えないことに注意してください。

セルあたり約100万書き込みサイクルの寿命で8KB、128KB、256KBなどの範囲のメモリ容量でArduinoと簡単に接続できる外部EEPROMICがあります。

これでEEPROMは終わりです。これで、EEPROMに関する十分な理論的知識が得られたはずです。

次のセクションでは、arduinoでEEPROMを実際にテストする方法を学びます。

ArduinoでEEPROMをテストする方法

これを実装するために必要なのは、USBケーブルとArduinoUnoボードだけです。準備は完了です。

上記の説明から、EEPROMにはデータを保存するアドレスがあることがわかりました。 ArduinoUnoに0〜1023の場所を保存できます。各ロケーションは、8ビットまたは1バイトに対応できます。

この例では、データを住所に保存します。プログラムの複雑さを軽減し、プログラムをできるだけ短くするために、0から9までのアドレスに1桁の整数(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の範囲の1桁の整数値を入力するように求められます。上記の出力から、値5を入力しました。

したがって、値5はアドレス位置3に格納されます。

値を入力すると、EEPROMに値が書き込まれます。

成功メッセージが表示されます。これは、値が保存されていることを意味します。

数秒後、コメントされたアドレスに保存されている値を読み取り、シリアルモニターに値を表示します。

結論として、ArduinoのマイクロコントローラーのEEPROMから値を書き込んだり読み取ったりしました。

次に、EEPROMを使用してパスワードを保存します。

6桁の数字(以下またはそれ以上)のパスワードを入力します。パスワードは6つの異なるアドレス(各桁の各アドレス)に保存され、「1」または「0」を保存するための追加のアドレスが1つあります。

パスワードを入力すると、追加のアドレスにパスワードが設定されていることを示す値「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キーを押します。これでパスワードが保存されました。

リセットボタンを押すか、USBケーブルをPCから外すと、Arduinoボードへの供給が中断されます。

次に、USBケーブルを再接続し、シリアルモニターを開きます。これにより、保存されている6桁のパスワードの入力を求められます。

LEDが点灯する正しいパスワードを入力してください。

パスワードを変更する場合は、コードの数字を変更してください。

int passExistAdd = 200

上記の行は、前に説明した追加のアドレスです。 6から1023までどこでも変更できます。0から5のアドレスは、6桁のパスワードを保存するために予約されています。

この追加アドレスを変更すると、パスワードがまだ作成されていないというプログラムがだまされ、新しい6桁のパスワードを作成するように求められます。

ArduinoチュートリアルでこのEEPROMに関して質問がある場合は、コメントで表現してください。すぐに返信が届く場合があります。




前:Arduinoを使用した過電流カットオフ電源 次へ:DTMFモジュールを使用した携帯電話制御のロボットカー