つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション40 ~ センサ入力のメモリ書き込み

前回のArduinoの内蔵メモリ(EEPROM)へのデータの読み書きを応用して今回はセンサなどの外部入力値をEEPROMに書き込んで読み出す方法について紹介したい。

atatat.hatenablog.com

1. 全体の構成・接続

 今回はポテンショメータをセンサに見立てて、ポテンショメータの出力をArduinoのアナログ入力A0に入力しアナログ入力された電圧をEEPROMに書き込み、後で読み出すという構成にした。 ポテンショメータの抵抗は1kΩとして、ポテンショメータに入力する電圧は、アナログ入力のフルレンジが利用できるように電源から5Vを供給する。Tinkercadのシミュレーション中にポテンショメータダイアルを適当にまわすことで、ポテンショメーターの出力が0~5Vの範囲で変動する。簡単ではあるが、以下が今回Tinkercadのシミュレーションで使用した構成・接続の図となる。

"EEPROMへのセンサ入力読み書きの構成・接続"
EEPROMへのセンサ入力読み書きの構成・接続

2. スケッチ

 前回と同様に最初にEEPROMからデータを読み出してから、アナログ入力端子からポテンショメータから入力された電圧をEEPROMに書き込むという処理を行っている。EEPROMは1バイト入力(0-255)で、アナログ入力は0-1023のため、レンジを変換する関数としてmap(val, 0, 1023, 0, 255);を使用している。この関数はvalの入力レンジ0-1023を0-255に丸めた数値を返す関数となっている。EEPROMから読み出した結果はシリアルモニタに表示するが、表示する部分はval_print(int add,float value)という関数を定義して使用している。すべてのアドレスに値を入力するには時間がかかるので、25番目のアドレスまで書き込んだら0に戻って再び同じ処理を繰り返すようにしている。

#include <EEPROM.h>

int val;
int address=0;
int maxadd=25;
float v;

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

void loop() {
  
  val=EEPROM.read(address);
  float v=(float)val/255*5;// 電圧値に変換して表示
  val_print(address,v);
  
  val = analogRead(A0);
  val = map(val, 0, 1023, 0, 255); // メモリ書き込みのため変換
  
  if (address==maxadd)
    address=0;
  EEPROM.write(address,val);
  address++;
  delay(500);
}

void val_print(int add,float value){
  Serial.print("add:");
  Serial.print(add);
  Serial.print("\t");
  Serial.print("Value: ");
  Serial.print(value);
  Serial.println(" V");  
}

3. 実行結果

 Tinkercadでシミュレーションを実行すると、1ループ目はEEPROMにデータがないので0と表示されるが、1ループ目の読み込み後にポテンショメーターの出力電圧が書き込まれるため2ループ目には1ループ目で記録された電圧を表示することになる。下図はシミュレーションの実行例を示している。

EEPROMに書き込まれたアナログ入力電圧の読み出し

なお前回と同様にArduinoのリセットボタンを押すと最初から実行されるはずだが、前回のシミュレーションも含めて以前のようにリセットボタンがうまく機能しない。(8/31現在) Tinkercadで内部エラーなどでコードが実行できないなどあるので、もしかしたらTinkercad側何か問題があるかもしれない。

4, まとめ

 今回は外部入力としてポテンショメーターの出力電圧をArduinoのアナログ入力で読み出した値をEEPROMに書き込み、書き込んだデータをEEPROMから読み出す例を紹介した。