TinkercadによるArduinoシミュレーション40 ~ センサ入力のメモリ書き込み
前回のArduinoの内蔵メモリ(EEPROM)へのデータの読み書きを応用して今回はセンサなどの外部入力値をEEPROMに書き込んで読み出す方法について紹介したい。
1. 全体の構成・接続
今回はポテンショメータをセンサに見立てて、ポテンショメータの出力をArduinoのアナログ入力A0に入力しアナログ入力された電圧をEEPROMに書き込み、後で読み出すという構成にした。 ポテンショメータの抵抗は1kΩとして、ポテンショメータに入力する電圧は、アナログ入力のフルレンジが利用できるように電源から5Vを供給する。Tinkercadのシミュレーション中にポテンショメータのダイアルを適当にまわすことで、ポテンショメーターの出力が0~5Vの範囲で変動する。簡単ではあるが、以下が今回Tinkercadのシミュレーションで使用した構成・接続の図となる。
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ループ目で記録された電圧を表示することになる。下図はシミュレーションの実行例を示している。
なお前回と同様にArduinoのリセットボタンを押すと最初から実行されるはずだが、前回のシミュレーションも含めて以前のようにリセットボタンがうまく機能しない。(8/31現在) Tinkercadで内部エラーなどでコードが実行できないなどあるので、もしかしたらTinkercad側何か問題があるかもしれない。
4, まとめ
今回は外部入力としてポテンショメーターの出力電圧をArduinoのアナログ入力で読み出した値をEEPROMに書き込み、書き込んだデータをEEPROMから読み出す例を紹介した。