Arduinoと戯れてみる!

Arduino 入門 番外編 11 搭載メモリについて(Flash SRAM EEPROM)

arduino-extra-edition-11Arduino番外編
スポンサーリンク

【Arduino 入門 番外編 11】
搭載メモリについて(Flash SRAM EEPROM)

arduino 入門 番外編はarduinoの基本的なことを解説している記事です。

 

本日は、Arduinoのメモリについて。

Arduinoに複雑なことをさせようとすると、スケッチ(コード、プログラム)がどんどん複雑になっていきます。

そして、スケッチ(コード、プログラム)が巨大化。

ついにはメモリ不足といった事態に陥ります。

入門編程度のスケッチ(コード、プログラム)で遊んでいる分にはメモリ不足になるということはないでしょう。

 

ある程度、慣れてきて色々し始めると直面することに・・・。

そのため、Arduinoのメモリについて前もって知っておくことが大事です。

 

それでは、arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。

いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。

 

Lessonの入門編で使用しているArduinoは互換品です。

互換品とは言え、

Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段で豊富な部品が多数ついています。

 

スポンサーリンク

Arduino メモリの種類について【ATmega328P】

Arduinoボードのマイクロコントローラ(ATmega328P)には3種類のメモリがあります。
※2019年7月現在のUNO情報

メモリ種類サイズ[バイト]用途
Flashメモリ
不揮発性
32kスケッチの格納
SRAM
揮発性
2kスケッチの実行中、変数の作成と操作に一時的に利用
EEPROM
不揮発性
1k長期的に情報を記録
不揮発性:電源を切っても情報は消えない。
揮発性:電源を切ると情報は失われる。

 

Flashメモリ

Flashメモリーは、スケッチ(コード、プログラム)が格納される場所です。

IDEで作成したスケッチが格納されているメモリーとなります。

 

Arduinoを使っていれば、わかると思います。

Arduinoの電源を落とします。

もう一度、電源を入れても書き込んだスケッチをそのまま動かすことができます。

それは、スケッチが不揮発性メモリであるFlashメモリに格納されているからです。

 

Flashメモリには、ブートローダと呼ばれる基本ソフトは初めから書き込まれています。

そのため、Arduinoの電源を入れると、このブートローダが起動されます。

その後、スケッチを起動します。

 

Windowsがパソコンにあらかじめインストールされていて、電源を入れるとWindowsが起動するのと、まあ似たようなものです。

 

SRAM

SRAMはスケッチの実行中、変数の作成と操作に一時的に利用されます。

メモリのサイズは小さいです。

ただし、他のメモリに比べ読み書きする動作速度は高速なメモリです。

また、揮発性メモリのなため電源を落とすと情報は失われます。

 

メモリサイズが小さいため、プログラムを作成する際はSRAMのメモリサイズを意識する必要があります。

とくに、文字列や配列を使用する場合はメモリがすぐになくなってしまうため気を付ける必要があります。

 

例えば、文字は1文字につき1バイト使用します。

100文字なら100バイトというようにあっというまにメモリを消費してしまいます。
※SRAMのサイズは2kバイトです。

 

ちなみに、下記で26バイト消費します。

char message[] = "abcdefghijklmnopqrstuvwxyz";

 

EEPROM

EEPROMは長期的に情報を格納しておく場所です。

EEPROMは不揮発性のメモリのため、電源がOFFの場合でもメモリ上の情報を保持できます。

 

このEEPROMを使用するためには、ライブラリを使用するのが簡単です。

Arduino IDE上に利用可能なEEPROMライブラリがあります。

EEPROMの性能は、書き込み時間が1バイト/3.3ms、サイクル寿命は10万回とされています。

 

公式サイトのサンプルコードを記載しておきます。

Arduinoの公式サイトは
Creative Commons Attribution-ShareAlike 3.0 Licenseに従っています。
下記サンプルコードも同様のライセンスに従います。

といっても上記リンクをご確認いただければ、わかりますがほぼ自由に使えます。

 

 

サンプルコード1

//EEPROMの値を0番地から純に1バイトずつ読み取り、シリアルで送信。
 #include <EEPROM.h> //IDEに標準に搭載されているライブラリ

int a = 0;
int value;

void setup() {
Serial.begin(9600);
}

void loop() {
value = EEPROM.read(a); //EEPROMから1バイト読み込み。

Serial.print(a);
Serial.print("\t");
Serial.print(value);
Serial.println();

a = a + 1;
if (a == 512) a = 0;

delay(500);
}

 

サンプルコード2

 

// EEPROMのアドレス0から511に、addressと同じ値を書き込みます。
#include <EEPROM.h> //IDEに標準に搭載されているライブラリ

void setup() {
for (int i = 0; i < 512; i++)
EEPROM.write(i, i); //EEPROMから1バイト書き込み。
}

void loop() {}

 

EEPROMライブラリの関数説明

#include <EEPROM.h>

 

関数名説明
EEPROM.read(address)address:読み取る位置。0以上の値(int)
戻り値:指定したアドレスの値(byte)
EEPROM.write(address, value)address:書き込む位置。0以上の値(int)
value:書き込む値。0から255(byte)
戻り値:なし

 

メモリー消費量の確認

コンパイル時、書き込み時にメモリーの状況を確認できます。

IDEの統合環境から

「ファイル」⇒「環境設定」を選択

下記図の⑥の部分の「コンパイル」と「書き込み」に✔を入れてください。

arduino-ide-basic-environment-02

 

 

上記の環境設定については下記記事で詳細を説明しています。

 

まとめ

Arduino 入門 番外編 11】搭載メモリについて(Flash SRAM EEPROM)

いかがだったでしょうか?

 

Arduinoに色んなことをさせようとしてスケッチが巨大化。

プログラムが転送できない!

転送はできたけど、メモリーを消費しすぎて動かない!

なんて、ことがないようにメモリお消費を意識してスケッチを書いていきましょう。

 

次回の番外編も、スケッチについて情報を発信したいと考えています。

 

最後に

疑問点、質問などありましたら気軽にコメントください。

この電子部品の解説をしてほしい!などなどなんでもOKです。

リンク切れなどあればコメントいただけると助かります。

 

Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。

 

Arduino入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

コメント

タイトルとURLをコピーしました